我们有一个企业 VPN 服务器,在 AWS 实例上运行 OpenVPN 2.3,使用 Ubuntu 16.04 Xenial。该服务器已使用 Ansible playbook 进行配置。
我计划升级到 Ubuntu 18.04 Bionic,它还会将 OpenVPN 升级到版本 2.4(这是一个理想的副作用,因为 OpenVPN 2.3 即将被弃用)。因此,我创建了一个带有 Bionic 的测试实例,并针对它运行了 Ansible 剧本。配置包括通过 Google Authenticator 进行 MFA,因此我还~/.google_authenticator
从旧服务器复制了文件并应用于chmod 400
它。
在新服务器运行之前,我还必须解决一些兼容性问题:
openvpn-plugin-auth-pam.so
文件位置已改变,现在不需要在服务器配置中指定其完整路径。CAP_AUDIT_WRITE
systemd 服务缺少权限openvpn
(查看更多详细信息这里)
但是,即使在此之后,新服务器上的身份验证仍然会失败。以下是我的/etc/pam.d/openvpn
身份验证结果:
auth required pam_google_authenticator.so
如果我用 替换此行auth required pam_permit.so
,我就会成功通过身份验证(当然可以使用任何密码)并建立连接,所以问题肯定是 MFA 介入的地方。
同时,pamtester
告诉我pam_google_authenticator.so
工作正常:
$ sudo pamtester openvpn vlad authenticate
Verification code:
pamtester: successfully authenticated
这是我尝试向 VPN 服务器进行身份验证时在系统日志中看到的内容:
Aug 16 15:17:39 ip-10-7-0-230 openvpn[10873]: AUTH-PAM: BACKGROUND: received command code: 0
Aug 16 15:17:39 ip-10-7-0-230 openvpn[10873]: AUTH-PAM: BACKGROUND: USER: vlad
Aug 16 15:17:39 ip-10-7-0-230 openvpn[10873]: AUTH-PAM: BACKGROUND: my_conv[0] query='login:' style=2
Aug 16 15:17:39 ip-10-7-0-230 openvpn[10873]: AUTH-PAM: BACKGROUND: user 'vlad' failed to authenticate: Authentication failure
在此主题我发现一个建议,服务器配置中调用 auth-pam 模块的行应该从
plugin openvpn-plugin-auth-pam.so openvpn
到:
plugin openvpn-plugin-auth-pam.so "openvpn login USERNAME password PASSWORD"
然而,它们似乎都不起作用——我仍然收到“身份验证失败”的信息。
有趣的是,在 Xenial 的基础上重建服务器的相同实验成功了 - 所以问题似乎出在 Ubuntu Bionic(一些额外的安全功能?)或 OpenVPN 2.4(一些兼容性问题)上。
有人知道如何解决这个问题吗?
更新。刚刚尝试添加nullok
和/etc/pam.d/openvpn
删除~/.google_authenticator
文件。仍然失败,同样的错误。
答案1
Ubuntu 18.04 及更高版本在 systemd 中使用更严格的沙盒配置,这会干扰 google-authenticator。
只需编辑并删除此行:/lib/systemd/system/[email protected]
[Service]
...
ProtectHome=true
这是 systemd 的一项新功能,它使包含“用户”内容的目录显示为空,例如/home
、/root
和/run/user
启用此功能通常是一个好主意,因为它/home
通常包含 SSH 和 GPG 密钥,但在这种情况下,它会阻止 OpenVPN 读取.google-authenticator
用户主目录中的文件。
更多信息: