V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
• 请不要在回答技术问题时复制粘贴 AI 生成的内容
imherer
V2EX  ›  程序员

Web 如何限制访问设备

  •  
  •   imherer · 7 天前 · 4391 次点击

    一个内部系统,但是部署在公网上的,用户都是用 chrome 访问,基于安全性考虑加 IP 访问限制,但是有些用户没有固定公网 ip 或者甚至可能有移动设备访问。

    有没有什么办法像 app 那样取到设备信息呢,加设备白名单限制访问

    第 1 条附言  ·  7 天前
    非常感谢各位的回复,我就不一一回复了。

    现在是加了账密+二次验证的,但是还是觉得不够安全,所以想看看能不能加类似设备白名单的功能

    目前想到了一种方案:首次登录的时候服务端下发一个类似 token 的东西,将这个 token 存在本地,这个就相当于设备的唯一标识了,给这个设备加了白名单了
    72 条回复    2025-02-13 18:04:21 +08:00
    8355
        1
    8355  
       7 天前   ❤️ 3
    UA 吗。。。 随便伪造
    最好是借助一些外部系统跳转做 sso ,类似钉钉/飞书登陆,其实你的核心诉求是鉴权用户而不是鉴权设备。
    合法用户的所有设备都可用才对
    UnluckyNinja
        2
    UnluckyNinja  
       7 天前 via Android
    http 请求是可以自己构造的,设备信息不靠谱,加个 auth 模块吧
    w292614191
        3
    w292614191  
       7 天前
    如果 nginx 之类的能限制 MAC 地址就好了。
    w292614191
        4
    w292614191  
       7 天前
    我之前翻了一圈,希望能在云服务器限制 mac 地址,结果没什么好的办法。
    mightybruce
        5
    mightybruce  
       7 天前
    既然都是浏览器访问,考虑一下浏览器指纹,使用一些成熟的浏览器指纹库,基本不管你 IP 和 浏览器头部做一些变化都能独立识别用户。
    mightybruce
        6
    mightybruce  
       7 天前
    比如这个 js 库的 demo
    https://fingerprint.com/demo/
    liuidetmks
        7
    liuidetmks  
       7 天前
    @w292614191 不可能的,除非你在应用层获取 mac
    leo7476040305
        8
    leo7476040305  
       7 天前 via iPhone   ❤️ 4
    套一层 VPN ,VPN 服务器固定 IP ,只允许 VPN 服务器 IP 访问
    kristofer
        9
    kristofer  
       7 天前
    加个登陆验证?
    djs
        10
    djs  
       7 天前
    上面老哥说的浏览器指纹可以考虑下
    fox0001
        11
    fox0001  
       7 天前 via Android
    内部系统不需要用户登录的吗?如果需要,就是登录验证、二次验证等的解决方案。如果不需要登录,可以考虑颁发证书的形式。
    poxiaogg
        12
    poxiaogg  
       7 天前
    可以用双向证书
    wangtian2020
        13
    wangtian2020  
       7 天前
    看你是防君子还是防小人,结果上来说就是小人防不住。
    HangoX
        14
    HangoX  
       7 天前
    搭建个 vpn 吧,要么用 openvpn ,要么用 tailscale ,这样安全性会高很多
    skallz
        15
    skallz  
       7 天前   ❤️ 1
    @mightybruce 浏览器指纹只能作为辅助识别用户的手段,不能作为唯一识别用户的手段,你可以看到任何指纹库其准确率都到不了 100%,哪怕是你发的这个 npm 文档上也写了准确率为 40%至 60%
    skallz
        16
    skallz  
       7 天前
    这种需求加个 auth 模块吧,接入微信钉钉飞书就行
    czk1997
        17
    czk1997  
       7 天前
    要求 SSO 。设备纳入 MDM ,加证书登录。或者类似 Cloudflare ZeroTrust 这样的方案。
    wheat0r
        18
    wheat0r  
       7 天前
    如果用户都在一个或几个固定的网络里,用内网的防火墙解决问题
    htfcuddles
        19
    htfcuddles  
       7 天前
    你需要的是 SSO+Device Enrollment ,例如 MS 的 Intune
    xiri
        20
    xiri  
       7 天前 via Android   ❤️ 1
    @w292614191 mac 地址只在局域网有效,出了网关看到的就都是网关的 mac 地址了,你这个不可能实现的,除非你自己实现应用端和服务端,把 mac 地址封装到数据载荷里
    EndlessMemory
        21
    EndlessMemory  
       7 天前
    搞个账号不好吗
    815979670
        22
    815979670  
       7 天前
    套一层 webvpn 内部系统只允许通过 webvpn 访问,webvpn 不逊用户额外装什么软件 直接用浏览器访问
    zgsi
        23
    zgsi  
       7 天前
    天啊,这问题不就是我年前遇到的。web 在公网,但是只给公司内部用。ip 是变化的。
    想了一圈,最后闲着无聊写了个 chrome 插件,请求接口的时候追加 auth 鉴权
    ysc3839
        24
    ysc3839  
       7 天前 via Android
    客户端证书,或者 http basic auth ,用户名+密码就相当于 token
    totoro625
        25
    totoro625  
       7 天前
    弄个 web 界面,让他们访问之前点击相应的链接把 IP 添加到白名单内,再访问这个系统
    luolw1998
        26
    luolw1998  
       7 天前
    cloudflare Zero Trust
    zgsi
        27
    zgsi  
       7 天前
    @zgsi 看了你的补充,我也补充下。
    chrome 插件首次安装后生产一个 guid 缓存到本地,然后后台加白名单和权限,然后请求接口的时候把 guid 加密放到 auth 。
    这样应该安全吧?
    imherer
        28
    imherer  
    OP
       7 天前
    @zgsi #27 也有问题。 就像他们说的防君子不防小人,要是有人拿到这个 guid ,直接加到别的设备里,那就相当于新增设备了
    zgsi
        29
    zgsi  
       7 天前
    @imherer 内部泄露那没办法了。你给他账号密码他一样给别人。我目前这样实现了。目前测试观察阶段很稳定。我目前弊端是要刷新才会生产新的 auth ,后期可能会考虑登录后的状态有效期给长一点来解决。
    如果你有了好的解决方案,麻烦踢下我!
    XiLingHost
        30
    XiLingHost  
       7 天前
    试试 mtls 吧,或者基于 FIDO 的设备 passkey
    imherer
        31
    imherer  
    OP
       7 天前
    @zgsi #29 嗯嗯
    chobitssp
        32
    chobitssp  
       7 天前
    TOTP 动态口令
    johnhuangemc2
        33
    johnhuangemc2  
       7 天前
    IP 限制 + VPN
    我们把敏感网站限制成仅公司 IP 可访问, 然后在公司网络部署 OpenVPN, 敏感网站添加 VPN 路由配置走 VPN, 要访问敏感网站就开启 VPN 访问
    Lemon2ee
        34
    Lemon2ee  
       7 天前
    我也建议从网络层面解决问题。
    部署一个 tailscale subnet router 在服务傍边,广播服务 ip
    部署一个 tailscale client 在公司内部,添加路由规则
    即可达到内部可以访问服务,并且服务无法直接访问公司内部网络
    (大概是这样的,没实战过
    cxh116
        35
    cxh116  
       7 天前
    客户端证书应该是比较成熟的方案吧。楼上有提到,在 nginx 里也可以实现。还可以每个客户端装不同证书,吊销指定的客户端证书。

    https://developers.cloudflare.com/ssl/client-certificates/
    liuzimin
        36
    liuzimin  
       7 天前 via Android   ❤️ 1
    @8355 我觉得楼主就是鉴权设备而不是用户。我们也有这样的需求,就算这个用户合法,但是只允许他的特定设备接入。
    zgzhang
        37
    zgzhang  
       7 天前
    你搜索的是 JS 设备指纹
    musi
        38
    musi  
       7 天前
    不然还是用 electron 包个浏览器吧,你想做的都能实现
    Karte
        39
    Karte  
       7 天前
    如果真的想进行设备上的限制, 那尽可能做个桌面端. 桌面端获取系统信息然后判定.

    如果只想确保登录的人员是合法的, 那尽可能增加双重验证, 或者使用目前最新的认证方案: passkey.

    passkey 可以让用户不通过账户名和密码登录, 只需要手机扫描登录的二维码, 然后通过蓝牙与主机交互确认登录.
    Karte
        40
    Karte  
       7 天前
    @Karte 这种方案用户无需记住密码, 所有登录操作必须有认证过的设备与页面交互才能进行登录.
    Karte
        41
    Karte  
       7 天前
    具体可以在 (passkey)[https://passkey.org/] 网站进行了解.
    imherer
        42
    imherer  
    OP
       7 天前
    @zgzhang js 设备指纹不行吧? 指纹受影响的因素太多了,比如分辨率、浏览器版本等等
    liuzimin
        43
    liuzimin  
       7 天前
    @Karte “如果真的想进行设备上的限制, 那尽可能做个桌面端. 桌面端获取系统信息然后判定.”

    请问有这方面的开源方案吗?
    imherer
        44
    imherer  
    OP
       7 天前
    @liuzimin #43 electron 、tauri 、wails 等等
    zgzhang
        45
    zgzhang  
       7 天前
    JS 设备指纹的确没那么文档,但绝大部分场景够用,我再给你个思路,很多企业用零信任解决这个问题,用零信任限制只有某些人和某些设备,可以访问你的系统
    8355
        46
    8355  
       7 天前   ❤️ 1
    @liuzimin 如果预设这种场景那就是设备本身可以定期更新类似 token 的令牌,通过证书等手段加限制,系统间通过令牌来识别设备。设备证书定期下发续期。
    ssiitotoo
        47
    ssiitotoo  
       7 天前
    只允许公司出口和 vpn 地址访问 非办公区需要使用 vpn 才能访问
    imherer
        48
    imherer  
    OP
       7 天前
    @zgzhang #45 其实现在账密登录后已经就是零信任了,因为每次和服务端交互都验证了是否已经登录过。
    不过零信任这个还可以再深究下看看有没有东西可以做
    zgzhang
        49
    zgzhang  
       7 天前
    @imherer 你理解的零信任不对,你说的只是登录验证,https://www.aliyun.com/product/security/csas ,参考类似的产品
    impaa
        50
    impaa  
       7 天前 via Android
    azure ad 可以做到,配合條件式存取,裡面有設備 id ,如果 edge 直接支持,如果 chrome 要安裝微軟出的插件
    Karte
        51
    Karte  
       7 天前
    @liuzimin 抱歉, 对于桌面端这个我不太了解. 不过可以先通过 AI 询问是否有相关方案.

    不过如果使用的是 NextJs 相关框架, 需要确保类似的框架是否能够调用系统底层 API.
    NSAgold
        52
    NSAgold  
       7 天前 via Android
    配个客户端证书
    mooyo
        53
    mooyo  
       7 天前
    你这个标准的 zero trust 需求,用户和你能连接到国际互联网的话,使用 cloudflare zero trust 免费版就能解决了。 添加一个 application ,使用邮箱验证,把用户的邮箱加进去,每次打开的时候需要使用邮箱获得一个验证码进入。
    mooyo
        54
    mooyo  
       7 天前
    @mooyo 国内的云厂商也有提供类似的功能,但应该都是收费的,免费的我暂时就看到 CF 这家。
    xiayun
        55
    xiayun  
       7 天前
    ssl 双向证书认证? sso ?
    liuzimin
        56
    liuzimin  
       7 天前
    说到零信任准入,我找到一个叫 NetBird 的开源项目,看上去好像可以满足要求。https://github.com/netbirdio/netbird?tab=readme-ov-file
    fiveStarLaoliang
        57
    fiveStarLaoliang  
       7 天前
    可以考虑硬件令牌( HOTP ),类似于 U 盾,一机一码单点登录,这样就算泄密,也能追踪到个人
    internelp
        58
    internelp  
       7 天前
    可用的方案:
    1 、客户端证书
    2 、HTTP basic auth
    3 、VPN
    irisdev
        59
    irisdev  
       7 天前
    楼上好多说 vpn 的,vpn 可以限制指定设备安装吗
    IvanLi127
        60
    IvanLi127  
       7 天前
    首先设备是受控的,如果不是,没得做。

    然后 mtls 就行了。
    54xavier
        61
    54xavier  
       7 天前
    @mightybruce #6 我也觉得这个方案 OK ,只要浏览器登录过一次 给这个账号记录一次浏览器指纹,之后这个账号都只能是这个指纹才能登录,指纹不对了就需要重新申请绑定新指纹
    n18255447846
        62
    n18255447846  
       6 天前
    webauthn 不用账密基于设备,新的浏览器原生 api
    liuzimin
        63
    liuzimin  
       6 天前   ❤️ 1
    @irisdev tailscale 后台就可以开启设备接入认证,每个新设备都需要管理员去后台 approve 允许了才能接入。所以我觉得原理上讲 vpn 限制设备是行得通的。
    xugj
        64
    xugj  
       6 天前
    多年前做过现在也一直在用,客户端是桌面程序获取本级 MAC 地址并在服务端绑定,客户端发送 MAC 地址、局域网 IP 等信息服务端验证通过调用浏览器打开指定地址;不知道这样会不会有什么安全隐患?
    han3sui
        65
    han3sui  
       6 天前
    每次登录加个短信验证码
    kalthus
        66
    kalthus  
       6 天前
    记得很多年前有过类似的需求,当时是写了个 activex 获取设备的 mac 地址(现在好像没有 activex 了?)
    imherer
        67
    imherer  
    OP
       6 天前
    @zgzhang #49 那确实是理解错了,为以为的零信任是任何一次交互都是不可信的都要验证呢
    imherer
        68
    imherer  
    OP
       6 天前
    @liuzimin #36 是的。感觉目前相对来说好一点的可能就是浏览器指纹吧,但是还要解决诸如浏览器版本升级后重新申请绑定
    chanChristin
        69
    chanChristin  
       6 天前
    我们用的就是 ip 白名单,至于没有公网 ip 或者没有固定 ip 的用户就给他们加临时白名单,大部分时间都是在固定场所登录的。
    wangyzj
        70
    wangyzj  
       6 天前
    浏览器指纹
    JEME
        71
    JEME  
       6 天前 via Android
    你是否在找,堡垒机,或者特权访问系统
    listenerri
        72
    listenerri  
       6 天前
    为什么不用系统防火墙呢,针对业务端口设置 IP 白名单
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   1021 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 29ms · UTC 20:00 · PVG 04:00 · LAX 12:00 · JFK 15:00
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.