SELinux自定义策略应通过日志驱动生成而非手写,先设permissive模式,用ausearch和audit2allow提取AVC拒绝生成模块,精简规则后semodule加载,再切enforcing验证;同时需用semanage和restorecon为文件打上匹配类型标签。

SELinux 自定义策略编写不是“写代码”,而是围绕进程行为和资源访问关系,用规则明确“谁(类型)能对什么(类型)做什么(操作)”。核心在于理解拒绝日志、生成最小权限规则、验证再上线。不建议从零手写.te文件起步,应优先用日志驱动方式生成初稿。
确认环境与准备工具
确保 SELinux 处于 permissive 模式(sudo setenforce 0),避免策略错误直接阻断服务;运行 sestatus 查看当前状态。安装必需工具:
- CentOS/RHEL:
yum install policycoreutils-python-utils audit libsemanage-python - Ubuntu/Debian:
apt install selinux-basics selinux-policy-default policycoreutils-python-utils auditd
这些工具中,audit2allow 和 ausearch 是策略生成的关键,semanage 和 restorecon 用于后续上下文管理。
从拒绝日志出发生成策略
让目标服务在 permissive 模式下运行一段时间,触发真实访问行为。然后提取最近的 AVC 拒绝事件:
sudo ausearch -m avc -ts recent | audit2allow -M myapp_policy- 该命令会生成
myapp_policy.te(可读源码)和myapp_policy.pp(编译后模块)
生成的 .te 文件通常较宽泛(例如允许全部 file 权限)。建议打开它,删减冗余规则,只保留实际需要的权限,比如把 { read write execute } 缩为 { read write },或限定 class 为 dir 而非 file。
Linux 安全审计工具,检查 SSH 配置、开放/监听端口、防火墙规则(ufw/iptables/nftables)、失败登录尝试、sudoers 权限...
加载并验证策略模块
用以下三步完成部署与确认:
- 加载模块:
sudo semodule -i myapp_policy.pp - 检查是否加载成功:
sudo semodule -l | grep myapp - 切回 enforcing 模式测试:
sudo setenforce 1,观察服务是否正常,同时监控/var/log/audit/audit.log是否仍有新 AVC 拒绝
若仍有拒绝,重复上一步骤——重新收集日志、生成新模块、叠加加载(semodule -i 支持多次加载同名模块更新)。
补充:文件上下文需同步调整
策略允许访问 ≠ 文件本身有正确标签。如果服务要读写自定义路径(如 /opt/myapp/conf),必须为其打上匹配的类型:
- 添加上下文规则:
sudo semanage fcontext -a -t myapp_etc_t "/opt/myapp/conf(/.*)?" - 应用标签:
sudo restorecon -Rv /opt/myapp/conf
否则即使策略允许 myapp_t → myapp_etc_t,实际文件仍是 default_t,规则无法命中。










