一、SELinux简介
1、selinux(Security-Enhanced Linux)是美国国家安全局(NSA)和SCC开发的Linux的一个强制访问控制的安全模块。selinux是一种基于 强制访问控制(MAC)安全系统。
2、Linux访问方式:
1)DAC自主访问控制:完全依赖于Linux系统权限的设置(rwx);
2)MAC强制访问控制:是由策略规则所控制,策略的规则决定控制的严格程度。策略规则例如:文件、进程、端口的上下文标签,selinux布尔值。
二、SELinux的三种模式
● enforcing强制访问:必须通过策略的配置才可以访问,会拦截非法的资源访问并记录相关日志。
● permissive警告模式:允许访问,当访问无权限的资源时会警告并记录相关日志,不会拦截访问。
● disabled禁用:禁用selinux功能。
1、修改selinux模式的命令(临时生效,重启系统后会变回默认的模式)
setenforce命令只能在enforcing与permissive两种模式之间进行切换。
命令:
命令 | 含义 |
getenforce | 查看当前的selinux模式 |
setenforce | 修改selinux模式,0为permissive模式,1为enforcing模式 |
2、修改配置文件(永久生效,重启系统后生效)
[root@vms002 /]# 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=permissive #selinux模式,修改后重启系统后才会生效 # SELINUXTYPE= can take one of three two values: # targeted - Targeted processes are protected, # minimum - Modification of targeted policy. Only selected processes are protected. # mls - Multi Level Security protection. SELINUXTYPE=targeted
selinux配置文件有两个,一个为真实配置文件,一个为软链接,无论修改哪一个配置文件都可以。如下所示:
[root@vms002 /]# ls -l /etc/selinux/config #真实配置文件 -rw-r--r--. 1 root root 548 8月 13 2018 /etc/selinux/config [root@vms002 /]# ls -l /etc/sysconfig/selinux #软链接 lrwxrwxrwx. 1 root root 17 8月 13 2018 /etc/sysconfig/selinux -> ../selinux/config
三、SELinux安全上下文标签
1、上下文件标签简介
Linux中的文件、进程、端口都有安全上下文标签,当运行selinux后所有的安全上下文标签都是访问控制的依据。
2、上下文标签的相关命令
命令 | 含义 |
ls -Z | 查看文件的上下文 |
ps -Z | 查看进程的上下文 |
chcon | 更改文件selinux安全上下文 |
restorecon | 恢复文件默认的selinux安全上下文 |
semanage | selinux策略管理工具 |
3、安全上下文实战演示
1)查看文件和进程的安全上下文
[root@vms001 /]# ls -lZ /var/www/html/index.html #查看文件的安全上下文 -rw-r--r--. root root unconfined_u:object_r:httpd_sys_content_t:s0 /var/www/html/index.html [root@vms001 /]# ls -ldZ /var/www/html/ #查看目录的安全上下文 drwxr-xr-x. root root system_u:object_r:httpd_sys_content_t:s0 /var/www/html/ [root@vms001 /]# ps -efZ | grep httpd #查看httpd进程的上下文 system_u:system_r:httpd_t:s0 root 49796 1 0 10:40 ? 00:00:01 /usr/sbin/httpd -DFOREGROUND system_u:system_r:httpd_t:s0 apache 49797 49796 0 10:40 ? 00:00:00 /usr/sbin/httpd -DFOREGROUND system_u:system_r:httpd_t:s0 apache 49798 49796 0 10:40 ? 00:00:00 /usr/sbin/httpd -DFOREGROUND system_u:system_r:httpd_t:s0 apache 49799 49796 0 10:40 ? 00:00:00 /usr/sbin/httpd -DFOREGROUND system_u:system_r:httpd_t:s0 apache 49800 49796 0 10:40 ? 00:00:00 /usr/sbin/httpd -DFOREGROUND system_u:system_r:httpd_t:s0 apache 49801 49796 0 10:40 ? 00:00:00 /usr/sbin/httpd -DFOREGROUND unconfined_u:unconfined_r:unconfined_t:s0-s0:c0.c1023 root 54695 4104 0 15:01 pts/1 00:00:00 grep --color=auto httpd
2)chcon命令修改文件的安全上下文
用法:chcon [选项] [-u selinux用户] [-r 角色] [-l 范围] [-t 类型] 文件
常用选项:
--reference=参考文件 文件
-r 修改角色属性
-l 修改范围属性
-t 修改类型属性
-R 递归
[root@vms001 /]# ls -ldZ /data/ drwxr-xr-x. root root unconfined_u:object_r:default_t:s0 /data/ [root@vms001 /]# chcon -R -t httpd_sys_content_t /data/ [root@vms001 /]# ls -ldZ /data/ drwxr-xr-x. root root unconfined_u:object_r:httpd_sys_content_t:s0 /data/
提示:当我们用chcon命令修改安全上下文时,只是临时生效,重置selinux安全标签或使用restorecon命令恢复文件默认的安全上下文后,chcon命令修改的安全上下文就会失效。如下代码所示:
[root@vms001 /]# ls -ldZ /data/ drwxr-xr-x. root root unconfined_u:object_r:httpd_sys_content_t:s0 /data/ [root@vms001 /]# restorecon -R /data/ [root@vms001 /]# ls -ldZ /data/ drwxr-xr-x. root root unconfined_u:object_r:default_t:s0 /data/
3)semanage命令
常用选项:
fcontext 管理文件上下文映射定义
port 管理网络端口类型定义
-a 添加预设安全上下文
-d 删除指定的预设安全上下文
-l 查看预设安全上下文
-t 修改类型属性
示例:
① 查看selinux策略默认的预设安全上下文信息
[root@vms001 /]# semanage fcontext -l
② 修改策略,添加一条新的预设安全上下文信息,恢复文件的默认安全上下文
[root@vms001 /]# ls -ldZ /oldboy/ #查看安全上下文 drwxr-xr-x. root root unconfined_u:object_r:default_t:s0 /oldboy/ [root@vms001 /]# semanage fcontext -a -t httpd_sys_content_t /oldboy #修改默认的安全上下文 [root@vms001 /]# ls -ldZ /oldboy/ #查看安全上下文 drwxr-xr-x. root root unconfined_u:object_r:default_t:s0 /oldboy/ [root@vms001 /]# restorecon -R /oldboy/ #恢复默认的安全上下文 [root@vms001 /]# ls -ldZ /oldboy/ #查看安全上下文 drwxr-xr-x. root root unconfined_u:object_r:httpd_sys_content_t:s0 /oldboy/
③ 利用正则表达式 递归设置目录的预设安全上下文
[root@vms001 /]# mkdir /www [root@vms001 /]# touch /www/file-{01..03} [root@vms001 /]# ls -ldZ /www/ drwxr-xr-x. root root unconfined_u:object_r:default_t:s0 /www/ [root@vms001 /]# ls -lZ /www/ -rw-r--r--. root root unconfined_u:object_r:default_t:s0 file-01 -rw-r--r--. root root unconfined_u:object_r:default_t:s0 file-02 -rw-r--r--. root root unconfined_u:object_r:default_t:s0 file-03 [root@vms001 /]# [root@vms001 /]# semanage fcontext -a -t httpd_sys_content_t "/www(/.*)?" [root@vms001 /]# [root@vms001 /]# restorecon -R /www/ [root@vms001 /]# [root@vms001 /]# ls -ldZ /www/ drwxr-xr-x. root root unconfined_u:object_r:httpd_sys_content_t:s0 /www/ [root@vms001 /]# ls -lZ /www/ -rw-r--r--. root root unconfined_u:object_r:httpd_sys_content_t:s0 file-01 -rw-r--r--. root root unconfined_u:object_r:httpd_sys_content_t:s0 file-02 -rw-r--r--. root root unconfined_u:object_r:httpd_sys_content_t:s0 file-03
④ 删除预设安全上下文
[root@vms001 /]# ls -ldZ /www/ drwxr-xr-x. root root unconfined_u:object_r:httpd_sys_content_t:s0 /www/ [root@vms001 /]# [root@vms001 /]# restorecon -R /www/ [root@vms001 /]# [root@vms001 /]# ls -ldZ /www/ drwxr-xr-x. root root unconfined_u:object_r:httpd_sys_content_t:s0 /www/ [root@vms001 /]# [root@vms001 /]# semanage fcontext -d "/www(/.*)?" [root@vms001 /]# [root@vms001 /]# ls -ldZ /www/ drwxr-xr-x. root root unconfined_u:object_r:httpd_sys_content_t:s0 /www/ [root@vms001 /]# [root@vms001 /]# restorecon -R /www/ [root@vms001 /]# [root@vms001 /]# ls -ldZ /www/ drwxr-xr-x. root root unconfined_u:object_r:default_t:s0 /www/ [root@vms001 /]# ls -lZ /www/ -rw-r--r--. root root unconfined_u:object_r:default_t:s0 file-01 -rw-r--r--. root root unconfined_u:object_r:default_t:s0 file-02 -rw-r--r--. root root unconfined_u:object_r:default_t:s0 file-03
四、SELinux布尔值
1、selinux布尔值简介
selinux布尔值我们可以理解为是一个开关,当selinux开启时,布尔值功能也同时开启,并且大部分默认的布尔值都是关闭的。需要实现一个功能时,同时也需要开启对应的布尔值,如果对应的布尔值没有开启,那么这个功能也无法实现。selinux布尔值相当于是在服务上多加了一个开关,服务本身以及布尔值这两个开关同时开启,这个服务才是真正的开启。
2、selinux布尔值相关命令
命令 | 含义 |
getsebool | 获取selinux布尔值 |
setsebool | 设置selinux布尔值 |
3、示例
我们用ftp做示例。
1)查看ftp的selinux布尔值(getsebool)
[root@vms002 /]# getsebool -a | grep ftp ftp_home_dir --> off ftpd_anon_write --> off ftpd_connect_all_unreserved --> off ftpd_connect_db --> off ftpd_full_access --> off ftpd_use_cifs --> off ftpd_use_fusefs --> off ftpd_use_nfs --> off ftpd_use_passive_mode --> off httpd_can_connect_ftp --> off httpd_enable_ftp_server --> off sftpd_anon_write --> off sftpd_enable_homedirs --> off sftpd_full_access --> off sftpd_write_ssh_home --> off tftp_anon_write --> off tftp_home_dir --> off
2)设置ftp的selinux布尔值,允许匿名用户可以上传文件或目录。(setsebool)代码如下:
[root@vms002 /]# setsebool -P ftpd_anon_write on #-P永久生效,同时写入到配置文件中。 [root@vms002 /]# [root@vms002 /]# getsebool -a | grep "ftpd_anon_write" ftpd_anon_write --> on sftpd_anon_write --> off
提示:on 或 1 为开启状态;off 或 0 为关闭状态。-P(大写)为永久生效。
五、排错
当我们无法访问或无法写入时,可以从以下三个方面进行排错:
1、服务的配置文件是否开启了权限;
2、Linux系统文件是否有权限;
3、selinux的上下文以及布尔值是否开启了对应的功能。
六、总结
1、selinux三种模式:
1)enforcing:强制开启访问控制;
2)permissive:允许,警告模式;
3)disabled:强制关闭selinux功能。
2、selinux安全上下文标签:
1)ls -Z:查看文件的安全上下文;
2)ls -ldZ:查看目录的安全上下文;
3)ps -Z:查看进程的安全上下文;
4)chcon:修改文件或目录的安全上下文:(临时生效,重置selinux或恢复默认安全上下文后失效)
--reference=参考文件 文件
-t 修改类型属性
-R 递归
5)restorecon:恢复文件或目录的默认安全上下文
-R 递归恢复目录的安全上下文
6)semanage:selinux策略管理工具:
fcontext 管理文件的安全上下文映射定义
port 管理网络端口类型定义
-a 添加预设安全上下文
-d 删除预设安全上下文
-t 修改类型属性
-l 显示预设安全上下文
3、selinux布尔值:
1)getsebool -a:查看布尔值
2)setsebool:修改布尔值
-P 永久生效,同时写入到配置文件中
3)on 或 1 为开启
4)off 或 0 为关闭