赞
踩
系统版本声明: RHEL8
参考: https://www.linuxprobe.com/basic-learning-10.html#102
“SELinux域”和“SELinux安全上下文”称为是Linux系统中的双保险
例如用root用户启动一个httpd进程,那这个httpd进程就拥有root的权限,可以做一切root可以做的事情.假定黑客控制了这个httpd进程,他就拿到了服务器的root权限.
SELinux会给进程打上标记,标记这个进程只能访问哪些数据,即使是root用户运行的进程,也只能在SELinux标记的范围运行.
mac就是SELinux方式
DAC常见的就是ACL权限控制
RBAC通常适用于域控环境下,比如将对应的用户添加到对应权限的组
# 查看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当前运行模式
[rocky root ~]# getenforce
Enforcing # 开启
强制启用安全策略模式,将拦截服务的不合法请求。
遇到服务越权访问时,只发出警告而不强制拦截。
对于越权的行为不警告也不拦截。
0为只警告,1为强制模式
# 将SELinux临时切换为只警告模式
setenforce 0
# 临时关闭SELinux后查看SELinux状态
[rocky root ~]# getenforce
Permissive # 只警告
# 将SELinux临时切换为强制模式
setenforce 1
# 查看开启后的SELinux状态
[rocky root ~]# getenforce
Enforcing # 强制模式
修改/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的所有访问日志都在/var/log/audit/audit.log
文件中记录.
# 查看SELinux访问日志
tail -f /var/log/audit/audit.log
限制服务的行为(功能)
安全上下文就是SELinux对进程和文件上打的标记
限制服务只能访问指定目录的指定文件
# 需要先安装semanage
yum install -y policycoreutils-python-utils
# 使用semanage查看所有的安全上下文
[rocky root ]# semanage fcontext -l|less
# 查看root相关的安全上下文
[rocky root ~]# semanage fcontext -l|grep root
## 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
# 查看/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重新打安全标记
touch /.autorelabel
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
# yum安装semanage
yum install -y policycoreutils-python-utils
# 永久修改目录的安全上下文的值 ## -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 就可以正常访问了
创建自定义目录
# 在/目录下创建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目录的安全上下文
[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 -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
# 安装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
# 查看 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
https://www.linuxcool.com/fixfiles
在重启时重新标记文件系统
# 在重启时重新标记文件系统
## -F 强制重置上下文为匹配file_context的自定义文件
fixfiles -F onboot
# 查看所有安全端口
## -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布尔值 [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查看ftpd相关的SELinux规则
# 查看SElinux的布尔值
getsebool -a
# 查看SELinux中ftpd_anon关键字的布尔值
getsebool -a |egrep 'ftpd_anon'
ftpd_anon_write --> off
# 将布尔值 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对于home目录为目录。其他目录是不管的
Centos无法启动,错误提示 Failed to start Login Service
原因分析:一般是selinux没关
解决办法:
https://blog.csdn.net/qijkkwcw/article/details/108979451
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。