RHCE(二十) Linux历史上最杰出的新安全子系统——SELinux

SELinux简介

SELinux(Security-Enhanced Linux) 是美国国家安全局(NSA)对于强制访问控制的实现,是 Linux历史上最杰出的新安全子系统。

SELinux提供了一种灵活的强制访问控制(MAC)系统,且内嵌于Linux Kernel中。SELinux定义了系统中每个【用户】、【进程】、【应用】和【文件】的访问和转变的权限,然后它使用一个安全策略来控制这些实体(用户、进程、应用和文件)之间的交互,安全策略指定如何严格或宽松地进行检查。(权限)

SELinux的特点

  1. 对内核对象和服务的访问控制
  2. 对进程初始化,继承和程序执行的访问控制
  3. 对文件系统,目录,文件和打开文件描述的访问控制
  4. 对端口,信息和网络接口的访问控制

在linux里所有的文件和进程都有一个值,这个值被称为安全值,当我满足或者匹配到这个安全值,那么才能进行访问。(http默认目录是在/var/www/html当我将这个默认的访问目录更改时你默认创建的 目录对应性另一个安全值,而我们默认访问的就是第一种安全值所以如果开启了selinux则不能访问更改后目录的东西)

SELinux 的作用及权限管理机制

SELinux 的作用

SELinux 主要作用就是最大限度地减小系统中服务进程可访问的资源(最小权限原则)。设想一下,如果一个以 root 身份运行的网络服务存在 0day 漏洞,黑客就可以利用这个漏洞,以 root 的身份在您的服务器上为所欲为了。是不是很可怕?SELinux 就是来解决这个问题的。

DAC

在没有使用 SELinux 的操作系统中,决定一个资源是否能被访问的因素是:某个资源是否拥有对应用户的权限(读、写、执行)。
只要访问这个资源的进程符合以上的条件就可以被访问。

而最致命问题是,root 用户不受任何管制,系统上任何资源都可以无限制地访问。
这种权限管理机制的主体是用户,也称为自主访问控制(DAC)

MAC

在使用了 SELinux 的操作系统中,决定一个资源是否能被访问的因素除了上述因素之外,还需要判断每一类进程是否拥有对某一类资源的访问权限。

这样一来,即使进程是以 root 身份运行的,也需要判断这个进程的类型以及允许访问的资源类型才能决定是否允许访问某个资源。进程的活动空间也可以被压缩到最小。
即使是以 root 身份运行的服务进程,一般也只能访问到它所需要的资源。即使程序出了漏洞,影响范围也只有在其允许访问的资源范围内。安全性大大增加。

这种权限管理机制的主体是进程,也称为强制访问控制(MAC)
而 MAC 又细分为了两种方式:

  • 类别安全(MCS)模式
  • 多级安全(MLS)模式

下文中的操作均为 MCS 模式。

SELinux的配置文件

[root@localhost ~]# vim /etc/selinux/config 

在这里插入图片描述
配置文件由两部分组成工作模式和政策

SELinux 的工作模式

SELinux 有三种工作模式,分别是:

  1. enforcing:强制模式。违反 SELinux 规则的行为将被阻止并记录到日志中。
  2. permissive:宽容模式。违反 SELinux 规则的行为只会记录到日志中。一般为调试用。
  3. disabled:关闭 SELinux。

如果想从 disabled 切换到 enforcing 或者 permissive 的话,需要重启系统。反过来也一样。而enforcing 和 permissive 模式可以通过 setenforce 1|0 命令快速切换。

#查看级别
[root@web ~]# getenforce
#使用命令行切换级别
setenforce 0
setenforce 1

#修改级别,直接编辑/etc/selinux/config
SELINUX=enforcing
#修改完成后重启才能生效
#查看selinux状态
[root@web ~]# sestatus

需要注意的是,如果系统已经在关闭 SELinux 的状态下运行了一段时间,在打开 SELinux 之后的第一次重启速度可能会比较慢。因为系统必须为磁盘中的文件创建安全上下文。

SELinux 的政策

系统中通常有大量的文件和进程,为了节省时间和开销,通常我们只是选择性地对某些进程进行管制。而哪些进程需要管制、要怎么管制是由政策决定的

在redhat 7 系统中,有三套政策,分别是:

  1. targeted:对大部分网络服务进程进行管制。这是系统默认使用的政策(下文均使用此政策)。
  2. minimum:以 targeted 为基础,仅对选定的网络服务进程进行管制。一般不用。
  3. mls:多级安全保护。对所有的进程进行管制。这是最严格的政策,配置难度非常大。一般不用,除非对安全性有极高的要求。

