SELinux学习笔记
SELinux学习笔记
主要参考了《Linux就该这么学》、《鸟哥的Linux私房菜——基础学习篇(第四版)》、《SELinux 入门》、《Selinux安全上下文详解》、《SELINUX工作原理详解》,感觉这部分内容还是鸟哥写的比较清楚,感觉刘遄在《Linux就该这么学》及其视频中讲的不够清晰,如果只听刘老师的课可能还是会对这部分知识有些迷茫的。
安全增强的Linux(Security Enhanced Linux,SELinux)是由美国国家安全局(National Security Agency,NSA)贡献的一个Linux内核模块,主要用于Redhat及其衍生版本中,为整个系统提供更加健壮的安全服务(Ubuntu中使用的是AppArmor,据说虽然可以在Ubuntu及其衍生版本中安装SELinux,但是其难度极大)。之所以开发这个模块,是因为NSA发现在系统的安全问题中,绝大多数问题并不是由于外部的攻击多么强大,更多的问题是由于所谓的内部员工的资源误用。
例如,在Apache中,默认的服务目录是/var/www/html,如果一个无经验的系统运维人员(糊涂蛋)在运维过程中,将其权限设置为777,那么所有的进程都可以在该目录中进行读写,这将造成极大的安全隐患。
1. MAC与DAC
自主访问控制(Discretionary Access Control,DAC):所谓DAC主要是指在没有启用SELinux的Linux系统中,系统会依据资源的rwx权限以及用户身份(进程所有者)来判断是否具有资源访问的权限。使用DAC的缺点在于:
- root具有最高权限:对于root用户而言,其具有系统最高的权限,因此各种rwx设置对于root用户而言形同虚设。
- 用户可以获取进程修改文件资源的访问权限:如果将某个资源的权限设置为777,那么该目录可以被任何用户读写操作
强制访问控制(Mandatory Access Control,MAC)是一种可以针对特定的进程与文件资源来进行权限的权限。因此当你即便拥有了root权限,但是当你执行特定的进程时,也未必拥有相应的读写权限。而SELinux采用的正是MAC方式。
简单而言,在DAC中控制的主体(subject)是用户,而MAC中控制的对象是进程。
2. SELinux的启动、关闭与查看
SELinux有三种模式:
- Enforceing:强制模式,SELinux启用
- Permissive:宽容模式,SELinux的安全策略不强制执行,但是会有相应的警告信息记录到日志文件中,一般用于SELinux的调试
- Disabled:关闭模式
查看
要查看SELinux的运行状态,需要使用如下命令:
getenforce
或者
sestatus
使用sestatus命令除了可以查看当前SELinux的运行模式外,还能看到很多额外的信息。
修改
修改SELinux的运行模式,主要有两种方法,一种是用命令行,另外一种是直接修改SELinux的配置文件。
命令行的方式只能修改为Enforce和Permissive,不能进行关闭,其命令格式为:
setenforce [0|1]
其中1为enforcing模式,0为permissive模式
要想关闭SELinux,只能修改SELinux的配置文件,其位置为/etc/selinux/config
打开该文件后,可以看到其中只有两行信息:
SELINUX=enforcing
SELINUXTYPE=targeted
我们只要将SELINUX行设置为对应模式即可,需要注意的是如果从enforcing或permissive模式切换为disabled模式,或者反过来,则需要重启系统(从disabled模式修改为其他两种模式时,需要重启两次,因为要重新写入上下文信息)才能生效。在disabled模式下,无法使用setenforce
命令。
在某些特殊情况下,从disable切换为enforcing模式,可能会导致大量服务无法顺利启动,但是使用permissive模式就不会有这种问题,要想解决这个问题就需要在permissive模式下,使用如下命令来重新还原所有的SELinux类型。
resotrecon -Rv /
3. SELinux的策略
在SELinux中默认有三种策略,如果你认真看了上面提到的/etc/selinux/config
文件,就会看到这三种策略,同时也一定清楚该如何切换SELinux的安全策略,这三种策略分别是:
- targeted:针对网络服务(如dhcpd、httpd、named、nscd、ntpd、portmap、snmpd、squid以及 syslogd等)的限制较多,针对本机的限制较少,是默认的策略
- minimum:修改自targeted策略,只针对选择的进程进行保护
- mls:多层的安全防护,使用完整的SELinux限制
需要注意的是,如果要修改SELinux的防护策略,必须要对系统进行重启。
要想查看安全策略的具体内容,可以使用命令:
getsebool -a
要想修改具体的策略规则,则需要使用如下命令:
setsebool -P <策略项>
-P
表示重启之后仍然有效。
4. 安全上下文
安全上下文是一个简单的、一致的访问控制属性,在SELinux中,类型标识符是安全上下文的主要组成部分,由于历史原因,一个进程的类型通常被称为一个域(domain),"域"和"域类型"意思都一样,我们不必苛刻地去区分或避免使用术语域,通常,我们认为【域】、【域类型】、【主体类型】和【进程类型】都是同义的,即都是安全上下文中的“TYPE”。
——《SELINUX工作原理详解》
我理解所谓安全上下文(Security Context)就是一种面向进程的读写权限管理,任何一个进程想要访问一个资源,首先都需要经过SELinux的安全策略检验,之后需要经过安全上下文的比对,最后需要经过文件rwx权限**的检验才能最终确认是否可以对资源进行访问。
要想查看上下文可以用三种方法:
- 查看Shell的上下文:
id -Z
- 查看进程的上下文:
ps -Z
- 查看文件的上下文:
ls -Z
安全上下文是存放在文件的inode内的,其主要由三部分组成:
Identify:Role:Type/Domain
4.1 Identify
Identity用来标识身份,一般以_u
结尾,常见的身份识别主要由以下几种:
- unconfined_u:不受限的用户,也就是说该文件来自于不受限的进程
- system_u:系统用户
4.2 Role
通过Role字段我们可以知道这个数据是属于进程、文件资源还是代表用户,通常以-r
结尾,常见的角色有:
- object_r:代表的是文件或目录等资源
- system_r:代表的就是进程和用户
4.3 Type
在默认的targeted策略中,Identify和Role都不重要,重要的是Type这个类型!!!一个进程能不能访问这个资源,主要就是取决于Type类型。该字段在文件与进程之间又有所区别:
- type:在文件资源上(也就是
ls -Z
中看到的)称为类型(Type) - domain:在主体进程(Subject,应该就是在
ps -Z
)称为域(Domain)
只有当domain与type对应,才能对资源进行访问。
4.4 例子
为了更好的理解这句话,我们来看《鸟哥Linux私房菜》上的一个例子
首先我们来看一下crond这个进程的安全上下文:
ps -eZ | grep crond
其结果为:
system_u:system_r:crond_t:s0-s0:c0.c1023 1061 ? 00:00:00 crond
system_u:system_r:crond_t:s0-s0:c0.c1023 1062 ? 00:00:00 atd
之后再来看一下执行文件和配置文件的安全上下文:
[root@localhost etc]# ll -Zd /usr/sbin/crond /etc/crontab /etc/cron.d
drwxr-xr-x. root root system_u:object_r:system_cron_spool_t:s0 /etc/cron.d
-rw-r--r--. root root system_u:object_r:system_cron_spool_t:s0 /etc/crontab
-rwxr-xr-x. root root system_u:object_r:crond_exec_t:s0 /usr/sbin/crond
我们可以看到,当运行程序/usr/sbin/crond
后,其程序的domain为crond_t
,它能够读取具有system_cron_spool_t
这种type的文件。
4.5 安全上下文的修改
要想修改SELinux文件的类型,主要有两种方法:
4.5.1 chcon
第一种方法就是使用chcon
,该命令格式为
chcon [-R] [-t <类型>] [-u <user>] [-r <role>] <文件>
或者
chcon -R --reference=<参考文件> <目标文件>
其参数含义为:
- -R:连同子目录一起进行修改
- -t:修改Type
- -u:修改Identify
- -r:修改Role
- -v:如果修改成功,会将变动的结果列出来
- --reference:参考文件,用参考文件的type修改目标文件的type
4.5.2 semanage
第二种方法就是使用semanage命令,该命令的格式为:
semanage fcontext -a -t <类型> <文件>
restore -Rv <文件>
这种方法是《Linux就该这么学》中教授的,显然这种方法要更复杂一些,而且有一些弊端(也许算不上弊端),这个我们后面再说,所以我个人更推荐第一种方法。
4.5.3 restorecon
如果使用了chcon
命令来修改文件的上下文,那么是可以使用restorecon
命令来进行恢复的,其命令格式我们其实刚刚已经见过了:
restorecon [-Rv] 文件/文件夹
既然是可以恢复,那么就说明在SELinux中,有个存储所有文件默认type的位置。仔细思考一下,我们就能知道,使用semanage
命令修改的是SELinux中的默认值,所以要在修改后执行一下restorecon
命令。所以个人建议在修改文件的type信息时,尽量使用chcon
而不要使用semenage
,除非你真的知道你自己在做什么!