这是我参与 8 月更文挑战的第 24 天,活动详情查看: 8月更文挑战
什么是SELinux
安全增强型 Linux(Security-Enhanced Linux)简称 SELinux
,它是一个 Linux 内核模块,也是 Linux 的一个安全子系统。
SELinux 主要由美国国家安全局开发。2.6 及以上版本的 Linux 内核都已经集成了 SELinux 模块。
SElinux是强制访问控制(MAC)安全系统,是linux历史上最杰出的新安全系统。对于linux安全模块来说,SElinux的功能是最全面的,测试也是最充分的,这是一种基于内核的安全系统。
SElinux官方的GitHub仓库:github.com/SELinuxProj…
SELinux 的结构及配置非常复杂,而且有大量概念性的东西,要学精难度较大。很多 Linux 系统管理员嫌麻烦都把 SELinux 关闭了。
工作流程如下图:
SELinux基本概念
主体(Subject)
可以完全等同于进程。
对象(Object)
被主体访问的资源。可以是文件、目录、端口、设备等。
政策和规则(Policy & Rule)
系统中通常有大量的文件和进程,为了节省时间和开销,通常我们只是选择性地对某些进程进行管制。
而哪些进程需要管制、要怎么管制是由政策决定的。
一套政策里面有多个规则。部分规则可以按照需求启用或禁用(以下把该类型的规则称为布尔型规则)。
规则是模块化、可扩展的。在安装新的应用程序时,应用程序可通过添加新的模块来添加规则。用户也可以手动地增减规则。
在 CentOS 7 系统中,有三套政策,分别是:
targeted
:对大部分网络服务进程进行管制。这是系统默认使用的政策(下文均使用此政策)。minimum
:以targeted
为基础,仅对选定的网络服务进程进行管制。一般不用。mls
:多级安全保护。对所有的进程进行管制。这是最严格的政策,配置难度非常大。一般不用,除非对安全性有极高的要求。
政策可以在 /etc/selinux/config
中设定。
SELinux下存在不同的规则,SELinux根据不同的工作类型对这些规则打开或关闭(on|off<布尔值1|0>),然后通过规则的开启与关闭具体地限制不同进程对文件的读取。
getsebool -a
setsebool
修改当前工作类型下指定规则的开启关闭,-P
表示同时修改文件使永久生效
安全上下文(Security Context)
安全上下文是 SELinux 的核心。
安全上下文我自己把它分为「进程安全上下文」和「文件安全上下文」。
一个「进程安全上下文」一般对应多个「文件安全上下文」。
**只有两者的安全上下文对应上了,进程才能访问文件。**它们的对应关系由政策中的规则决定。
文件安全上下文由文件创建的位置和创建文件的进程所决定。而且系统有一套默认值,用户也可以对默认值进行设定。
需要注意的是,单纯的移动文件操作并不会改变文件的安全上下文。
安全上下文有四个字段,分别用冒号隔开。形如:system_u:object_r:admin_home_t:s0
。
ls -Z
查看文件上下文
id -Z
查看用户上下文
ps -Z
查看进程上下文
netstat -Z
查看网络连接上下文
SELinux 的工作模式
SELinux 有三种工作模式,分别是:
enforcing
:强制模式。违反 SELinux 规则的行为将被阻止并记录到日志中。permissive
:宽容模式。违反 SELinux 规则的行为只会记录到日志中。一般为调试用。disabled
:关闭 SELinux。
要如何知道你的系统当前是什么模式?你可以使用一条简单的命令来查看,这条命令就是 getenforce
。
SELinux 工作模式可以在 /etc/selinux/config
中设定。
如果想从 disabled
切换到 enforcing
或者 permissive
的话,需要重启系统。反过来也一样。
需要注意的是,如果系统已经在关闭 SELinux 的状态下运行了一段时间,在打开 SELinux 之后的第一次重启速度可能会比较慢。因为系统必须为磁盘中的文件创建安全上下文(我表示我重启了大约 10 分钟,还以为是死机了……)。
你可以使用setenforce
去临时更改运行的模式,重启后就失效。
setenforce 0 //临时改为permissive模式
setenforce 1 //临时改为permissive模式
SELinux 日志的记录需要借助 auditd.service
这个服务,请不要禁用它。
获取你启用了SELinux的系统的详细状态报告
sestatus -v
SELinux 日志
当开启了 SELinux 之后,很多服务的一些正常行为都会被视为违规行为(标题及下文中的错误均指违规行为)。
这时候我们就需要借助 SELinux 违规日志来分析解决。
SELinux 违规日志保存在 /var/log/audit/audit.log
中。
该文件的内容很多,而且混有很多与 SELinux 错误无关的系统审计日志。我们要借助 sealert
这个实用工具来帮忙分析
sealert -a /var/log/audit/audit.log