SELinux,Security Enhanced Linux 的缩写,也就是安全强化的 Linux,是由美国国家安全局(NSA)联合其他安全机构(比如 SCC 公司)共同开发的,旨在增强传统 Linux 操作系统的安全性,解决传统 Linux 系统中自主访问控制(DAC)系统中的各种权限问题(如 root 权限过高等)。它是部署在 Linux 上用于增强系统安全的功能模块。
- 主体 (Subject)
- 目标 (Object)
- 政策 (Policy)
- targeted minimum mls
- 安全性本文 (security context)
安全性本文存在于主体程序中与目标文件资源中。程序在内存内,所以安全性本文可以存入 是没问题。 安全性本文是放置到文件的inode 内的,因此主体程序想要读取目标文件资源时,同样需要读取 inode , 这 inode 内就可以比对安全性本文以及 rwx 等权限值是否正确,而给予适当的读取权限依据。 我们先来看看 /root 下面的文件的安全性本文好了。观察安全性本文可使用“ ls -Z ”去观察如下:(注意:你必须已经启动了 SELinux 才行! # 先来观察一下 root 主文件夹下面的“文件的 SELinux 相关信息”
[root@study ~]# ls -Z
# 上述特殊字体的部分,就是安全性本文的内容! 如上所示,安全性本文主要用冒号分为三个字段,这三个字段的意义为:
Identify:role:type 身份识别:角色:类型 字段说明:身份识别 (Identify): 相当于帐号方面的身份识别!
主要的身份识别常见有下面几种常见的类型:
unconfined_u:不受限的用户,也就是说,该文件来自于不受限的程序所产生的!
system_u:系统用户,大部分就是系统自己产生的文件啰!
角色 (Role): 通过角色字段,我们可以知道这个数据是属于程序、文件资源还是代表使用者。
一般的角色 有:
object_r:代表的是文件或目录等文件资源,这应该是最常见的啰;
system_r:代表的就是程序啦!不过,一般使用者也会被指定成为 system_r 喔! 你也会发现角色的字段最后面使用“ _r ”来结尾!因为是 role 的意思嘛!
类型 (Type) (最重要!): 在默认的 targeted 政策中, Identify 与 Role 字段基本上是不重要的!重要的在于这个类型 (type) 字段! 基本上,一个主体程序能不能读取到这个文件资源,与类型字段有关!
而类 型字段在文件与程序的定义不太相同,分别是:
type:在文件资源 (Object) 上面称为类型 (Type);
domain:在主体程序 (Subject) 则称为领域 (domain) 了! domain 需要与 type 搭配,则该程序才能够顺利的读取文件资源啦!
程序与文件 SELinux type 字段的相关性 那么这三个字段如何利用呢?首先我们来瞧瞧主体程序在这三个字段的意义为何!通过身份 识别与角色字段的定义, 我们可以约略知道某个程序所代表的意义喔!先来动手瞧一瞧目前 系统中的程序在 SELinux 下面的安全本文为何?
# 再来观察一下系统“程序的 SELinux 相关信息”
[root@study ~]# ps -eZ -e:显示所有进程;
# 基本上程序主要就分为两大类,一种是系统有受限的 system_u:system_r,另一种则可能是用户自己的,
# 比较不受限的程序 (通常是本机用户自己执行的程序),亦即是 unconfined_u:unconfined_r 这两种!
# 1\. 先看看 crond 这个“程序”的安全本文内容: [root@study ~]# ps -eZ | grep cron # 这个安全本文的类型名称为 crond_t 格式! # 2\. 再来瞧瞧可执行文件、配置文件等等的安全本文内容 [root@study ~]# ll -Zd /usr/sbin/crond /etc/crontab /etc/cron.d -d, –directory 将目录象文件一样显示,而不是显示其下的文件。
若文件的 type 设置错误, 那么即使权限设置为 rwx 全开的 777 ,该主体程序也无法读 取目标文件资源的啦!不过如此一来, 也就可以避免使用者将他的主文件夹设置为 777 时所 造成的权限困扰。 就是,万一你的 crond 配置文件的SELinux 并不是 system_cron_spool_t 时, 该配置文件真的可以顺利的被读取运行吗?
# 1\. 先假设你因为不熟的缘故,因此是在“root 主文件夹”创建一个如下的 cron 设置:
crond 命令每分钟会定期检查是否有要执行的工作,如果有要执行的工作便会自动执行该工作。
[root@study ~]# vim checktime
10 * * * * root sleep 60s
* * * * *
- - - - -
| | | | |
| | | | +----- 星期中星期几 (0 - 6) (星期天 为0)
| | | +---------- 月份 (1 - 12)
| | +--------------- 一个月中的第几天 (1 - 31)
| +-------------------- 小时 (0 - 23)
+------------------------- 分钟 (0 - 59)
在 /etc/crontab 中添加环境变量,在可执行命令之前添加命令 . /etc/profile;/bin/sh,使得环境变量生效,
# 2\. 检查后才发现文件放错目录了,又不想要保留副本,因此使用 mv 移动到正确目录:
[root@study ~]# mv checktime /etc/cron.d
[root@study ~]# ll /etc/cron.d/checktime
-rw-r--r--. 1 root root 27 Aug 7 18:41 /etc/cron.d/checktime
# 仔细看喔,权限是 644 ,确定没有问题!任何程序都能够读取喔!
# 3\. 强制重新启动 crond ,然后偷看一下登录文件,看看有没有问题发生!
[root@study ~]# systemctl restart crond [root@study ~]# tail /var/log/cron
# 上面的意思是,有错误!因为原本的安全本文与文件的实际安全本文无法搭配的缘故!
SELinux的三种模式
并非所有的 Linux distributions 都支持 SELinux 的,所以你必须要先观察一下你的系统版本
- enforcing:强制模式,代表 SELinux 运行中,且已经正确的开始限制 domain/type 了
- permissive:宽容模式:代表 SELinux 运行中,不过仅会有警告讯息并不会实际限制
- domain/type 的存取。这种模式可以运来作为 SELinux 的 debug 之用;
- disabled:关闭,SELinux 并没有实际运行。