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

Web 如何限制访问设备

  •  
  •   imherer · 36 天前 · 4869 次点击
    这是一个创建于 36 天前的主题,其中的信息可能已经有所发展或是发生改变。

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

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

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

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

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

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

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

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

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

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

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