RHCE Day5 SELinux

SELinux

概述

概念

selinux 是linux系统中基于内核 访问控制系统。

作用

控制 哪个进程 以 何种方式 访问 哪个文件。他会限制服务的功能和文件访问,selinux是建立在传统权限管理之上,进行更仔细,更细节的权限控制。

名词解释

  • 主体 subject:被selinux限制的具体进程(nginx named nfs ssh...),基本上被限制的进程都是网络服务。
  • 目标 tartget:被访问的一些文件
  • 策略 policy:内容繁多 5000+
  • 安全上下文 security context:进程、文件 / 目录的 "身份标识",是访问匹配的核心

SELinux的启动、关闭与查看

三种配置模式

  • enforcing:强制模式,启用SELinux,将拦截服务的不合法请求
  • permissive:宽容模式,启用SELinux,遇到服务越权访问时,只发出警告而不强制拦截
  • disabled:禁用模式,SELinux没有运行

模式管理

查看当前模式
shell 复制代码
[root@server ~]# getenforce
临时开启/关闭
shell 复制代码
[root@server ~]# setenforce  0      # 临时关闭selinux,转为宽容模式,重启系统失效
[root@server ~]# getenforce
Permissive
-----------------------------------------------
[root@server ~]# setenforce  1     # 临时开启selinux,转为强制模式,重启失效
[root@server ~]# getenforce
Enforcing
永久修改SELinux的模式
shell 复制代码
1.强制模式(默认开启)
[root@server ~ ]# vim /etc/selinux/config
-----------------------------------------------
SELINUX=enforcing #开启selinux
-----------------------------------------------
[root@server ~]# touch /.autorelabel #重建上下关系
[root@server ~]# reboot
2.禁用模式
[root@server ~]# vim  /etc/selinux/config 
-----------------------------------------------
SELINUX=disabled #禁用selinux
-----------------------------------------------
[root@server ~]# reboot

重启系统后若陷入重启循环

在系统启动引导界面,按键盘向下键移动到第二行,然后点击键盘 "e" 键。

按下向下键移动到最后一行,再按左键,输入 "rd break",然后按下 "Ctrl + X" 组合键,跳转至下一页面。

进入单用户模式后,依次执行以下命令:

mount -o remount,rw /sysroot:以读写权限重新挂载系统根目录。

chroot /sysroot:切换根目录到系统的真实根目录。

touch /.autorelabel :创建一个文件,用于在系统重启时重新标记文件系统安全上下文

两次执行 exit 命令

注意
  • enforcing与permissive之间切换时,需要重启系统
  • enforcing、permissive与disabled之间切换时,必须重启系统才会生效

selinux配置文件

shell 复制代码
[root@server ~]# vim  /etc/selinux/config 

SELINUX=enforcing         # 设置模式

SELINUXTYPE=targeted      # 设置策略类型

# 注意:/etc/sysconfig/selinux文件与上述配置问价内容相同,选择一个配置即可

selinux的状态

命令
shell 复制代码
[root@server ~]# sestatus
分析
shell 复制代码
[root@server ~]# sestatus
SELinux status:                 enabled           # 是否启用  
SELinuxfs mount:                /sys/fs/selinux   # selinux临时文件系统的挂载点
SELinux root directory:         /etc/selinux      # 启动目录,配置文件位置
Loaded policy name:             targeted          # 当前加载的策略类型
				 # 策略类型
				 #  targeted:只保护目标运行,默认
			     #  minimum:少数选定进程进行保护
			     #  mls:多级安全保护,最高级
Current mode:                   enforcing         # 执行的模式,重要
Mode from config file:          enforcing         # 配置文件的模式
Policy MLS status:              enabled
Policy deny_unknown status:     allowed
Memory protection checking:     actual (secure)
Max kernel policy version:      33

安全上下文

查看文件安全上下文

shell 复制代码
[root@server ~]# ls -Z
system_u:object_r:admin_home_t:s0 anaconda-ks.cfg
# system_u : 标记了当前文件属于系统级别的文件 u user
# object_r : 当前文件他是属于文件或者目录型类型 r role
# admin_home_t : (重要)当前文件归属的策略类型 t type
# s0:安全级别(一般情况下数字越小,安全级别越低)

查看进程安全上下文

shell 复制代码
[root@server ~]# ps -eZ | grep nginx
system_u:system_r:httpd_t:s0       1314 ?        00:00:00 nginx
system_u:system_r:httpd_t:s0       1315 ?        00:00:00 nginx
system_u:system_r:httpd_t:s0       1316 ?        00:00:00 nginx

查看安全上下文有哪些字段

shell 复制代码
dnf install setools-console -y
seinfo -u #查看selinux用户类型
seinfo -r #查看selinux角色类型
seinfo -t #查看selinux策略类型

修改安全上下文

chcon 命令

临时修改文件的安全上下文。

chcon是直接修改文件的上下文,并非修改selinux的上下文数据库。

作用

手动修改目标的上下文策略

格式
shell 复制代码
# 方法1
chcon  [-R] [-t  type]  [-u  user]  [-r  role]  [-v] 文件名
-R :递归
-t : 修改策略类型
-u :修改selinux用户类型
-r : 修改selinux橘色类型
-v :显示具体修改过程
shell 复制代码
# 方法2:
chcon  -R  --reference=范例文件  文件名
restorecon命令

