温馨提示×

centos selinux安全策略解读

小樊
35
2025-12-29 03:48:26
栏目: 智能运维

SELinux 在 CentOS 中的定位与核心概念

  • SELinux 是 Linux 内核的强制访问控制(MAC)机制,在传统的自主访问控制(DAC,rwx 权限)之上增加细粒度控制,即使以 root 身份运行,仍会被策略限制。它通过给主体(进程)和客体(文件、端口、套接字等)打上安全上下文标签,再由策略规则决定是否放行。CentOS 默认启用 SELinux,常见策略为 targeted(仅保护选定的网络服务),也可选 mls(多级安全)。安全上下文通常形如:user:role:type,其中对访问控制最关键的是 type(进程域与文件类型)。

工作模式与配置文件

  • 三种模式
    • Enforcing:强制执行策略并记录拒绝日志。
    • Permissive:仅记录违规,不阻断操作,适合排错。
    • Disabled:完全关闭 SELinux,需重启生效。
  • 配置文件
    • 路径:/etc/selinux/config(符号链接 /etc/sysconfig/selinux)。
    • 关键项:
      • SELINUX=enforcing|permissive|disabled
      • SELINUXTYPE=targeted|mls
  • 模式切换要点
    • Enforcing ⇄ Permissive:可用命令 setenforce 0/1 即时切换,无需重启。
    • 涉及 Disabled 的切换(启用或彻底关闭)必须重启系统;从 Disabled 改回时,系统会进行重新标记(relabel),首次启动可能较慢。

常用管理命令与用法

  • 状态与模式
    • 查看:getenforcesestatus
    • 切换:setenforce 0|1
  • 安全上下文查看
    • 文件/目录:ls -Z
    • 进程:ps -Z
    • 用户:id -Z
  • 上下文修复与变更
    • 按策略恢复默认上下文:restorecon -R /path
    • 临时修改上下文:chcon -t type /path
    • 持久化文件上下文规则:semanage fcontext -a -t type “/path(/.*)?” && restorecon -R /path
  • 端口类型
    • 查看:semanage port -l | grep port
    • 添加:semanage port -a -t http_port_t -p tcp 8080
  • 布尔值(功能开关)
    • 查看:getsebool -a
    • 设置:setsebool -P httpd_can_network_connect on(持久化加 -P
  • 审计与策略生成
    • 查看拒绝日志:ausearch -m avc -ts recent
    • 生成模块:audit2allow -a -M mypolicy
    • 安装模块:semodule -i mypolicy.pp
  • 规则查询
    • 查询允许规则:sesearch --allow
      以上命令覆盖了日常运维中对 SELinux 的状态检查、上下文管理、端口与布尔值调整、日志分析与最小权限策略定制等核心操作。

排错流程与最小权限修复示例

  • 标准排错流程
    1. 确认模式:getenforce(如为 Enforcing,可先 setenforce 0 切到 Permissive 验证是否为 SELinux 问题)。
    2. 查拒绝日志:ausearch -m avc -ts todaytail -f /var/log/audit/audit.log
    3. 定位标签与进程:ls -Z /pathps -Z -C processname
    4. 先行修复上下文:restorecon -R /path;若仍失败,按需用 semanage fcontext 持久化规则。
    5. 若涉及网络端口,核对类型:semanage port -l | grep port
    6. 若功能受限,核对布尔值:getsebool -a | grep servicename
    7. 需要最小权限放行时,基于日志生成模块:audit2allow -a -M mysvc && semodule -i mysvc.pp
    8. 验证无误后切回 Enforcing
  • 示例:Nginx 静态目录被拒
    • 现象:访问返回 403,日志出现 AVC 拒绝,涉及进程域 httpd_t 与目标类型不匹配。
    • 修复:
      • 确认目录标签:ls -Z /usr/share/nginx/html
      • 恢复默认标签:restorecon -R /usr/share/nginx/html
      • 若仍不生效,持久化:
        semanage fcontext -a -t httpd_sys_content_t “/usr/share/nginx/html(/.*)?”
        restorecon -R /usr/share/nginx/html
      • 如需对外端口(如 8080):
        semanage port -a -t http_port_t -p tcp 8080
      • 验证并切回强制模式。
        该流程遵循“先诊断、再修复、最后最小化放行”的原则,既恢复业务,又保持最小暴露面。

生产环境最佳实践

  • 保持 SELinux 为 Enforcing,仅在排错时短时切到 Permissive;避免直接 Disabled
  • 优先用布尔值端口类型微调,其次再考虑自定义策略模块,避免“过度放行”。
  • 对关键目录/文件使用 semanage fcontext + restorecon 持久化标签,避免拷贝/移动导致标签错乱。
  • 上线前在测试环境验证策略变更,变更留痕(版本化管理策略模块与规则)。
  • 建立审计与告警:定期分析 AVC 日志,必要时结合 setroubleshootsealert 生成可读报告。

0