SELinux全称为Security-Enhanced Linux,是由美国国家安全局主导开发并合并进Linux内核的一套强制访问控制框架。它并不是用来替代传统文件权限,而是在其之上增加了一层更细粒度的约束。通俗地说,过去系统只问你是不是主人,SELinux还要问你这个进程有没有资格碰这个资源。

安全上下文是SELinux的核心
在SELinux开启的状态下,系统里的每一个进程、文件、端口甚至网络数据包都会被赋予一个安全上下文。这个上下文通常由四个字段组成,格式为用户:角色:类型:级别。其中最关键的是类型字段,绝大多数访问决策都是基于类型之间的规则来做的。
我们可以用下面的命令查看一个文件的安全上下文:
# 查看/etc/passwd的安全上下文 ls -Z /etc/passwd # 输出类似:system_u:object_r:passwd_file_t:s0 /etc/passwd # 查看当前shell进程的安全上下文 ps -eZ | grep bash
从上面的输出能看到,文件类型被标记成passwd_file_t,而进程也有自己的类型。只有当策略中明确允许某个进程类型去访问某个文件类型时,操作才能成功。这种机制让攻击者即便拿到了某个服务的权限,也很难越界去读取系统其他关键数据。
SELinux的三种工作模式
SELinux在启动时可以处于不同模式,理解这些模式有助于我们平衡安全和可用性。第一种是强制模式,所有违反策略的行为都会被拦截并记录。第二种是宽容模式,策略规则会被检查但不会真正拒绝访问,只产生审计日志,适合调试阶段使用。第三种是关闭状态,内核完全不加载SELinux模块。
通过配置文件和命令都能调整模式。配置文件一般位于/etc/selinux/config,修改后需要重启生效;而使用setenforce命令则可以临时切换强制与宽容模式。
# 临时关闭为宽容模式 setenforce 0 # 临时开启为强制模式 setenforce 1 # 查看当前模式 getenforce
需要注意的是,临时修改在重启后会还原成配置文件中定义的模式。生产环境建议保持强制模式,如果某些业务不兼容,应当通过编写自定义策略模块来解决,而不是直接禁用SELinux。
策略类型与排错思路
常见的SELinux策略有目标化策略和严格策略。目标化策略只约束系统里一部分高风险服务,比如httpd、mysqld,这也是多数发行版默认采用的方式。严格策略则对所有进程都施加限制,管理成本较高。
当服务出现异常时,第一步应检查审计日志。SELinux产生的拒绝信息会写在/var/log/audit/audit.log中,也可以通过ausearch工具过滤。如果确认是误拦,可使用sealert分析并生成修复建议,或者利用audit2allow生成策略模块。
# 查找最近的SELinux拒绝记录 ausearch -m AVC -ts recent # 根据日志生成允许规则并加载 audit2allow -a -M mypolicy semodule -i mypolicy.pp
不过盲目允许所有被拒操作会削弱安全保护。更规范的做法是修改文件上下文,使其符合既有策略。例如Web目录若被误标为默认类型,可用semanage fcontext与restorecon修正。
# 将/site目录标记为httpd可访问类型 semanage fcontext -a -t httpd_sys_content_t "/site(/.*)?" restorecon -Rv /site
通过上述方式,既保留了SELinux的强制访问控制能力,又让业务顺畅运行。掌握上下文、模式与日志分析,就能把SELinux从阻碍变成可靠的防护层。