SELinux介绍

本章主要介绍在RHEL8中如何使用 SELinux。 

  • 了解什么是 SELinux
  • 了解 SELinux 的上下文
  • 配置端口上下文
  • 了解SELinux的布尔值
  • 了解SELinux的模式 

在 Windows系统中安装了一些安全软件后,当执行某个命令时,如果安全软件认为这个命令对系统是一种危害,则会阻止这个命令继续运行。例如,在powershell中创建一个用户 net user tom /add,安全软件会认为这个操作是不安全的,然后会阻止,如下图所示。

 

Windows上的安全软件保护系统 

RHEL/CentOS 中的SELinux实现的是类似的功能,SELinux全称是Security-Enhanced Linux,目的是提高系统的安全性。当我们执行某个操作时,如果SELinux认为此操作有危险,则会拒绝进一步的访问。 


了解上下文 

在开启了SELinux 的情况下,SELinux 会为每个文件、每个进程都分配一个标签,这个标签我们称为上下文(context),后续说的标签和上下文是同一个概念,查看上下文时需要加上Z选项。例如,查看进程的上下文,命令如下。 

[root@rhel03 ~]# ps -axZ | grep -v grep | grep httpd
system_u:system_r:httpd_t:s0       4166 ?        Ss     0:01 /usr/sbin/httpd -DFOREGROUND
system_u:system_r:httpd_t:s0       4170 ?        S      0:00 /usr/sbin/httpd -DFOREGROUND
system_u:system_r:httpd_t:s0       4171 ?        Sl     0:04 /usr/sbin/httpd -DFOREGROUND
system_u:system_r:httpd_t:s0       4172 ?        Sl     0:04 /usr/sbin/httpd -DFOREGROUND
system_u:system_r:httpd_t:s0       4173 ?        Sl     0:04 /usr/sbin/httpd -DFOREGROUND
system_u:system_r:httpd_t:s0       4471 ?        Sl     0:04 /usr/sbin/httpd -DFOREGROUND
[root@rhel03 ~]# 

可以看到,httpd进程的上下文为httpd_t。 

查看文件的上下文,命令如下。

[root@rhel03 ~]# ls -dZ /var/www/html/
system_u:object_r:httpd_sys_content_t:s0 /var/www/html/
[root@rhel03 ~]# 

可以看到,/var/www/html的上下文为httpd_sys_content_t。 

特定上下文的进程,只能访问特定上下文的文件,上下文为httpd_t的进程可以访问上下文为httpd_sys _content_t的文件或目录。 

下面做一个测试。

在rhel03上创建目录/web,并写一些测试数据到/web/index.html中,命令如下。 

[root@rhel03 ~]# mkdir /web
[root@rhel03 ~]# echo 5555 > /web/index.html
[root@rhel03 ~]# 

查看/web 的上下文,命令如下。 

[root@rhel03 ~]# ls -dZ /web/
unconfined_u:object_r:default_t:s0 /web/
[root@rhel03 ~]# 

可以看到,/web 的上下文为 default_t。 

把/web软链接到/var/www/html/www,命令如下。 

[root@rhel03 ~]# ln -s /web /var/www/html/www
[root@rhel03 ~]# 

查看/var/www/html中的内容,命令如下。

[root@rhel03 ~]# ls /var/www/html/
index.html  www
[root@rhel03 ~]#

这里的www是/web的软链接(快捷方式),当我们在地址栏中输 入“192.168.23.33/www"时,其实访问的是/web中的index.html。 

确保httpd服务是运行的,命令如下。 

[root@rhel03 ~]# systemctl restart httpd
[root@rhel03 ~]# systemctl is-active httpd
active
[root@rhel03 ~]#

确保防火墙放行了httpd服务,命令如下。 

[root@rhel03 ~]# firewall-cmd --add-service=http
success
[root@rhel03 ~]# 

在客户端上访问此内容,结果如下图所示。

 

