SELinux 安全机制

SELinux 安全机制

在 Linux 服务器安全体系中,防火墙、权限管理、系统补丁往往是最被关注的部分,但还有一个极其关键、同时又经常被误解的安全机制——SELinux(Security-Enhanced Linux)。许多初学者在使用 CentOS、RHEL 或 Fedora 时,常常在遇到服务无法启动、端口无法访问时,第一反应是关闭 SELinux。然而,真正理解并正确使用 SELinux,能够让你的系统安全性提升一个数量级。

一、什么是 SELinux?

SELinux 是由美国 NSA 与开源社区共同开发的一种 强制访问控制(MAC) 系统,用来限制进程对文件、目录、端口等资源的访问能力。

传统 Linux 权限(DAC:自主访问控制)有两个主要缺陷:

  1. 权限只看用户/用户组,粒度较粗
  2. root 拥有完全控制权,任何进程只要越权到 root 就可以为所欲为

SELinux 则通过严格的安全策略,为每个进程和资源定义“可以访问什么、以什么方式访问”,即使是 root 也不能越界。

二、SELinux 的三种模式

SELinux 提供三种工作模式:

1. Enforcing(强制模式)——默认、也是最安全的模式

系统严格执行 SELinux 策略,违规访问会被拒绝。

2. Permissive(宽容模式)

只记录违规行为但不执行阻拦。 常用于排查问题或调试服务。

3. Disabled(关闭)

完全禁用 SELinux。 强烈不建议生产环境关闭。

三、查看与设置 SELinux 模式

查看当前模式

1
2
getenforce
sestatus

图片

临时切换模式(重启失效)

1
2
setenforce 0   # 切换到 Permissive
setenforce 1 # 切换到 Enforcing

永久修改模式(需修改配置文件)

1
2
3
4
5
6
vim /etc/selinux/config

SELINUX=enforcing
# 或
SELINUX=permissive
SELINUX=disabled

修改后需要重启才能生效:

1
reboot

四、SELinux 的核心概念

为了理解 SELinux 事件,必须掌握以下三个关键词:

1. Type(类型)

每个进程、文件、端口都会有一个类型(type)。 SELinux 最常使用 Type Enforcement(类型强制)策略。

示例:

  • httpd 进程类型:httpd_t
  • 网页目录类型:httpd_sys_content_t

如果进程类型与资源类型不匹配,就会被拒绝访问。


2. Context(安全上下文)

每个对象都会有一个 SELinux 上下文:

1
ls -Z /var/www/html

格式类似:

1
system_u:object_r:httpd_sys_content_t:s0

其中最重要的字段是 object_r:httpd_sys_content_t,即“资源的类型”。


3. Booleans(策略开关)

用于控制常见服务行为,例如:

1
getsebool -a | grep httpd

例如允许 HTTP 访问网络:

1
setsebool -P httpd_can_network_connect on

这是比修改 Context 更安全、更推荐的方式。