三步认证?


9

我正在使用Ubuntu。

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

我要两个人独立工作,但从来没有能够使他们一起工作。我敢肯定,这是有可能的。

谢谢。


通常,您不会因重复因素而获得太多收益。证书和代码生成器符合“您拥有的东西”要素。密码符合“您所知道的”。另一个常见因素是“您是什么”(生物计量学)。
Zoredache

Answers:


8

通过将PAM模块链接在一起可以实现此目的。但是在我进入任何细节之前:

错误配置PAM可以并且将阻止您登录系统

值得庆幸的是,您始终可以启动到单用户模式并解决问题,但是请注意,PAM并不是您想要的多余东西。

无论如何,其背后的想法是可以利用堆叠的PAM模块来确保pam-google-authenticatorpam_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-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

替换<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中找到


很好的答案!如果我可以多次投票支持,那我会。
亚伦·米勒

谢谢!虽然-对于证书登录我加入我的公钥到的.ssh / authorized_keys文件(使用sshd_config中的RSA验证和Pubkey验证设置),并为OTP代码我使用pam_google_authenticator - google-authenticator.googlecode.com/hg。那怎么办?
Jesse W

@JesseW为此,您需要将SSHD设置为使用PAM以及公共密钥。虽然我确信我不是在细节,你肯定会需要设置ChallengeResponseAuthenticationUsePAM为“是”,然后设置我的回答上面详细到要么上将/etc/pam.d/sshd或/etc/pam.d/common线-auth,取决于您是要对所有登录名还是仅对SSH执行此操作。切记删除“ pam_certificate_auth.so”填充行并修改[success = <n>”行。
Xenopathic 2013年

2

我阅读了这篇文章,并认为它听起来很酷-这就是我如何使三要素身份验证起作用的方法。我在这里写了一篇关于它的博客文章。

基本上,我在PAM中设置了Google Authenticator和密码,然后在OpenSSH中设置了公钥认证(这绕过了其他两个),最后OpenSSH要求也通过PAM进行认证(最后一行)

从/ etc / ssh / sshd_conf

PubkeyAuthentication yes
ChallengeResponseAuthentication yes
PasswordAuthentication no
UsePAM yes
AuthenticationMethods publickey,keyboard-interactive

1

仅需将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

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.