8.2. 为自定义应用程序创建并强制 SELinux 策略
您可以通过 SELinux 限制应用程序,来提高主机系统和用户数据的安全性。因为每个应用程序都有特定的要求,因此根据您的用例,为创建限制一个简单守护进程的 SELinux 策略修改这个流程示例。
先决条件
-
selinux-policy-devel
软件包及其依赖项已安装在您的系统上。
步骤
在本例中,准备一个简单的守护进程,它将打开
/var/log/messages
文件进行写入:创建一个新文件,然后在您选择的文本编辑器中打开:
vi mydaemon.c
$ vi mydaemon.c
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 插入以下代码:
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 编译文件:
gcc -o mydaemon mydaemon.c
$ gcc -o mydaemon mydaemon.c
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 为您的守护进程创建一个
systemd
单元文件:Copy to Clipboard Copied! Toggle word wrap Toggle overflow 安装并启动守护进程:
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 检查新守护进程是否没有被 SELinux 限制:
ps -efZ | grep mydaemon
$ ps -efZ | grep mydaemon system_u:system_r:unconfined_service_t:s0 root 4117 1 0 16:56 ? 00:00:00 /usr/local/bin/mydaemon
Copy to Clipboard Copied! Toggle word wrap Toggle overflow
为守护进程生成自定义策略:
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 使用上一命令创建的设置脚本使用新策略模块重建系统策略:
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 请注意,设置脚本使用
restorecon
命令重新标记文件系统的对应部分:restorecon -v /usr/local/bin/mydaemon /usr/lib/systemd/system
restorecon -v /usr/local/bin/mydaemon /usr/lib/systemd/system
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 重启守护进程,检查它现在被 SELinux 限制:
systemctl restart mydaemon ps -efZ | grep mydaemon
# systemctl restart mydaemon $ ps -efZ | grep mydaemon system_u:system_r:mydaemon_t:s0 root 8150 1 0 17:18 ? 00:00:00 /usr/local/bin/mydaemon
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 由于守护进程现在受 SELinux 限制,SELinux 也阻止它访问
/var/log/messages
。显示对应的拒绝信息:ausearch -m AVC -ts recent
# ausearch -m AVC -ts recent ... type=AVC msg=audit(1590247112.719:5935): avc: denied { open } for pid=8150 comm="mydaemon" path="/var/log/messages" dev="dm-0" ino=2430831 scontext=system_u:system_r:mydaemon_t:s0 tcontext=unconfined_u:object_r:var_log_t:s0 tclass=file permissive=1 ...
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 您还可以使用
sealert
工具获取更多信息:Copy to Clipboard Copied! Toggle word wrap Toggle overflow 使用
audit2allow
工具推荐更改:Copy to Clipboard Copied! Toggle word wrap Toggle overflow 因为
audit2allow
建议的规则在某些情况下可能不正确,所以只使用其输出的一部分来查找对应的策略接口。使用macro-expander
工具检查logging_write_generic_logs(mydaemon_t)
宏,以查看宏提供的所有允许规则:Copy to Clipboard Copied! Toggle word wrap Toggle overflow 在这种情况下,您可以使用推荐的接口,因为它只提供对日志文件及其父目录的读写访问。在您的类型强制文件中添加对应的规则:
echo "logging_write_generic_logs(mydaemon_t)" >> mydaemon.te
$ echo "logging_write_generic_logs(mydaemon_t)" >> mydaemon.te
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 另外,您可以添加这个规则而不是使用接口:
echo "allow mydaemon_t var_log_t:file { open write getattr };" >> mydaemon.te
$ echo "allow mydaemon_t var_log_t:file { open write getattr };" >> mydaemon.te
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 重新安装策略:
Copy to Clipboard Copied! Toggle word wrap Toggle overflow
验证
检查您的应用程序是否受 SELinux 限制,例如:
ps -efZ | grep mydaemon
$ ps -efZ | grep mydaemon system_u:system_r:mydaemon_t:s0 root 8150 1 0 17:18 ? 00:00:00 /usr/local/bin/mydaemon
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 验证您的自定义应用程序不会导致任何 SELinux 拒绝:
ausearch -m AVC -ts recent
# ausearch -m AVC -ts recent <no matches>
Copy to Clipboard Copied! Toggle word wrap Toggle overflow