我刚刚在我的 VPS 上安装了 Fedora 22,并尝试做一些简单的事情——通过 pam_exec 在每次 ssh 登录时运行我的 informer 脚本。但我遇到了意想不到的困难:pam_exec 失败,退出代码为 13。
我在 /etc/pam.d/sshd 的末尾添加了习惯行:
session optional pam_exec.so seteuid /usr/local/bin/loginformer.py
当然loginformer.py有执行标志:
$ ls -l /usr/local/bin/loginformer.py
-rwxr-xr-x. 1 root root 4254 Jun 8 09:35 /usr/local/bin/loginformer.py
但这里是痛苦的摘录journalctl -lb SYSLOG_FACILITY=10
:
Jun 08 11:58:49 fedora22 sshd[671]: pam_exec(sshd:session): execve(/usr/local/bin/loginformer.py,...) failed: Permission denied
Jun 08 11:58:49 fedora22 sshd[663]: pam_exec(sshd:session): /usr/local/bin/loginformer.py failed: exit code 13
我不确定发生了什么,因为它总是在我的 ArchLinux 上运行。我认为这可能是一些 SELinux 限制,但我不确定。
我做错了什么?
更新
好吧,我尝试深入了解 SELinux,并了解我应该更改脚本的 SELinux 上下文。
现在 SELinux 的上下文看起来是这样的:
$ ls -Z /usr/local/bin/loginformer.py
unconfined_u:object_r:user_home_t:s0 /usr/local/bin/loginformer.py
但是我应该为脚本设置哪个上下文?
更新2
另外,我认为 SELinux AVC 日志对于检测问题可能非常有用。抱歉我没有早点给。
cat /var/log/audit/audit.log | grep loginformer.py
返回很多相同的字符串:
type=AVC msg=audit(1433784991.570:265): avc: denied { execute } for pid=7866 comm="sshd" name="loginfomer.py" dev="vda1" ino=11924 scontext=system_u:system_r:sshd_t:s0-s0:c0.c1023 tcontext=unconfined_u:object_r:user_home_t:s0 tclass=file permissive=0
答案1
pam_exec
和的pam_selinux
调用顺序很重要。手册页pam_selinux
笔记:
将 pam_selinux 添加到 PAM 堆栈中可能会破坏执行应用程序的其他 PAM 模块的行为。为了避免这种情况,pam_selinux.so 打开应放置在 PAM 堆栈中的此类模块之后,并且 pam_selinux.so 关闭应该放在他们面前。当这样的安置不可行时,pam_selinux.so 恢复可用于临时恢复原始安全上下文。
相似地,丹·沃尔什写道关于主题:
如果您要添加一个 pam_module 来执行用户不允许执行的命令,例如 pam_mount,则应该添加它前pam_selinux.so 打开命令。如果您要添加一个 pam_module 来执行用户可以执行的命令,那么您可能需要这些后pam_selinux.so 打开线路。
另请注意,您的脚本当前的安全上下文为user_home_t
,这可能与默认策略不兼容(移动文件时会保留文件上下文;如果您在主目录中创建文件,则移动文件将保留原始上下文)。您可能应该使用默认bin_t
上下文。要恢复默认上下文:
restorecon /usr/local/bin/loginformer.py
如果您的脚本没有做任何太特殊的事情,则放置在上下文pam_exec
之前pam_selinux
并重新字符串应该足以解决您的问题。