我读过WireGuard 规范,WireGuard 似乎本身不支持任何类型的用户身份验证(例如 LDAP 或类似的东西)。任何拥有服务器公钥且其 IP 地址为白名单在服务器配置中,即可连接。
是否有人知道任何提供用户身份验证的 WireGuard 扩展或实现?
答案1
隧道的每一端都有自己生成的密钥和派生的公钥(在连接的另一端定义为“对等方”)。要按照您写的方式操作,您需要在“客户端”之间共享私钥,这是您能做的最糟糕的事情(从技术上讲您可以,但我希望没有人会想到这一点)。
让我们思考一下“客户端与服务器”的角色:
服务器
- 拥有密钥
- 包含所有可能的对等方/用户的列表
- 每个客户表示为自己的同侪在服务器端使用相关公钥定义客户
客户
- 拥有密钥
- 一个同侪使用公钥定义服务器
我们可以说,客户端使用单因素身份验证进行身份验证,并且使用客户端的公钥实现身份验证。
- 授予新客户访问权限意思是在服务器端增加一个对等定义(无需重启VPN/无需中断所有当前VPN会话即可实现)。
- 撤销当前客户端的访问权限意味着删除服务器端的对等定义(同样,无需重新启动 VPN 即可完成 - 关闭所有当前会话)。
如果我正确理解了您的问题,那么此“功能”在 WireGuard 中是开箱即用的,无需任何扩展。
答案2
正如 @Kamil 所说,WireGuard 的概念与其他 VPN 解决方案略有不同。我也是在不久前开始使用它的,如果您想实现使用现有身份验证的功能,您可以按照我在一些项目中看到的方式获得它:
- 使用您喜欢的方法以及 2FA 对您的用户进行身份验证,无论您想要什么。
- 用户认证成功后,客户端会生成一个临时密钥对。
- 通过安全连接,客户端将公钥发送到服务器,获取其配置(端点、服务器公钥等......)
- 客户端连接到 VPN
- 当用户注销或会话过期时,服务器可以从 WireGuard 端点中删除该对等体。
当然,所有这些都可以在客户端和服务器端自动完成。
答案3
为了扩展@Securez的建议,将SSH之类的东西与Wireguard结合起来怎么样?这里的想法是SSH提供所需的“身份验证”服务,而Wireguard在对等方成功验证后提供安全隧道。
例如(在 Linux 上),
配置 SSH 以启用多种身份验证方法,例如
AuthenticationMethods "publickey,keyboard-interactive"
接下来,使用 oathtool 之类的工具为 SSH 实现公钥 + 密码 + TOTP 身份验证的组合(这也可以包含基于 LDAP 的身份验证或 SSH 支持的几种身份验证方法的任意组合,但肯定包含基于密钥的身份验证)
然后配置
/etc/ssh/sshrc
调用一个脚本,该脚本根据用户登录 SSH 的情况,向 Wireguard 添加一个对等点(也可以选择在防火墙上为用户的 IP 地址打开 WG 端口,例如 iptables)
然后用户按如下方式连接(可以使用简单的脚本自动完成):
- 通过 SSH 连接到远程对等体
- 身份验证成功后,断开 SSH 并激活 Wireguard 连接
可以安排一个 cron 作业来检查自每个活动对等体最近一次握手以来经过的时间,如果时间大于指定的间隔,例如 180 秒(意味着对等体不再连接),则踢出该对等体(并且如果适用,关闭防火墙端口)。
如果您不需要连接用户能够通过 SSH 进入远程对等点,则可以将用户 shell 设置为/sbin/nologin
。此外,为了使调用的脚本/etc/ssh/sshrc
能够将对等点添加到 Wireguard,该脚本将需要 sudo 访问权限。可以使用 中的以下内容来限制该风险/etc/sudoers
:
%wireguard-users ALL=NOPASSWD: /path/to/add-wg-peer
其中wireguard-users
是您要添加所有 Wireguard 用户的组。理想情况下,脚本add-wg-peer
不应接受任何参数,以限制滥用。
这种设置的好处:
- 使用经过充分测试、已建立的现成组件
- 公钥 + 密码 + TOTP 的组合满足以下要求:a. 您知道的东西,以及 b. 您拥有的东西,可以减轻受损对等体获得未经授权的访问的风险
- 如果实施防火墙功能,则可以通过限制 Wireguard 对授权 IP 地址的访问来进一步减少攻击面(并且还可能解决被确定为Wireguard 中的已知限制)
缺点:
- 您刚刚将 SSH 暴露给公共互联网 :o
- 这里未涵盖的所有其他内容
想法、观察、批评?我真的很想知道这样的设置可能导致哪些潜在的陷阱。