Ubuntu 上更新 SELinux 规则的实用步骤
前置说明
- Ubuntu 默认不启用 SELinux,默认使用 AppArmor。如确需使用 SELinux,需先安装组件并启用;变更 SELINUX=disabled ↔ enforcing/permissive 通常需要重启系统。SELinux 有 Enforcing/Permissive/Disabled 三种模式,其中在 Permissive 下仅记录拒绝日志不阻断,便于排错。
更新策略的常用方式
-
方式一 从拒绝日志自动生成并加载本地模块
- 确保审计服务运行并收集日志:sudo apt install auditd audispd-plugins。
- 查看拒绝事件:sudo ausearch -m avc -ts recent 或 grep avc /var/log/audit/audit.log。
- 生成可加载模块:sudo audit2allow -M mypol(生成 mypol.te/mypol.pp)。
- 加载模块:sudo semodule -i mypol.pp。
- 验证与回看日志,确认不再出现同类 AVC 拒绝。
-
方式二 使用 semanage 调整策略与上下文
- 端口标签(示例:放行 TCP 8080 为 http 端口)
- 查看端口:semanage port -l | grep http_port_t
- 添加端口:sudo semanage port -a -t http_port_t -p tcp 8080
- 文件上下文与重标记
- 声明默认上下文:sudo semanage fcontext -a -t httpd_sys_content_t “/var/www/html(/.*)?”
- 应用到现有文件:sudo restorecon -Rv /var/www/html
- 布尔值(示例:允许 httpd 访问用户主目录)
- 永久生效:sudo setsebool -P httpd_enable_homedirs 1
说明:semanage 与 restorecon 是维护策略与文件标签的常用组合,前者写入策略数据库,后者将默认标签应用到文件系统。
-
方式三 编写并编译自定义策略模块(.te)
- 新建模块:mkdir -p /selinux-custom-policy && cd $!
- 编辑模块文件(示例 custom_policy.te):
- 编译并加载:
- 使用开发 Makefile:make -f /usr/share/selinux/devel/Makefile 生成 custom_policy.pp,然后 sudo semodule -i custom_policy.pp;
- 或手工编译:checkmodule -M -m -o custom_policy.mod custom_policy.te 与 semodule_package -o custom_policy.pp -m custom_policy.mod,再 sudo semodule -i custom_policy.pp。
- 使新上下文生效:sudo restorecon -Rv /path/to/app。
该方式适合对特定进程/路径进行精细化授权。
变更模式与生效范围
- 临时切换:sudo setenforce 0|1(在 Permissive 与 Enforcing 间切换,立即生效;从/到 Disabled 需重启)。
- 永久生效:编辑 /etc/selinux/config 的 SELINUX= 字段为 enforcing/permissive/disabled,随后 sudo reboot。
- 排错建议:先在 Permissive 观察日志与行为,再切回 Enforcing。
常见问题与建议
- 工具可用性:若提示 semanage/audit2allow 不存在,安装 policycoreutils-python-utils 等工具包。
- 策略冲突与最小化授权:优先用 audit2allow 生成最小必要规则,避免直接 setenforce 0 绕过问题。
- 生产环境变更:先在测试环境验证,逐步加载模块并回看 ausearch -m avc,必要时回滚模块 sudo semodule -r mypol。
- 是否真的需要 SELinux:若仅为一般服务器加固,可考虑继续使用 AppArmor(Ubuntu 默认),其工具链为 aa-status/aa-enforce/aa-disable。