我有一个 openVPN 设置,用户可以不是在运行 openVPN 的 Debian VM 上拥有 shell 帐户。我在 Google 上找到的文章都包含为传统 *nix 用户设置 Google Authenticator 的说明(例如,需要在用户的主目录中执行 Authenticator 二进制文件)。
是否有文档解释如何将 Google Authenticator 集成到仅基于.ovpn
客户端使用的文件进行身份验证的 openvpn 服务器?
我在看https://github.com/evgeny-gridasov/openvpn-otp,但仍需要配置Google Authenticator。
答案1
不可以。当然你不能这么做。这会违背 2FA 的初衷。你的服务器必须有一种方法可以验证用户凭证,并且此信息不应通过网络发送(即您不能单独使用 client.ovpn 文件)。
虽然您不一定非要创建 unix 用户,但您必须让用户将他们的验证码安装到服务器上。您可以使用虚拟用户已颁发的证书使用 sftp、使用客户端(相互)授权的 https、CIFS(samba)或使用 TLS 扩展的旧 ftp,或者任何其他让服务器知道用户创建的验证码的方式。通信通道应该是安全的(加密 || 本地)。
当然,如果您的用户上传自己的文件,您就无法使用 openvpn-otp 使用的基于聚合文件的凭据。幸运的是,我们还有另一个(更好的)选择,那就是使用 Linux 出色的安全模块 pam。
首先,您必须使用上述方法之一将 google-authenticator 创建的用户文件收集到目录中。在我们的例子中,它将是 /etc/google-auth。
你必须强制所有文件使用单一用户 ID,因为你没有真正的用户。开放VPN。权限必须是 0400 (-r--------)。Pam 不喜欢世界/组可读凭据(当然)。您可以使用 samba、apache、ftp 或在最坏的情况下使用 cron 选项卡(不推荐)轻松强制执行此操作。
为了测试目的,只需执行以下操作:
mkdir /etc/google-auth
apt-get install libpam-google-authenticator
google-authenticator
# set up as you wish, save image and/or codes
mv ~/.google_authenticator /etc/google-auth/some_username
chown -R openvpn /etc/google-auth
之后,您要求 openvpn 针对 libpam 进行身份验证,它有自己的 google auth 模块。将其附加到您的 openvpn 服务器文件中:
plugin /usr/lib/openvpn/openvpn-plugin-auth-pam.so openvpn
这表示我们将使用 pam 身份验证方法和 pam auth id开放VPN。
现在,为 openvpn 创建 pam 设置。编辑 /etc/pam.d/openvpn:
auth requisite /lib/security/pam_google_authenticator.so secret=/etc/google-auth/${USER} user=openvpn
account required pam_permit.so
这里我们说,如果没有成功的谷歌身份验证,我们将立即失败(必要条件),我们使用一个特殊的秘密文件而不是默认的 $HOME/.google_authenticator(secret=),并且我们以用户 openvpn 的身份访问文件,因为我们的用户没有真正的用户 ID。在下一行中,我们只说我们允许每个人在成功身份验证后连接。当然,您应该在这里实施自己的权限策略。您可以使用相应的 pam 模块通过文件、mysql db 或 ldap 控制允许的用户。
将其附加到您的 openvpn 客户端文件中
auth-user-pass
auth-nocache
reneg-sec 0
我们使用 auth-user-pass 让 openvpn 客户端询问用户名和密码。我们不喜欢缓存(“密码”会改变),出于同样的原因,定期重新协商对我们来说也不好。
之后,您应该能够在没有 openvpn-otp 的情况下进行连接。请考虑这是一种更加灵活的方法,因为如果您愿意,您可以在 pam 控制文件中实现非常复杂的规则。例如,您可以根据您的 mysql 或 ldap 目录启用/禁用用户,而无需触及这些证书。
答案2
设置:在 Ubuntu Server 18.04.4 LTS 上为 Raspberry Pi 安装带 2FA(Google Authenticator)的 OpenVPN 服务器 硬件:Raspberry Pi 3 Model B+ Rev 1.3
- 你必须使用没有活动 2FA 登录设置的 Linux 用户登录(我的情况是 someuser)
- 输入以下命令
sudo apt install libqrencode3 libpam-google-authenticator google-authenticator sudo mv /home/someuser/.google_authenticator /etc/google-auth/someuser sudo chown -R root /etc/google-auth
- 将以下文件添加到您的 openvpn 配置文件中(在我的情况下为 /etc/openvpn/server/server.conf)
plugin /usr/lib/aarch64-linux-gnu/openvpn/plugins/openvpn-plugin-auth-pam.so openvpn
- 创建文件 /etc/pam.d/openvpn 并填充以下内容
# Google Authenticator auth requisite /lib/aarch64-linux-gnu/security/pam_google_authenticator.so secret=/etc/google-auth/someuser user=root account required pam_permit.so
- 将以下 3 行添加到你的 openvpn 客户端文件中
auth-user-pass auth-nocache reneg-sec 0
- 重启 openvpn 服务并运行测试
systemctl restart openvpn@server
- 当与 OpenVPN 客户端(在 Windows 10 中)连接时,您会获得额外的登录名(用户:someuser / 密码:'来自 Google Authenticator 的 OTP')