91·安全加固高级

SELinux 安全增强

selinuxsecurity

第91课:SELinux 安全增强

学习目标

通过本课的学习,你将能够:

  1. 理解 SELinux 的基本原理:明白 SELinux(安全增强型 Linux)作为一种强制访问控制(MAC)机制,与传统的自主访问控制(DAC)有何不同及其重要性。
  2. 管理 SELinux 布尔值(Booleans):学会查询和设置 SELinux 布尔值,以灵活地开关特定服务的安全策略。
  3. 设置与修复文件安全上下文(Context):掌握查看和修改文件、目录安全上下文的方法,确保服务能正常访问其资源。
  4. 配置 SELinux 的运行模式:能够在 enforcing(强制)、permissive(宽容)和 disabled(禁用)三种模式间进行切换与排查问题。
  5. 使用 SELinux 日志进行故障排查:学会分析 audit.log 来定位和解决 SELinux 引发的权限拒绝问题。

核心概念

想象一下,传统的 Linux 权限(如 rwx)是“房门上的锁”,房主(所有者)可以决定谁拥有钥匙(读/写/执行权限)。而 SELinux 则更像是为整个房子制定了一套详尽的“安保规则手册”:即使你有钥匙,也可能被门卫(SELinux 策略)拦下,因为规则不允许你在特定时间(如凌晨2点)进入某个房间(特定进程访问特定文件)。

核心是“标签”(Label)。系统中的每个进程、文件、目录、端口等资源都被打上了安全上下文的“标签”。SELinux 策略定义了哪些标签之间可以交互。例如,标签为 httpd_t 的 Web 服务器进程,只能访问标签为 httpd_sys_content_t 的网页文件,而不能访问标签为 shadow_t 的密码文件。

SELinux 模式

  • Enforcing:策略生效,违反策略的操作会被阻止并记录到日志。
  • Permissive:策略不生效,但违反策略的操作会被记录到日志。这是调试的黄金模式
  • Disabled:完全关闭 SELinux。不推荐,因为无法提供额外保护,且重新启用需要重启并重新标记整个文件系统。

安全上下文

一个典型的上下文看起来是这样的:user:role:type:level。 对于系统管理,我们最关心的是 type(类型)。例如:

  • httpd_t: Web 服务器进程的类型。
  • httpd_sys_content_t: Web 内容文件应具备的类型。
  • sshd_t: SSH 服务进程的类型。

策略的核心规则就是:“httpd_t 进程可以读取 httpd_sys_content_t 类型的文件”。

代码示例

1. 查看 SELinux 状态与上下文

# 查看 SELinux 整体状态
sestatus

# 查看当前 SELinux 运行模式
getenforce

# 查看文件/目录的安全上下文(-Z 选项)
ls -Z /var/www/html/index.html
# 输出示例: -rw-r--r--. root root unconfined_u:object_r:httpd_sys_content_t:s0 index.html

# 查看进程的安全上下文
ps auxZ | grep httpd
# 你会看到 httpd 进程运行在 `httpd_t` 类型下。

2. 管理 SELinux 布尔值

布尔值是策略中的开关,用于快速启用或禁用一组相关规则。

# 列出所有布尔值及其当前状态
getsebool -a | grep httpd

# 查询与 Samba 相关的布尔值
getsebool -a | grep samba

# 临时设置布尔值(重启后失效)
# 允许 httpd 发起网络连接(例如作为反向代理)
setsebool -P httpd_can_network_connect on

# “-P” 选项表示永久写入策略,重启后依然生效。
setsebool -P samba_enable_home_dirs on

3. 设置与修复文件安全上下文

当文件被移动或由非标准位置创建时,其上下文可能不正确。

# 查看并对比正确与错误上下文
ls -Z /var/www/html/ # 正确上下文
ls -Z /home/user/mysite/ # 可能错误的上下文

# 临时修改上下文(重启后可能被 restorecond 服务覆盖)
chcon -t httpd_sys_content_t /home/user/mysite/index.html

# 永久设置上下文(推荐方法)
# 首先,使用 `semanage` 工具添加一条文件上下文规则
semanage fcontext -a -t httpd_sys_content_t "/home/user/mysite(/.*)?"

# 然后,使用 `restorecon` 应用规则,将规则应用到现有文件
restorecon -Rv /home/user/mysite/

# 验证修改
ls -Z /home/user/mysite/index.html

4. 排查 SELinux 拒绝问题

当服务出现莫名奇妙的“权限拒绝”错误时,SELinux 往往是首要怀疑对象。

