示例PAM模块演示了两因素身份验证,以通过SSH,OpenVPN等登录服务器,等等。
该项目并不是要登录Google,Facebook或其他TOTP/HOTP第二因素系统,即使他们建议使用Google Authenticator应用程序。
RFC 4226中指定了基于HMAC的一次性密码(HOTP),RFC 6238中指定了基于时间的一次性密码(TOTP)。
./bootstrap.sh
./configure
make
sudo make install如果您无法访问“ sudo”,则必须在调用“ make install”之前手动成为“根”。
为了获得最高的安全性,请确保即使密码和/或OTP不正确,请要求密码和OTP。这意味着至少是pam_unix.so的第一个(或其他用于验证密码的任何其他模块)和pam_google_authenticator.so索应根据required设置,而不是requisite 。两者都可能不受required ,但这可能取决于您的PAM配置的其余部分。
如果您使用HOTP(基于计数器而不是基于时间的计数器),请添加选项no_increment_hotp以确保计数器不会因失败尝试而增加。
将此行添加到您的PAM配置文件:
auth required pam_google_authenticator.so no_increment_hotp
运行google-authenticator二进制文件,以在主目录中创建一个新的秘密密钥。这些设置将存储在~/.google_authenticator中。
如果您的系统支持“ libqrencode”库,则将显示您可以使用Android“ Google Authenticator”应用程序扫描的QRCode。
如果您的系统没有此库,则可以遵循google-authenticator输出的URL,或者必须手动输入Android“ Google Authenticator”应用程序中的字母数字秘密键。
无论哪种情况,在添加了键后,单击“和”,直到上下文菜单显示为止。然后检查键的验证值是否匹配(此功能在Android应用程序的所有构建中都不可用)。
每次登录系统时,都将在输入正常用户ID后,根据给google-authenticator选项,提示您的TOTP代码(基于时间的password)或HOTP(基于计数)(基于计数器)(基于计数器)(基于计数器)和您的普通UNIX帐户密码。
在最初的推出过程中,您可能会发现并非所有用户都创建了一个秘密密钥。如果您仍然希望它们能够登录,则可以在模块的命令行上传递“ nullok”选项:
auth required pam_google_authenticator.so nullok
如果您的系统对主目录进行加密,直到用户输入密码后,您要么必须在询问OTP代码之前重新安排PAM配置文件中的条目以解密主目录,要么必须将秘密文件存储在一个非标准位置:
auth required pam_google_authenticator.so secret=/var/unencrypted-home/${USER}/.google_authenticator
将是一个可能的选择。确保设置适当的权限。您还必须告诉用户手动将他们的.google_authenticator文件移至此位置。
除了“ $ {user}”外, secret=选项还识别“〜”和${HOME}作为用户主目录的短手。
使用secret=选项时,您可能还需要设置user=选项。后者强迫PAM模块在执行任何文件操作之前切换到专用的硬编码用户ID。使用user=选项时,您不得在文件名中包含“〜”或“ $ {home}”。
如果您想对系统上没有传统的UNIX帐户的用户进行身份验证,则user=选项也很有用。
请参阅上面的“加密主目录”。
覆盖默认令牌提示。如果要在提示中包含空格,请将整个参数包裹在方括号中:
auth required pam_google_authenticator.so [authtok_prompt=Your secret token: ]
在执行任何文件操作之前,请强迫PAM模块切换到硬编码的用户ID。通常用于secret= 。
危险选择!
默认情况下,PAM模块要求必须拥有Secrets File,用户登录(或指定了user= ,由该用户拥有)。此选项禁用检查。
此选项可用于允许守护程序未作为根而运行,以处理该用户不拥有的配置文件,例如用户本身拥有的配置文件。
危险选择!
默认情况下,PAM模块需要仅由文件的所有者(默认情况下模式0600)才能读取秘密文件。在非默认配置中使用该模块的情况下,管理员可能需要更宽松的文件权限或用于其用例的特定设置。
在系统日志中启用更多的详细日志消息。
一些PAM客户端不仅可以提示用户获取密码。为了解决此问题,此PAM模块支持堆叠。如果通过forward_pass选项,则pam_google_authenticator模块在单个提示中查询用户的系统密码和验证代码。然后,它将系统密码转发到下一个PAM模块,必须使用use_first_pass选项配置。
反过来, pam_google_authenticator模块还支持标准use_first_pass和try_first_pass选项。但是,大多数用户无需在pam_google_authenticator上设置这些用户。
如果您发现您的TOTP代码永远无法正常工作,则最常见的是服务器上时钟的结果与Android设备上的时钟不同。 PAM模块试图补偿时间偏斜。您可以通过尝试连续将其记录3次来教它有关您所经历的偏斜量。确保您始终等待30秒(但不会更长),以便获得三个不同的TOTP代码。
一些管理员更喜欢自动调整时间偏斜,因为这样做会导致系统配置略有安全。如果要禁用它,则可以在模块命令行上这样做:
auth required pam_google_authenticator.so noskewadj
不要为失败的HOTP尝试增加计数器。通常,您应该设置此攻击者而没有令牌的攻击者尝试失败的密码尝试,不要锁定授权用户。
如果尚未设置OTP,则允许用户在没有OTP的情况下登录。
PAM需要至少一个SUCCESS答案,而nullok使该模块IGNORE 。这意味着,如果使用此选项至少一个其他模块必须说SUCCESS 。一种方法是auth required pam_permit.so添加到PAM配置的末尾。
默认情况下,PAM模块在用户输入时不会回荡验证代码。在某些情况下,管理员可能更喜欢不同的行为。将echo_verification_code选项传递到模块以启用回声。
如果您想要基于计数器而不是基于时间表的验证代码,请使用google-authenticator二进制代码在主目录中以适当的选项生成秘密键。在此模式下,时钟偏差是无关紧要的,窗口尺寸选项现在适用于当前被接受的代码以外的代码,以减少同步问题。
如果存在和非零,则提供宽限期,在此期间不会要求第二个验证代码。尝试将秒设置为86400,以允许在请求代码之间进行全日;或一个小时3600。
成功的一次性通信登录后,通过将(IP地址,时间戳)对添加到安全文件中来起作用;仅跟踪最后十个不同的IP地址。
危险选择!
有了此选项,一个具有填充文件系统(带有Web请求的洪水服务器,或者只有帐户填充磁盘的洪水服务器)的攻击者可以强制可以重复使用一次性通信的情况,从而击败其目的”一度”。
默认情况下,如果定义了grace_period选项,则PAM模块需要一些可用空间来存储最后登录的IP地址和时间戳。如果服务器没有自由空间或更新配置文件错误,它可以防止访问。使用allow_readonly选项,您可以忽略在配置文件更新期间可能发生的任何错误。