发现访问是被拒绝的,原因是当客户端在浏览器的地址栏中输 入“192.168.23.33/www"连接到服务器时,服务器会有一个httpd进程来“接待”这个客户端的连接请求,然后 httpd根据用户的请求去访问目录/web,如下图所示。

 前面已经看到httpd进程的上下文是httpd_t,/web的上下文是default_t,这两个是不匹配 的,所以 httpd进程访问目录/web时被拒绝。

但是httpd进程是可以正常访问/var/www/html的(上下文为httpd_sys_content_t),考虑如果把/web的上下文改成 httpd sys content t是不是就可以使httpd进程能访问了呢? 

改变上下文的命令如下。

  • chcon ‐R ‐t 上下文 目录 

这里-R选项的意思是递归。

把/web的上下文改成httpd_sys_content_t,命令如下。 

[root@rhel03 ~]# chcon -R -t httpd_sys_content_t /web/
[root@rhel03 ~]# 

再次查看/web的上下文,命令如下。 

[root@rhel03 ~]# ls -dZ /web/
unconfined_u:object_r:httpd_sys_content_t:s0 /web/
[root@rhel03 ~]# 

现在已经是 httpd_sys_content_t了,浏览器测 试结果如下图所示。

 

发现可以正常访问了。如果要恢复目录的默认上下文,可以用“restorecon -R 目录”命令。下面恢复/web的上下文,命令如下。 

[root@rhel03 ~]# restorecon -R /web
[root@rhel03 ~]# 

再次查看/web的上下文,命令如下。

[root@rhel03 ~]# ls -dZ /web
unconfined_u:object_r:default_t:s0 /web
[root@rhel03 ~]#

可以看到,/web的上下文又恢复成default t了,此时刷新浏览器之后又是被拒绝。 

如果想修改默认上下文,可以用如下语法。

  • semanage fcontext ‐a ‐t httpd_sys_content_t "/目录(/.*)?" 

这里(/.*)?表示“/目录”本身及里面所有的内容。 

下面修改/web 的默认上下文,命令如下。

[root@rhel03 ~]# semanage fcontext -a -t httpd_sys_content_t "/web(/.*)?"
[root@rhel03 ~]#

查看/web 的上下文,命令如下。

[root@rhel03 ~]# ls -dZ /web/
unconfined_u:object_r:default_t:s0 /web/
[root@rhel03 ~]#

可以看到,当前仍然是 default_t,说明semanage修改的只是默认值,并没有改变当前上下文,要改变当前上下文,仍然需要使用restorecon命令,命令如下。 

[root@rhel03 ~]# restorecon -R /web/
[root@rhel03 ~]# ls -dZ /web/
unconfined_u:object_r:httpd_sys_content_t:s0 /web/
[root@rhel03 ~]# 

可以看到,此时已经修改了默认上下文。


端口上下文 

端口也是有上下文的,如果一个端口没有上下文或上下文和进程不匹配,则进程就无法访问此端口。 

查看系统所有端口上下文的命令是semanage port -l(小写字母l,list的意思)。

练习:请通过如下命令把httpd端口改为808,命令如下。

[root@rhel03 ~]# sed -i '/^Listen/cListen 808' /etc/httpd/conf/httpd.conf
[root@rhel03 ~]# 

然后重启 httpd服务,命令如下。

[root@rhel03 ~]# 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.
[root@rhel03 ~]#

发现启动服务失败,通过journalctl -xe l grep httpd查看日志,发现里面有一段话,如下所示。 

