这个问题是针对一般应用的,但我可以用一些具体的例子来说明我的问题的性质。当安装某些 Linux 身份验证包(如 krb5、sssd 或 pam_pkcs11)时,PAM 配置目录下的文件中会包含一些内容(如/etc/pam.d/系统身份验证和/etc/pam.d/密码验证)并将添加或修改一行以指向新的。所以已安装的文件,例如pam_krb5.so,pam_sssd.so, 或者pam_pkcs11配置文件用来。
对于某些软件包来说,这似乎会自动发生,无需用户干预,只需安装 rpm 软件包(使用 yum 或直接使用 rpm 工具),就像我观察到的安装 sssd 软件包的情况一样(至少在 RHEL 7 上),它将添加对pam_sssd.so进入*-授权PAM 文件。我认为唯一可行的方法是通过 rpm 可以拥有的内部脚本,因此我查找了如何在 rpm 的 SPEC 中列出内部脚本,挂载了 RHEL 7 映像以查看源包,然后在 Packages 目录中运行了此脚本:
sudo rpm --scripts -qpl sssd-* | grep -i pam
然而,我没有得到任何返回的行,表明任何内容正在接触 /etc/pam.d 目录中的文件,即使我删除 grep,我确实看到了 if/then 脚本逻辑执行其他操作的结果,因此--脚本参数正在起作用。
我也很好奇,在一个非常特殊的例子里,是什么将这一行添加到我的
/etc/pam.d/system-auth
文件中:
身份验证 [成功=完成 身份验证信息_unavail=忽略 忽略=忽略 默认=失败] pam_pkcs11.so nodebug
如果它不是 RPM 的内部脚本,我想知道它是否可能是最初运行的新安装文件中的某个二进制文件,并且它负责添加这些更改,但没有看到任何证据。
此外,我实际上还 grep 过验证配置RPM 脚本中的行也是如此,因为我知道验证配置可以做到这一点,但没有找到任何东西。但它似乎必须运行验证配置或者在后台执行一些等效的操作来执行该操作。
有谁知道是什么导致了这些变化?
答案1
我承认,这是一个非常有趣的问题。
RedHat 是一家庞大的组织,它有能力重写其发行版(RHEL、CentOS)中提供的任何开源软件。而且它确实这么做了。
我决定在 CentOS7.3 机器上strace
进行安装,以下是我所看到的(部分输出):samba
open("/etc/pam.d/samba;593a8da8", O_WRONLY|O_CREAT|O_TRUNC, 0666) = 47
fcntl(47, F_SETFD, FD_CLOEXEC) = 0
umask(022) = 0777
write(47, "#%PAM-1.0\nauth required\tpa"..., 177) = 177
close(47) = 0
ioctl(1, SNDCTL_TMR_TIMEBASE or SNDRV_TIMER_IOCTL_NEXT_DEVICE or TCGETS, {B38400 opost isig icanon echo ...}) = 0
ioctl(1, SNDCTL_TMR_TIMEBASE or SNDRV_TIMER_IOCTL_NEXT_DEVICE or TCGETS, {B38400 opost isig icanon echo ...}) = 0
lstat("/etc/pam.d/samba", 0x7ffeed35d250) = -1 ENOENT (No such file or directory)
rename("/etc/pam.d/samba;593a8da8", "/etc/pam.d/samba") = 0
getuid() = 0
getuid() = 0
chown("/etc/pam.d/samba", 0, 0) = 0
chmod("/etc/pam.d/samba", 0644) = 0
utime("/etc/pam.d/samba", [2017/05/25-07:33:05, 2017/05/25-07:33:05]) = 0
getuid()
它创建/etc/pam.d/samba
包含以下内容的文件:
#%PAM-1.0
auth required pam_nologin.so
auth include password-auth
account include password-auth
session include password-auth
password include password-auth
此外,还有一个可以自动更新的工具,可用于备份和/或恢复 pam.d 配置文件 - 即authconfig
。我猜它可能在安装某些软件包时用于更新PAM
配置文件。例如,RedHat 配置SSSD
系统身份验证的部分程序(包括配置PAM
)是:
Use authconfig to enable SSSD for system authentication. # authconfig --update --enablesssd --enablesssdauth This automatically updates the PAM configuration to reference all of the
rpm --scripts -qpl samba-4* | grep -i pam
这是我的测试服务器的输出: /etc/pam.d/samba
- 这是在 samba 安装期间创建的新文件。