Guix附带一个SELinux策略文件,位置在etc/guix-daemon.cil,它可以在启用SELinux的系统上安装,为Guix的文件添加标签及指定后台进程的期望行为。由于Guix系统不提供SELinux基础策略,这个后台进程策略不能在Guix系统上使用。
用root用户执行这个命令以安装策略:
semodule -i etc/guix-daemon.cil
用restorecon
或者你的系统提供的其它机制重新给文件系统打标签。
一旦安装好策略,为文件系统重新打好标签,并且重启了后台进程,它应该在guix_daemon_t
环境里运行。你可以用下面这个命令确认:
ps -Zax | grep guix-daemon
运行guix build hello
之类的命令并监控SELinux日志以说服你自己SELinux允许所有的操作。
这个策略不是完美的。这里有一个关于限制和缺陷的列表,当为Guix后台进程部署提供的SELinux策略时该认真考虑。
guix_daemon_socket_t
isn’t actually used. None of the socket
operations involve contexts that have anything to do with
guix_daemon_socket_t
. It doesn’t hurt to have this unused label, but
it would be preferable to define socket rules for only this label.
guix
gc
不可以任意访问指向profile的链接。由于设计的原因,符号链接的目标的文件标签和符号链接本身的文件标签是不同的。尽管$localstatedir里的所有profile都被打上了标签,指向这些profile的符号链接继承它们所在的文件夹的标签。对于普通用户的家目录里的链接,标签是user_home_t
。但是对于root用户的家目录,或/tmp,或HTTP服务器的工作目录等文件夹里的链接不是这样。guix
gc
会被阻止读取和跟随这些链接。
/gnu/store/.+-(guix-.+|profile)/bin/guix-daemon
的文件都被赋予guix_daemon_exec_t
标签;这意味着任何profile里的任何有这样名字的的文件都会被允许在guix_daemon_t
域里执行。这不够理想。一个攻击者可以构建提供这个可执行程序的软件包,并说服一个用户安装、运行它,以此进入guix_daemon_t
域。那时,SELinux无法阻止它访问所在域的进程可以访问的文件。
You will need to relabel the store directory after all upgrades to
guix-daemon, such as after running guix pull
. Assuming the
store is in /gnu, you can do this with restorecon -vR /gnu
, or
by other means provided by your operating system.
我们可以在安装时生成一个更严格的策略,仅当前安装的guix-daemon
的精确的的文件名会被打上guix_daemon_exec_t
标签,而不是用一个宽泛的正则表达式。这样的缺点是root必须在每次安装提供guix-daemon
的Guix软件包时安装或升级策略。