[root@rhel03 ~]# journalctl -xe | grep httpd
12月 12 11:39:16 rhel03 useradd[2723]: new user: name=apache, UID=48, GID=48, home=/usr/share/httpd, shell=/sbin/nologin
-- Subject: httpd.service 单元已开始启动
-- httpd.service 单元已开始启动。
12月 12 11:39:46 rhel03 httpd[3333]: AH00558: httpd: Could not reliably determine the server's fully qualified domain name, using fe80::c272:7829:bfe2:5137. Set the 'ServerName' directive globally to suppress this message
-- Subject: httpd.service 单元已结束启动
-- httpd.service 单元已结束启动。
12月 12 11:39:56 rhel03 httpd[3333]: Server configured, listening on: port 80
-- Subject: httpd.service 单元已开始停止操作
-- httpd.service 单元已开始停止操作。
12月 12 11:49:06 rhel03 systemd[1]: httpd.service: Succeeded.
-- The unit httpd.service has successfully entered the 'dead' state.
-- Subject: httpd.service 单元已结束停止操作
-- httpd.service 单元已结束停止操作。
-- Subject: httpd.service 单元已开始启动
-- httpd.service 单元已开始启动。
12月 12 11:49:27 rhel03 httpd[3761]: AH00558: httpd: Could not reliably determine the server's fully qualified domain name, using fe80::c272:7829:bfe2:5137. Set the 'ServerName' directive globally to suppress this message

这里的意思是无法绑定端口808,这是因为端口808没有对应的上下文,命令如下。 

[root@rhel03 ~]# semanage port -l | grep 'b808\b'
[root@rhel03 ~]# 

这样httpd进程是访问不了端口808的。但是端口80是正常工作的,查看端口80的上下文, 命令如下。 

[root@rhel03 ~]# semanage port -l | grep '\b80\b'
http_port_t                    tcp      80, 81, 443, 488, 8008, 8009, 8443, 9000
[root@rhel03 ~]# 

可以看到,端口80的上下文是 http_port_t。如果把端口808的上下文改成和端口80一样不就可以了吗?试试修改端口808的上下文。 

修改端口上下文的语法如下。

  • semanage port ‐a ‐t 上下文 ‐p 协议 端口 

如果要删除端口上下文,语法如下。 

  • semanage port ‐d ‐t 上下文 ‐p 协议 端口 

下面把端口808的上下文改成http_port_t,命令如下。 

[root@rhel03 ~]# semanage port -a -t http_port_t -p tcp 808
[root@rhel03 ~]# 

这里的意思是把端口808的上下文改成http_port_t。

再次查看端口808的上下文,命令如下。

[root@rhel03 ~]# semanage port -l | grep '\b808\b'
http_port_t                    tcp      808, 80, 81, 443, 488, 8008, 8009, 8443, 9000
[root@rhel03 ~]#

再次重启httpd服务,命令如下。

[root@rhel03 ~]# systemctl restart httpd
[root@rhel03 ~]# 

可以正常启动,查看端口监听情况,命令如下。

[root@rhel03 ~]# netstat -ntulp | grep 808
tcp6       0      0 :::808                  :::*                    LISTEN      7237/httpd          
[root@rhel03 ~]# 

端口808也正常运行了。


了解SELinux的布尔值 

布尔值可以理解为一个功能开关,在没有SELinux的情况下,电灯亮不亮完全由开关控制,打开开关电灯亮,关闭开关电灯 灭。现在有了SELinux,情况如下图所示。

现在电灯亮还是不亮,不能完全由原来的开关A决定,这当中 SELinux也具有决定权。如果把开关A打开,但是 SELinux不允许打开,则电灯仍然是不亮的。

要查看系统中所有SELinux的布尔值可以使用getsebool -a命令。 

下面看一个例子,在前面讲到yum时,已经在rhel03上启动了vsftpd并开启了匿名用户访问,匿名用户是ftp或anonymous。 

下面开始测试匿名用户是否可以往ftp中写入内容。

(1)在rhel03上创建/var/ftp/incoming目录,并把所有者和所属组改为ftp,命令如下。 

[root@rhel03 ~]# mkdir /var/ftp/incoming
[root@rhel03 ~]# chown ftp.ftp /var/ftp/incoming
[root@rhel03 ~]# 

