OpenVPN 2.4 + Google 身份验证器 = 身份验证失败

Vla*_*rov 5 openvpn pam google-authenticator ubuntu-18.04

我们有一个企业 VPN 服务器,在装有 Ubuntu 16.04 Xenial 的 AWS 实例上运行 OpenVPN 2.3。服务器已使用 Ansible playbook 进行配置。

我计划升级到 Ubuntu 18.04 Bionic,它还将 OpenVPN 升级到 2.4 版(这是一个预期的副作用,因为 OpenVPN 2.3 已被弃用)。所以我创建了一个带有 Bionic 的测试实例,并针对它运行了 Ansible playbook。配置包括通过 Google Authenticator 的 MFA,所以我也~/.google_authenticator从旧服务器复制文件并应用chmod 400到它。

在新服务器工作之前,我还必须解决一些兼容性问题:

  • openvpn-plugin-auth-pam.so 文件位置已更改,现在无需在服务器配置中指定其完整路径。
  • CAP_AUDIT_WRITEopenvpnsystemd 服务中缺少权限(在此处查看更多详细信息)

但是,即使在该身份验证之后,新服务器上的身份验证仍然失败。这是我的/etc/pam.d/openvpn样子:

auth required pam_google_authenticator.so
Run Code Online (Sandbox Code Playgroud)

如果我用 替换这一行auth required pam_permit.so,我将成功通过身份验证(当然使用任何密码)并连接,所以问题肯定是 MFA 介入的地方。

同时,pamtester告诉我pam_google_authenticator.so工作正常:

$ sudo pamtester openvpn vlad authenticate
Verification code:
pamtester: successfully authenticated
Run Code Online (Sandbox Code Playgroud)

这是我在尝试对 VPN 服务器进行身份验证时在 syslog 中看到的内容:

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
Run Code Online (Sandbox Code Playgroud)

这个线程中,我发现了一个建议,即服务器配置中调用 auth-pam 模块的行应该从

plugin openvpn-plugin-auth-pam.so openvpn
Run Code Online (Sandbox Code Playgroud)

到:

plugin openvpn-plugin-auth-pam.so "openvpn login USERNAME password PASSWORD"
Run Code Online (Sandbox Code Playgroud)

但是,它们似乎都不起作用 - 我仍然收到“身份验证失败”。

有趣的是,在 Xenial 的基础上重建服务器的相同实验有效 - 所以问题似乎出在 Ubuntu Bionic(一些额外的安全功能?)或 OpenVPN 2.4(一些兼容性问题)中。

有没有人有任何想法如何解决这个问题?

更新。只是尝试添加nullok/etc/pam.d/openvpn和删除~/.google_authenticator文件。仍然失败,同样的错误。

小智 2

Ubuntu 18.04 及更高版本在 systemd 中使用更严格的沙箱配置,这会干扰 google-authenticator。

只需编辑/lib/systemd/system/openvpn@.service并删除此行:

[Service]
...
ProtectHome=true
Run Code Online (Sandbox Code Playgroud)

这是 systemd 的一项新功能,它使包含“用户”内容的目录显示为空,例如/home/root/run/user

启用此功能通常是一个好主意,因为它/home通常包含 SSH 和 GPG 密钥,但在这种情况下,它会阻止 OpenVPN 读取.google-authenticator用户主目录中的文件。

更多信息: