先来探讨SELinux与Ubuntu默认安全机制AppArmor的兼容性问题。Ubuntu系统默认采用AppArmor作为内核级强制访问控制(MAC)方案,而SELinux则是另一套主流的MAC机制。两者设计理念相近,但实现方式差异显著——AppArmor基于路径名进行控制,SELinux则基于标签。若同时启用,极易引发规则冲突,例如重复拦截或互相覆盖。因此,如需使用SELinux,建议先彻底禁用AppArmor:通过systemctl stop apparmor停止服务,再执行apt purge apparmor卸载软件包,避免两者争夺系统安全控制权。禁用后,按标准流程安装SELinux工具包(selinux-basics、auditd),运行selinux-activate激活,随后设置/etc/selinux/config中的SELINUX=enforcing模式,最后重启系统使配置生效。

SELinux与防火墙(UFW/iptables)的协同配置
Ubuntu通常使用UFW(Uncomplicated Firewall,基于iptables的前端工具)管理网络流量,其与SELinux的配合遵循一个基本原则:规则互补,避免相互干扰。
- 避免冲突:UFW负责网络层访问控制(如允许或拒绝端口),SELinux则负责进程与文件层的访问控制(如限制进程对敏感文件的读写)。两者不应设置重叠规则——典型例子:UFW开放了SSH端口22,SELinux就不应再拒绝sshd进程访问该端口。
- 配置示例:安装SELinux后,通过
setenforce 1启用强制模式,使用semanage fcontext调整文件上下文(例如semanage fcontext -a -t httpd_sys_content_t "/var/www(/.*)?"),再执行restorecon应用上下文。同时利用UFW设置默认拒绝入站、允许出站策略,并开放必要端口(如ufw allow 22/tcp)。
SELinux与日志服务(rsyslog)的配合
rsyslog是Ubuntu系统日志的核心服务,它和SELinux配合可实现安全事件的可追溯性。
- 允许rsyslog访问SELinux日志:SELinux的拒绝访问日志(AVC日志)默认存储在
/var/log/audit/audit.log(若启用auditd)或/var/log/messages中。需通过semanage port命令为rsyslog添加syslog端口权限(例如semanage port -a -t syslogd_port_t -p tcp 514),确保rsyslog能正常接收SELinux日志。 - 集中管理日志:配置rsyslog将SELinux日志分离到独立文件——例如在
/etc/rsyslog.conf中添加local6.* /var/log/selinux.log,后续即可用ausearch分析AVC日志、用audit2why解释拒绝原因,排查安全事件时效率更高。
SELinux策略定制与优化
为使SELinux与Ubuntu系统配合更流畅,需通过策略定制来平衡安全性与可用性。以下几个方向值得关注:
- 调整布尔值:SELinux布尔值是可动态修改的策略开关,例如
httpd_can_network_connect_db控制Apache是否允许连接数据库。用getsebool -a可查看所有布尔值,用setsebool直接修改(如setsebool httpd_can_network_connect_db on),修改后立即生效,无需重启系统。 - 自定义策略模块:若默认策略无法满足特定应用需求(例如新开发的Web应用需要特殊文件访问权限),可用
audit2allow工具生成自定义策略模块。流程为:ausearch -m a vc -ts recent | audit2allow -M myapp,生成.te文件后编译为.pp文件,再通过semodule -i安装即可。 - 性能优化:定期检查SELinux日志(
ausearch -m a vc -ts recent),找出高频拒绝事件并优化策略(如添加必要的类型转换规则)。同时调整内核参数(如kernel.selinux=1)减少不必要的安全检查,可降低对系统性能的影响。
