SELinux安全子系统
SELinux到底是什么
系统版本声明: RHEL8
参考: https://www.linuxprobe.com/basic-learning-10.html#102
“SELinux域”和“SELinux安全上下文”称为是Linux系统中的双保险
例如用root用户启动一个httpd进程,那这个httpd进程就拥有root的权限,可以做一切root可以做的事情.假定黑客控制了这个httpd进程,他就拿到了服务器的root权限.
SELinux会给进程打上标记,标记这个进程只能访问哪些数据,即使是root用户运行的进程,也只能在SELinux标记的范围运行.
MAC安全模型
MAC
就是SELinux方式
DAC安全模型
DAC
常见的就是ACL权限控制
RBAC安全模型
RBAC
通常适用于域控环境下,比如将对应的用户添加到对应权限的组
k8s用的就是RBAC
。
查看状态,启动和关闭SELinux服务
查看SELinux的当前状态
# 查看SELinux的当前状态
[rocky root ~]# sestatus
SELinux status: enabled
SELinuxfs mount: /sys/fs/selinux
SELinux root directory: /etc/selinux
Loaded policy name: targeted
Current mode: permissive
Mode from config file: disabled
Policy MLS status: enabled
Policy deny_unknown status: allowed
Memory protection checking: actual (secure)
Max kernel policy version: 33
查看SELinux当前运行模式
# 查看SELinux当前运行模式
[rocky root ~]# getenforce
Enforcing # 开启
SELinux的三种运行模式
SELinux模式 | 解释 |
---|---|
enforcing | 强制启用安全策略模式,将拦截服务的不合法请求。 |
permissive | 遇到服务越权访问时,只发出警告而不强制拦截。 |
disabled | 对于越权的行为不警告也不拦截。 |
临时切换SELinux运行模式
0为只警告,1为强制模式
# 将SELinux临时切换为只警告模式
setenforce 0
# 临时关闭SELinux后查看SELinux状态
[rocky root ~]# getenforce
Permissive # 只警告
# 将SELinux临时切换为强制模式
setenforce 1
# 查看开启后的SELinux状态
[rocky root ~]# getenforce
Enforcing # 强制模式
永久修改SELinux模式
修改/etc/selinux/config配置不会立即生效,会在重启后生效,如果想要立即生效,还需要执行setenforce
# 修改SELinux的配置为disabled
vi /etc/selinux/config
## 设置永久关闭,必须重启后才真实生效
## 从disabled改为其他模式,也是需要重启后才能生效,setenforce没有作用
将 SELINUX=enforcing 改为 SELINUX=disabled
## 设置永久强制模式
SELINUX=enforcing
## 强制永久只警告模式
SELINUX=permissive
# 关闭SELinux
setenforce 0
# 查看当前运行模式
getenforce
# sed替换配置
sed -ri 's#(SELINUX=).*#\1disabled#' /etc/selinux/config
# 方法2:修改SELinux的状态为disabled
## sed "s/原字符串/替换字符串/" filename
sed -i 's/^SELINUX=.*/SELINUX=disabled/' /etc/selinux/config
SELinux访问日志
SELinux的所有访问日志都在/var/log/audit/audit.log
文件中记录.
# 查看SELinux访问日志
tail -f /var/log/audit/audit.log
SELinux域
限制服务的行为(功能)
SELinux安全上下文
安全上下文就是SELinux对进程和文件上打的标记
限制服务只能访问指定目录的指定文件
ls -Z
查看安全上下文
安装semanage
# yum安装semanage命令行
yum install -y policycoreutils-python-utils
semanage查看永久安全上下文
# 使用semanage查看所有的安全上下文
semanage fcontext -l|less
# 查看root相关的安全上下文
semanage fcontext -l|grep root
查看进程的SELinux安全上下文的值
## a:显示所有进程,包括其他用户的进程。
## u:以用户为基础显示进程信息,包括进程的所有者、CPU 使用率、内存占用等。
## x:显示没有控制终端的进程。
## Z:按安全上下文标记进行分组显示进程信息。
[rocky root ~]# ps auxZ|grep httpd
system_u:system_r:httpd_t:s0 root 1762 0.0 0.5 282900 11724 ? Ss 21:07 0:00 /usr/sbin/httpd -DFOREGROUND
system_u:system_r:httpd_t:s0 apache 1806 0.0 0.4 296780 8412 ? S 21:07 0:00 /usr/sbin/httpd -DFOREGROUND
system_u:system_r:httpd_t:s0 apache 1807 0.0 0.7 1485700 14164 ? Sl 21:07 0:00 /usr/sbin/httpd -DFOREGROUND
system_u:system_r:httpd_t:s0 apache 1808 0.0 0.6 1354572 12116 ? Sl 21:07 0:00 /usr/sbin/httpd -DFOREGROUND
system_u:system_r:httpd_t:s0 apache 1809 0.0 0.6 1354572 12116 ? Sl 21:07 0:00 /usr/sbin/httpd -DFOREGROUND
unconfined_u:unconfined_r:unconfined_t:s0-s0:c0.c1023 root 2067 0.0 0.0 221928 1148 pts/0 R+ 21:08 0:00 grep --color=auto httpd
查看目录对应的SELinux安全上下文的值
# 查看/var/www/html目录对应的SELinux安全上下文的值
## l:使用详细列表格式显示目录信息。
## d:仅显示目录本身的信息,而不是目录下的文件和子目录信息。
## z:显示安全上下文标记,用于控制目录的访问权限。
ls -ldz /var/www/html
查看文件的安全上下文
cd /var/www/html
# 创建临时文件
touch qwe
# 查看SELinux上下文
[rocky root /var/www/html]# ls -Z qwe
unconfined_u:object_r:httpd_sys_content_t:s0 qwe
# 回到root的家目录
cd ~ && touch qwe
# 查看/root目录下的qew文件的安全上下文
[rocky root ~]# ls -Z qwe
unconfined_u:object_r:admin_home_t:s0 qwe
# 在普通用户的家目录创建文件
cd /home/omaidb && touch qew
# 查看omaidb的家目录下的文件安全上下文
[rocky root /home/omaidb]# ls -Z qwe
unconfined_u:object_r:user_home_t:s0 qwe
重新给系统打selinux标签
# 重新SELinux重新打安全标记
touch /.autorelabel
semanage永久配置SELinux的条目
semanage
可以针对用户
,端口
,模块
,接口
,登录
等进行配置
。
# 管理 SELinux 用户和角色
semanage login
# 管理 SELinux 端口策略
semanage port
# 管理文件上下文策略
semanage fcontext
# 管理 SELinux 布尔值
semanage boolean
# 查看semanage支持的参数
[rocky root /web]# semanage
boolean export import login node port
dontaudit fcontext interface module permissive user
永久修改某个目录的安全上下文
# 永久修改目录的安全上下文的值
## -a 是添加新的文件上下文
## -t 是要修改安全上下文的值为 httpd_sys_content_t
## /home/www/html 要修改哪个目录
## !!SELinux 中不可以加目录后的/
semanage fcontext -a -t httpd_sys_content_t /home/www/html
# 永久修改目录下所有文件的安全上下文
semanage fcontext -a -t httpd_sys_content_t /home/www/html/*
# 使规则生效
## -R 立即递归生效目录的SELinux规则
restorecon -RvF /home/www/html
# 这时候再打开http://ip 就可以正常访问了
永久修改目录安全上下文示例2
创建自定义目录
# 在/目录下创建web目录并配置安全上下文
cd / && mkdir web
# 查看/web的安全上下文
## l:使用详细列表格式显示文件信息。
## d:仅显示目录本身的信息,而不是目录下的文件和子目录信息。
## Z:显示安全上下文标记,用于控制文件的访问权限。
## 安全上下文default_t表示缺省的安全上下文
[rocky root /]# ls -ldZ web
drwxr-xr-x. 2 root root unconfined_u:object_r:default_t:s0 6 10月 28 22:15 web
# 查看SELinux内置规则中是否有匹配/web目录的规则
## -l:列出当前系统中所有的文件上下文规则
[rocky root /]# semanage fcontext -l|grep "^/web"
## 结果为空
永久设置/web目录的安全上下文为httpd_sys_content_t
# 设置/web目录及目录下的文件的安全上下文为`httpd_sys_content_t`
## -a 是添加新的文件上下文
## -t 是要修改安全上下文的值为 httpd_sys_content_t
[rocky root /]# semanage fcontext -a -t httpd_sys_content_t '/web(/.*)?'
# 查看SELinux内置规则中已经有匹配/web目录的规则
## -l:列出当前系统中所有的文件上下文规则
[rocky root /]# semanage fcontext -l|grep "^/web"
/web(/.*)? all files system_u:object_r:httpd_sys_content_t:s0
# 查看web目录的安全上下文并没有生效
## l:使用详细列表格式显示文件信息。
## d:仅显示目录本身的信息,而不是目录下的文件和子目录信息。
## Z:显示安全上下文标记,用于控制文件的访问权限。
[rocky root /]# ls -ldZ web/
drwxr-xr-x. 2 root root unconfined_u:object_r:default_t:s0 6 10月 28 22:15 web/
# 刷新(重新恢复)web目录的安全上下文
restorecon -Rv /web
# 查看web目录的安全上下文已经生效
## l:使用详细列表格式显示文件信息。
## Z:显示安全上下文标记,用于控制文件的访问权限。
[rocky root /web]# ls -lZ /web
总用量 0
-rw-r--r--. 1 root root unconfined_u:object_r:httpd_sys_content_t:s0 0 10月 28 22:27 qwe
# 在web目录下创建test1和test2文件
touch /web/test1 /web/test2
# 查看test1的默认安全上下文已经是httpd_sys_content_t
## l:使用详细列表格式显示文件信息。
## Z:显示安全上下文标记,用于控制文件的访问权限。
[rocky root /web]# ls -lZ /web
总用量 0
-rw-r--r--. 1 root root unconfined_u:object_r:httpd_sys_content_t:s0 0 10月 28 22:27 qwe
-rw-r--r--. 1 root root unconfined_u:object_r:httpd_sys_content_t:s0 0 10月 28 22:31 test1
修改test2
的安全上下文
为samba_share_t
,然后重启
查看test2
的上下文
# 修改test2的安全上下文为samba_share_t
## chcon:修改文件或目录的 SELinux 安全上下文标记。
## -t 指定新的 SELinux 安全上下文标记为 samba_share_t
[rocky root /web]# chcon -t samba_share_t test2
# 查看test2的安全上下文
## l:使用详细列表格式显示文件信息。
## Z:显示安全上下文标记,用于控制文件的访问权限。
[rocky root /web]# ls -lZ test2
-rw-r--r--. 1 root root unconfined_u:object_r:samba_share_t:s0 0 10月 28 22:39 test2
# 重新SELinux重新打安全标记
touch /.autorelabel
# 重启,本次重新会比以往时间慢很多
reboot
# 重启后再查看test2的安全上下文
[rocky root /web]# ls -lZ test2
-rw-r--r--. 1 root root unconfined_u:object_r:httpd_sys_content_t:s0 0 10月 28 22:31 test2
刷新(重新恢复)文件/目录的安全上下文
在/var/www/下创建logs目录
# 创建logs目录
cd /var/www/ && mkdir logs
# 查看logs的安全上下文
[rocky root /var/www]# ls -ldZ logs
drwxr-xr-x. 2 root root unconfined_u:object_r:httpd_sys_content_t:s0 6 10月 28 22:08 logs
新建的logs的安全上下文与SELinux预制的安全上下文不符,这时候需要刷新(重新恢复)安全上下文
刷新(重新恢复)logs目录的安全上下文
# 刷新(重新恢复)logs目录的安全上下文
[rocky root /var/www]# restorecon logs/
# 然后再查看logs目录的安全上下文
[rocky root /var/www]# ls -ldZ logs
drwxr-xr-x. 2 root root unconfined_u:object_r:httpd_log_t:s0 6 10月 28 22:08 logs
chcon修改文件/目录的安全上下文
修改安全上下文示例: chcon -t 安全上下文标签 文件
# 修改test2的安全上下文为samba_share_t
[rocky root /web]# chcon -t samba_share_t test2
# 查看test2的安全上下文
[rocky root /web]# ls -lZ test2
-rw-r--r--. 1 root root unconfined_u:object_r:samba_share_t:s0 0 10月 28 22:39 test2
示例:chcon -t 修改文件的安全上下文
# 安装httpd
yum install httpd -y
# 添加内容到index.html
echo "SELinux test" >> /var/www/html/index.html
# 关闭欢迎页
cd /etc/httpd/conf.d && mv welcome.conf welcome.conf.bak
# 访问网页测试
[rocky root /var/www/html]# curl localhost
SELinux test
修改httpd的安全上下文
# 查看 index.html的默认安全上下文
[rocky root /var/www/html]# ls -lZ
总用量 4
-rw-r--r--. 1 root root unconfined_u:object_r:httpd_sys_content_t:s0 13 10月 28 21:13 index.html
# 修改index.html安全上下文为samba_share_t
[rocky root /var/www/html]# ls -lZ
总用量 4
-rw-r--r--. 1 root root unconfined_u:object_r:samba_share_t:s0 13 10月 28 21:13 index.html
# 修改index.html的安全上下文后无法访问到index.html
[rocky root /etc/httpd/conf.d]# curl localhost
<!DOCTYPE HTML PUBLIC "-//IETF//DTD HTML 2.0//EN">
<html><head>
<title>403 Forbidden</title>
</head><body>
<h1>Forbidden</h1>
<p>You don't have permission to access this resource.</p>
</body></html>
# 将index.html的安全上下文修改回默认
[rocky root /var/www/html]# chcon -t httpd_sys_content_t index.html
# 再访问web
[rocky root /var/www/html]# curl localhost
SELinux test
fixfiles修复安全上下文
https://www.linuxcool.com/fixfiles
在重启时重新标记文件系统
# 在重启时重新标记文件系统
## -F 强制重置上下文为匹配file_context的自定义文件
fixfiles -F onboot
SELinux安全端口
查看安全端口
# 查看所有安全端口
## -l 查看安全上下文
semanage port -l|less
# 查看指定服务的安全端口
[rocky root /web]# semanage port -l|grep http
http_cache_port_t tcp 8080, 8118, 8123, 10001-10010
http_cache_port_t udp 3130
http_port_t tcp 80, 81, 443, 488, 8008, 8009, 8443, 9000
pegasus_http_port_t tcp 5988
pegasus_https_port_t tcp 5989
修改安全端口
# 先修改httpd的监听端口为12345
vim /etc/httpd/conf/httpd.conf
# 重启httpd服务会失败
[rocky root /web]# systemctl restart httpd
Job for httpd.service failed because the control process exited with error code.
See "systemctl status httpd.service" and "journalctl -xe" for details.
# 查看SELinux的安全端口12345规则,发现没有匹配的规则
## -l 查看安全上下文
[rocky root ~]# semanage port -l|grep 12345
将12345
端口标记为http_port_t
# 标记12345端口为http_port_t
[rocky root ~]# semanage port -a -t http_port_t -p tcp 12345
# 查看12345的端口规则,是http_port_t
[rocky root ~]# semanage port -l|grep 12345
http_port_t tcp 12345, 80, 81, 443, 488, 8008, 8009, 8443, 9000
# 重启httpd服务成功
[rocky root ~]# systemctl restart httpd
# 立即就可以访问http了
SeLinux的布尔值
SELinux的布尔值
,就是SELinux对已经适配SELinux开发好的服务的策略控制.
查看所有的SELinux布尔值
# 查看所有的SELinux布尔值
[rocky root ~]# semanage boolean -l|less
# 查看samba的布尔值
[rocky root ~]# semanage boolean -l|grep samba
samba_create_home_dirs (关 , 关) Allow samba to create home dirs
samba_domain_controller (关 , 关) Allow samba to domain controller
samba_enable_home_dirs (关 , 关) Allow samba to enable home dirs
samba_export_all_ro (关 , 关) Allow samba to export all ro
samba_export_all_rw (关 , 关) Allow samba to export all rw
samba_load_libgfapi (关 , 关) Allow samba to load libgfapi
samba_portmapper (关 , 关) Allow samba to portmapper
samba_run_unconfined (关 , 关) Allow samba to run unconfined
samba_share_fusefs (关 , 关) Allow samba to share fusefs
samba_share_nfs (关 , 关) Allow samba to share nfs
sanlock_use_samba (关 , 关) Allow sanlock to use samba
tmpreaper_use_samba (关 , 关) Allow tmpreaper to use samba
use_samba_home_dirs (关 , 关) Allow use to samba home dirs
virt_use_samba (关 , 关) Allow virt to use samba
getsebool查看SELinux规则(Centos7)
getsebool查看ftpd相关的SELinux规则
# 查看SElinux的布尔值
getsebool -a
# 查看SELinux中ftpd_anon关键字的布尔值
getsebool -a |egrep 'ftpd_anon'
ftpd_anon_write --> off
setsebool修改Selinux的布尔值
# 将布尔值 ftpd_anon_write 的状态开启,临时生效,重启后恢复默认
setsebool ftpd_anon_write on
# 将布尔值 ftpd_anon_write 的状态开启并永久生效
## -P 参数永久生效
setsebool -P ftpd_anon_write on
# 可以看到再次查看时,ftpd_anon_write 已开启
[rocky root ~]# semanage boolean -l|grep ftpd_anon_write
ftpd_anon_write (开 , 开) Allow ftpd to anon write
SElinux对于文件的约束
SELinux对于home目录为目录。其他目录是不管的
常见问题
Centos无法启动,错误提示 Failed to start Login Service
原因分析:一般是selinux没关
解决办法:
https://blog.youkuaiyun.com/qijkkwcw/article/details/108979451