restorecon通过selinux的上下文数据库来恢复某个文件的原有上下文。

作用
  • 让文件的SELinux类型恢复为默认的SELinux类型
  • 默认的SELinux类型与semanage命令有关,其参考semanage命令所查询的默认SELinux类型
格式
shell 复制代码
restorecon  [-Rv]  文件或目录
-R:连同子目录一起修改;
-v:将过程显示到屏幕上
semanage命令

直接修改selinux的上下文数据库

作用

用于管理 SELinux 的策略,查询/修改/增加/删除文件的默认SELinux安全上下文,管理网络端口、消息接口等

安装
shell 复制代码
[root@server ~]# yum  install  policycoreutils-python-utils  -y
格式1:
shell 复制代码
semanage   选项    参数   文件
  • 选项:login|user|port|interface|fcontext|translation|boolean ,注意:fcontext查询默认安全上下文(重要)
  • 参数
shell 复制代码
 -l :查看子命令的详细策略都有什么
 -a :添加策略
 -m :修改策略
 -d :删除策略
 -D :完全删除
 -t :策略类型
 -r :角色
 -s :用户
 -f :文件
  • 文件:设置对象文件或目录
常用命令组
  • 查询文件的默认安全上下文
shell 复制代码
[root@server ~]# semanage fcontext -l | grep  文件名

[root@server ~]# semanage fcontext -l | grep  /etc/passwd 
/etc/passwd[-\+]?        regular file    system_u:object_r:passwd_file_t:s0 
/etc/passwd\.OLD         regular file    system_u:object_r:passwd_file_t:s0 
/etc/passwd\.adjunct.*   regular file    system_u:object_r:passwd_file_t:s0 
/etc/passwd\.lock        regular file    system_u:object_r:passwd_file_t:s0 

实验

实验一

使用chcon -t方法修改文件nginx 发布目录的上下文 让其在selinux开启的状态仍旧能够访问。

shell 复制代码
# 1. 查看/usr/share/nginx/html目录的策略类型
[root@server ~]# ls -Zd /usr/share/nginx/html/
system_u:object_r:httpd_sys_content_t:s0 /usr/share/nginx/html/
# 2. 将其修改到/web目录身上
[root@server ~]#chcon -R -t httpd_sys_content_t /web
# 3. 查看/web目录是否修改成功
[root@server ~]# ls -Zd /web
system_u:object_r:httpd_sys_content_t:s0 /web
# 4.恢复/web原有上下文
[root@server ~]#restorecon -R /web

实验二

使用 chcon --reference 修改 nginx发布目录的上下文 让其在selinux开启的状态仍旧能够访问。

shell 复制代码
# 1.使用引用法将/usr/share/nginx/html上下文 复制/web
[root@server ~]#chcon -R --reference=/usr/share/nginx/html /web
# 2. 查看/web目录是否修改成功
[root@server ~]# ls -Zd /web
system_u:object_r:httpd_sys_content_t:s0 /web
# 3.恢复/web原有上下文
[root@server ~]#restorecon -R /web

实验三

使用semanage修改selinux的数据库,然后使用数据库恢复文件上下文

shell 复制代码
#1 .在selinux的文件记录中添加一条关于nginx发布目录的上下文信息
[root@server ~]# semanage fcontext -a -t httpd_sys_content_t "/web(/.*)?"
#2. 使用restrorecon 通过数据记录恢复/web上下文信息
[root@server ~]# restorecon -R /web
#3. 检查是否恢复成功
[root@server ~]# ls -ZR /web
/web:
system_u:object_r:httpd_sys_content_t:s0 index.html

实验四

修改服务的可用端口的范围

shell 复制代码
# 查看服务默认支持哪些端口
[root@server ~]# semanage port -l | grep http_port_t
http_port_t                    tcp      80, 81, 443, 488, 8008, 8009, 8443, 9000

# 给http_port_t添加新的端口
[root@server ~]# semanage port -a -t http_port_t -p tcp 82

# 再次查看
[root@server ~]# semanage port -l | grep http_port_t
http_port_t                    tcp      82, 80, 81, 443, 488, 8008, 8009, 8443, 9000

# 在浏览器中访问nginx去验证
相关推荐
是垚不是土2 小时前
运维新人踩坑记录:Redis与MySQL生产故障排查&优化手册
运维·数据库·redis·mysql·云计算·bootstrap
snpgroupcn2 小时前
如何在SAP中实现数据验证自动化?5天缩短验证周期,提升转型效率的3大关键策略
运维·人工智能·自动化
optimistic_chen2 小时前
【Linux 系列】Linux 命令/快捷键详解
linux·运维·服务器·ubuntu·命令行·快捷键
ICT技术最前线2 小时前
如何高效测试Linux系统连通性?
linux·网络·智能路由器
浅笑离愁12342 小时前
VI视频输入模块学习
linux·音视频
gzr_csdn3 小时前
【报错解决】VMware 嵌套虚拟化问题
linux·容器
袖手蹲3 小时前
树莓派 5 Trixie 镜像 + Docker 架设 Eclipse Mosquitto 与 ESP32 双向 MQTT 交互
运维·docker·容器
盛世隐者3 小时前
【Linux】好用的命令记录
linux
山卡拉噶4 小时前
在Linux中安装Kdump调试环境
linux·运维·服务器