![三步验证?](https://linux22.com/image/1366902/%E4%B8%89%E6%AD%A5%E9%AA%8C%E8%AF%81%EF%BC%9F.png)
我正在使用 Ubuntu。
我只是想知道是否可以将 libpam-google-authenticator(允许您使用手机生成的代码登录)和证书身份验证设置为一起工作,如果可以,我将如何设置它。因此 - 为了登录我的帐户,您必须拥有我的密码、我的手机(及其密码)以及我的证书/私钥及其密码。
我已经让它们独立工作,但从未能让它们一起工作。不过我相信这是有可能的。
谢谢。
答案1
可以通过将 PAM 模块链接在一起来实现这一点。但在我详细介绍之前:
错误配置 PAM 会阻止你登录系统
值得庆幸的是,您始终可以启动到单用户模式并解决问题,但请注意,PAM 并不是您想要在必要的情况下进行操作的东西。
pam-google-authenticator
无论如何,其背后的想法是,可以利用堆叠 PAM 模块来确保pam_unix
(这将检查您的密码)和证书模块都必须成功才能允许您访问。默认情况下,PAM 配置为允许任何身份验证模块对您进行身份验证,而跳过其他模块。
在 /etc/pam.d/common-auth 中,您将在顶部附近看到类似以下内容的一行:
auth [success=2 default=ignore] pam_unix.so nullok_secure try_first_pass
这告诉 PAM,如果pam_unix.so
成功,它将跳过接下来的两个规则(通常是另一个身份验证模块,然后是pam_deny.so
),然后继续执行可选模块。但是,如果模块失败,它将被忽略,控制权将传递给链中的下一个模块。这将继续执行每个身份验证模块,直到控制权跳转到可选块,或者 PAM 遇到 pam_deny.so 并立即失败。
这可确保pam-google-authenticator
和pam_unix.so
您的证书 PAM 模块均成功,以便允许您访问。我不知道您使用的 Google 身份验证器模块或证书模块的名称,但您应该能够在 common-auth 文件中找到它们。因此,通过在顶部放置类似这样的内容:
auth requisite pam_unix.so nullok_secure
auth requisite pam_google_authenticator.so
auth requisite pam_certificate_auth.so
auth [success=<n>] pam_permit.so
<n>
用此处 pam_permit.so 模块和下一个模块之间的模块数量进行替换pam_permit.so
- 换句话说,应该将其设置为最顶层 auth 模块的 [success=n default=ignore] 代码 + 1。这种语法有点奇怪,但本质上会在上述模块成功后跳过 auth 模块。
当然,您可能想知道如何将此三步身份验证限制在您的用户帐户上。这可以通过模块完成pam_succeed_if.so
,并应插入上述三步身份验证块上方:
auth [success=ignore default=4] pam_succeed_if.so user = <username>
其中<username>
替换为您的用户名。此行只是表示,如果 pam_succeed_if.so 成功(即您的用户名与该行上的用户名匹配),则 PAM 应继续执行下一个模块,即三步身份验证模块。否则,PAM 应跳转到实际模块,这些模块距离此模块有 4 个模块。
要匹配多个内容,例如匹配某个组的成员身份以及某个用户名,必须使用多行,例如:
auth [success=1 default=ignore] pam_succeed_if.so user = <username>
auth [success=ignore default=4] pam_succeed_if.so user ingroup <group>
在执行任何操作之前,我会备份 common-auth 文件,并熟悉单用户模式以及如何在紧急情况下恢复旧文件。此配置尚未经过我的测试,但它应该可以工作。
首次测试时,请打开一个或两个 root shell,然后让它们保持原样。如果出现任何问题,它们将充当后备,因为您可以轻松地用备份替换 common-auth。然后,进行这些更改。接下来,尝试使用su
登录到您的用户帐户 - 您需要完成三步身份验证过程。
该模块的完整文档pam_succeed_if.so
可以在以下位置找到http://linux.die.net/man/8/pam_succeed_if
答案2
我读了这篇文章,觉得很酷——下面是我如何让三因素身份验证发挥作用的。我写了一篇关于它的博客文章这里。
基本上,我在 PAM 中设置了 Google Authenticator 和密码,然后在 OpenSSH 中设置了公钥身份验证(这会绕过另外两个),最后 OpenSSH 要求也通过 PAM 进行身份验证(最后一行)
来自 /etc/ssh/sshd_conf
PubkeyAuthentication yes
ChallengeResponseAuthentication yes
PasswordAuthentication no
UsePAM yes
AuthenticationMethods publickey,keyboard-interactive
答案3
您只需将 Pubkey + GoogleAuth 添加到 /etc/pam.d/sshd 的顶部
#auth requisite pam_unix.so nullok_secure #if you want password, too :)
auth requisite pam_google_authenticator.so
auth [success=2] pam_permit.so
我假设您有 OpenSSH >= 6.2 并且 sshd_config 已编辑
为了更加严密的安全性,请添加一些额外的配置:D