SELinux的学习
SELinux管理
SELinux 是由美国国家安全局(NSA)开发的,整合在 Linux 内核当中,针对特定的进程与指定的文件资源进行权限控制的系统。即使你是 root 用户,也必须遵守 SELinux 的规则,才能正确访问正确的资源,这样可以有效地防止 root 用户的误操作(当然,root 用户可以修改 SELinux 的规则)。
****需要注意的是,系统的默认权限还是会生效的,也就是说,用户既要符合系统的读、写、执行权限,又要符合 SELinux 的规则,才能正确地访问系统资源。
SELinux是什么
SELinux,Security Enhanced Linux 的缩写,也就是安全强化的 Linux,是由美国国家安全局(NSA)联合其他安全机构(比如 SCC 公司)共同开发的,旨在增强传统 Linux 操作系统的安全性,解决传统 Linux 系统中自主访问控制(DAC)系统中的各种权限问题(如 root 权限过高等)。
SELinux 项目在 2000 年以 GPL 协议的形式开源,当 Red Hat 在其 Linux 发行版本中包括了 SELinux
之后,SELinux 才逐步变得流行起来。现在,SELinux 已经被许多组织广泛使用,几乎所有的 Linux 内核 2.6
以上版本,都集成了 SELinux 功能。
两个访问控制系统的特点:
- 自主访问控制系统(Discretionary Access Control,DAC)是 Linux 的默认访问控制方式,也就是依据用户的身份和该身份对文件及目录的 rwx 权限来判断是否可以访问。不过,在 DAC 访问控制的实际使用中我们也发现了一些问题:
- root 权限过高,rwx 权限对 root 用户并不生效,一旦 root 用户被窃取或者 root 用户本身的误操作,都是对 Linux 系统的致命威胁。
- Linux 默认权限过于简单,只有所有者、所属组和其他人的身份,权限也只有读、写和执行权限,并不利于权限细分与设定。
- 不合理权限的分配会导致严重后果,比如给系统敏感文件或目录设定 777 权限,或给敏感文件设定特殊权限——SetUID 权限等。
- 强制访问控制(Mandatory Access Control,MAC)是通过 SELinux 的默认策略规则来控制特定的进程对系统的文件资源的访问。也就是说,即使你是 root 用户,但是当你访问文件资源时,如果使用了不正确的进程,那么也是不能访问这个文件资源的。
安装SELinux
SELinux 安装命令如下:
[root@localhost ~]# yum -y install setroubleshoot
[root@localhost ~]# yum -y install setools-console
SELinux的主要作用
- 它使用的是 MAC 控制方式,这被认为是最强的访问控制方式;
- 它赋予了主体(用户或进程)最小的访问特权,这也就意味着,每个主体仅被赋予了完成相关任务所必须的一组有限的权限。通过赋予最小访问特权,可以防止主体对其他用户或进程产生不利的影响;
- SELinux 管理过程中,每个进程都有自己的运行区域(称为域),各进程仅运行在自己的域内,无法访问其他进程和文件,除非被授予了特殊权限。
- SELinux 可以调整到 Permissive 模式,此模式允许查看在系统上执行 SELinux 后所产生的印象。在 Permissive 模式中,SELinux 仍然会记录它所认为的安全漏洞,但并不会阻止它们。
SELinux 的工作模式(Disabled、Permissive和Enforcing)
SELinux 的几个概念:
- 主体(Subject):就是想要访问文件或目录资源的进程。想要得到资源,基本流程是这样的:由用户调用命令,由命令产生进程,由进程去访问文件或目录资源。在自主访问控制系统中(Linux 默认权限中),靠权限控制的主体是用户;而在强制访问控制系统中(SELinux 中),靠策略规则控制的主体则是进程。
- 目标(Object):这个概念比较明确,就是需要访问的文件或目录资源。
- 策略(Policy):Linux 系统中进程与文件的数量庞大,那么限制进程是否可以访问文件的 SELinux 规则数量就更加烦琐,如果每个规则都需要管理员手工设定,那么 SELinux 的可用性就会极低。还好我们不用手工定义规则,SELinux 默认定义了两个策略,规则都已经在这两个策略中写好了,默认只要调用策略就可以正常使用了。这两个默认策略如下:
- -targeted:这是 SELinux 的默认策略,这个策略主要是限制网络服务的,对本机系统的限制极少。我们使用这个策略已经足够了。
- -mls:多级安全保护策略,这个策略限制得更为严格。
- 安全上下文(Security Context):每个进程、文件和目录都有自己的安全上下文,进程具体是否能够访问文件或目录,就要看这个安全上下文是否匹配。如果进程的安全上下文和文件或目录的安全上下文能够匹配,则该进程可以访问这个文件或目录。当然,判断进程的安全上下文和文件或目录的安全上下文是否匹配,则需要依靠策略中的规则。
示意图:当主体--->访问目标文件时,如果系统中启动了 SELinux,则主体的访问请求首先需要和 SELinux 中定义好的策略进行匹配。如果进程符合策略中定义好的规则,则允许访问,这时进程的安全上下文就可以和目标的安全上下文进行匹配;如果比较失败,则拒绝访问,并通过 AVC(Access Vector Cache,访问向量缓存,主要用于记录所有和 SELinux 相关的访问统计信息)生成拒绝访问信息。如果安全上下文匹配,则可以正常访问目标文件。当然,最终是否可以真正地访问到目标文件,还要匹配产生进程(主体)的用户是否对目标文件拥有合理的读、写、执行权限。
Disable工作模式(关闭模式)
在 Disable 模式中,SELinux 被关闭,默认的 DAC 访问控制方式被使用。对于那些不需要增强安全性的环境来说,该模式是非常有用的。
例如,若从你的角度看正在运行的应用程序工作正常,但是却产生了大量的 SELinux AVC
拒绝消息,最终可能会填满日志文件,从而导致系统无法使用。在这种情况下,最直接的解决方法就是禁用
SELinux,当然,你也可以在应用程序所访问的文件上设置正确的安全上下文。
需要注意的是,在禁用 SELinux 之前,需要考虑一下是否可能会在系统上再次使用 SELinux,如果决定以后将其设置为 Enforcing 或 Permissive,那么当下次重启系统时,系统将会通过一个自动 SELinux 文件重新进程标记。
关闭 SELinux 的方式也很简单,只需编辑配置文件 /etc/selinux/config,并将文本中 SELINUX= 更改为 SELINUX=disabled 即可,重启系统后,SELinux 就被禁用了。
Permissive工作模式(宽容模式)
在 Permissive 模式中,SELinux 被启用,但安全策略规则并没有被强制执行。当安全策略规则应该拒绝访问时,访问仍然被允许。然而,此时会向日志文件发送一条消息,表示该访问应该被拒绝。
SELinux Permissive 模式主要用于以下几种情况:
审核当前的 SELinux 策略规则;
测试新应用程序,看看将 SELinux 策略规则应用到这些程序时会有什么效果;
解决某一特定服务或应用程序在 SELinux 下不再正常工作的故障。
某些情况下,可使用 audit2allow 命令来读取 SELinux 审核日志并生成新的 SELinux 规则,从而有选择性地允许被拒绝的行为,而这也是一种在不禁用 SELinux 的情况下,让应用程序在 Linux 系统上工作的快速方法。
Enforcing工作模式(强制模式)
从此模式的名称就可以看出,在 Enforcing 模式中, SELinux 被启动,并强制执行所有的安全策略规则。
SELinux配置文件(/etc/selinux/config)
SELinux 配置只能有 root 用户进行设置和修改。配置和策略文件位于 /etc/selinux 目录中,主配置文件位 /etc/selinux/config 文件,该文件中的内容如下:
[root@localhost ~]# vim /etc/selinux/config
# This file controls the state of SELinux on the system.
# SELINUX= can take one of these three values:
# enforcing - SELinux security policy is enforced.
# permissive - SELinux prints warnings instead of enforcing.
# disabled - No SELinux policy is loaded.
SELINUX=enforcing
#指定SELinux的运行模式。有enforcing(强制模式)、permissive(宽容模式)、disabled(不生效)三种模式
# SELINUXTYPE= can take one of these two values:
# targeted - Targeted processes are protected,
# mls - Multi Level Security protection.
SELINUXTYPE=targeted
#指定SELinux的默认策略。有 targeted(针对性保护策略,是默认策略)和 mls(多级安全保护策略)两种策略
主配置文件中,除去以‘#’符号开头的注释行,有效配置参数仅有 2 行。其中:
SELinux=enforcing
(为 SELinux 默认的工作模式,有效值还可以是 permissive 和 disabled;)强制模式(enforcing)、宽容模式(permissive)切换到关闭模式(disabled
SELINUXTYPE=targeted (
用于指定 SELinux 的默认策略。)
SELinux工作模式设置(getenforce、setenforce和sestatus命令)
[root@localhost ~]# getenforce
#查询SELinux的运行模式
Enforcing
#当前的SELinux是强制模式
[root@localhost ~]# sestatus
SELinux status: enabled
SELinuxfs mount: /selinux
Current mode: enforcing
Mode from config file: enforcing
Policy version: 24
Policy from config file: targeted
setenforce 命令的基本格式如下:
[root@localhost ~]# setenforce 选项
选项:
- 0: 切换成 permissive(宽容模式);
- 1: 切换成 enforcing(强制模式);
[root@localhost ~]# setenforce 0
#切换成宽容模式
[root@localhost ~]# getenforce
Permissive
[root@localhost ~]# setenforce 1
#切换成强制模式
[root@localhost ~]# getenforce
Enforcing
SELinux安全上下文查看方法
如下:
[root@localhost ~]# ls -Z
#使用选项-Z查看文件和目录的安全上下文
-rw-------.root root system_u:object_r:admin_home_t:s0 anaconda-ks.cfg
-rw-r--r--.root root system_u:object_r:admin_home_t:s0 install.log
-rw-r--r--.root root system_u:object_r:admin_home_t:s0 install.log.syslog
查看目录的安全上下文,需要添加“-d”选项,代表查看目录本身,而非目录下的子文件。举个例子:
[root@localhost ~]# ls -Zd /var/www/html/
drwxr-xr-x.root root system_u:object_r:httpd_sys_content_t:s0 /var/www/html/
查看进程的安全上下文呢?只需使用 ps 命令即可。命令如下:
(system_u:object_r:httpd_sys_content_t:s0---就是安全上下文)
[root@localhost ~]# service httpd start
#启动apache服务
[root@localhost ~]# ps auxZ | grep httpd
unconfined_u:system_r:httpd_t:s0 root 25620 0.0 0.5 11188 3304 ? Ss
03:44 0:02 /usr/sbin/httpd
1) 身份字段(user)
- - root:表示安全上下文的身份是 root。
- - system_u:表示系统用户身份,其中“_u”代表 user。
- - user_u:表示与一般用户账号相关的身份,其中“_u”代表 user
seinfo 命令格式如下:
[root@localhost ~]# seinfo [选项]
选项:
-u: 列出SELinux中所有的身份(user);
-r: 列出SELinux中所有的角色(role);
-t: 列出SELinux中所有的类型(type);
-b: 列出所有的布尔值(也就是策略中的具体规则名称);
-x: 显示更多的信息;
seinfo 命令的功能较多,我们在这里只想查询 SELinux 中的身份,那么只需执行如下命令:
[root@localhost ~]# seinfo -u
Users:9
sysadm_u
system_u
xguest_u
root
guest_u
staff_u
user_u
unconfined_u
git_shell_u
2) 角色(role)
主要用来表示此数据是进程还是文件或目录。这个字段在实际使用中也不需要修改,所以了解就好。
常见的角色有以下两种:
- - object_r:代表该数据是文件或目录,这里的“_r”代表 role。
- - system_r:代表该数据是进程,这里的“_r”代表 role。
SELinux 使用 seinfo 命令查询命令如下:
[root@localhost ~]# seinfo -r
Roles:12
guest_r
staff_r
user_r
git_shell_r
logadm_r
object_r
sysadm_r
system_r
webadm_r
xguest_r
nx_server_r
unconfined_r
3) 类型(type)
类型字段是安全上下文中最重要的字段,进程是否可以访问文件,主要就是看进程的安全上下文类型字段是否和文件的安全上下文类型字段相匹配,如果匹配则可以访问。
注意,类型字段在文件或目录的安全上下文中被称作类型(type),但是在进程的安全上下文中被称作域(domain)。也就是说,在主体(Subject)的安全上下文中,这个字段被称为域;在目标(Object)的安全上下文中,这个字段被称为类型。域和类型需要匹配(进程的类型要和文件的类型相匹配),才能正确访问。
SELinux 通过 seinfo 命令查询的命令如下:
[root@localhost ~]# seinfo -t | more
Types:3488
#共有3488个类型
bluetooth_conf_t
cmirrord_exec_t
foghorn_exec_t
jacorb_port_t
sosreport_t
etc_runtime_t
例如:已知 apache 进程可以访问 /var/www/html/(此目录为 RPM 包安装的 apache 的默认网页主目录)目录中的网页文件,所以 apache 进程的域和 /var/www/html/ 目录的类型应该是匹配的,
查询一下,命令如下:
[root@localhost ~]# ps auxZ | grep httpd
unconfined_u:system_r:httpd_t:s0 root 25620 0.0 0.5 11188 3304 ? Ss
03:44 0:02 /usr/sbin/httpd
#apache进程的域是httpd_t
[root@localhost ~]# ls -dZ /var/www/html/
drwxr-xr-x.root root system_u:object_r:httpd_sys_content_t:s0 /var/www/html/
#/var/www/html/目录的类型是httpd_sys_content_t
apache 进程的域是 httpd_t,
/var/www/html/ 目录的类型是 httpd_sys_content_t,
这个主体的安全上下文类型经过策略规则的比对,是和目标的安全上下文类型匹配的,所以 apache 进程可以访问 /var/www/html/ 目录。
SELinux安全上下文的修改和设置(chcon和restorecon命令)
chcon 命令格式如下:
[root@localhost ~]# chcon [选项] 文件或目录
选项:
- -R: 递归,当前目录和目录下的所有子文件同时设置;
- -t: 修改安全上下文的类型字段,最常用;
- -u: 修改安全上下文的身份字段;
- -r: 修改安全上下文的角色字段;
举个例子:
[root@localhost ~]# echo'test page!!!' >> /var/www/html/index.html
#建立一个网页文件,并写入“test page!!!”