改所有者和所属组的目的是让匿名用户(ftp用户)有足够的权限去写

(2)修改配置文件/etc/vsftpd/vsftpd.conf,添加如下两行。 

anon_upload_enable=YES
anon_mkdir_write_enable=YES

这两行的作用是设置允许匿名用户往ftp中写内容。这两行加在哪里都可以,原本配置文件中就有这两行,只是被注释掉了,所以直接找到这两行内容,把最前面的#去掉也可以。 

然后重启vsftpd,命令如下。

[root@rhel03 ~]# systemctl restart vsftpd
[root@rhel03 ~]# 

在rhel04上自行安装lftp,使用lftp登录并进入incoming目录中(如果不指定用户名,则是匿名用户登录)。 

[root@rhel04 ~]# lftp 192.168.23.33/incoming
cd 成功, 当前目录=/incoming
lftp 192.168.23.33:/incoming> ls
lftp 192.168.23.33:/incoming> 

可以看到,使用匿名用户是可以登录成功的(注意,如果想使用指定用户登录,则需要加上u选项),并且 incoming目录下没有任何文件。 

(3)到rhel04上测试把/etc/hosts文件上传进去,命令如下。 

[root@rhel04 ~]# lftp 192.168.23.33/incoming
cd 成功, 当前目录=/incoming
lftp 192.168.23.33:/incoming> put /etc/hosts
158 bytes transferred
lftp 192.168.23.33:/incoming> 

这里显示已经上传上去了。

切换到rhel03上,开启相关布尔值。 

先查看布尔值ftpd_full_access是否开启,命令如下。

[root@rhel03 ~]# getsebool -a | grep ftpd_full_access
ftpd_full_access --> on
[root@rhel03 ~]#

这里显示为on,说明已经开启了。这是我们在讲搭建yum源时开启的。

开启布尔值的语法如下。

  • setsebool 布尔值 on 或
  • setsebool 布尔值 1 

关闭布尔值的语法如下。

  • setsebool 布尔值 off 或
  • setsebool 布尔值 0 

setsebool可以加上P(大写)选项,表示永久生效,即重启系统之后也生效。

因为这里已经开启了布尔值 ftpd_full_access,所以下面先关闭这个布尔值,命令如下。 

[root@rhel03 ~]# setsebool -P ftpd_full_access off
[root@rhel03 ~]# 

再次切换到rhel04上上传一个文件,命令如下。 

[root@rhel04 ~]# lftp 192.168.23.33/incoming
cd 成功, 当前目录=/incoming
lftp 192.168.23.33:/incoming> put /etc/hosts
put: /etc/hosts: 访问失败: 553 Could not create file. (hosts)
lftp 192.168.23.33:/incoming>

发现上传失败。

再次切换到rhel03上,执行如下命令。 

[root@rhel03 ~]# setsebool -P ftpd_full_access on
[root@rhel03 ~]# 

了解SELinux的模式 

SELinux一共有以下两种模式。

  1. Enforcing:如果不满足SELinux条件,则SELinux 会阻止访问服务并提供警报。
  2. Permissive:如果不满足SELinux条件,则SELinux不会阻止访问,但是会警报。查看当前处于什么模式用getenforce命令,命令如下。
[root@rhel03 ~]# getenforce 
Enforcing
[root@rhel03 ~]# 

要是想切换模式,需要用setenforce命令。

setenforce 1:切换到Enforcing模式。

setenforce0:切换到Permissive模式。 

[root@rhel03 ~]# setenforce 0
[root@rhel03 ~]# getenforce 
Permissive
[root@rhel03 ~]# setenforce 1
[root@rhel03 ~]# getenforce 
Enforcing
[root@rhel03 ~]# 

但是使用setenforce命令切换也只是临时生效,重启系统之后又变成默认模式了。如果想修改默认模式,可以通过修改配置文件/etc/selinux/config或/etc/sysconfig/SELinux,后者是前者的快捷方式(软链接)。 

