温馨提示×

Ubuntu SELinux网络策略

小樊
41
2025-12-10 13:43:57
栏目: 智能运维

Ubuntu 上启用 SELinux 并制定网络策略

一 前置说明与模式

  • Ubuntu 默认不启用 SELinux,默认使用 AppArmor;在 Ubuntu 上启用 SELinux 属于可选操作。SELinux 有三种模式:Disabled(彻底关闭)、Permissive(仅记录不阻断,便于排错)、Enforcing(强制实施策略)。建议先在 Permissive 下验证,再切到 Enforcing。SELinux 与 ufw/iptables 互不冲突:前者是内核级 MAC 策略,后者是网络层防火墙,二者可叠加使用。

二 启用 SELinux 与基础检查

  • 安装组件与激活
    • 安装工具与策略包:sudo apt update && sudo apt install selinux-basics selinux-policy-default auditd audispd-plugins
    • 激活 SELinux:sudo selinux-activate
  • 配置模式(两种等效方式)
    • 运行时切换:sudo setenforce 0|1(分别对应 Permissive/Enforcing
    • 永久配置:编辑 /etc/selinux/config,设置 SELINUX=permissive|enforcing,重启生效
  • 基础检查
    • 查看状态:sestatusgetenforce
    • 查看审计日志:sudo ausearch -m avc -ts recentgrep avc /var/log/audit/audit.log
  • 说明
    • 初次启用后建议重启一次,确保策略与文件标签正确加载。

三 网络策略常用操作

  • 端口类型与标签
    • 列出端口与类型:semanage port -l
    • 添加自定义端口到类型(示例:将 8080/tcp 加入 http_port_t,使 Web 服务可绑定)
      • sudo semanage port -a -t http_port_t -p tcp 8080
    • 查看自定义项:semanage port -lC
  • 服务网络访问布尔值
    • 查看布尔值:getsebool -a | grep httpd_can_network_connect
    • 持久开启(示例:允许 httpd 主动发起数据库连接)
      • sudo setsebool -P httpd_can_network_connect_db 1
  • 网络相关常见类型与用途(示例)
    • http_port_t:Web 服务端口(如 80/tcp、443/tcp、8080/tcp
    • mysqld_port_t:数据库端口(如 3306/tcp
  • 文件与目录上下文(与网络服务读取内容相关)
    • 添加目录上下文:sudo semanage fcontext -a -t httpd_sys_content_t '/var/www/html(/.*)?'
    • 应用上下文:sudo restorecon -Rv /var/www/html
  • 策略模块与定制
    • 从拒绝日志生成模块:sudo ausearch -m avc -ts recent | audit2allow -M mypol
    • 加载模块:sudo semodule -i mypol.pp
  • 排错要点
    • 优先在 Permissive 模式验证,确认无 AVC 拒绝后再切 Enforcing
    • 使用 ausearch -m avcaudit2allow 快速定位并生成策略补丁。

四 与防火墙的配合

  • ufw 负责网络层访问控制,SELinux 负责进程/端口/类型的强制访问控制,二者可同时启用且职责不同。
  • 常用 ufw 示例
    • 启用:sudo ufw enable
    • 放行端口:sudo ufw allow 22/tcpsudo ufw allow 80,443/tcp
    • 按来源放行:sudo ufw allow from 192.168.1.0/24
    • 查看状态:sudo ufw status verbose
  • 实践建议
    • 先用 ufw 限制来源/端口,再用 SELinux 精确控制进程对端口与网络资源的访问,形成纵深防御。

五 常见网络场景示例

  • Web 服务使用非标准端口
    • 放行防火墙:sudo ufw allow 8080/tcp
    • 让 SELinux 允许 httpd 绑定 8080:sudo semanage port -a -t http_port_t -p tcp 8080
    • 重启服务并验证
  • 应用服务器连接数据库
    • 放行数据库端口(如 3306/tcp)于 ufw
    • 允许应用(如 httpd/php-fpm)发起数据库连接:sudo setsebool -P httpd_can_network_connect_db 1
  • 自定义服务端口
    • 将服务端口加入对应类型(如将某自定义服务端口加入 http_port_t 或自建类型),必要时用 audit2allow 生成模块并加载。

0