Ubuntu 中 SELinux 与其他安全机制的集成
总体原则与组件分工
- SELinux 是 Linux 内核的强制访问控制(MAC)机制,作用于进程、文件、套接字等对象的安全上下文与策略;Ubuntu 默认启用的是 AppArmor,如需使用 SELinux,需要额外安装并启用。
- 防火墙(ufw、firewalld、iptables)工作在网络层/传输层,负责有状态/无状态过滤与端口放行;与 SELinux 互补,不冲突。
- systemd 作为初始化系统与服务管理器,提供对 SELinux 与 AppArmor 的原生集成(如服务安全上下文、AppArmor 配置加载、套接字激活时的标签处理等)。
与防火墙的集成
- 基本思路:用 SELinux 控制进程对资源的访问(例如是否允许绑定某端口、读写某目录),用 ufw/firewalld/iptables 控制“谁能进出哪些端口/协议”。两者各司其职、可同时开启。
- 快速示例(并行使用 ufw 与 SELinux):
- 查看与切换 SELinux 模式:
- 查看:getenforce、sestatus
- 切换:setenforce 1(Enforcing),或编辑 /etc/selinux/config 的 SELINUX=permissive|enforcing 后重启生效
- 配置 ufw:
- 启用:sudo ufw enable
- 策略:sudo ufw default deny incoming、sudo ufw default allow outgoing
- 放行端口:sudo ufw allow 22/tcp、sudo ufw allow 80/tcp、sudo ufw allow 443/tcp
- 说明:SELinux 不会替代防火墙的端口放行;例如 SELinux 允许 httpd 绑定 80/tcp,仍需 ufw 允许该端口入站。
与 systemd 的集成
- systemd 对 SELinux 的支持包括:在服务单元中设置 SELinuxContext、从网络连接继承 SELinux 上下文(SELinuxContextFromNet)、以及在创建文件/目录时自动应用正确的 SELinux 标签。
- 示例(为服务显式指定 SELinux 上下文):
- 在单元文件 [Service] 段添加:SELinuxContext=system_u:system_r:httpd_t:s0
- 说明:若未显式设置,systemd 会依据策略与可执行文件标签进行默认标记与约束;涉及 UNIX 域套接字 的绑定,也会在 SELinux 启用时按策略处理标签。
与 AppArmor 的共存与切换
- Ubuntu 默认使用 AppArmor;AppArmor 与 SELinux 同属 MAC 框架,但策略模型不同,不建议同时在同一系统上并行启用。
- 切换建议:
- 启用 SELinux:安装 selinux-basics、selinux-policy-default、auditd 等包,执行 sudo selinux-activate,将 SELINUX=permissive(先宽容以验证)写入 /etc/selinux/config,必要时可 卸载或停止 AppArmor 以避免干扰。
- 回退 AppArmor:禁用 SELinux 后启用并启动 apparmor 服务,按需加载策略。
与容器和审计日志的集成
- 容器(以 Docker 为例):在启用 SELinux 的 Ubuntu 上,容器进程会受 SELinux 类型标签约束;可通过 –security-opt label=type:container_t 等选项为容器指定或调整标签,实现与宿主机的进程/文件隔离。
- 审计与排错:
- 查看 SELinux 状态与布尔值:sestatus、getsebool -a
- 永久调整布尔值:setsebool -P 1|0
- 查看与处理拒绝事件:使用 journalctl 检索 AVC 拒绝日志,配合 audit2why、sealert 分析并生成策略修正建议。