Linux SELinux 核心概念与管理
一、SELinux 基本概念
SELinux 即安全增强型 Linux(Security-Enhanced Linux),由美国国家安全局(NSA)开发,是一套基于强制访问控制(MAC)的安全机制,旨在解决传统 Linux 权限管理的安全隐患。
1. 与传统权限模型的区别
- DAC(自主访问控制):
传统 Linux 的权限管理方式,主体(用户)对目标文件的访问仅由文件的 rwx 权限决定。存在安全隐患:通过 suid/sgid 特殊权限可能被滥用,错误配置易引发漏洞。 - MAC(强制访问控制):
SELinux 采用的权限模型,主体(程序)访问目标文件时,必须同时满足 DAC 权限和 SELinux 安全策略,否则访问被拒绝。
2. DAC 与 MAC 的核心差异
特性 | DAC(自主访问控制) | MAC(强制访问控制) |
---|---|---|
主体 | 用户 | 程序(进程) |
决策依据 | 仅文件本身的 rwx 权限 | 文件权限 + SELinux 安全策略 |
灵活性 | 高(用户可自主修改权限) | 严格(策略由系统管理员统一配置) |
安全级别 | 较低(易因配置错误导致漏洞) | 较高(强制限制所有访问行为) |
二、SELinux 原理与特点
1. 核心原理
基于强制访问控制机制,在传统权限基础上,通过定义 “安全上下文标签” 和 “类型规则”,限制程序对文件 / 资源的访问:只有当程序的类型与目标文件的类型匹配(符合策略规则)时,访问才被允许。
2. 主要特点
- 安全上下文标签(Context):所有文件、进程、端口等都被分配唯一的标签,用于标识其安全属性。
- 双重权限检查:访问行为需同时通过传统 Unix 权限(DAC)和 SELinux 策略(MAC)检查。
- 细粒度控制:可针对单个程序、文件或端口制定访问规则,而非仅依赖用户身份。
三、SELinux 安全策略与模式
1. 安全策略(Policy)
SELinux 通过预定义的策略文件控制访问规则,常见策略:
- targeted(默认):仅对关键服务(如 httpd、sshd)施加严格限制,普通程序不受特殊限制,适用于 RHEL/CentOS 等发行版。
- mls(多级安全):最高级别的安全策略,对所有进程和文件实施严格的多级访问控制,配置复杂,适用于高安全需求场景(如军事、金融)。
2. 运行模式
SELinux 的配置文件为 /etc/selinux/config
(与 /etc/sysconfig/selinux
软链接一致),支持三种运行模式:
- enforcing(强制模式):
启用 SELinux,严格执行策略,不符合规则的访问被拒绝并记录日志。 - permissive(警告模式):
不拒绝访问,但会记录违反策略的行为(用于调试:判断问题是服务配置错误还是 SELinux 阻挡)。 - disabled(禁用模式):
完全关闭 SELinux,需重启系统生效。
3. 模式管理命令
查看当前模式:
getenforce # 输出:Enforcing / Permissive / Disabled
[root@zhang3 /]# getenforce Enforcing
临时切换模式(无需重启,重启后失效):
setenforce 0 # 切换为 Permissive 模式 setenforce 1 # 切换为 Enforcing 模式
永久切换模式:
编辑
/etc/selinux/config
,修改SELINUX
字段后重启:SELINUX=enforcing # 或 permissive / disabled
四、安全上下文(Context)详解
安全上下文是 SELinux 的核心标识,由用户(u)、角色(r)、类型(t) 三部分组成,格式为:user:role:type
。
例如:unconfined_u:object_r:httpd_sys_content_t:s0
1. 查看安全上下文
查看文件 / 目录的上下文:p
ll -Z /abc/aa # 查看文件 aa 的上下文 ll -ldZ /abc/ # 查看目录 /abc 的上下文
[root@zhang3 /]# ll -Z
lrwxrwxrwx. root root system_u:object_r:bin_t:s0 bin -> usr/bin
dr-xr-xr-x. root root system_u:object_r:boot_t:s0 boot
drwxr-xr-x. root root system_u:object_r:device_t:s0 dev
drwxr-xr-x. root root system_u:object_r:etc_t:s0 etc
drwxr-xr-x. root root system_u:object_r:home_root_t:s0 home
lrwxrwxrwx. root root system_u:object_r:lib_t:s0 lib -> usr/lib
***************************
输出格式解析(以第一行为例)
lrwxrwxrwx. root root system_u:object_r:bin_t:s0 bin -> usr/bin
从左到右依次为:
文件权限与类型:lrwxrwxrwx.
l 表示这是一个符号链接(软链接);
后续 rwxrwxrwx 是权限位;
末尾 . 表示该文件受 SELinux 控制。
所有者:root(文件的拥有者用户)。
所属组:root(文件所属的用户组)。
SELinux 安全上下文:system_u:object_r:bin_t:s0
这是核心信息,由 4 部分组成,用冒号分隔:
system_u:用户(User),表示 SELinux 上下文的用户(system_u 是系统用户)。
object_r:角色(Role),表示访问该对象的角色(object_r 是文件 / 目录等对象的默认角色)。
bin_t:类型(Type),最关键的部分,决定了进程能否访问该文件。例如 bin_t 表示这是二进制程序目录的类型。
s0:级别(Level),用于 MLS(多级安全)策略,默认 s0 表示最低级别。
文件名 / 链接目标:bin -> usr/bin(表示 bin 是指向 usr/bin 的软链接)。
其他行说明
dr-xr-xr-x. root root system_u:object_r:boot_t:s0 boot
d 表示 boot 是目录;
boot_t 是 /boot 目录的 SELinux 类型(用于系统启动相关文件)。
drwxr-xr-x. root root system_u:object_r:device_t:s0 dev
d 表示 dev 是目录;
device_t 是 /dev 目录的 SELinux 类型(用于设备文件,如 /dev/sda 等)。
查看进程的上下文:
ps -Z | grep httpd # 查看 httpd 进程的上下文
2. 修改安全上下文
临时修改(重启或 relabel 后失效):
chcon -t tmp_t /abc/aa # 将 /abc/aa 的类型改为 tmp_t
-t
:指定类型(最常用的上下文部分)。
恢复默认上下文:
当手动修改后需还原时,使用restorecon
:restorecon -v /abc/aa # 恢复 /abc/aa 的默认上下文(-v 显示详细信息)
永久修改上下文:
通过semanage
工具添加规则(需安装policycoreutils-python
包):# 永久将 /abc 及其子目录的类型设为 tmp_t semanage fcontext -a -t tmp_t "/abc(/.*)?" restorecon -RFv /abc/ # 应用规则(-R 递归,-F 强制)
3. 标签混乱的修复
当系统上下文标签错乱时,可重打所有标签:
touch /.autorelabel # 创建触发文件
reboot # 重启后自动重新标记所有文件(耗时较长)
五、布尔开关(Boolean)管理
布尔开关是 SELinux 中用于动态调整策略的开关,可临时或永久开启 / 关闭特定规则(如允许 httpd 访问用户家目录)。
1. 查看布尔开关
getsebool -a # 列出所有布尔开关及其状态
getsebool -a | grep http # 筛选与 http 相关的开关
2. 修改布尔开关
临时修改
(重启后失效):
setsebool ftpd_full_access on # 允许 ftp 服务的完全访问权限
永久修改(需
-P
参数):setsebool -P ftpd_full_access on # 永久生效
六、端口标签管理
SELinux 对端口也有标签限制,只有当端口标签与服务类型匹配时,服务才能正常监听该端口(如 httpd 默认仅允许监听 http_port_t
类型的端口)。
1. 常用端口标签操作
添加端口标签:
# 允许 httpd 监听 8910/tcp 端口(将 8910 标记为 http_port_t) semanage port -a -t http_port_t -p tcp 8910
查询端口标签:
semanage port -l | grep 8910 # 查看 8910 端口的标签 semanage port -l | grep http # 查看 http 服务允许的端口
修改端口标签:
semanage port -m -t pegasus_http_port_t -p tcp 8910 # 改为 pegasus 类型
删除端口标签:
semanage port -d -t pegasus_http_port_t -p tcp 8910
总结
SELinux 通过强制访问控制(MAC)机制为 Linux 系统提供了额外的安全保障,其核心要素包括:
- 安全上下文(Context):标识文件、进程的安全属性;
- 布尔开关:动态调整策略规则;
- 端口标签:限制服务可监听的端口。
在实际使用中,建议保持 enforcing
模式,通过 setenforce 0
临时排查问题,再通过 semanage
或布尔开关调整策略,而非直接禁用 SELinux。掌握 SELinux 管理是保障 Linux 系统安全的重要技能。