简介
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 的规则,右边的就是对应规则的布尔值(打开或者关闭)
setsebool -P 规则名称 [0|1] # 修改当前工作类型下指定规则的开启关闭,-P表示同时修改文件使永久生效
域就是用来对进行进行限制,而上下文就是对系统资源进行限制。
SELinux 运行状态切换
- 1.Enforcing 强制(严格按策略执行保护)
- 2.Permissive 宽松 (若有违规会记录写到日志里面,但不真正做限制)
- 3.Disabled 禁用 (内核不加载 SELlinux)
禁用 SELinux,与不带 SELinux 系统是一样的,通常情况下我们在不怎么了解 SELinux 时,将模式设置成 disabled,这样在访问一些网络应用时就不会出问题了。
检查当前的 SElinux 运行状态
[root@localhost ~]# getenforce
Enforcing
可以看到是强制状态(默认运行状态)
切换运行状态
[root@localhost ~]# setenforce 0 //切换为宽松状态
[root@localhost ~]# setenforce 1 //切换为强制状态
注意:通过 setenforce 来设置 SELinux 只是临时修改,当系统重启后就会失效了,所以如果要永久修改,就通过修改 SELinux 主配置文件
配置文件
SELinux 的配置文件路径
[root@localhost ~]# vim /etc/selinux/config
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 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 信息,
[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 服务器网站目录下创建的文件
[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
我们在根目录下创建下试试
-rw-r--r--. root root unconfined_u:object_r:admin_home_t:s0 2.html
结果显示是不是 httpd_sys_content_t
如何才能修改 2.html 的安全上下文呢
[root@localhost demo]# chcon --reference=/var/www/html/ /root/demo/2.html
把文件或目录的安全上下文恢复到默认值
restorecon [选项] <文件或目录 1> [<文件或目录 2>...]
restorecon -R /demo/2.html
添加某类进程允许访问的端口
命令基本用法
semanage port -a -t <服务类型> -p <协议> <端口号>
注:各种服务类型所允许的端口号可以通过 semanage port -l 命令配合 grep 过滤查看。
为 Nginx 需要使用 10080 的端口用于 HTTP 服务。
semanage port -a -t http_port_t -p tcp 10080
SELinux 错误分析和解决
认识 SELinux 日志
当开启了 SELinux 之后,很多服务的一些正常行为都会被视为违规行为(标题及下文中的错误均指违规行为)。
这时候我们就需要借助 SELinux 违规日志来分析解决。
SELinux 违规日志保存在 /var/log/audit/audit.log 中。
/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 分析错误
命令基本用法
sealert -a /var/log/audit/audit.log
执行完命令之后,系统需要花一段时间去分析日志中的违规行为并给出分析报告。分析报告的结构讲解请看下图:
Comments NOTHING