三步验证?

Jes*_*e W 9 ssh authentication sshd two-factor-authentication

我正在使用 Ubuntu。

我只是想知道是否可以将 libpam-google-authenticator(它允许您使用手机生成的代码登录)和证书身份验证设置为协同工作,如果可能,我将如何处理设置它。因此 - 为了登录我的帐户,您必须拥有我的密码、我的电话(及其密码)以及我的证书/私钥及其密码。

我已经让他们独立工作,但从来没有让他们一起工作。不过,我相信在某种程度上这是可能的。

谢谢。

Xen*_*hic 8

可以通过将 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
Run Code Online (Sandbox Code Playgroud)

这告诉 PAM 应该pam_unix.so成功,它将跳过接下来的两个规则(通常是另一个身份验证模块,然后是pam_deny.so)并继续执行可选模块。但是,如果模块失败,那么它将被忽略,并且控制权将传递到链中的下一个模块。这将继续向下每个身份验证模块,直到控制跳到可选块,或者 PAM 命中 pam_deny.so 并在那里失败。

这可以被利用来保证pam-google-authenticatorpam_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
Run Code Online (Sandbox Code Playgroud)

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

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

在做任何这些之前,我会备份 common-auth 文件,并让自己熟悉单用户模式以及如何在紧急情况下恢复旧文件。这个配置没有经过我的测试,但它应该可以工作。

第一次测试时,打开一两个 root shell,让它们单独待着。如果出现任何问题,这些可以作为后备,因为您可以轻松地用备份替换 common-auth。然后,进行这些更改。接下来,尝试使用su登录到您的用户帐户 - 您应该需要通过三步验证过程。

pam_succeed_if.so模块的完整文档可以在http://linux.die.net/man/8/pam_succeed_if找到