Ubuntu 上让 SELinux 支持新应用的实操流程
前置说明
- Ubuntu 默认启用的是 AppArmor,并非 SELinux。若要在 Ubuntu 上使用 SELinux,需要额外安装与启用,且社区与生态的“即插即用”支持相对有限;在需要完善的 SELinux 策略与工具链时,很多场景会优先选择 RHEL/CentOS/Fedora。如确需启用,请评估维护成本与兼容性。
启用与基础配置
- 安装组件与激活
- 安装工具与策略:sudo apt install selinux-basics selinux-policy-default auditd audispd-plugins setools selinux-policy-dev
- 激活 SELinux:sudo selinux-activate
- 配置为宽容模式并重启
- 编辑 /etc/selinux/config:设置 SELINUX=permissive(首次上线建议宽容以收集拒绝日志)
- 重启系统:sudo reboot
- 常用检查
- 查看状态:getenforce、sestatus
- 查看拒绝日志:sudo ausearch -m avc -ts recent 或 sudo cat /var/log/audit/audit.log | grep avc
- 说明
- 宽容模式会记录违规但不阻断,便于策略迭代;确认无误后再切回 enforcing。
为新应用接入 SELinux 的标准流程
- 识别与标签
- 确认应用可执行文件路径,查看当前上下文:ls -lZ /path/to/app
- 为可执行文件设置专用执行类型(示例类型名:myapp_exec_t):
- 临时:sudo chcon -t myapp_exec_t /path/to/app
- 持久:sudo semanage fcontext -a -t myapp_exec_t “/path/to/app” && sudo restorecon -v /path/to/app
- 定义策略模块
- 新建策略文件 myapp.te(示例):
- 声明模块与类型:
- policy_module(myapp, 1.0)
- type myapp_t; type myapp_exec_t;
- 可执行文件入口与域迁移:
- init_daemon_domain(myapp_t, myapp_exec_t)
- 按需补充最小权限(示例:允许读家目录内容)
- allow myapp_t user_home_t:dir search;
- allow myapp_t user_home_t:file { read getattr open };
- 编译与加载
- 使用开发 Makefile 编译并安装:
- make -f /usr/share/selinux/devel/Makefile
- sudo semodule -i myapp.pp
- 验证与回归
- 重启应用,观察 AVC 拒绝;必要时在 permissive 下继续收集并迭代策略,直至无拒绝后再切 enforcing。
- 常见扩展
- 端口类型:如应用监听 8080/tcp,可加入 http_port_t:sudo semanage port -a -t http_port_t -p tcp 8080
- 布尔开关:如允许某服务发起 DB 连接:sudo setsebool -P httpd_can_network_connect_db 1
- 文件/目录标签:对数据目录设置专用类型并 restorecon,确保运行时标签正确。
排错与临时权衡
- 快速定位
- 查看最近拒绝:ausearch -m avc -ts recent
- 按进程查标签:ps -Z -C
- 按路径查标签:ls -lZ
- 临时放行(不建议长期使用)
- 将应用域设为宽容:sudo semanage permissive -a <myapp_t>
- 或将可执行文件改为 unconfined_t(几乎绕过 SELinux):sudo chcon -t unconfined_t /path/to/app(持久化可用 semanage fcontext + restorecon)。上述做法会降低安全性,仅用于应急与问题定位。
实用建议
- 上线顺序建议:安装与激活 → permissive 收集日志 → 定制最小权限策略 → 回归测试 → enforcing 运行 → 持续审计。
- 若遇到复杂依赖或频繁策略冲突,评估是否改用 RHEL/CentOS/Fedora 等 SELinux 生态更完善的发行版,以降低维护成本。