SELinux 安全子系统
Linux系统使用SELinux技术的目的是为了让各个服务进程都受到约束,使其仅获取到本应获取的资源。它能够从多方面监控违法行为:对服务程序的功能进行限制(SELinux 域限制可以确保服务程序做不了出格的事情);对文件资源的访问进行限制(SELinux 安全上下文确保文件资源只能被其所属的服务程序进行访问)。
很多服务器在部署好 Linux系统后直接将 SELinux 禁用了。这绝对不是明智的选择。SELinux 服务有 3 种配置模式,具体如下。
- enforcing:强制启用安全策略模式,将拦截服务的不合法请求。
- permissive:遇到服务越权访问时,只发出警告而不强制拦截。
- disabled:对于越权的行为不警告也不拦截。
虽然在禁用 SELinux 服务后确实能够减少报错几率,但这在生产环境中相当不推荐。建议检查一下自己的系统,查看 SELinux 服务主配置文件中定义的默认状态。如果是 permissive 或 disabled,建议赶紧修改为 enforcing。
使用selinux需要记住的四个命令
- semanage:该命令用于管理selinux的安全上下文,可查看、添加、修改和删除进程、文件或目录的安全上下文策略
- restorecon:执行semanage命令后,需要使用restorecon命令将设置好的安全上下文立即生效,可以加上-Rv参数对指定的目录进行递归操作,以及显示修改过程
- getsebool:查询selinux域的安全策略,需要加上 -a 参数
- setsebool:修改selinux域的安全策略的规则,加上 -P 参数使其永久且立即生效
可以使用 getenforce 命令获得当前 SELinux服务的运行模式:
[RS ~]# getenforce //查看当前SELinux服务的运行模式
Enforcing
[root@RS ~]# sestatus //查询selinux服务的工作状态
SELinux status: enabled
SELinuxfs mount: /sys/fs/selinux
SELinux root directory: /etc/selinux
Loaded policy name: targeted
Current mode: enforcing
Mode from config file: enforcing
Policy MLS status: enabled
Policy deny_unknown status: allowed
Memory protection checking: actual (secure)
Max kernel policy version: 31
可以用 setenforce [0|1]命令修改SELinux 当前的运行模式(0 为禁用,1 为启用)。注意,这种修改只是临时的,在系统重启后就会失效:
[RS ~]# setenforce 0 //临时禁用SELinux
[RS ~]# getenforce //查看运行模式
Permissive
[RS ~]# setenforce 1 //启用SELinux
[RS ~]# getenforce //查看运行模式
Enforcing
在临时禁止SELINUX以后是可以访问刚刚修改的配置内容的,那么分析下问题所在:
httpd 服务程序的功能是允许用户访问网站内容,因此 SELinux 肯定会默认放行用户对网站的请求操作。但是将网站数据的默认保存目录修改为/home/wwwroot,这就产生问题了。
/home 目录是用来存放普通用户的家目录数据的,而现在 httpd 提供的网站服务却要去获取普通用户家目录中的数据,这显然违反了 SELinux 的监管原则。
现在,把 SELinux 服务恢复到强制启用安全策略模式,然后分别查看原始网站数据的保存目录与当前网站数据的保存目录是否拥有不同的 SELinux 安全上下文值。
[RS ~]# ls -Zld /var/www/html //查看SELinux安全上下文值
drwxr-xr-x. 2 root root system_u:object_r:httpd_sys_content_t:s0 24 Dec 21 05:58 /var/www/html
[RS ~]# ls -Zld /home/wwwroot //查看SELinux安全上下文值
drwxr-xr-x. 2 root root unconfined_u:object_r:user_home_dir_t:s0 24 Dec 21 06:00 /home/wwwroot
用户段 system_u 代表系统进程的身份,角色段 object_r 代表文件目录的角色,类型段 httpd_sys_content_t 代表网站服务的系统文件。针对当前这种情况,我们只需要使用 semanage 命令,将当前网站目录/home/wwwroot 的SELinux 安全上下文修改为跟原始网站目录的一样就行了。
semanage 命令
semanage 命令用于管理 SELinux 的策略,英文全称为“SELinux manage”,语法格式为“semanage [参数] [文件]”。
SELinux 服务极大地提升了 Linux 系统的安全性,将用户权限牢牢地锁在笼子里。semanage 命令不仅能够像传统的 chcon 命令那样设置文件、目录的策略,还能够管理网络端口、消息接口(这些新特性将在本章后文中涵盖)。使用 semanage 命令时,经常用到的几个参数及其作用如表所示。
参数 | 作用 |
---|---|
-l | 查询 |
-a | 添加 |
-m | 修改 |
-d | 删除 |
向新的网站数据目录中新添加一条 SELinux 安全上下文,让这个目录以及里面的所有文件能够被 httpd 服务程序访问到:
[RS ~]# semanage fcontext -a -t httpd_sys_content_t /home/wwwroot //添加SELinux安全上下文
[RS ~]# semanage fcontext -a -t httpd_sys_content_t /home/wwwroot/* //添加SELinux安全上下文
在执行上述设置之后,还无法立即访问网站,还需要使用 restorecon 命令将设置好的 SELinux 安全上下文立即生效。在使用 restorecon 命令时,可以加上-Rv 参数对指定的目录进行递归操作,以及显示 SELinux 安全上下文的修改过程。最后,再次刷新页面,就可以正常看到网页内容了。
[RS@ ~]# restorecon -Rv /home/wwwroot //刷新SELinux 安全上下文立即生效
永久修改启动模式
永久修改 SElinux 启动模式、永久生效 重启生效
[RS@ ~]# vim /etc/selinux/config //修改配置文件永久生效
# 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 //修改此行