使用vim打开/etc/selinux/config,如下图所示 

其中 SELINUX=后面的部分就是默认模式(记住不是 SELINUXTYPE那行)。如果想彻底关闭SELinux,只能在此配置文件中把内容改为SELINUX=disabled,且重启才能生效。 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/249551.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

二维差分详解

前言 上一期我们分享了一维差分的使用方法,这一期我们将接着上期的内容带大家了解二位差分的使用方法,话不多说,LET’S GO!(上一期链接) 二维差分 二维差分我们可以用于对矩阵区间进行多次操作的题。 二维差分我们还…

使用国内镜像源安装opencv

在控制台输入命令: pip install opencv-python -i https://pypi.tuna.tsinghua.edu.cn/simple 验证安装: step 1: 打开终端;step 2: 输入python,进入Python编译环境;step 3: 粘贴…

LT8711HE方案《任天堂Switch底座方案》

LT8711HE Type-c转HDMI方案 LT8711HE是高性能的Type-C/DP1.2转HDMI2.0转换器,设计用于连接 USB Type-C 源或 DP1.2 源到 HDMI2.0 接收器。该LT8711HE集成了符合 DP1.2 标准的接收器和符合 HDMI2.0 标准的发射器。此外,两个 CC 控制器是包括用于 CC 通信以…

20.Java程序设计-基于SSM框架的安卓掌上校园生活系统的设计与实现

摘要: 随着移动互联网技术的快速发展,校园生活信息化成为提高学校管理效率、方便学生生活的关键。本研究以基于SSM(Spring Spring MVC MyBatis)框架的技术体系为基础,致力于设计与实现一款功能强大、高效稳定的安卓…

手动添加Git Bash Here到右键菜单(超详细)

通过WindowsR快捷键可以打开“运行窗口”,在“窗口”中输入“regedit”,点击“确定”打开注册表。 依次进入HKEY_CLASSES_ROOT —-》 Directory —-》Background —-》 shell 路径为Computer\HKEY_CLASSES_ROOT\Directory\Background\shell 3.在“s…

来聊聊Spring的循环依赖

文章目录 首先了解一下什么是循环依赖简述解决循环依赖全过程通过debug了解Spring解决循环依赖全过程Aservice的创建递归来到Bservice的创建然后BService递归回到了getAservice的doGetBean中故事再次回到Aservice填充BService的步骤 总结成流程图为什么二级就能解决循环依赖问题…

2023年底总结丨5大好用的局域网监控软件

不知不觉间2023年又到结尾了,今年我们服务过很多想要电脑监控软件的客服,也服务了很多想要加密软件的客户。 这一年,我们走得不疾不徐,走得稳而坚定;这一年,我们累积服务超过万计客户;这一年&a…

面试官:这些大学生都会

大家好,我是 JavaPub。 最近有些同学在后台问我,面试总是会遇到被问 Linux 命令的问题,自己就面试个后端开发岗位,怎么这么难呢? 其实 Linux 命令,对于一个后端开发来说,并不是很难&#xff0c…

springcloudalibaba01

整合springcloud 和 springcloudalibaba&#xff0c;&#xff0c;&#xff0c; 版本对应关系 <dependencyManagement><dependencies><!--每个springcloud的工具都有一个版本每个springcloud alibaba的工具都有一个版本统一版本--> <!-- 整合…

spring boot 实现直播聊天室

spring boot 实现直播聊天室 技术方案: spring bootwebsocketrabbitmq 使用 rabbitmq 提高系统吞吐量 引入依赖 <dependencies><dependency><groupId>com.alibaba</groupId><artifactId>fastjson</artifactId><version>2.0.42&…

广州华锐互动:汽车电子线束加工VR仿真培训与实际生产场景相结合,提高培训效果

