简介

SELinux简介

SELinux(Secure Enhanced Linux)安全增强的Linux是由美国国家安全局NSA针对计算机基础结构安全开发的一个全新的Linux安全策略机制。SELinux可以允许系统管理员更加灵活的来定义安全策略。

SELinux是一个内核级别的安全机制,从Linux2.6内核之后就将SELinux集成在了内核当中,因为SELinux是内核级别的,所以我们对于其配置文件的修改都是需要重新启动操作系统才能生效的。

现在主流发现的Linux版本里面都集成了SELinux机制,CentOS/RHEL都会默认开启SELinux机制。

SELinux基本概念

  • Subject 主体,是一个进程
  • Object 对象,是文件,设备,套接字或者任何可以对主体访问的资源
  • Action 动作,就是主体对象执行的操作 读,写等
  • Policy 策略
  • Mode 模式
  • Security Context 安全上下文

我们知道,操作系统的安全机制其实就是对两样东西做出限制:进程和系统资源(文件、网络套接字、系统调用等)。

在之前学过的知识当中,Linux操作系统是通过用户和组的概念来对我们的系统资源进行限制,我们知道每个进程都需要一个用户才能执行。

在SELinux当中针对这两样东西定义了两个基本概念:域(domin)和上下文(context)。

工作类型

SELinux下存在不同的规则,SELinux根据不同的工作类型对这些规则打开或关闭(on|off<布尔值1|0>),然后通过规则的开启与关闭具体地限制不同进程对文件的读取。
getsebool -a 或者 sestatus -b # 查看当前工作类型下各个规则的开启与否
规则
左边的是SELinux的规则,右边的就是对应规则的布尔值(打开或者关闭)

1
setsebool -P 规则名称 [0|1]    # 修改当前工作类型下指定规则的开启关闭,-P表示同时修改文件使永久生效

域就是用来对进行进行限制,而上下文就是对系统资源进行限制。

SELinux运行状态切换

  • 1.Enforcing 强制(严格按策略执行保护)
  • 2.Permissive 宽松 (若有违规会记录写到日志里面,但不真正做限制)
  • 3.Disabled 禁用 (内核不加载SELlinux)
    禁用SELinux,与不带SELinux系统是一样的,通常情况下我们在不怎么了解SELinux时,将模式设置成disabled,这样在访问一些网络应用时就不会出问题了。

检查当前的SElinux运行状态

1
2
[root@localhost ~]# getenforce 
Enforcing

可以看到是强制状态(默认运行状态)

切换运行状态

1
2
[root@localhost ~]# setenforce 0 //切换为宽松状态
[root@localhost ~]# setenforce 1 //切换为强制状态

注意:通过 setenforce 来设置SELinux只是临时修改,当系统重启后就会失效了,所以如果要永久修改,就通过修改SELinux主配置文件

配置文件

SELinux的配置文件路径

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

SELinux的配置文件内容

1
2
3
4
5
6
7
8
9
10
11
12
# 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 three values:
# targeted - Targeted processes are protected,
# minimum - Modification of targeted policy. Only selected processes are protected.
# mls - Multi Level Security protection.
SELINUXTYPE=targeted

SELINUX=enforcing 自行修改即可

SELINUXTYPE=targeted 用于指定 SELinux 的默认策略(目标策略)
在CentOS/RHEL中,其默认使用的是目标(target)策略,那么何为目标策略呢?
目标策略定义了只有目标进程受到SELinux限制,非目标进程就不会受到SELinux限制,通常我们的网络应用程序都是目标进程,比如httpd、mysqld,dhcpd等等这些网络应用程序。

上下文概念

我们可以通过 ls -Z 这个命令来查看我们文件的上下文信息,也就是SELinux信息,

1
2
3
4
5
 [root@localhost ~]# ls -Z
-rw-------. root root system_u:object_r:admin_home_t:s0 anaconda-ks.cfg
drwxr-xr-x. root root unconfined_u:object_r:admin_home_t:s0 Desktop
-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

我们发现其比传统的 ls 命令多出来了 system_u:object_r:admin_home_t:s0 这个东西,我们现在就来分析一下这段语句所代表的含义

这条语句通过:划分成了四段,第一段 system_u 代表的是用户,第二段 object_r 表示的是角色,第三段是SELinux中最重要的信息,admin_home 表示的是类型

  • ①system_u  指的是SElinux用户,root表示root账户身份,user_u表示普通用户无特权用户,system_u表示系统进程,通过用户可以确认身份类型,一般搭配角色使用。身份和不同的角色搭配时有权限不同,虽然可以使用su命令切换用户但对于SElinux的用户并没有发生改变,账户之间切换时此用户身份不变,在targeted策略环境下用户标识没有实质性作用。

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

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

修改安全上下文

这是在Apache服务器网站目录下创建的文件

1
2
[root@localhost demo]# ls -dZ /var/www/html/index.html 
-rw-r--r--. root root unconfined_u:object_r:httpd_sys_content_t:s0 /var/www/html/index.html

我们在根目录下创建下试试
1
2
-rw-r--r--. root root unconfined_u:object_r:admin_home_t:s0 2.html


结果显示是不是 httpd_sys_content_t

如何才能修改2.html的安全上下文呢

1
[root@localhost demo]# chcon --reference=/var/www/html/  /root/demo/2.html 

把文件或目录的安全上下文恢复到默认值
restorecon [选项] <文件或目录 1> [<文件或目录 2>…]

1
restorecon -R /demo/2.html

添加某类进程允许访问的端口

命令基本用法
semanage port -a -t <服务类型> -p <协议> <端口号>

注:各种服务类型所允许的端口号可以通过 semanage port -l 命令配合 grep 过滤查看。
为 Nginx 需要使用 10080 的端口用于 HTTP 服务。

1
semanage port -a -t http_port_t -p tcp 10080

SELinux 错误分析和解决

认识 SELinux 日志

当开启了 SELinux 之后,很多服务的一些正常行为都会被视为违规行为(标题及下文中的错误均指违规行为)。

这时候我们就需要借助 SELinux 违规日志来分析解决。

SELinux 违规日志保存在 /var/log/audit/audit.log 中。

1
2
3
4
/var/log/audit/audit.log 的内容大概是这样的。
type=LOGIN msg=audit(1507898701.391:515): pid=8523 uid=0 subj=system_u:system_r:crond_t:s0-s0:c0.c1023 old-auid=4294967295 auid=0 tty=(none) old-ses=4294967295 ses=25 res=1
type=USER_START msg=audit(1507898701.421:516): pid=8523 uid=0 auid=0 ses=25 subj=system_u:system_r:crond_t:s0-s0:c0.c1023 msg='op=PAM:session_open grantors=pam_loginuid,pam_keyinit,pam_limits,pam_systemd acct="root" exe="/usr/sbin/crond" hostname=? addr=? terminal=cron res=success'
...

该文件的内容很多,而且混有很多与 SELinux 错误无关的系统审计日志。我们要借助 sealert 这个实用工具来帮忙分析(如果提示找不到命令的话请安装 setroubleshoot 软件包)。

使用 sealert 分析错误

命令基本用法

1
sealert -a /var/log/audit/audit.log

执行完命令之后,系统需要花一段时间去分析日志中的违规行为并给出分析报告。分析报告的结构讲解请看下图: