openvpn - 如何配置 PAM 身份验证以组合密码 + OTP 令牌
问题描述
我正在尝试为存储在 IPA 服务器中的用户实现 OpenVPN 服务器的 PAM 身份验证。我的用例需要 PAM 身份验证,而不是 LDAP 身份验证。
在测试中,在 IPA 中配置为仅使用密码进行身份验证的用户可以成功进行身份验证。但是,当 IPA 用户配置为使用密码 + OTP 令牌进行身份验证时,身份验证失败。
如链接@ https://sourceforge.net/p/openvpn/mailman/message/35969399/中所述
我这样配置 /etc/pam.d/openvpn :
auth requisite pam_succeed_if.so uid >= 1000 quiet_success
auth sufficient pam_sss.so otp_in_password
auth required pam_deny.so
account [default=bad success=ok user_unknown=ignore] pam_sss.so
account required pam_permit.so
但身份验证失败,IPA 日志显示无效凭据。
我在其他地方阅读以配置 SSSD 以接受 2FA 值作为密码字段的一部分,因为 OpenVPN 无法询问 PAM 对话的多个提示。但我不确定如何进行该配置。
解决方案
我解决了!
关键是使用更高版本的 sssd。在 2.0.x 版本中,身份验证提示配置变得可用 - re: https://sssd.io/docs/design_pages/prompting_configuration.html
不幸的是,我的 OpenVPN 实例在 Centos 7.8 上运行,它只支持最高版本 1.16。所以我启动了一个已经加载了 sssd 版本 2.2.3 的 Centos 8 VM。Fedora 29 或更高版本也可以。
在 Centos 8 VM 上,我安装并配置了 openVPN 和 free-ipa-client。然后我将 sssd 配置为将密码和 OTP 令牌组合为一个值。
vi /etc/sssd/sssd.conf
将以下部分添加到文件底部:
[prompting/password]
password_prompt = Please enter LDAP password:
[prompting/2fa]
single_prompt = True
first_prompt = Please enter LDAP password + OTP token value:
根据需要更改提示词。它实际上只在从 cli 测试时出现。但最重要的是,我在几个小时后了解到,这两个部分都需要按所示顺序进行。
接下来,通过编辑用于 OpenVPN 服务的文件来配置 pam.d——在我的例子中,该文件名为 openvpn
vi /etc/pam.d/openvpn
添加以下内容:
auth requisite pam_succeed_if.so uid >= 1000 quiet_success
auth sufficient pam_sss.so
auth required pam_deny.so
account [default=bad success=ok user_unknown=ignore] pam_sss.so
account required pam_permit.so
重启sssd和openvpn
systemctl restart sssd
systemctl restart openvpn-server@server
我还按照链接@ https://sourceforge.net/p/openvpn/mailman/message/35969399/中描述的步骤配置FreeIPA。
在本地测试:
- 将 FreeIPA 中的用户配置为仅使用密码。在我的情况下,用户 ID 是 test5
- 切换到服务器上没有 sudo 权限的本地用户
su testuser
- 现在尝试切换到 ipa 用户
su test5
- 应该会提示您 -请输入 LDAP 密码:
- 确认您只能使用密码登录,然后退出回到 testuser
- 现在在 FreeIPA 中配置用户(test5)以使用密码 + OTP
- 在 FreeIPA 中为用户 test5 创建一个令牌
- 再次尝试切换到ipa用户
su test5
- 现在应该提示您 -请输入 LDAP 密码 + OTP 令牌值:
- 尝试仅使用密码登录。尝试应该失败。
- 尝试再次切换到 ipa 用户
su test5
- 应该会提示您 -请输入 LDAP 密码 + OTP 令牌值:
- 尝试使用密码 + OTP 令牌值再次登录。(我使用 Google Authenticator 生成令牌值)。登录应该成功
接下来我从 OpenVPN 客户端进行了测试——使用和不使用 OTP 令牌。
一切正常!
推荐阅读
- c++ - c ++从2个时间点计算经过的秒数
- sql - 如何从不在表中的列表中获取 id?
- powerbi - 如何在 power bi 中更改数据源(不同的结构)
- data-visualization - Tableau 将四分之一合并到 x 轴上的折线图中
- javascript - Oracle Apex:如何将表单中的数字字段限制为仅允许数字?
- r - 我可以用starts_with 对列进行分组吗?
- svg - 如何使用 Snap SVG 获取 SVG 元素的正确位置 - getBBox()
- postgresql - Postgres 计数插入/更新的记录
- reactjs - 我如何在反应中调整大小,拖放图像?
- java - Class.forName("com.mysql.cj.jdbc.Driver")