温馨提示×

SELinux如何实现网络隔离

小樊
46
2025-12-26 01:16:49
栏目: 智能运维

SELinux实现网络隔离的机制与要点

一、核心机制

  • 类型强制访问控制(TE):每个进程有域(domain),网络端口、套接字等客体有类型(type)。只有当策略中存在“允许某域对某端口/套接字类型进行某类网络操作”的规则时,操作才被放行,否则被拒绝。典型映射如:sshd_t ↔ ssh_port_t(22/TCP)httpd_t ↔ http_port_t(80/TCP、443/TCP)。这能在进程与端口层面实现“谁可以对哪个端口做什么”的细粒度隔离。
  • 端口类型与标签:端口并非只有数字,还带有SELinux类型。通过给端口打上特定类型标签,可限制只有对应域的进程才能绑定/连接到该端口,从而实现服务间的网络隔离与端口“白名单”。
  • 布尔开关:针对常见网络服务,策略提供可切换的**布尔(boolean)**项,用来打开/关闭某类网络能力(如是否允许某服务对外发起连接、是否允许访问用户主目录等),便于在不改策略源码的情况下做功能取舍与隔离强度调整。
  • 策略类型与默认域:主流发行版默认启用targeted策略,仅对“目标进程”实施域隔离,其他进程运行在unconfined_t下,降低系统整体攻击面;需要时可采用更严格的strict/mls策略以增强隔离。

二、常见隔离手段与配置示例

  • 端口绑定隔离(端口类型匹配)

    • 原理:进程域必须与端口类型匹配才能监听/连接。非标准端口需先“贴”上对应类型标签,否则绑定失败。
    • 示例:让 Apache 监听 8088/TCP
      # 1) 防火墙放行
      firewall-cmd --permanent --add-port=8088/tcp
      firewall-cmd --reload
      
      # 2) 将 8088/TCP 标记为 http_port_t,使 httpd_t 可绑定
      semanage port -a -t http_port_t -p tcp 8088
      
      # 3) 验证与回滚
      semanage port -l | grep http_port_t
      semanage port -d -p tcp 8088   # 需要回滚时使用
      
    • 适用场景:强制“某服务只能使用某端口/端口集合”,避免端口劫持与越权监听。
  • 服务对外连接隔离(布尔开关)

    • 原理:默认策略常禁止服务主动对外连接(出站隔离)。按需开启布尔值即可放行特定出站能力。
    • 示例:允许 httpd 对外发起连接(如连接后端 API/数据库)
      setsebool -P httpd_can_network_connect on
      
    • 示例:允许 Samba 共享用户主目录
      setsebool -P samba_enable_home_dirs on
      
    • 适用场景:在“服务域”维度控制“能否出站/能否访问某类资源”,实现最小权限的出站网络隔离。
  • 基于域的进程间网络隔离

    • 原理:不同服务运行在各自受限域(如 httpd_t、smbd_t、nfs_t),策略仅允许它们访问各自所需的端口/资源类型,彼此默认隔离;即便同机运行,跨域网络能力也受到严格约束。
    • 示例:Samba 的 smbd 进程运行在 smbd_t,默认只能读写 samba_share_t 类型对象,不能直接读写 httpd_sys_content_t 等类型,从而实现服务间的数据与网络访问隔离。
    • 适用场景:多服务共存的服务器,利用域隔离减少“一个服务被攻破后横向影响其他服务”的风险。

三、与防火墙的分工与配合

  • SELinux作用于内核的进程/客体标签与策略规则,控制“谁能对哪个端口/套接字做什么”;firewalld/nftables作用于网络层/传输层的包过滤与转发规则,控制“哪些IP/端口的流量可以进出主机”。两者是互补关系:即使防火墙放行,SELinux仍会拦截不匹配策略的网络操作;反之亦然。

四、排错与运维要点

  • 检查运行状态与策略模式
    getenforce                 # 查看 Enforcing/Permissive/Disabled
    setenforce 0/1              # 临时切换(重启失效)
    
  • 查看进程与端口的SELinux上下文
    ps -eZ | grep httpd        # 进程域(如 httpd_t)
    semanage port -l | grep http  # 端口类型(如 http_port_t)
    
  • 永久化与回滚
    • 端口标签:使用 semanage port -a/-m/-d 进行增删改,变更可随时回滚。
    • 布尔值:使用 setsebool -P 永久生效(不加 -P 重启后失效)。
  • 故障定位思路
    • 服务起不来或端口绑定失败,优先检查:端口是否被 SELinux 允许该域使用(端口类型是否正确)。
    • 服务能监听但访问异常,检查:是否缺少对应的布尔开关(出站/访问能力)。
    • 查看 /var/log/audit/audit.log(或 journalctl)中的 AVC 拒绝记录,可精确定位被拒的域/类型/操作。

0