PAM:在pam_mkhomedir之前执行命令?


8

当用户登录系统并且没有主目录时,我们想使用pam_mkhomedir创建用户的主目录。这是一种常见的做法。这是pam_mkhomedir的快速描述:

如果会话开始时不存在,则pam_mkhomedir PAM模块将创建用户主目录。这使用户无需使用分布式文件系统或预先创建大量目录即可出现在中央数据库(例如NIS,Kerberos或LDAP)中。骨架目录(通常为/ etc / skel /)用于复制默认文件,还为创建设置了umask。

但是,这是一个运行ZFS的FreeBSD 8.2系统。我们需要首先执行ZFS命令,因为我们希望每个用户一个ZFS文件系统pam_mkhomedir可以做一个mkdir,但是我们需要做类似的事情zfs create /zpool/home/$USER

有谁知道在用户的首次登录会话期间是否可以使用PAM执行命令?


我用来自archive.org的存档版本替换了solarisinternals.com链接,因为前者被域名抢注者占用。感谢@Norman Gray指出来。
Stefan Lasiewski

Answers:


9

有一个名为PAM的PAM模块pam_exec-如果您编写检查和/或创建ZFS卷的脚本,则可以将其链接到现有的PAM规则中,并保持状态良好,而无需假设交互式登录,默认的Shell和骨架目录等。例如,你可能有

session required pam_unix.so
session required pam_exec.so check_zfs.sh $PAM_USER

或任何适合您特定设置的内容。

(正如汤姆·肖在评论中指出的那样,这session required pam_mkhomedir.so将是多余的。)


很好,除了您在pam_mkhomedir.so行中有错别字-pam.conf中的错别字不是很好!-而且,如果check_zfs.sh脚本完成所有肮脏的工作,我也不认为该行是必需的。
汤姆·肖

@Tom为什么在PAM模块为您完成时重新发明轮子?
安德鲁

2
问题的关键是他希望使用“ zfs create”而不是“ mkdir”来创建主目录。这是通过使用pam_exec完成的。该目录已存在,因此后续的pam_mkhomedir将什么都不做!
汤姆·肖

确实是@TomShaw。
安德鲁

3

值得一提的是,您的问题包含一个无效的假设:即使PAM也不知道这是否是用户的首次登录。它仅知道用户是否具有主目录。

因此,请记住,这不是PAM要做的,但是您可以轻松地/etc/bashrc从中运行某些内容,并在命令前先检查并删除用户主目录中的dotfile。需要root privs吗?适当锁定的sudo或setuid二进制文件可能最适合您。这两个选项还使您可以选择将点文件放在用户无法修改或删除的位置(如果您关心这种事情)。


我糊涂了。pam_mkhomedir不是在创建这些主目录,复制/ etc / skel等的内容吗?我看了一眼C代码(在FreeBSD上),我想我可以看到它将骨架文件复制到新创建的homedir的位置。
Stefan Lasiewski,2011年

仅仅因为用户没有主目录并不意味着他们以前没有登录过该系统。例如,主目录可能已被删除。但是,这主要是语义上的和分裂的头发。
Red Tux

@red:了解。我更新了我的问题。
Stefan Lasiewski 2011年

1

因此,您有两种选择:

1)在创建目录之前,首先修改pam_mkhomedir的源以创建zfs文件系统。2)让pam_mkhomedir像往常一样运行,然后添加一个脚本来检查并查看用户注销后在自己的zfs文件系统上是否有文件夹。遇到这些情况时,请移动/ home目录,创建文件系统,然后将文件移回到该目录中。

我怀疑在第一天将用户留在主/ home不会引起太多问题,因此我会选择后一种选择,它更简单。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.