随着科技的不断发展&#xff0c;虚拟现实&#xff08;VR&#xff09;技术已经逐渐渗透到各个领域&#xff0c;为企业和个人带来了前所未有的便利。在汽车制造行业中&#xff0c;线束加工作为一项关键的生产工艺&#xff0c;其质量直接影响到汽车的性能和安全。因此&#xff0c;…

【UE】在蓝图中修改材质实例的参数的两种方式

目录 方式一、通过“在材质上设置标量/向量参数值”节点实现 方式二、通过“设置标量/向量参数值”节点实现 方式一、通过“在材质上设置标量/向量参数值”节点实现 1. 在材质中设置了两个参数 2. 创建材质实例 3. 创建一个蓝图&#xff0c;对静态网格体赋予材质实例 在事件…

基于虚拟机下的win7系统安装简记

文章目录 安装系统激活win7提示系统保留分区未分配驱动器问题使用win7 Active激活系统根据dns分配的ip地址将网络改为固定ip&#xff0c;然后关闭防火墙&#xff0c;即可完成虚拟机与宿主机互通 安装系统 在虚拟机中找到自己下载win7镜像文件&#xff0c;配置完成后一路next即…

MySQL数据库卸载-Windows

目录 1. 停止MySQL服务 2. 卸载MySQL相关组件 3. 删除MySQL安装目录 4. 删除MySQL数据目录 5. 再次打开服务&#xff0c;查看是否有MySQL卸载残留 1. 停止MySQL服务 winR 打开运行&#xff0c;输入 services.msc 点击 "确定" 调出系统服务。 2. 卸载MySQL相关组…

虚幻学习笔记13—C++静态和动态加载

一、前言 我们在蓝图中可以很方便的添加各种需要的组件&#xff0c;那么在C代码中要如何实现呢。在代码中分静态和动态加载&#xff0c;而无论静态和动态&#xff0c;加载的内容有资源和资源类&#xff0c;资源类通常为带资源的蓝图类。 二、实现 在实现静态或动态加载时&…

什么是回调函数

需求 A&#xff0c;B两个小组开发一个功能。B小组开发制作油条模块:make_youtiao。A小组需要调用B小组开发的模块&#xff0c;然后执行后续的操作&#xff1a;sell()如下图&#xff1a; 上面的方式A小组必须等待B小组开发的模块make_youtiao执行完成后才能执行sell()。 上图代…

力扣 | 98. 验证二叉搜索树

98. 验证二叉搜索树 中序遍历 (边遍历边验证顺序性) private TreeNode prev null;private boolean isBST true;public boolean isValidBST(TreeNode root) {inorder(root);return isBST;}private void inorder(TreeNode node) {if (node null) return;inorder(node.left);…

什么是第一方数据,如何使用它?

多年来&#xff0c;第一方数据一直是营销行业的话题。 随着用户数据隐私法律法规的不断收紧&#xff0c;营销人员必须接受一个几乎没有数据 cookie 的世界。 我们必须在如何合法和合乎道德地获取客户信息方面更具创造性。 不确定什么是第一方数据&#xff1f;或者不太确定从…

关于嵌入式开发的一些信息汇总:C标准、芯片架构、编译器、MISRA-C

关于嵌入式开发的一些信息汇总&#xff1a;C标准、芯片架构、编译器、MISRA-C 关于C标准芯片架构是什么&#xff1f;架构对芯片有什么作用&#xff1f;arm架构X86架构mips架构小结 编译器LLVM是什么&#xff1f;前端在干什么&#xff1f;后端在干什么&#xff1f; MISRA C的诞生…

基于JSP+Servlet+Mysql的建设工程监管信息

基于JSPServletMysql的建设工程监管信息 一、系统介绍二、功能展示1.企业信息列表2.录入项目信息3.项目信息列表 四、其它1.其他系统实现五.获取源码 一、系统介绍 项目名称&#xff1a;基于JSPServlet的建设工程监管信息 项目架构&#xff1a;B/S架构 开发语言&#xff1a;…