# 第一步:检查审计日志
ausearch -m avc --start recent

# 或者直接查看日志
cat /var/log/audit/audit.log | grep avc

# 日志条目会显示:“denied { read } for pid=xxxxx comm=“httpd” name=“index.html” dev=“sda1” ino=12345 scontext=system_u:system_r:httpd_t:s0 tcontext=unconfined_u:object_r:user_home_t:s0”
# 解读:httpd_t 进程(Web服务器)试图读取一个 user_home_t 类型的文件(用户主目录文件),被策略拒绝。

# 第二步:根据日志生成建议的修复策略
sealert -a /var/log/audit/audit.log

# 第三步:考虑解决方案
# 方案A:修复文件上下文(如上一步的 restorecon)
# 方案B:如果该行为合理且常见,可考虑打开相关布尔值。
# 方案C:如果系统没有 `sealert`,可以使用 `audit2allow` 生成自定义模块(需谨慎!)
cat /var/log/audit/audit.log | audit2allow -M myfix
semodule -i myfix.pp

实践练习

练习一:观察与识别

  1. 使用 ls -Z 查看 /etc/passwd/etc/shadow/tmp/ 目录下的一个文件的安全上下文。
  2. 思考:为什么 /etc/shadow 的上下文类型(通常是 shadow_t)与 /etc/passwdpasswd_file_t)不同?这如何增强了安全性?

练习二:调整策略解决“实际问题” 场景:你在 /opt/webapp/ 目录下部署了一个网站,但 Apache (httpd) 服务无法访问其中的页面,日志显示权限拒绝。

  1. 使用 sestatusgetenforce 确认 SELinux 处于 Enforcing 模式。
  2. 通过查看日志或使用 ls -Z,确认 /opt/webapp/index.html 的上下文类型不是 httpd_sys_content_t
  3. 任务:使用 semanage fcontextrestorecon 命令,永久地将 /opt/webapp/ 目录的上下文类型设置为 httpd_sys_content_t,使网站恢复正常访问。

练习三:使用布尔值 场景:你需要配置本地用户通过 Samba 服务访问他们的家目录。

  1. 查找与“samba”和“home”相关的布尔值。
  2. 永久启用一个最有可能解决此问题的布尔值。
  3. 验证该布尔值已设置为 on

常见错误

  1. 一遇问题就关闭 SELinux:这是最大且最危险的误区。正确做法是先切换到 Permissive 模式排查,利用日志和工具解决问题。关闭 SELinux 会丧失其提供的强大纵深防御。
  2. 忽略布尔值,只改文件上下文:很多安全问题可以通过简单的开关布尔值解决,这比修改文件上下文更精准、更符合策略设计初衷。例如,允许 httpd 连接数据库,应优先检查 httpd_can_network_connect_db 布尔值。
  3. 使用 chcon 而不 restoreconchcon 的修改是临时性的,且可能在系统触发自动标记(如文件系统检查)时丢失。应使用 semanage fcontext + restorecon 进行永久、规范的修改。
  4. 盲目使用 audit2allow 生成策略:此工具有时会生成过于宽松的规则。在应用其生成的 .pp 模块前,必须理解它到底允许了什么。最安全的做法是先根据日志手动修复上下文或调整布尔值。
  5. 不检查 audit.log:SELinux 拒绝操作时,服务本身的日志(如 /var/log/httpd/error_log)可能只显示 “Permission denied”,而详细原因全部记录在 /var/log/audit/audit.log 中。不看此日志等于盲人摸象。

小结

  • SELinux 是 MAC 安全机制,通过为资源分配“标签”并执行策略来强制访问控制,是 Linux 安全体系的重要基石。
  • 三步排错法:1) setenforce 0 切至宽容模式验证问题是否消失;2) 检查 /var/log/audit/audit.log 找到被拒绝的 AVC 记录;3) 根据记录通过 restoreconsetseboolsemanage 修复。
  • 布尔值是快速开关,用于调整一组相关策略规则,应优先考虑。
  • 上下文是根本,确保文件和进程的标签与策略规则匹配,使用 semanagerestorecon 进行持久化管理。
  • 切勿轻易禁用 SELinux,将其置于 Permissive 模式并努力解决它所报告的问题,是提升系统安全性和管理员技能的最佳途径。

在下一课中,我们将学习另一种强制访问控制工具 AppArmor,它采用基于路径的配置文件方式,与 SELinux 的标签方式形成对比。

练习编辑器

rust
Loading...

继续学习

完成本课后,建议继续学习下一课「AppArmor 应用防护」 以巩固所学知识。