SELinux加固Linux安全

SELinux 模式

  • enforcing 模式 : SELinux强制执行访问控制规则。 在强制模式下,如果规则没有明确允许访问,则拒绝访问,并写入日志。此模式是默认模式。

  • Permissive 模式 :SELinux 加载策略并处于活动状态,但不强制执行 访问控制规则,⽽是记录访问违规。此模式有助于对应用和规则进行测试和故障排除。

  • disable 模式 :完全关闭 SELinux。不拒绝任何SELinux违规,不予记录。

复制代码
 [root@server ~ 18:47:49]# getenforce 
 Enforcing
 #permission是临时关闭用来测试是不是selinux引起的原因
 [root@server ~ 18:49:23]# setenforce 
 usage:  setenforce [ Enforcing | Permissive | 1 | 0 ]
 [root@server ~ 18:49:36]# setenforce 0
 [root@server ~ 18:49:56]# getenforce 
 Permissive
 [root@server ~ 18:50:01]# setenforce 1
 [root@server ~ 18:50:04]# getenforce 
 Enforcing
 ​
 ***关闭要编辑配置文件完成***
 selinux是内核级别功能

SELinux 的文件标签机制

新文件默认 SELinux 上下文
复制代码
 #核心标签是 tmp_t → 相当于给 /tmp 贴了 “临时公共区” 标签,说明这是系统默认的临时文件存放地,所有用户 / 程序都能临时用,但权限受 SELinux 限制(比如不能假装自己是 “网站文件”)
 [root@server ~ 18:50:06]# ls -dZ /tmp
 drwxrwxrwt. root root system_u:object_r:tmp_t:s0       /tmp
 ​
 #文件 /tmp/lyk 是 user_tmp_t → 这是 “用户在临时区创建的文件” 专属标签,继承了 /tmp 的 “公共临时” 属性,但和系统级临时文件标签区分开了
 [root@server ~ 18:55:40]# touch /tmp/lyk
 [root@server ~ 18:56:14]# ls -dZ /tmp /tmp/lyk
 drwxrwxrwt. root root system_u:object_r:tmp_t:s0       /tmp
 -rw-r--r--. root root unconfined_u:object_r:user_tmp_t:s0 /tmp/lyk
 [root@server ~ 18:56:29]# ls -dZ /var/www/html/
 drwxr-xr-x. root root system_u:object_r:httpd_sys_content_t:s0 /var/www/html/
 ​
 #文件 index.html 也是 httpd_sys_content_t → 继承了文件夹的 “网站内容” 标签,说明 “这是正经的网页文件”,httpd 服务能正常读取它
 [root@server ~ 18:57:19]# touch /var/www/html/index.html
 [root@server ~ 18:57:33]# ls -Zd /var/www/html/index.html /var/www/html/
 drwxr-xr-x. root root system_u:object_r:httpd_sys_content_t:s0 /var/www/html/
 -rw-r--r--. root root unconfined_u:object_r:httpd_sys_content_t:s0 /var/www/html/index.html
复制代码
 #总结:这些命令讲了 SELinux 的 2 个核心知识点
 #-标签继承性:文件默认会继承所在文件夹的 SELinux 标签(比如 /var/www/html 里的文件默认是 httpd_sys_content_t,/tmp 里的文件默认是 user_tmp_t)。
 ​
 #-标签决定性:一个程序能否访问文件,不仅看权限(rwx),还要看双方的标签是否 “匹配”。比如 httpd 服务默认只能访问 httpd_sys_content_t 标签的文件,如果你把网页文件放到 /tmp(标签 tmp_t),即使权限够,SELinux 也会阻止访问(因为标签不匹配)。
 ​
 简单说:SELinux 靠标签给文件 “分类”,限制程序只能访问 “同类标签” 的文件,防止越权访问,让系统更安全。这就是为什么配置网站时,文件放对目录(带正确标签)很重要~

-a

