systemd 不仅能感知 SELinux,而且其自身(而非依赖 Linux 内核)也会对特定的 SELinux 类别和权限施加强制访问控制,这种程序被称为用户空间对象管理器(userspace object manager)
由于 systemd 会执行强制访问控制,因此它也有自己的 AVC。而这类从用户空间对象管理器产生的 AVC 日志,被称为 USER_AVC 事件。
systemd 的部分 Unit 文件支持设置该服务运行时需要切换到的 SELinux 上下文。
比如 chronyd-restricted.service 就具有对应的 SELinux 上下文设置。
systemctl cat chronyd-restricted.service
返回值中,[Service] 节有一行
SELinuxContext=system_u:system_r:chronyd_restricted_t:s0
即为 chronyd 在运行的时候应该具有的 SELinux 上下文。
需要注意的是,即便我们不为某个服务设置 SELinux 上下文,SELinux 也有规则切换服务的上下文。而且,即便我们通过 SELinuxContext= 设置了我们希望的 SELinux 上下文,也需要对应的 SELinux 规则允许这样的上下文切换。
Note
|
|
Note
|
当我们出于某种特殊的目的(比如临时测试某个功能)自定义了 SELinuxContext= 之后,systemd 会尝试在所有执行命令相关的任务(Unit 文件中,所有以 Exec 开头的配置条目)中使用这个上下文,但并非所有 Exec* 的命令行都能符合我们自定义的下文。此时我们可以为 Exec* 条目的值(也就是命令行内容)的最前端添加一个 一般来说,默认的系统上的软件和该系统上的 SELinux 是自洽的,是不需要 |
systemd-run
可以将某个程序临时加载为由 systemd 管理的守护进程。systemd 会自动为该守护进程生成一个临时的 Unit 文件,而且这个文件会在用户执行 systemctl stop
后自动被移除。要为该守护进程设置参数,则必须通过`systemd-run` 的命令行参数进行设置。就守护进程所处的 SELinux 上下文来说,可以使用 --property SELinuxContext=<…>
指定。
Tip
|
需要注意的是,若一个二进制文件具有 unconfined_t 上下文(比如用户自行编译的程序),则它大概率不能被 |
有一些服务需要确定 SELinux 存在才可以运行,比如为系统自动重标签的 selinux-autorelabel.service 服务,就要求系统启用了 SELinux。
在 systemd 服务的 unit 文件的 [Unit] 段中,就有一个 ConditionSecurity= 字段。当我们将其的值设置为 selinux 的时候,启动该服务的时候,就会预先检测 SELinux 是否正在运行,仅当 SELinux 正在运行时,才会之际执行这个服务。
Note
|
关于 ConditionSecurity= 和各种以 Condition 开头的配置,见 https://www.freedesktop.org/software/systemd/man/latest/systemd.unit.html#Conditions%20and%20Asserts |
有一个与 selinux-autorelabel.service 的前序的服务,被称为 selinux-autorelabel-mark.service。若这个服务处于激活状态,且 SELinux 没有在系统上运行,则它会在文件系统根目录上创建 .autorelabel 文件。这样,在之后的某次激活了 SELinux 的启动过程中,就会启用 selinux-autorelabel.service 为整个文件系统重新标记 SELinux 上下文。
它的巧妙设计在于,selinux-autorelabel-mark.service 的 ConditionSecurity= 被设置成了 !selinux,这样我们就只会在某次没有启用 SELinux 的情况下生成 .autorelabel。在正常的启动中,若我们检查 selinux-autorelabel-mark.service 的状态,就能看到下面的字眼:
systemd[1]: selinux-autorelabel-mark.service - Mark the need to relabel after reboot was skipped because of an unmet condition check (ConditionSecurity=!selinux).
标题所指的“服务”,主要就是指 systemd-tmpfiles 软件,以及其对应的 systemd-tmpfiles-XXXX.serivce 服务。正如其名所指,这个服务最常见的作用,就是设置临时文件系统中的文件和文件夹,以及这些文件和文件夹的相关设置。
systemd-tmpfiles 与 SELinux 关联的地方,在于 systemd-tmpfiles 可以恢复目录和文件的 SELinux 上下文。
比如,在 /usr/lib/tmpfiles.d/selinux-policy.conf 中,我们可以发现,行首的 z
或者 Z
在告诉 systemd-tmpfiles 恢复或递归恢复指定路径的 SELinux 上下文。