好的,我来帮你系统梳理 SELinux(Security-Enhanced Linux) 的概念、原理、工作机制以及配置方法,让你“一文彻底明白”它到底是什么。


1️⃣ SELinux 概念

  • 全称:Security-Enhanced Linux
  • 类型:Linux 内核安全模块(Linux Security Module, LSM)
  • 目标:提供 强制访问控制(MAC, Mandatory Access Control),增强系统安全
  • 提出者:美国国家安全局(NSA)
  • 适用场景
    • 限制进程访问系统资源
    • 防止未授权操作或入侵
    • 强化服务器和容器安全

简单理解:SELinux 就像 Linux 的安全“护身符”,在传统的用户/组权限之上再加一层安全策略控制。


2️⃣ SELinux 与传统权限的区别

权限机制特点SELinux 对应
传统 DAC(Discretionary Access Control)基于文件所有者、用户组、权限位(rwx)控制可以绕过,用户可修改
MAC(SELinux)基于 策略规则 控制访问,不能被用户随意绕过强制安全策略

总结:传统权限是“谁拥有文件决定权限”,SELinux 是“系统策略决定权限”,安全性更高。


3️⃣ SELinux 核心组成

  1. 策略(Policy)
    • 定义哪些 主体(process) 可以访问哪些 客体(file、socket、port)
    • 分为:
      • Targeted Policy(默认,大部分进程不限制)
      • Strict Policy(严格,每个进程都受限制)
      • MLS/MCS Policy(多级安全,多用于敏感环境)
  2. 上下文(Context)
    • 文件、进程、端口等都被分配一个 SELinux 上下文
    user:role:type:level
    • 例如:system_u:object_r:httpd_sys_content_t:s0
      • user:主体所属用户
      • role:角色
      • type:类型(最关键,用于访问控制)
      • level:安全级别
  3. 访问决策(Access Vector Cache, AVC)
    • 内核模块根据策略判断访问是否允许
    • 日志记录违规操作

4️⃣ SELinux 工作模式

模式描述命令查看 / 设置
Enforcing强制执行策略,违规操作被阻止getenforce / setenforce 1
Permissive不阻止操作,仅记录日志setenforce 0
Disabled关闭 SELinux编辑 /etc/selinux/config

日常开发常用 Permissive 调试,生产环境推荐 Enforcing


5️⃣ SELinux 操作示例

5.1 查看状态

sestatus

5.2 查看文件上下文

ls -Z /var/www/html

5.3 修改文件上下文

chcon -t httpd_sys_content_t /var/www/html/index.html

5.4 永久修改策略

semanage fcontext -a -t httpd_sys_content_t "/var/www/html(/.*)?"
restorecon -Rv /var/www/html

5.5 查看日志(阻止操作)

ausearch -m avc -ts today


6️⃣ SELinux 访问控制原理

  1. 主体(Process) 发起访问请求
  2. 内核获取主体和客体的 SELinux 上下文
  3. 内核查询 策略(Policy),判断是否允许
  4. 允许 → 正常访问
    拒绝 → 阻止访问并记录日志

核心点:SELinux 基于类型(Type)访问控制(Type Enforcement, TE),通过策略决定进程访问文件、端口、套接字等资源。


7️⃣ 常见问题

  1. 服务访问被阻止
    • 查看日志 /var/log/audit/audit.log
    • 使用 audit2allow 生成策略允许操作
  2. 开发调试麻烦
    • 可临时切换 Permissive 模式
    • 不建议长期关闭 SELinux
  3. 文件上下文错误
    • 用 restorecon -Rv /path 恢复默认上下文

8️⃣ 总结

  • SELinux 本质:Linux 内核的 强制访问控制系统
  • 作用:限制进程访问资源、防止越权操作、强化系统安全
  • 核心概念:主体(process)、客体(file/port)、策略(policy)、上下文(context)
  • 关键操作
    • 查看状态:sestatus
    • 查看上下文:ls -Z
    • 修改上下文:chcon / semanage
    • 查看日志:ausearch
  • 建议
    • 开发环境可用 Permissive
    • 生产环境尽量 Enforcing
    • 遇到阻止操作先分析日志,再修改策略