SELinux


SELinux 入门:Linux 安全增强子系统详解

一、什么是 SELinux?

SELinux(Security-Enhanced Linux) 是 Linux 系统的安全增强子系统,由美国国家安全局(NSA)开发。它通过强制访问控制(MAC)机制,严格限制进程、文件、服务之间的交互,防止恶意程序利用系统漏洞获取权限,从底层提升系统安全性。
- 核心作用:即使管理员账户被入侵,SELinux 也能通过预设策略限制攻击范围。
- 典型场景:保护 Web 服务器、数据库、容器等关键服务,防止权限滥用。

我们可以把 SELinux 比作一个超级严格的“系统保安”,专门防止各种“违规行为”。

  • 具体禁止场景

1.跨区域乱闯:网页服务器想打开用户的私人文件(比如/home/user/private.txt),即使你有文件的“读取权限”(钥匙),但保安看你“身份标签”不对(比如你的工作区是“网页区”,文件属于“用户区”),直接拦住。

2.乱改系统文件:普通用户(甚至管理员root)想直接修改系统配置文件(比如/etc/httpd.conf),但保安发现你的“操作权限”没被提前登记,哪怕你有写入权限,也不让改。

3.偷偷创建敏感文件:某个程序想在系统核心目录(比如/bin)里新建文件,保安会说“这里只能系统自己用,你没资格创建”。

4.端口乱占用

  • 网页服务器(httpd)只能用“80号门”(端口80)和“443号门”(端口443),如果你让它用“8080号门”,保安会说“这个门没给你登记,禁止通过”。
  • 普通程序想占用“1024以下的门”(比如端口80),保安会说“这些门只有领导(特权程序)能用,你没资格”。

5.乱连外部网络

  • 网页服务器默认只能“被动开门”(等别人访问),不能主动“出去打电话”(比如连接数据库)。如果想连,必须让保安登记“允许上网”的权限。
  • 远程电脑想访问你电脑的“22号门”(SSH端口),但保安发现对方“身份可疑”(标签不匹配),直接拒绝连接。

总结:SELinux的核心逻辑——“没说允许的,就是禁止的”

  • 传统权限(如chmod:像“钥匙”,有钥匙就能进(默认允许,除非明确禁止)。
  • SELinux:像“保安”,即使有钥匙,也要看你“身份标签”和“允许清单”,没登记的就是不让进(默认禁止,必须明确允许)。

这样一来,即使黑客拿到了“钥匙”(比如获取了文件读写权限),保安也会检查“身份”和“权限清单”,把非法操作拦在门外,大大提高系统安全性!

二、SELinux 三种工作模式

模式 英文解释 核心行为 适用场景
Enforcing 强制模式 严格执行 SELinux 策略,阻止任何不符合规则的访问,并记录日志到 /var/log/audit/audit.log 生产环境(默认推荐)
Permissive 宽容模式(调试模式) 不阻止违规访问,但记录详细日志(方便排查策略问题) 排查权限问题时临时启用
Disabled 禁用模式 完全关闭 SELinux(安全性降低,不建议生产环境使用) 非安全测试环境或旧系统兼容

三、查看 SELinux 状态

1. 快速查看当前模式

getenforce  # 简洁输出:Enforcing/Permissive/Disabled

或查看详细状态(包含策略版本、配置路径等):

sestatus

输出解读(以 enforcing 模式为例):

SELinux status:                 enabled       # SELinux 已启用
Current mode:                   enforcing     # 当前运行模式
Mode from config file:          enforcing     # 配置文件中的目标模式(重启后生效)
Loaded policy name:             targeted      # 当前策略(常见:targeted/mls)

四、修改 SELinux 模式(分步指南)

场景 1:临时切换模式(无需重启,重启后失效)

  • 切换到宽容模式(排查问题)
setenforce 0  # 等价于 permissive 模式(临时生效,重启后恢复原配置)
  • 恢复强制模式
setenforce 1  # 等价于 enforcing 模式(临时生效)

注意setenforce 仅能在 EnforcingPermissive 之间切换,无法直接禁用 SELinux。

场景 2:永久修改模式(需重启)

1.编辑配置文件

vi /etc/selinux/config  # 推荐用文本编辑器(如 nano、vim)

找到 SELINUX= 行,修改为目标模式(三选一):

SELINUX=enforcing   # 强制模式(默认)
SELINUX=permissive  # 宽容模式
SELINUX=disabled    # 禁用模式(谨慎!)

2.保存并重启系统

systemctl reboot  # 重启后新配置生效

🔍 重启后验证:getenforce 应显示新模式(如 disabled)。

五、用 sed 命令批量修改配置(适合脚本操作)

需求:通过脚本关闭 SELinux(禁用模式)

1.备份原配置(重要!)

cp /etc/selinux/config /etc/selinux/config.bak

2.使用 sed 替换模式

sed -i 's/SELINUX=enforcing/SELINUX=disabled/g' /etc/selinux/config
# 或针对其他模式:s/SELINUX=permissive/SELINUX=disabled/

3.临时关闭(立即生效,重启后永久生效)

setenforce 0  # 先切换到 permissive,避免 Enforcing 模式下的权限阻塞

⚠️ 警告:禁用 SELinux 会降低系统安全性,仅建议在测试环境或旧软件兼容性问题时使用。生产环境应优先排查策略而非直接关闭。

六、SELinux 最佳实践(生产环境必看)

  1. 优先使用 Permissive 模式调试 当服务因 SELinux 策略报错(如文件权限拒绝)时:
  2. 临时切换到 permissive 模式:setenforce 0
  3. 复现问题,通过日志定位策略缺失:
grep 'avc:' /var/log/audit/audit.log  # 搜索 SELinux 违规记录
  • 使用 audit2allow 工具生成修复策略(避免禁用 SELinux)。

  • 理解常用策略类型

  • targeted:默认策略,仅保护关键系统服务(如 httpd、sshd),对普通用户影响小。
  • mls:多级安全策略(军用级),适合对安全性要求极高的场景(配置复杂)。

  • 避免直接修改配置文件 生产环境建议通过官方工具调整策略,例如:

  • semanage:管理 SELinux 策略规则(如端口、文件标签)。
  • chcon:临时修改文件安全标签(永久生效需配合 semanage fcontext)。

七、常见问题与排错

Q1:关闭 SELinux 后服务仍无法启动?

  • A:可能是残留的安全标签问题。尝试重置文件标签:
restorecon -Rv /服务路径  # 恢复默认安全上下文(需在 Permissive/Disabled 模式下执行)

Q2:如何恢复默认 SELinux 配置?

  • A:若配置文件损坏,可重新生成默认文件:
mv /etc/selinux/config /etc/selinux/config.bak
touch /etc/selinux/config  # 重启后系统会自动生成默认配置(仅首次有效)

Q3:生产环境误设为 Disabled 如何恢复?

  • A:编辑 /etc/selinux/config 改回 enforcingpermissive,重启后生效。若无法启动系统,可进入单用户模式修改配置。

八、总结:SELinux 操作三原则

  1. 生产环境不禁用:优先通过 permissive 模式排查策略,用官方工具修复权限问题。
  2. 修改前备份:对 /etc/selinux/config 和关键文件执行 cp 备份,避免配置丢失。
  3. 善用日志:通过 audit.log 定位违规行为,结合 man selinux 或官方文档理解策略逻辑。

掌握 SELinux 基础配置后,可进一步学习安全标签、策略定制等进阶内容,充分发挥其在服务器安全中的防护作用。