18.SELInux安全性
一、SELinux
(1)SELinux架构
SELinux(Security-Enhanced Linux,安全增强型 Linux)是基于 Linux 内核的强制访问控制(MAC)安全机制,核心架构围绕 “策略决策 - 执行” 流程设计,主要包含三大组件:
- 内核模块(Security Server)
嵌入 Linux 内核,是 SELinux 的核心执行层,负责接收用户 / 进程的访问请求,结合安全策略判断是否允许访问,并通过 LSM(Linux Security Modules,Linux 安全模块)框架与内核其他子系统(如文件系统、进程管理)交互,强制执行访问控制规则。
2.安全策略(Policy)
预定义的访问控制规则集合,决定 “哪些主体(如进程)可以访问哪些客体(如文件、端口)”。常见策略类型有:
- 目标策略(Targeted Policy):默认策略,仅对关键进程(如 Apache、MySQL)进行严格管控,普通进程按传统 DAC(自主访问控制)规则运行,兼顾安全性和易用性;
- 严格策略(Strict Policy):对所有进程和资源强制执行 MAC 控制,安全性极高,但配置复杂,适用于高安全需求场景。
- 3.用户空间工具
提供策略管理、状态查询、日志查看的命令行工具集,如setsebool(修改布尔值)、semanage(管理安全上下文)、ausearch(查询 SELinux 日志)等,是用户操作 SELinux 的核心接口。
(2)SELinux用法
SELinux 的用法围绕 “状态查询 - 规则配置 - 日志分析” 三大场景展开,核心操作依赖命令行工具:
- 状态与信息查询
- 查看 SELinux 当前模式:getenforce(返回 Enforcing、Permissive 或 Disabled);
- 查看详细配置:sestatus(显示模式、策略类型、进程 / 文件安全上下文等);
- 查看文件安全上下文:ls -Z 文件名(如ls -Z /var/www/html);
- 查看进程安全上下文:ps -Z 进程ID/名称(如ps -Z httpd)。
- 2.规则配置
- 修改布尔值(临时生效):setsebool -P 布尔名=值(-P表示永久生效,如setsebool -P httpd_can_network_connect=on允许 Apache 进程联网);
- 管理端口标签:semanage port -a -t 端口标签 -p 协议 端口号(如-a添加、-t http_port_t指定 HTTP 端口标签,例:semanage port -a -t http_port_t -p tcp 8080,允许 8080 端口作为 HTTP 服务端口);
- 恢复文件默认上下文:restorecon -Rv 目录/文件(-R递归处理目录,-v显示详细过程,如restorecon -Rv /var/www/html修复网站目录的安全上下文)。
- 3.日志分析
SELinux 拒绝访问的日志默认记录在/var/log/audit/audit.log(依赖 auditd 服务),可通过工具筛选分析:
- ausearch -m AVC -ts recent:查看最近的 “访问向量缓存(AVC)” 拒绝日志(AVC 日志是 SELinux 拒绝访问的核心日志类型);
- sealert -a /var/log/audit/audit.log:自动分析日志,生成问题原因和解决方案(如提示需开启某个布尔值或添加端口标签)
(3)SELinux基本概念
- 主体(Subject)
发起访问请求的实体,主要指 Linux 进程(如 httpd、sshd 进程),每个主体都有唯一的 “进程安全上下文”,用于标识其身份和权限范围。
2.客体(Object)
被访问的资源,包括文件、目录、端口、设备文件、IPC(进程间通信)资源等,每个客体也有 “客体安全上下文”,描述资源的类型和属性。
3.安全上下文(Security Context)
SELinux 识别主体和客体的 “身份标签”,格式为用户:角色:类型[:级别](级别仅在 MLS/MCS 策略中使用),例如:
- 进程 httpd 的上下文:system_u:system_r:httpd_t:s0;
- 网站文件的上下文:unconfined_u:object_r:httpd_sys_content_t:s0;
核心是 “类型(Type) ”:SELinux 策略主要通过 “主体类型(如 httpd_t)能否访问客体类型(如 httpd_sys_content_t)” 判断访问权限,即 “类型强制(Type Enforcement,TE)”,是 SELinux 最核心的访问控制逻辑。
4.访问向量(Access Vector)
描述 “主体对客体的访问行为”,如读(read)、写(write)、执行(execute)、绑定(bind,针对端口)等。SELinux 策略通过 “访问向量规则” 明确 “某主体类型对某客体类型的某访问行为是否允许”。
(4)更改SELinux模式
SELinux 有三种运行模式,模式决定其访问控制的严格程度,更改模式需区分 “临时生效(重启后失效)” 和 “永久生效(需修改配置文件)”:
- 三种模式说明
- Enforcing(强制模式):默认模式,SELinux 主动强制执行安全策略,拒绝不符合规则的访问,并记录 AVC 日志;
- Permissive(宽容模式):仅记录不符合规则的访问(生成 AVC 日志),但不拒绝访问,用于调试 SELinux 规则(如排查 “Enforcing 模式下服务启动失败” 问题);
- Disabled(禁用模式):完全关闭 SELinux,不执行任何 MAC 控制,仅依赖 Linux 传统 DAC 机制,安全性最低,不推荐生产环境使用。
- 1.3临时更改模式(当前会话生效)
通过setenforce命令实现,仅支持切换到 Enforcing 或 Permissive(无法直接切换到 Disabled):
- 切换到 Enforcing 模式:setenforce 1(或setenforce Enforcing);
- 切换到 Permissive 模式:setenforce 0(或setenforce Permissive);
注意:若当前模式为 Disabled,setenforce命令无效,需先永久启用 SELinux 并重启系统。
- 3永久更改模式(重启后生效)
需修改 SELinux 主配置文件/etc/selinux/config(或/etc/sysconfig/selinux,软链接到前者),修改SELINUX参数:
- 永久设为 Enforcing:SELINUX=enforcing;
- 永久设为 Permissive:SELINUX=permissive;
- 永久设为 Disabled:SELINUX=disabled;
二、控制SELinux上下文
(1)更改SELinux上下文
SELinux 上下文是附加到文件、进程等对象上的标签(格式:用户:角色:类型:级别
),用于 SELinux 策略判断访问权限。更改上下文的核心目的是让对象符合 SELinux 策略对标签的要求,避免权限被拒绝。
(2)基本文件上下文操作
核心知识点:
- 上下文组成:文件上下文主要关注
类型
(type)部分(如httpd_sys_content_t
表示 Web 服务可访问的内容)。 - 临时与永久更改:
- 临时更改:仅当前生效,重启或文件系统重新挂载后失效。
- 永久更改:通过修改 SELinux 上下文数据库,持久生效(需结合文件系统路径规则)。
常用命令总结:
命令 | 作用 | 示例 |
---|---|---|
ls -Z | 查看文件 / 目录的 SELinux 上下文 | ls -Z /var/www/html |
chcon | 临时更改文件 / 目录的上下文(类型等) | chcon -t httpd_sys_content_t /web/file |
semanage fcontext | 永久添加 / 修改文件路径的上下文规则 | semanage fcontext -a -t httpd_sys_content_t "/web(/.*)?" |
restorecon | 根据semanage 配置的规则恢复文件上下文 | restorecon -Rv /web (-R 递归,-v 显示过程) |
matchpathcon | 查看路径应有的默认上下文 | matchpathcon /var/www/html |
三、使用布尔值调整SELinux策略
SELinux 布尔值(Boolean)是策略中预设的开关,用于动态调整特定权限规则(无需修改底层策略)。通过开启 / 关闭布尔值,可快速允许或禁止某些常见操作(如 Web 服务访问网络、Samba 共享_home 目录等),无需重新编译策略。
常用命令总结:
命令 | 作用 | 示例 |
---|---|---|
getsebool | 查看布尔值当前状态(on/off) | getsebool -a (查看所有);getsebool httpd_can_network_connect (查看单个) |
setsebool | 临时修改布尔值状态(重启后失效) | setsebool httpd_can_network_connect on |
setsebool -P | 永久修改布尔值状态(-P 保存到配置) | setsebool -P samba_enable_home_dirs on |
示例:将自定义 Web 目录(/myweb)设置为 httpd 可访问
默认/myweb
的上下文类型可能不是httpd_sys_content_t
(httpd 默认允许访问的类型),导致网页无法访问:
- 查看当前上下文:
ls -Z /myweb # 可能显示:unconfined_u:object_r:default_t:s0 /myweb
2.永久配置上下文规则(通过semanage
):
semanage fcontext -a -t httpd_sys_content_t "/myweb(/.*)?" # 匹配/myweb及子目录
3.应用规则(恢复上下文):
restorecon -Rv /myweb # -R递归处理子目录,-v显示过程
4.验证:
ls -Z /myweb # 此时显示:unconfined_u:object_r:httpd_sys_content_t:s0 /myweb
四、知识点总结
- SELinux 是如何保护资源的?
答:SELinux 通过为系统中的进程、文件、目录等资源分配安全上下文(包含用户、角色、类型、级别等信息),并依据安全策略规则(如类型强制访问控制)限制进程对资源的访问。只有当进程上下文与资源上下文匹配策略允许的规则时,访问才被许可,从而实现对资源的强制保护。
2. 什么是自由决定的访问控制(DAC)?它有什么特点?
答:定义:DAC 是一种访问控制机制,资源的所有者可自主决定哪些用户或组能访问该资源(如 Linux 文件权限中的所有者、组、其他用户权限设置)。
特点:
访问权限由资源所有者自由分配和修改;
依赖于用户身份和文件权限(如 rwx 权限);
安全性较低,可能因所有者误操作导致权限泄露。
3. 什么是强制访问控制(MAC)?它有什么特点?
答:定义:MAC 是由系统管理员预先定义安全策略,强制限制主体(进程)对客体(文件等资源)的访问,资源所有者无法自主修改访问权限(如 SELinux)。
特点:
访问控制由系统策略强制实施,不受用户自主决定;
基于主体和客体的安全属性(如 SELinux 上下文);
安全性高,适合对安全要求严格的场景(如服务器、涉密系统)。
4. 什么是 SELinux 上下文?
答:SELinux 上下文是附加在系统资源(进程、文件、目录、端口等)上的安全标识,用于 SELinux 策略判断访问权限。其格式通常为 user:role:type:level(如 unconfined_u:object_r:httpd_sys_content_t:s0),其中类型(type) 是最常用的部分,用于限制进程与文件的交互。
5. setenforce 0 命令的作用是什么?
答:setenforce 0 用于将 SELinux 临时切换到Permissive 模式(宽容模式)。在此模式下,SELinux 仅记录违反策略的行为(日志中生成 avc 拒绝消息),但不实际阻止访问。重启系统后会恢复为配置文件中设置的模式(enforcing 或 permissive)。
6.定义一条 SELinux 文件上下文规则,以便将 /custom 目录及目录中所有文件的上下文类型设置为 httpd_sys_content_t。
答:semanage fcontext -a -t httpd_sys_content_t "/custom(/.*)?"
restorecon -Rv /custom
semanage fcontext 用于添加持久化的文件上下文规则,(/.*)? 表示匹配 /custom 目录及所有子文件 / 子目录;
restorecon 用于应用规则,将 /custom 及其内容的上下文恢复为规则定义的类型。