众所周知,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
用于非身份验证目的规则。那正确吗?
重要提示:可选模块不会被忽略,它们将被处理,它们的结果将被忽略,即即使它们失败,认证过程也不会中止。
在许多情况下,您可能希望在身份验证期间执行某个操作(要执行的模块),但即使在失败的情况下,您也不希望身份验证过程中止。
一个实际的例子是,如果您想使用 pam 在登录期间使用与用户密码相同的密码自动打开 dm-crypt 加密设备:
请注意,如果
required
使用而不是optional
此处,则第一次登录将成功,因为 cryptsetup 将返回 0 作为其退出代码,但如果用户注销然后再次登录,则登录将失败,因为设备已经打开并且 cryptsetup 将返回非零退出代码。然而,在这种情况下,您仍然希望登录成功。这只是我想到的一个例子,因为我实际使用了它,也就是说,这不是理论上的情况,但这是您希望失败的模块不会中止身份验证过程的许多情况之一。
除了马塞洛的回答外,其他实际用途:
这些都来自 Ubuntu 16.04 VM,我从未接触过 PAM 配置(除了我安装的任何软件包可能有,我怀疑这些
pam_kwallet*
行来自哪里)。pam_faildelay.so
提供了一个很好的示例,即被忽略的模块仍然提供即时、明显的反馈:如果您输入了错误的密码,则让您等待。这是您通常用作的模块optional
,因为成功或失败实际上并不重要。但!pam_faildelay.so
仅支持auth
,因此任何正常使用都可以auth optional
。