selinux策略审计与优化是持续过程,需通过audit.log分析avc拒绝、用audit2allow生成草案并人工审查,优先使用布尔值调控权限,修复文件上下文而非临时打补丁,并定期清理冗余策略模块。

SELinux 策略审计与优化不是一次性配置,而是持续观察、分析和收敛的过程。核心目标是:在 enforcing 模式下稳定运行,既不因过度限制导致服务异常,也不因放权过宽削弱安全边界。
从 audit.log 抓真实拒绝行为
所有策略问题的起点都在审计日志。SELinux 拒绝访问时,内核会记录 AVC(Access Vector Cache)事件到 /var/log/audit/audit.log(若使用 auditd)或 /var/log/messages(若未启用 auditd)。
- 快速查看最近拒绝:
ausearch -m avc -ts recent | head -20 - 提取全部拒绝并生成可读摘要:
ausearch -m avc -i -ts today | audit2why - 导出为待审核的策略模块草案:
ausearch -m avc -ts today | audit2allow -a -M myapp_fix(生成myapp_fix.te和myapp_fix.pp)
注意:audit2allow 生成的规则是“最小补丁”,但未必符合最小权限原则。例如它可能允许整个目录 read,而实际只需对某个配置文件 open read。务必人工审查 .te 文件后再编译加载。
用布尔值代替硬编码放权
布尔值是 SELinux 的“策略开关”,无需重载策略即可生效,且支持持久化,是生产环境首选的调优手段。
- 列出全部布尔值及其说明:
semanage boolean -l - 开启某项能力(当前会话+永久):
setsebool -P httpd_can_network_connect on - 关闭高风险功能(如禁用 CGI 执行):
setsebool -P httpd_execmem off
常见高价值布尔值包括:httpd_can_network_connect_db、mysqld_connect_any、container_use_ceph(RHEL 9+)。优先启用明确业务必需的,禁用默认开启但实际未用的(如 rsync_client 在非备份服务器上)。
修复上下文,而非临时打补丁
大量 AVC 拒绝源于文件或端口标签错误,比如把 Web 内容目录标成 default_t,或数据库 socket 标成 tmp_t。
- 查当前路径标签:
ls -Z /opt/myapp/data - 添加持久化上下文规则(不改文件本身):
semanage fcontext -a -t mysqld_db_t "/opt/myapp/data(/.*)?" - 批量应用新标签:
restorecon -Rv /opt/myapp/data
避免使用 chcon——它只改内存标签,重启或 relabel 后失效,且无法被 semanage 管理,容易造成策略混乱。
精简策略模块,降低内核开销
过多或冗余的策略模块会拖慢访问决策速度,尤其在高并发场景下。
- 列出已加载模块及大小:
semodule -l | awk '{print $1}' | xargs -I{} semodule -l -f {} | grep -E '^(name|size)' - 卸载未使用的自定义模块:
semodule -r myold_app_v1 - 确认某类型是否仍被引用:
sesearch -s httpd_t -t user_home_t -c file -p read
建议每季度执行一次策略健康检查:删除半年未更新、无对应进程运行、且 ausearch 中零 AVC 记录的模块。targeted 策略本身已足够精简,重点清理的是自行开发的 .pp 模块。











