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通常适用于域控环境下,比如将对应的用户添加到对应权限的组


查看状态,启动和关闭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的三种运行模式

  • 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对进程和文件上打的标记
限制服务只能访问指定目录的指定文件

在这里插入图片描述


查看安全上下文


安装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 1028 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 1028 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 1028 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 1028 22:27 qwe
-rw-r--r--. 1 root root unconfined_u:object_r:httpd_sys_content_t:s0 0 1028 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 1028 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 1028 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 1028 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 1028 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 1028 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 1028 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 1028 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.csdn.net/qijkkwcw/article/details/108979451

  • 1
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

识途老码

赞赏是第一生产力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值