![由于 SELinux,pam_exec 无法调用 systemctl](https://linux22.com/image/226957/%E7%94%B1%E4%BA%8E%20SELinux%EF%BC%8Cpam_exec%20%E6%97%A0%E6%B3%95%E8%B0%83%E7%94%A8%20systemctl.png)
我试图在 CentOS 7 上每次 SSH 会话启动和结束时执行一个脚本。该脚本应该启动/停止 systemd 服务。
这是我的设置:
在 中,我在和/etc/pam.d/sshd
之间添加了以下行:pam_selinux.so close
pam_selinux.so open
session optional pam_exec.so seteuid log=/tmp/pam_sshd_session.log /etc/pam_session.sh
我添加了脚本/etc/pam_session.sh
;大多数内容都是无关紧要的,为简洁起见,假设:
#!/bin/bash
systemctl stop some-service.service
此设置无法执行我的服务,我在以下位置看到这一点/tmp/pam_sshd_session.log
:
Failed to stop some-service.service: Access denied
在/var/log/audit/audit.log
我看到这一行:
type=USER_AVC msg=audit(1701099322.109:12223): pid=1 uid=0 auid=4294967295 ses=4294967295 subj=system_u:system_r:init_t:s0 msg='avc: denied { status } for auid=1001 uid=0 gid=0 path="/etc/systemd/system/some-service" cmdline="systemctl stop some-service.service" scontext=system_u:system_r:sshd_t:s0-s0:c0.c1023 tcontext=unconfined_u:object_r:systemd_unit_file_t:s0 tclass=service exe="/usr/lib/systemd/systemd" sauid=0 hostname=? addr=? terminal=?'
我发现这个问题它描述了调用脚本本身的类似问题。不过,在我的情况下调用了该脚本,我无法将该问题提出的解决方案应用于我的问题,因为sshd_t
(来自我的上下文)显然不是/usr/sbin/semanage
此处显示的命令的有效参数。
我需要做什么才能pam_exec
拨打电话systemctl
?
编辑
权限/etc/pam_session.sh
有:
-rwxr-xr-x. root root unconfined_u:object_r:sshd_exec_t:s0 /etc/pam_session.sh
我在尝试时确实设置了sshd_exec_t
较早,但据我所知,只要我在pam_selinux.so close
和之间执行文件,就没有必要这样做pam_selinux.so open
。
答案1
audit2allow
帮助我创建了这个文件sshd_selinux_config.te
:
module sshd_selinux_config 1.0;
require {
type systemd_unit_file_t;
type sshd_t;
class service { start status stop };
}
#============= sshd_t ==============
allow sshd_t systemd_unit_file_t:service { start status stop };
连同它的编译版本sshd_selinux_config.pp
。然后我通过启用它semodule -i sshd_selinux_config.pp
并解决了问题。