核心:安全上下文(Security Context)

安全上下文是 SELinux 的核心。可以把它分为「进程安全上下文」和「文件安全上下文」。一个「进程安全上下文」一般对应多个「文件安全上下文」。只有两者的安全上下文对应上了,进程才能访问文件。它们的对应关系由政策中的规则决定。

文件安全上下文由文件创建的位置和创建文件的进程所决定。而且系统有一套默认值,用户也可以对默认值进行设定。需要注意的是:单纯的移动文件操作并不会改变文件的安全上下文。

#查看selinux值
[root@localhost ~]# ll -Z

在这里插入图片描述安全上下文有四个字段,分别用冒号隔开。对应含义如下:

system_u:object_r:admin_home_t:s0
用户身份    角色     类型(标签) 安全级别

注意:第三段是SELinux中最重要的信息,admin_home 表示的是类型

1、用户身份字段

主要有下面几个用户身份:

  • root表示root账户身份
  • user_u表示普通用户无特权用户
  • system_u表示系统用户

通过用户可以确认身份类型,一般搭配角色使用。身份和不同的角色搭配时权限不同,虽然可以使用su命令切换用户但对于SElinux的用户并没有发生改变,账户之间切换时此用户身份不变,在targeted策略环境下用户标识没有实质性作用。

2、角色字段

object_robject_r一般为文件目录的角色system_r一般为进程的角色,在targeted策略环境中用户的角色一般为system_r。

用户的角色类似用户组的概念,不同的角色具有不同的身份权限,一个用户可以具备多个角色,但是同一时间只能使用一个角色。在targeted策略环境下角色没有实质作用,在targeted策略环境中所有的进程文件的角色都是system_r角色。

3、类型(标签)字段

admin_home文件和进程都有一个类型,SElinux依据类型的相关组合来限制存取权限

Touch /.autorelabel 系统当中默认启用了selinux,去读取一个去止文件,而这个文件里是否有内容它都要去读,读完之后它会给这些系统默认的文件设置安全值,即context值,下面描述如何修改context值。

修改context值有两种命令,semanage和chcon,命令对应格式如下:

semanage fcontext -a -t httpd_sys_content_t  "/www(/.*)?"
restorecon -v /www/index.html	 必须执行否则不生效
注:目录或文件的默认安全上下文可以通过 semanage fcontext -l 命令配合 grep过滤查看
chcon -t context值的类型 文件名 

注意:文件的context值会随着目录的作用和环境的不同而发生改变,该值会继承上一级目录的context值

4、安全级别字段

最后一段 s0 是跟MLS、MCS相关的东西,暂时不需要管。

SELinux的布尔值开关

当你配置一个服务现在selinux也是开启的,所以你这个服务的有些功能是用不了的,而bool值相当于是一个开关,你把这个功能开关按上就好了

#查看布尔值
[root@web ~]# getsebool -a
#查看ftp相关的布尔值
[root@web ~]# getsebool -a | grep ftp
#设置布尔值
setsebool -P ftp_home_dir on

案例:

使用ftp服务演示布尔值的设定 开启vsftp服务,配置为本地用户允许读写家目录,不允许遍历其他目录

配置如下:
1.添加防火墙允许策略

[root@localhost ~]# firewall-cmd --permanent --add-service=ftp
[root@localhost ~]# firewall-cmd --reload

2.修改ftp配置文件

[root@localhost ~]# vim /etc/vsftpd/vsftpd.conf 

[禁止匿名用户]
anonymous_enable=no

[禁止遍历]
#首先开启chroot选项
allow_writeable_chroot=YES
#打开chroot选项
chroot_list_enable=YES
#指定打开谁的CHROOT
chroot_list_file=/etc/vsftpd/chroot_list
#确保以下选项参数无误
local_enable=YES
write_enable=YES

3.编辑/etc/vsftpd/chroot_list文件

[root@localhost ~]# vim /etc/vsftpd/chroot_list
      redhat

4.修改布尔值打开/home目录的权限

[root@localhost ~]# getsebool -a | grep ftp_home_dir
ftp_home_dir --> off
[root@localhost ~]# setsebool -P ftp_home_dir on

5.使用图形界面切换级别

安装policycoreutils-gui
执行system-config-selinux

然后就OK了

原创文章 105 获赞 110 访问量 1万+

猜你喜欢

转载自blog.csdn.net/qq_43624033/article/details/105890709