复制代码
 ​
 [root@server ~ 18:58:49]# ls -Zd /root
 dr-xr-x---. root root system_u:object_r:admin_home_t:s0 /root
 [root@server ~ 19:04:02]# cp /tmp/lyk ./lyk-1
 [root@server ~ 19:04:48]# ls -Zd /root /root/lyk-1
 dr-xr-x---. root root system_u:object_r:***admin_home_t***:s0 /root
 -rw-r--r--. root root unconfined_u:object_r:***admin_home_t***:s0 /root/lyk-1
 [root@server ~ 19:05:04]# cp -a /tmp/lyk ./lyk-2
 [root@server ~ 19:05:39]# ls -Zd /root /root/lyk-2
 dr-xr-x---. root root system_u:object_r:***admin_home_t***:s0 /root
 -rw-r--r--. root root unconfined_u:object_r:***user_tmp_t***:s0 /root/lyk-2

-z

  • 用于显示和设置SELinux上下文
复制代码
 [root@server ~ 16:20:41]#  ps -C sshd -Z
 LABEL                              PID TTY          TIME CMD
 -                                 1012 ?        00:00:00 sshd
 -                                 1070 ?        00:00:00 sshd
 [root@server ~ 17:02:21]# ls -Z /home
 drwx------. lyk lyk unconfined_u:object_r:user_home_dir_t:s0 lyk
 ​
 # 其他命令中 -Z 选项
 # cp -Z     set SELinux security context of destination file to default type
 # mkdir -Z     set SELinux security context of each created directory to the default type
设置文件 SELinux 上下文

设置文件上下文命令

  • chcon 命令,直接更改文件SELinux上下文。但是,它不会将上下文更改保存到 SELinux 上下文数据库中。系统下一次对所有文件进行 relabel 操作时,将导致该上下文恢复。它对于测试和实验很有用。

  • restorecon 命令,根据 SELinux上下文数据库中规则,恢复文件SELinux上下文。原先通过 chcon命令所做的更改,将失效。

    #chcon
复制代码
 #修改标签user_tmp_t:s0 /root/lyk-2->admin_home_t:s0 /root/lyk-2
 -rw-r--r--. root root unconfined_u:object_r:user_tmp_t:s0 /root/lyk-2
 -rw-r--r--. root root unconfined_u:object_r:user_tmp_t:s0 /root/lyk-3
 [root@server ~ 19:15:03]# chcon -t admin_home_t /root/lyk-2
 [root@server ~ 19:22:59]# ls -Zd /root /root/lyk-*
 dr-xr-x---. root root system_u:object_r:admin_home_t:s0 /root
 -rw-r--r--. root root unconfined_u:object_r:admin_home_t:s0 /root/lyk-1
 -rw-r--r--. root root unconfined_u:object_r:admin_home_t:s0 /root/lyk-2
 -rw-r--r--. root root unconfined_u:object_r:user_tmp_t:s0 /root/lyk-3
#restorecon
复制代码
 #恢复原来标签 user_tmp_t->admin_home_t
 [root@server ~ 19:23:04]# restorecon -Rv /root
 restorecon reset /root/lyk-3 context unconfined_u:object_r:user_tmp_t:s0->unconfined_u:object_r:admin_home_t:s

示例:配置 web 站点监听端口

复制代码
 [root@server ~ 19:24:33]# mkdir /www
 [root@server ~ 19:27:40]# ls -Zd /www
 drwxr-xr-x. root root system_u:object_r:default_t:s0   /www
 [root@server ~ 19:27:51]# vim /etc/httpd/conf/httpd.conf 
 #编辑
 DocumentRoot "www"
 <Directory "/www">
     AllowOverride None
     # Allow open access:
     Require all granted
 </Directory>
 ​
 [root@server ~ 19:30:02]# systemctl start httpd
 [root@server ~ 19:30:59]# systemctl disable firewalld.service --now
 ​
 [root@server ~ 19:31:41]# echo hello > /www/index.html
 [root@server ~ 19:32:33]# setenforce 0
 [root@server ~ 19:34:26]# ls -Zd /www
 drwxr-xr-x. root root system_u:object_r:default_t:s0   /www
 ​
 [root@server ~ 19:35:41]# ls -Zd /var/www/html/
 drwxr-xr-x. root root system_u:object_r:httpd_sys_content_t:s0 /var/www/html/
 ​
 [root@server ~ 19:35:51]# chcon -t httpd_sys_content_t /www
 ​
 [root@server ~ 19:37:25]# ls -Zd /www
 drwxr-xr-x. root root system_u:object_r:httpd_sys_content_t:s0 /www