温馨提示×

SELinux策略如何编写和优化

小樊
45
2025-12-26 01:14:50
栏目: 智能运维

编写与优化 SELinux 策略的实用指南

一 基础与准备

  • 运行模式与状态
    • 三种模式:Enforcing(强制执行)、Permissive(仅记录不拦截,便于调试)、Disabled(关闭)。常用命令:getenforcesetenforce 0|1sestatus;永久配置在 /etc/selinux/configSELINUX=SELINUXTYPE=(常见值为 targeted)。在生产环境建议保持 Enforcing,问题排查阶段可切到 Permissive
  • 安全上下文与标签
    • 上下文格式:user:role:type:level(常见客体 role=object_rtype 是访问控制核心;level 用于 MLS)。查看命令:ls -Zps -Z
  • 策略类型
    • 常见为 targeted(只保护特定服务)、MLS(多级安全,较少用于通用服务器)。一般服务器优先使用 targeted

二 策略编写步骤

  • 为服务创建专用域与可执行标签
    • 定义类型(.te):声明服务域与可执行类型,并使用宏将服务纳入初始化域(便于正确启动与域转换)。示例:
      module myapp 1.0;
      require { type init_t; class process transition; }
      type myapp_t, domain;
      type myapp_exec_t, exec_type, file_type;
      init_daemon_domain(myapp_t)
      
    • 标记可执行文件(file_contexts):/usr/local/bin/myapp u:object_r:myapp_exec_t:s0
    • 编译与加载模块:checkmodule -M -m -o myapp.mod myapp.tesemodule_package -o myapp.pp -m myapp.modsemodule -i myapp.pp
  • 为数据路径设置持久化文件上下文
    • 使用 semanage fcontext 添加规则并用 restorecon 应用,避免用易丢失的 chcon
      semanage fcontext -a -t httpd_sys_content_t "/web/data(/.*)?"
      restorecon -Rv /web/data
      
    • 常见场景:Web 内容目录使用 httpd_sys_content_t,数据库数据目录使用对应服务类型(如 mysqld_db_t 等)。
  • 使用布尔值快速启用/关闭功能
    • 查看与设置:getsebool -asetsebool httpd_can_network_connect_db onsetsebool -P httpd_can_network_connect_db on(持久化)。优先用布尔值而非直接放开规则。
  • 处理域转换与客体默认类型
    • 当进程执行特定可执行文件后切换到服务域,需配合 type_transition 与必要的 allow 规则;示例:
      type_transition init_t myapp_exec_t : process myapp_t;
      allow init_t myapp_exec_t : process transition;
      allow myapp_t myapp_exec_t : file { execute read getattr };
      allow myapp_t self : process { fork signal sigchld };
      
    • 注意:type_transition 只提供“默认类型”,不会自动赋予访问权限,仍需显式 allow

三 优化与排错

  • 基于日志的精准授权
    • 检索拒绝事件:ausearch -m avc -ts recentgrep "avc:.*denied" /var/log/audit/audit.log。先判断访问是否合理,再决定是改标签、开布尔值,还是写最小规则。
    • 辅助生成模块:audit2allow -w -a(解释拒绝原因)、audit2allow -M mypolicy < /var/log/audit/audit.logsemodule -i mypolicy.pp。避免“照单全收”,仅授予必要权限。
  • 用工具做策略质量与冲突检查
    • 使用 sealert -a /var/log/audit/audit.log 获取更友好的分析与修复建议;在策略合并与编译阶段关注 neverallow 冲突与可维护性。
  • 性能与可维护优化
    • 遵循最小权限原则:只授予完成功能所必需的权限;优先用布尔值与细化类型,少用通配与过宽规则。
    • 保持策略模块化、可复用(属性与宏),定期清理无用规则与历史模块;对高并发服务,避免不必要的复杂策略与过度日志。
  • 模式切换与灰度策略
    • 新服务或大规模变更:先在 Permissive 观察完整拒绝日志,再切回 Enforcing;对仍频繁报错的个别网域可短期保留 Permissive,但应有明确回退计划。

四 常见场景与命令清单

  • Web 服务(以 httpd 为例)
    • 目录标签:semanage fcontext -a -t httpd_sys_content_t "/var/www/html(/.*)?" && restorecon -R /var/www/html
    • 允许数据库连通(如确有需要):setsebool -P httpd_can_network_connect_db on
    • 端口标签:如需使用非默认端口,先为端口打标签,再在策略中允许访问该端口类型。
  • 自定义服务(通用步骤)
    • 定义类型与域、标记可执行文件、必要时设置 type_transition、编译并加载模块;用 ps -Zls -Z 校验上下文是否生效。
  • 常用命令速查
    • 状态与模式:sestatusgetenforcesetenforce 0|1
    • 标签:ls -Zps -Zsemanage fcontextrestorecon -Rv
    • 布尔值:getsebool -asetseboolsetsebool -P
    • 日志与修复:ausearch -m avcaudit2allow -M <name>semodule -i <name>.ppsealert -a <log>

五 安全与风险提示

  • 切勿以关闭 SELinux 换取兼容性或性能(如将 SELINUX=disabled)。优先通过正确的标签、布尔值与最小权限规则解决问题。
  • 避免在生产环境长期使用 chcon 或直接编辑策略文件;使用 semanage 持久化上下文,策略变更通过模块管理。
  • 对自动生成的规则保持审慎,务必复核访问向量与客体类别,防止过度授权与策略膨胀。

0