![为什么我们在 PAM 中使用可选项,即使它会被忽略?](https://linux22.com/image/127677/%E4%B8%BA%E4%BB%80%E4%B9%88%E6%88%91%E4%BB%AC%E5%9C%A8%20PAM%20%E4%B8%AD%E4%BD%BF%E7%94%A8%E5%8F%AF%E9%80%89%E9%A1%B9%EF%BC%8C%E5%8D%B3%E4%BD%BF%E5%AE%83%E4%BC%9A%E8%A2%AB%E5%BF%BD%E7%95%A5%EF%BC%9F.png)
我们知道,optional
是PAM配置文件中的控制值之一。
选修的:
如果该模块是堆栈中与此服务+类型关联的唯一模块,那么它的成功或失败才是重要的。
我很困惑。
这是/etc/pam.d/login
:
session required pam_selinux.so open
session required pam_namespace.so
session optional pam_keyinit.so force revoke
session include system-auth
session include postlogin
-session optional pam_ck_connector.so
我看到两条规则,即optional
控制和公正的行动。
我假设我们仅将optional
规则用于未经身份验证的目的。是对的吗?
答案1
重要提示:可选模块不会被忽略,它们将被处理,它们的结果将被忽略,即即使失败,身份验证过程也不会中止。
在许多情况下,您可能希望在身份验证期间执行某个操作(要执行的模块),但即使失败,您也不希望身份验证过程中止。
一个实际的例子是,如果您想使用 pam 在登录过程中使用与用户密码相同的密码自动打开 dm-crypt 加密设备:
auth optional pam_exec.so expose_authtok quiet /usr/sbin/cryptsetup --allow-discards open UUID=... /home/username
请注意,如果required
使用 if 而不是optional
此处,则第一次登录将成功,因为 cryptsetup 将返回 0 作为其退出代码,但如果用户注销然后再次登录,则登录将失败,因为设备已打开,并且 cryptsetup 将返回非零退出代码。然而,在这种情况下,您仍然希望登录成功。
这只是我想到的一个例子,因为我实际使用它,即,这不是理论上的情况,但这是您希望失败的模块不会中止身份验证过程的许多情况之一。
答案2
除此以外还有其他实际用途马塞洛的回答:
$ grep 'auth.*optional' /etc/pam.d -R
/etc/pam.d/lightdm:auth optional pam_gnome_keyring.so
/etc/pam.d/lightdm:auth optional pam_kwallet.so
/etc/pam.d/lightdm:auth optional pam_kwallet5.so
/etc/pam.d/gnome-screensaver:auth optional pam_gnome_keyring.so
/etc/pam.d/login:auth optional pam_faildelay.so delay=3000000
/etc/pam.d/login:auth optional pam_group.so
/etc/pam.d/lightdm-greeter:auth optional pam_gnome_keyring.so
/etc/pam.d/lightdm-greeter:auth optional pam_kwallet.so
/etc/pam.d/lightdm-greeter:auth optional pam_kwallet5.so
/etc/pam.d/unity:auth optional pam_gnome_keyring.so
这些都来自 Ubuntu 16.04 VM,我从未接触过 PAM 配置(除了我安装的任何软件包可能有的情况,这就是我怀疑这些pam_kwallet*
行的来源)。
- GNOME 密钥环和 KDE 钱包模块很容易理解:它们解锁您的登录密钥环,其中可能保存您的 SSH 和 GPG 密钥以及浏览器密码。
pam_faildelay.so
提供了一个很好的例子,说明被忽略的模块仍然提供即时、明显的反馈:如果您输入了错误的密码,则让您等待。这是您通常使用的模块optional
,因为成功或失败实际上并不重要。但!pam_faildelay.so
只支持auth
, 所以任何正常使用就可以了auth optional
。