如何拥有备份pam模块

如何拥有备份pam模块

我目前正在了解 PAM。现在我使用 OTP 和密码,但我希望能够使用 OTP 和密码,如果失败,则使用我的 YubiKey 和密码。我在 Arch 上,pam.d 目录中的系统身份验证文件如下所示:

auth      required  pam_oath.so     usersfile=/etc/users.oath window=30 digits=6 debug
auth      required  pam_unix.so     try_first_pass nullok
auth      optional  pam_permit.so
auth      required  pam_env.so

account   required  pam_unix.so
account   optional  pam_permit.so
account   required  pam_time.so

password  required  pam_unix.so     try_first_pass nullok sha512 shadow
password  optional  pam_permit.so

session   required  pam_limits.so
session   required  pam_unix.so
session   optional  pam_permit.so

答案1

Arch 是 Linux PAM(与 Solaris PAM 和 FreeBSD PAM 不同),Linux PAM 具有跳过规则的方法,因此实现此目的的一种方法是:

auth required pam_unix.so ... # password
auth [success=2 default=bad] pam_yubikey ...
auth [success=1 default=bad] pam_otp ...
auth required pam_deny.so
auth required pam_env.so
...

对于 yubikey,如果有效,应该向下跳两条规则(到env任何后续的身份验证设置步骤),对于 OTP,则向下跳一条规则,否则拒绝身份验证。我不确定这些位default的选项或其他选项[...]应该是什么,所以我将它们设置为失败。

另一个选择是子堆栈,在主规则文件中您将有类似的内容:

...
auth substack otp-foo
auth substack yubikey-foo
...

然后附加/etc/pam.d/{otp-foo,yubikey-foo}文件将执行 if-authgood-or-pam_deny。然而,在这种情况下,两者都会被尝试(Linux PAM 在所有子堆栈中工作),与前面的示例不同,在前面的示例中,如果 yubikey 工作,它将跳过 otp 检查。

答案2

在 thrig 的帮助下,我终于得到了正确的答案,但他的第一个解决方案不起作用,因为 default=bad 会导致堆栈总是失败。我的方法是制作一个 2fa 子堆栈。这次我在 su 而不是 system-auth 上进行了测试。 su PAM 文件如下所示:

#%PAM-1.0
auth            sufficient      pam_rootok.so
# Uncomment the following line to implicitly trust users in the "wheel" group.
#auth           sufficient      pam_wheel.so trust use_uid
# Uncomment the following line to require a user to be in the "wheel" group.
#auth           required        pam_wheel.so use_uid
auth            required        pam_unix.so
auth            substack        2fa
account         required        pam_unix.so
session         required        pam_unix.so

正如您在 pam_unix 之后看到的那样,我包含了子堆栈 2fa,如下所示:

auth sufficient pam_yubico.so id=35659 authfile=/etc/yubikey_mappings debug
auth required   pam_oath.so usersfile=/etc/users.oath window=30 digits=6 debug

因为它位于子堆栈中,所以足够的控制值不会结束整个模块堆栈,而只会结束子堆栈。所以现在如果我的 yubikey 失败,如果我输入正确的密码,我可以使用 OTP。

相关内容