全部,
我正在开发对 systemd 的修改,它将扩展 systemd-sleep 以支持在挂起、混合睡眠等上调用用户定义的脚本,类似于 systemd-sleep。这工作得很好,但是当我开始在启用 SELinux 的系统上进行测试时,事情开始崩溃。
我不太熟悉 SELinux,所以我什至不知道从哪里开始寻找。从根本上来说,该服务以配置用户 (/usr/lib/systemd/systemd-sleep-user) 的身份调用脚本,该脚本又执行$HOME/.config/systemd/system-sleep
.
相关的错误消息是:SELinux is preventing systemd-sleep-u from execute_no_trans access on the file /home/stallion/.config/systemd/system-sleep/kill-scdaemon.sh.
由于此行为类似于 systemd-sleep 的工作方式(尽管它使用 /usr/lib/systemd/system-sleep),我希望这只需要将相同的属性应用于用户位置。
有什么想法吗?
编辑:相关审核日志条目如下:
类型=AVC msg=audit(1508702442.885:388): avc:拒绝{execute_no_trans} for pid=3539 comm="systemd-sleep-u" path="/home/stallion/.config/systemd/system-sleep/kill- scdaemon.sh" dev="dm-3" ino=533984 scontext=system_u:system_r:init_t:s0 tcontext=system_u:object_r:config_home_t:s0 tclass=文件许可=0
答案1
发生错误的原因是 SELinux 策略中没有规则允许特定访问:允许带有上下文的文件的非转换执行配置_home_t通过运行在的进程初始化_t领域。
您可以创建一个自定义策略模块来包含此类规则,但您可能不想允许任何初始化要执行的进程任何带有用户主数据标签的文件。另一种选择是创建自定义策略,其中包含脚本的新文件上下文、匹配的标签规则和允许进程的规则初始化_t域来执行它们。
第三个选项(可能也是最简单的选项)是配置 systemd 以执行以下进程:无限制域,其中 SELinux 几乎没有任何限制(常规 DAC 等限制仍然适用)。使用SELinuxContext
systemd 服务文件中的选项:
SELinuxContext=system_u:system_r:unconfined_t:s0