温馨提示×

Ubuntu SELinux网络访问控制

小樊
47
2025-11-24 19:09:41
栏目: 智能运维

Ubuntu 上启用 SELinux 并进行网络访问控制

一 背景与注意事项

  • Ubuntu 默认使用 AppArmor,而 SELinux 源自 NSA 的强制访问控制(MAC)框架,常见于 RHEL/CentOS/Fedora。在 Ubuntu 上启用 SELinux 属于可选方案,需自行安装与维护,复杂度与风险高于 AppArmor。生产环境启用前务必在测试环境验证并做好回滚预案。

二 启用与基础配置

  • 安装与激活
    • 安装组件:sudo apt update && sudo apt install -y policycoreutils selinux-utils selinux-basics auditd
    • 激活 SELinux:sudo selinux-activate
    • 重启系统:sudo reboot
  • 模式切换与持久化
    • 查看模式:getenforce(返回 Enforcing/Permissive/Disabled
    • 临时切换:sudo setenforce 0|1(仅在当前会话生效)
    • 永久生效:编辑 /etc/selinux/config,设置 SELINUX=enforcing|permissive|disabled,然后重启
  • 首次启用后的标签重建
    • disabled 切换到 enforcing/permissive 会触发文件系统重新打标(relabel),耗时较长,属正常现象。

三 网络访问控制常用手段

  • 端口类型与端口管理
    • 查看端口与类型:sudo semanage port -l | grep <服务名>
    • 添加端口到类型(示例将 8080/tcp 加入 http_port_t):sudo semanage port -a -t http_port_t -p tcp 8080
    • 修改现有端口类型:sudo semanage port -m -t ssh_port_t -p tcp 9999
    • 删除端口映射:sudo semanage port -d -t http_port_t -p tcp 8080
  • 服务外连与协议布尔值
    • 查看布尔值:getsebool -a | grep <服务名>
    • 启用/禁用示例:
      • 允许 Apache 对外发起连接:sudo setsebool -P httpd_can_network_connect 1
      • 允许 SSH 对外连接:sudo setsebool -P sshd_can_network_connect 1
      • 允许 MySQL 对外连接:sudo setsebool -P mysqld_can_network_connect 1
    • 提示:将布尔值设为 0 可在策略层面阻断对应网络行为,便于“默认拒绝、按需放行”。
  • 网络访问审计与策略生成
    • 查看最近拒绝日志:sudo ausearch -m avc -ts recent
    • 解释拒绝原因:sudo audit2why < /var/log/audit/audit.log
    • 生成并加载自定义模块(示例):
      • sudo ausearch -m avc -ts recent | audit2allow -M my-net-policy
      • sudo semodule -i my-net-policy.pp
  • 验证与回退
    • 验证模式:getenforce(应为 Enforcing 才表示策略生效)
    • 故障排查:临时切到 Permissive 验证是否为 SELinux 导致:sudo setenforce 0;定位后再回到 Enforcing

四 常见场景示例

  • 变更服务监听端口(以 SSH 为例)
    • 修改 /etc/ssh/sshd_configPort 9999
    • 放行端口类型:sudo semanage port -m -t ssh_port_t -p tcp 9999
    • 重启服务:sudo systemctl restart ssh
  • 放行 Web 服务对外连接(以 Apache 为例)
    • 允许对外连接:sudo setsebool -P httpd_can_network_connect 1
    • 如需访问非默认目录,修正文件上下文(示例):
      • sudo semanage fcontext -a -t httpd_sys_content_t "/websrv(/.*)?"
      • sudo restorecon -R /websrv
  • 非标端口运行 Web 服务
    • 放行端口:sudo semanage port -a -t http_port_t -p tcp 8080
    • 重启 httpd 并验证访问。

五 故障排查与最佳实践

  • 快速判定是否为 SELinux 问题
    • 检查模式:getenforce
    • 查看拒绝日志:sudo ausearch -m avc -ts recent
    • 解释日志:sudo audit2why < /var/log/audit/audit.log
  • 变更策略的稳妥流程
    • 先在 Permissive 下验证功能,再回到 Enforcing
    • 优先使用官方策略与端口类型,其次用 audit2allow 生成最小必要规则
    • 变更策略或系统标签后,必要时重启相关服务或系统
  • 风险提示
    • 修改 SELinux 可能导致服务异常或无法启动;务必保留回滚方案(如快照、可切回的 Permissive 模式)
    • 若仅需应用级网络限制,也可评估 AppArmor(Ubuntu 默认)以降低维护复杂度。

0