Answers:
通过将PAM模块链接在一起可以实现此目的。但是在我进入任何细节之前:
错误配置PAM可以并且将阻止您登录系统
值得庆幸的是,您始终可以启动到单用户模式并解决问题,但是请注意,PAM并不是您想要的多余东西。
无论如何,其背后的想法是可以利用堆叠的PAM模块来确保pam-google-authenticator
,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块上方:
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文件,并且使自己熟悉单用户模式以及在紧急情况下如何还原旧文件。此配置尚未经过我的测试,但可以正常工作。
要进行第一次测试,请打开一个或两个根外壳,然后将其放置。如果发生任何问题,它们将作为备用,因为您可以轻松地用备份替换common-auth。然后,进行这些更改。接下来,尝试使用su
登录到您的用户帐户-您需要完成三步身份验证过程。
该pam_succeed_if.so
模块的完整文档可在http://linux.die.net/man/8/pam_succeed_if中找到
ChallengeResponseAuthentication
并UsePAM
为“是”,然后设置我的回答上面详细到要么上将/etc/pam.d/sshd或/etc/pam.d/common线-auth,取决于您是要对所有登录名还是仅对SSH执行此操作。切记删除“ pam_certificate_auth.so”填充行并修改[success = <n>”行。
我阅读了这篇文章,并认为它听起来很酷-这就是我如何使三要素身份验证起作用的方法。我在这里写了一篇关于它的博客文章。
基本上,我在PAM中设置了Google Authenticator和密码,然后在OpenSSH中设置了公钥认证(这绕过了其他两个),最后OpenSSH要求也通过PAM进行认证(最后一行)
从/ etc / ssh / sshd_conf
PubkeyAuthentication yes
ChallengeResponseAuthentication yes
PasswordAuthentication no
UsePAM yes
AuthenticationMethods publickey,keyboard-interactive