为什么我们在 PAM 中使用可选项,即使它会被忽略?

为什么我们在 PAM 中使用可选项,即使它会被忽略?

我们知道,optional是PAM配置文件中的控制值之一。

linux-pam.org:

选修的:
如果该模块是堆栈中与此服务+类型关联的唯一模块,那么它的成功或失败才是重要的。

我很困惑。

这是/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

相关内容