我正在实现一个 Web 服务器,其中的配置和用户文件通过 NFS(Amazon EFS)共享,如下所述: https://serverfault.com/a/933566/81774
作为 Apache 配置的一部分,我使用 mod_mpm_itk 以不同的用户名运行网站。如何在服务器之间同步用户名,而无需将新用户名嵌入 Web 服务器 AMI。
我假设我不能将 /etc/passwd 移动到 NFS,因为如果没有安装 NFS,服务器就无法启动?
根据评论更新:
似乎没有办法用 nsswitch.conf 加载附加文件,只能根据这个答案查询附加服务:https://unix.stackexchange.com/a/210587
附加服务的缺点是会引入额外的故障点。
当服务器启动时从 NFS 复制 /etc/passwd 并使用 pwck 重新读取它是否可行,如此处所述https://unix.stackexchange.com/a/102336?
答案1
您可以尝试使用pam_extrausers
。它使用单独/etc/passwd
样式的用户帐户列表,以补充标准身份验证机制。等效文件为/var/lib/extrausers/passwd
、/var/lib/extrausers/shadow
和/var/lib/extrausers/group
。
每当其某个用户帐户更新时,进行同步会更安全,/etc/passwd
并且相关文件将由服务器进行管理。
在 Debian 衍生系统上,包名称是libnss-extrausers
。
虽然这是一个PAM
模块,但配置应用于/etc/nsswitch.conf
:
passwd: compat extrausers
group: compat extrausers
shadow: compat extrausers
要在这些文件中创建条目,最好在您的主系统上以本地用户身份创建它们(没有任何标准实用程序可以管理这些条目)。然后将这些条目从现有的passwd
、shadow
和group
文件复制到 中的等效文件中/var/lib/extrausers
。记得修复 上的权限shadow
以匹配系统权限。
grep -E '^(user1|user2|user3):' /etc/passwd >/var/lib/extrausers/passwd
grep -E '^(user1|user2|user3):' /etc/shadow >/var/lib/extrausers/shadow
grep -Ew '(user1|user2|user3)' /etc/group >/var/lib/extrausers/group
chmod u=rw,go=r /var/lib/extrausers/passwd /var/lib/extrausers/group
chown root:shadow /var/lib/extrausers/shadow
chmod u=rw,g=r,o= /var/lib/extrausers/shadow
ls -l /var/lib/extrausers
total 12
-rw-r--r-- 1 root root 21 Apr 18 15:36 group
-rw-r--r-- 1 root root 49 Apr 18 15:37 passwd
-rw-r----- 1 root shadow 123 Apr 18 15:37 shadow
你可以使用你喜欢的任何技术来复制文件。我喜欢rsync
使用 root equilibrium:
for rhost in remote1 remote2 remote3 ...
do
rsync -avR /var/lib/extrausers/* "$rhost":/
done
答案2
如果你不想引入额外的故障点,那么你必须在本地创建用户。这实际上是一个非常不错的想法。
虽然您可以复制 passwd 文件,但我建议使用本地 ansible playbook 或 puppet 独立清单,如果缺少用户,它可以在本地创建用户。您可以将 playbook 保存在 NFS 上。