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 /tmpdrwxrwxrwt. 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/lykdrwxrwxrwt. 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 /rootdr-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-1dr-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-2dr-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 -ZLABEL PID TTY TIME CMD- 1012 ? 00:00:00 sshd- 1070 ? 00:00:00 sshd[root@server ~ 17:02:21]# ls -Z /homedrwx------. 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 /rootrestorecon 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 /wwwdrwxr-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 /wwwdrwxr-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 /wwwdrwxr-xr-x. root root system_u:object_r:httpd_sys_content_t:s0 /www