Linux SELinux详解!

3,215 阅读5分钟

这是我参与 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 关闭了。

工作流程如下图:

image.png

SELinux基本概念

主体(Subject)

可以完全等同于进程

对象(Object)

被主体访问的资源。可以是文件、目录、端口、设备等。

政策和规则(Policy & Rule)

系统中通常有大量的文件和进程,为了节省时间和开销,通常我们只是选择性地对某些进程进行管制。

而哪些进程需要管制、要怎么管制是由政策决定的。

一套政策里面有多个规则。部分规则可以按照需求启用或禁用(以下把该类型的规则称为布尔型规则)。

规则是模块化、可扩展的。在安装新的应用程序时,应用程序可通过添加新的模块来添加规则。用户也可以手动地增减规则。

在 CentOS 7 系统中,有三套政策,分别是:

  1. targeted:对大部分网络服务进程进行管制。这是系统默认使用的政策(下文均使用此政策)。
  2. minimum:以 targeted 为基础,仅对选定的网络服务进程进行管制。一般不用。
  3. mls:多级安全保护。对所有的进程进行管制。这是最严格的政策,配置难度非常大。一般不用,除非对安全性有极高的要求。

政策可以在 /etc/selinux/config 中设定。

SELinux下存在不同的规则,SELinux根据不同的工作类型对这些规则打开或关闭(on|off<布尔值1|0>),然后通过规则的开启与关闭具体地限制不同进程对文件的读取。

getsebool -a

image-20210824005527053

setsebool修改当前工作类型下指定规则的开启关闭,-P表示同时修改文件使永久生效

image-20210824005721942

安全上下文(Security Context)

安全上下文是 SELinux 的核心

安全上下文我自己把它分为「进程安全上下文」和「文件安全上下文」。

一个「进程安全上下文」一般对应多个「文件安全上下文」。

**只有两者的安全上下文对应上了,进程才能访问文件。**它们的对应关系由政策中的规则决定。

文件安全上下文由文件创建的位置和创建文件的进程所决定。而且系统有一套默认值,用户也可以对默认值进行设定。

需要注意的是,单纯的移动文件操作并不会改变文件的安全上下文。

安全上下文有四个字段,分别用冒号隔开。形如:system_u:object_r:admin_home_t:s0

img

ls -Z查看文件上下文

image-20210824004847233

id -Z 查看用户上下文

image-20210824004907637

ps -Z查看进程上下文

image-20210824004956862

netstat -Z查看网络连接上下文

image-20210824005040925

SELinux 的工作模式

SELinux 有三种工作模式,分别是:

  1. enforcing:强制模式。违反 SELinux 规则的行为将被阻止记录到日志中
  2. permissive:宽容模式。违反 SELinux 规则的行为只会记录到日志中。一般为调试用。
  3. disabled:关闭 SELinux。

要如何知道你的系统当前是什么模式?你可以使用一条简单的命令来查看,这条命令就是 getenforce

image-20210824003054051

SELinux 工作模式可以在 /etc/selinux/config 中设定。

image-20210824003244396

如果想从 disabled 切换到 enforcing 或者 permissive 的话,需要重启系统。反过来也一样。

需要注意的是,如果系统已经在关闭 SELinux 的状态下运行了一段时间,在打开 SELinux 之后的第一次重启速度可能会比较慢。因为系统必须为磁盘中的文件创建安全上下文(我表示我重启了大约 10 分钟,还以为是死机了……)。

你可以使用setenforce去临时更改运行的模式,重启后就失效。

setenforce 0 //临时改为permissive模式
setenforce 1 //临时改为permissive模式

image-20210824003645029

SELinux 日志的记录需要借助 auditd.service 这个服务,请不要禁用它。

image-20210824004015420

获取你启用了SELinux的系统的详细状态报告

sestatus -v

image-20210824004703149

SELinux 日志

当开启了 SELinux 之后,很多服务的一些正常行为都会被视为违规行为(标题及下文中的错误均指违规行为)。

这时候我们就需要借助 SELinux 违规日志来分析解决。

SELinux 违规日志保存在 /var/log/audit/audit.log 中。

image-20210824001655282

该文件的内容很多,而且混有很多与 SELinux 错误无关的系统审计日志。我们要借助 sealert 这个实用工具来帮忙分析

sealert -a /var/log/audit/audit.log

参考资料

做人做事,安全第一! —— SELinux 入门

SELinux入门

SELinux详解

推荐阅读

Linux Shell编程基础!

Linux sudo和sudoers详解!

Linux部署samba服务器!

Linux Zabbix 5.0安装详解!

docker之docker-compose的使用!

docker之Dockerfile文件详解!