SELinux(Security-Enhanced Linux)
一、常见的读取控制机制
1. DAC (Discretionary Access Control: 任意式读取控制)
在DAC架构下,每一个对象都会记录一个拥有者的信息,只要是对象的拥有者,就可以获得对该对象完整控制的能力。传统的Unix系统提供的安全机制,就是操作DAC的思维。
ACL(Access Control List: 访问控制列表)
它是DAC的延伸。在ACL环境下,你可以为不同的用户设置一组权限。如此一来,就可以对不同的用户设置不同的权限了。
在Unix系统中,每个文件(这里成为“对象”)都会存储一个权限模式(Permission Mode)的信息,每一个进程也会记录其执行者,UNIX利用这个执行者的身份,配合对象的权限模式信息,来判断进程是否可以读取对象。由于DAC与ACL都仅针对使用者与对象的关系进行读取控制,所以不论是DAC还是ACL,恐怕都无法满足现今系统对安全性的要求。
2. MAC (Mandatory Access Control:强制性读取控制)
MAC架构下,会为每一个对象增添一个“安全脉络(Security Context)”的资讯,进程或用户除了需具备传统的权限外,还必须获得SELinux的授权,方能读取指定的对象,因而让管理者可以获得更多的读取控制能力。
MAC还能进行更加精细的读取控制配置。
常见的MAC的机制包括RBAC和MLS。
* RBAC (Role-based Access Control: 角色基础读取控制)
在RBAC架构下,是以用户所隶属的角色(Role)进行读取权限判断的动作的。
* MLS (Multi-Level Security: 多层次安全)
在MLC架构下,是以数据内容的敏感性或机密性定义几种不同的等级。以对象的机密等级来决定进程对对象的读取能力。
* MCS (Multi-Category Security: 多重类型安全性)
它是以MLC为基础,再加上类别(Category),可以使MLS进行更细微的读取控制。
二、什么是SELinux
SELinux子系统以“类型强制性(Type Enhancement)”读取控制机制为主,并融合RBAC、MLS和MCS等3种MAC读取控制机制的特性。
在SELinux的世界中,定义了许多的类型(Type),每一个进程、文件、设备、网络连接等,都必须标识其所属的类型。进行仅能读取相同(或相关)类型的文件。如果非相关类型,且SELinux不允许读取时,则无法读取。这就是“类型强制性”读取控制机制。
SELinux不允许非相同或者相关类型的对象之间进行读取。
另外,SELinux是Linux内核提供其功能,所有执行于Linux内核中的应用程序都必须由SELinux管辖。
SELinux与传统的DAC有什么关系?
SELinux在DAC之后执行。也就是系统先判断进程在传统的权限下拥有了读取能力后,再利用SELinux判断进程是否可以读取。如果传统的权限禁止读取,则SELinux也不会发生任何作用。
三、SELinux的软件包
SELinux由下列几项软件包组成:
* 原则文件,用来提供或配置SELinux安全原则的文件。
* 安全服务器,或称原则引擎,用来存储安全原则以及诠释安全脉络的意义。
* 读取向量缓存,在内存中暂存从安全服务器查询所得的结果,以便加快查询的速度。
* 审核记录文件,用来存储SELinux产生的信息,包括允许读取与禁止读取的事件,文件名是:/var/log/audit/audit.log。
* SELinux虚拟文件系统,名为selinuxfs,用来呈现SELinux内部的信息,如果启动了SELinux,selinuxfs会自动加载到/selinux/中。
* 配置工具,诸如chcon、setsebool等。
四、系统初始化SELinux的步骤
当启动加载器(GRUB)顺利地加载Linux内核后,Linux内核会执行init服务,让init服务建立系统环境。在init服务展开正常的初始化系统的程序之前,会先创建SELinux环境(如果需要的话)。
STEP 1:判断Linux内核是否支持SELinux。init先挂载procfs,然后检测Linux内核是否提供selinuxfs文件系统,如果是,表示内核支持SELinux功能,如果不是,跳过创建SELinux的步骤;
STEP 2: 判断SELinux是否需要启动。init根据启动加载器传递给Linux内核的/etc/sysconfig/selinux中的SELINUX参数或者selinux内核启动参数,来决定是否要启动SELinux系统;
STEP 3: 设置SELinux的模式。init服务想将SELinux的模式定为permission mode,这种模式下,SELinux将不会强制禁止违反安全原则定义的读取操作。然后,init会根据在/etc/sysconfig/selinux的SELINUX参数,如果它定义为enforcing,则将模式切换到Enforcement Mode;
STEP 4: init挂载selinuxfs文件系统到/selinux/目录;
STEP 5: init加载SELinux的安全原则文件。init会根据/etc/sysconfig/selinux中的SELINUXTYPE=TYPE参数,决定要加载哪一个SELinux安全原则,并配合/selinux/policyvers中的定义,载入某一个版本(Version)的SELinux安全原则文件,该SELinux安全原则为:/etc/selinux/TYPE/policy/policy.VERSION;
STEP 6: 系统根据/etc/selinux/TYPE/contexts/中的相关文件来设置一些重要的安全脉络。包括init服务本身也获得了安全脉络(user_u:system_r:unconfined_t)。
至此,SELinux环境就创建好了。
五、启动和停用SELinux
方法1: 通过内核启动参数
通过这种方法,可以在启动加载器时直接修改参数:
boot: linux selinux=N
N = 0:停用SELinux; N != 0:启用SELinux。
每次启动都要修改参数,太麻烦了。也可以通过修改文件/boot/grub/grub.conf来实现。
... ....
kernel /vmlinuz-2.6.18-53.el5 ro root=LABEL=/ rhgb quiet selinux=N
... ...
方法2: 通过SELinux配置文件
SELinux的配置文件是:/etc/sysconfig/selinux。
# 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
# SELINUXTYPE= can take one of these two values:
# targeted - Targeted processes are protected,
# mls - Multi Level Security protection.
SELINUXTYPE=targeted
启动了selinux后,可以通过命令sestatus来查看selinux的状态。
[root@airhouse flagonxia]# sestatus
SELinux status: enabled
SELinuxfs mount: /selinux
Current mode: enforcing
Mode from config file: enforcing
Policy version: 22
Policy from config file: targeted
selinux的模式可以通过getenforce查看。
[root@airhouse flagonxia]# getenforce
Enforcing
从上面命令的执行结果来看,模式是enforcing。我们可以将模式改变为permissive。
[root@airhouse flagonxia]# setenforce 0
[root@airhouse flagonxia]# getenforce
Permissive
六、管理安全脉络
6.1 安全脉络的格式
USER:ROLE:TYPE:[:LEVEL[:CATEGORY]]
USER --> system_u, user_u, root
ROLE --> user_r, staff_r, secadm_r, object_r
TYPE --> unconfined_t, default_t, mint_t, etc_t, device_t, shadow_t, usr_t, lib_t, java_exec_t ......
LEVEL --> s0~s15
CATEGORY --> c0~c1023
6.2 查看对象的安全脉络
* ls -Z: 查看文件的安全脉络
* ps -Z: 查看进程的安全脉络
* id -Z: 查看张海的安全脉络
例子:
[root@airhouse flagonxia]# ls -Z /etc/passwd
-rw-r--r-- root root system_u:object_r:etc_t:s0 /etc/passwd
6.3 修改安全脉络
chcon [OPTIONS...] CONTEXT FILES
chcon [OPTIONS...] -reference=REF_FILES FILES
例子:
[root@airhouse temp]# ls -Z testfile
-rw-r--r-- root root system_u:object_r:user_home_t:s0 testfile
[root@airhouse temp]# chcon -u root -t etc_t testfile
[root@airhouse temp]# ls -Z
-rw-r--r-- root root root:object_r:etc_t:s0 testfile
6.4 修复安全脉络
6.4.1 找出默认安全脉络
matchpathcon [OPTIONS...] FILES
OPTIONS:
-n: 不显示文件路径名称,仅显示安全脉络
-V:顺便检查安全脉络有没有定义
例子:
[root@airhouse temp]# ls /etc/passwd /var/www/nosuchfile
ls: cannot access /var/www/nosuchfile: No such file or directory
/etc/passwd
[root@airhouse temp]# matchpathcon /etc/passwd /var/www/nosuchfile
/etc/passwd system_u:object_r:etc_t:s0
/var/www/nosuchfile system_u:object_r:httpd_sys_content_t:s0
6.4.2 使用fixfiles修复安全脉络
fixfiles [-R PACKAGES...] [check | restore]
-R PACKAGES:指定仅修复PACKAGES软件包,如果没有这个参数,则修复所有软件包
check:检查指定软件包中错误的安全脉络
restore:除了检查之外,还修复错误的安全脉络
注意一点,fixfiles这个命令的局限在,仅能修复RPM包提供的文件的安全脉络。
6.4.3 使用restorecon还原安全脉络
restorecon [OPTIONS...] [FILES...]
例子:
step1】 查看文件testfile默认的安全脉络
[root@airhouse temp]# matchpathcon /home/flagonxia/temp/testfile
/home/flagonxia/temp/testfile system_u:object_r:user_home_t:s0
step2】 查看文件testfile实际的安全脉络
[root@airhouse temp]# ls -Z
-rw-r--r-- root root root:object_r:etc_t:s0 testfile
step3】 还原testfile的安全脉络
[root@airhouse temp]# restorecon /home/flagonxia/temp/testfile
step4】 查看结果,testfile还原成默认的安全脉络
[root@airhouse temp]# ls -Z testfile
-rw-r--r-- root root system_u:object_r:user_home_t:s0 testfile
6.5 重新产生安全脉络
想selinux重新产生重要文件的安全脉络,需要完成下面步骤:
1) 产生一个空的/.autorelabel文件
2) 重新启动Linux系统
7 管理SELINUX的安全原则
SELINUX的安全脉络的作用是划分和组织对象,给对象赋予各种特定的属性,包括USER、ROLE、TYPE、LEVEL和CATEGORY等。而安全原则的作用是定义SELINUX的读取控制的规则,以及细节的配置数据。就是不同类型的对象能否被特定的主体读取的规则。
SELINUX的安全原则有3类:
* targeted 最常用
* strict
* mls
安全原则targeted存放在/etc/selinux/targeted/目录中。
[root@airhouse temp]# cd /etc/selinux/targeted
[root@airhouse targeted]# ls
contexts modules policy setrans.conf seusers
[root@airhouse targeted]# cd policy
[root@airhouse policy]# ls
policy.23
policy.23是该安全原则数据库文件,23是版本号。
8 SELINUX布尔值