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,除非你真的知道你自己在做什么!

推荐阅读更多精彩内容

  • linux的访问控制 Discretionary Access Control(DAC) 自主(自由)访问控制:这...
    dreamscd阅读 2,821评论 0 4
  • 一个程序被加载到内存当中运行,那么在内存内的那个数据就被称为进程(process)。进程是操作系统上非常重要的概念...
    Zhang21阅读 1,432评论 0 12
  • 1、第八章 Samba服务器2、第八章 NFS服务器3、第十章 Linux下DNS服务器配站点,域名解析概念命令:...
    哈熝少主阅读 2,735评论 0 10
  • 一、SELinux/SEAndroid简介 安全增强型 Linux(Security-Enhanced Linux...
    Stan_Z阅读 1,472评论 0 10
  • 前面系列文章讲解了Linux下通过文件传输、文件共享、邮件系统来分享和获取资源,本文讲解网络资源获取和共享的另外一...
    黑马腾云阅读 148评论 0 0