自定义 systemd 服务的 ExecStart 的 selinux 上下文

自定义 systemd 服务的 ExecStart 的 selinux 上下文

我有一个Type=simple /etc/systemd/system/custom.service。它有ExecStart=/root/scripts/custom.sh。我用它来使各种管理事情在启动后自动发生。它在 Redhat 7.9 上运行良好,没有selinux=enforcing设置 selinux 问题。

在 RHEL 8.8 中,我在/var/log/messages.

systemd[1]: Started custom service.
systemd[96691]: custom.service: Failed to execute command: Permission denied
systemd[96691]: custom.service: Failed at step EXEC spawning /root/scripts/custom.sh: Permission denied
systemd[1]: custom.service: Main process exited, code=exited, status=203/EXEC
systemd[1]: custom.service: Failed with result 'exit-code'.

SELinux is preventing /usr/lib/systemd/systemd from execute access on the file custome.sh. For complete SELinux messages run: sealert -l 84fa818f-e23a-4686-afb5-3f2399d0d6ea

setroubleshoot[96693]: SELinux is preventing /usr/lib/systemd/systemd from execute access on the file custom.sh.#012#012
*****Plugin catchall (100. confidence) suggests
**************************#012#012If you believe that systemd should be allowed execute access
on the custom.sh file by default.#012Then you should report this as a bug.#012You can generate a
local policy module to allow this access.
#012Do#012allow this access for now by executing:
#012# ausearch -c '(ation.sh)' --raw | audit2allow -M my-ationsh#012# semodule -X 300 -i my-ationsh.pp#012

所以我知道我的/root/scripts/custom.sh脚本没有正确的 selinux 上下文。但我应该用什么?

我的/etc/systemd/system/custom.servicesystemd_unit_file_t自动获取,所以我相信一切都已设置。

我的/root/scripts/custom.sh目前有unconfined_u:object_r:admin_home_t:s0.

在检查该文件夹中其他服务的其他 ExecStart 项目时,ls -ldZ我看到:

-rwxr-xr-x. 1 root root system_u:object_r:bluetooth_exec_t:s0      1375048 May 17  2022 /usr/libexec/bluetooth/bluetoothd
-rwxr-xr-x. 1 root root system_u:object_r:NetworkManager_exec_t:s0   67752 Feb 23 04:51 /usr/libexec/nm-dispatcher
-rwxr-xr-x. 1 root root system_u:object_r:avahi_exec_t:s0           146208 Nov  3  2020 /usr/sbin/avahi-daemon
-rwxr-xr-x. 1 root root system_u:object_r:xdm_exec_t:s0             471744 Dec 12  2022 /usr/sbin/gdm
-rwxr-xr-x. 1 root root system_u:object_r:modemmanager_exec_t:s0   2203464 Dec 13  2022 /usr/sbin/ModemManager
-rwxr-xr-x. 1 root root system_u:object_r:syslogd_exec_t:s0         742168 Jan 10 06:46 /usr/sbin/rsyslogd
-rwxr-xr-x. 1 root root system_u:object_r:timedatex_exec_t:s0        33984 Aug 12  2018 /usr/sbin/timedatex
  • 我需要创建customservice_exec_t类型上下文吗?如果是这样,怎么办?
  • 我以为我遇到了一个上下文,在搜索时bin_t我没有看到某些服务的相应语法。exec_t是否有bin_t一个好的上下文可以节省我创建上下文的开销?
  • 对于我正在做的事情,正确的约定是什么,这样它将来就不会因为我做了不正确的事情而无法工作?我需要将selinux=enforcing其设置为宽容并不是一个解决方案。

答案1

我需要创建一个 customservice_exec_t 类型上下文吗?如果是这样,怎么办?

您不需要这样做,只有当您想要创建非常具体的规则并确保控制访问它的每种类型时才需要这样做,这创建起来非常耗时且维护成本很高。看起来您只想使用低维护成本的最佳 selinux 实践。虽然你可以检查这里怎么做。

我以为我遇到了 bin_t 作为一个上下文,当我搜索时,我没有看到某些服务的相应 exec_t 语法。 bin_t 是一个很好的上下文,可以用来节省我创建上下文的开销吗?

是的,bin_t在这里使用是一个很好的上下文,它是一个通用上下文,为许多上下文提供执行权限。

对于我正在做的事情,这里的正确约定是什么,这样它将来就不会因为我做了不正确的事情而无法工作

您可以将脚本复制到/bin然后restorecon -RF /bin/custom.sh,或者使用以下命令scripts为您的文件夹授予正确的上下文:

semanage fcontext -a -t bin_t "/root/scripts(/.*)?"
restorecon -RF /root/scripts

相关内容