SELinux 入门 pt.2

news2024/11/19 4:44:47

哈喽大家好,我是咸鱼

在《SELinux 入门 pt.1》中,咸鱼向各位小伙伴介绍了 SELinux 所使用的 MAC 模型、以及几个重要的概念(主体、目标、策略、安全上下文)

我们还讲到:

  • 对于受 SELinux 管制的进程,会先检查 SELinux 策略规则,然后再检查 DAC 规则
  • 对于不受 SELinux 管制的进程,仍然会执行 DAC 规则

也就是说对于受 SELinux 管制的进程而言,想要对文件资源进行操作,需要先经过 SELinux 策略规则的三个关卡(SELinux 模式查看——>策略规则比对——>安全上下文比对),然后再经过 DAC 规则中的 rwx 权限比对

过程如下图所示
在这里插入图片描述
需要注意的是,并不是所有的程序都会被 SELinux 所管制,被 SELinux 管制的进程主体被称为【受限程序主体】

举个例子,我们看一下 crond 进程和 bash 进程

# 通过 ps 命令查看
[root@localhost ~]# ps -eZ | grep -E 'cron|bash'
system_u:system_r:crond_t:s0-s0:c0.c1023 1340 ? 00:00:00 atd
unconfined_u:unconfined_r:unconfined_t:s0-s0:c0.c1023 28094 pts/0 00:00:00 bash
system_u:system_r:crond_t:s0-s0:c0.c1023 28174 ? 00:00:00 crond

可以看到,crond 是受限的主体进程(crond_t),而 bash 因为是本机进程,因此就是不受限 unconfined_t 的类型,即 bash 可以直接进行 rwx 权限比对,而不需要进行 SELinux 策略规则比对

接下来我们来分别看一下 SELinux 策略规则比对中的三个关卡

SELinux 运行模式

受限程序主体首先来到第一关:SELinux 运行模式比对

SELinux 有三种运行模式,用于控制系统中进程和文件资源访问的安全性

这三种模式分别是:

  • Enforcing(强制)

这个是默认的模式,在这个模式下 SELinux 正常运行,会强制执行访问控制规则,限制进程和用户对系统资源的访问

如果一个进程试图执行未经授权的操作,如读取或修改受限文件,强制模式会阻止这些操作并记录相关的安全事件

  • permissive(宽松)

在宽松模式下,SELinux 会记录违反访问规则的操作,但不会阻止它们

这允许用户查看哪些操作会受到限制,但不会影响应用程序的正常运行

宽容模式通常用于识别需要修改的规则,以确保应用程序在强制模式下可以正常运行

  • disabled(禁用)

在禁用模式下,SELinux 完全被关闭,不再对进程和文件访问进行任何安全限制

如何查看当前 SELinux 的运行模式?

[root@localhost ~]# getenforce 
Enforcing

如果返回结果是 Enforcing,表示当前运行在强制模式;如果是 Permissive,表示运行在宽容模式;如果是 Disabled,表示 SELinux 被禁用

如何切换 SELinux 运行模式?

  • 临时切换
# 更改为 enforcing 模式
[root@localhost ~]# setenforce 1

# 更改为 permissive 模式
[root@localhost ~]# setenforce 0

PS:临时切换系统重启后会恢复为默认模式

如果 SELinux 为 disabled 运行模式,表示 SELinux 已经关闭,是无法切换成 Enforcing 模式或 Permissive 模式的

  • 永久切换

如果要永久更改,需要修改配置文件

以 CentOS 7.x 为例

[root@localhost ~]# vim /etc/selinux/config

SELINUX 的值更改为 enforcingpermissivedisabled,保存文件然后重启系统

策略与规则

受限主体程序通过第一关之后来到第二关——策略(policy)和规则(rule)比对

可以使用 sestatus 来查看当前 SELinux 使用那些策略

sestatus
-v:检查位于 /etc/sestatus.conf 中的文件与进程的安全上下文
-b:显示当前策略的规则(以布尔值列出)
[root@localhost ~]# sestatus
SELinux status:                 enabled # selinux 是否启动
SELinuxfs mount:                /sys/fs/selinux # selinux 相关文件挂载点
SELinux root directory:         /etc/selinux # 根目录
Loaded policy name:             targeted # 当前策略
Current mode:                   permissive # 当前模式
Mode from config file:          enforcing # 当前在配置文件内的模式
Policy MLS status:              enabled # 是否包含 MLS 模式
Policy deny_unknown status:     allowed # 是否预设抵挡未知的主体进程
Max kernel policy version:      31

如果想要查看当前策略下的规则,可以使用setatus -b 或者 getsebool 命令

[root@localhost ~]# sestatus -a
[root@localhost ~]# getsebool
[root@localhost ~]# getsebool -a
abrt_anon_write --> off
abrt_handle_event --> off
abrt_upload_watch_anon_write --> on
antivirus_can_scan_system --> off
antivirus_use_jit --> off
auditadm_exec_content --> on
authlogin_nsswitch_use_ldap --> off
authlogin_radius --> off
authlogin_yubikey --> off
awstats_purge_apache_log_files --> off
boinc_execmem --> on
cdrecord_read_content --> off
cluster_can_network_connect --> off
cluster_manage_all_files --> off
cluster_use_execmem --> off
cobbler_anon_write --> off
...

我们可以看到上面的输出中有特别多的 SELinux 规则,但是每个规则中具体是怎么限制的我们却还不知道

我们可以通过 seinfo 等工具进行查看

# 需要先下载
[root@localhost ~]# yum install -y setools-console
# 可以看到策略是 targeted,这个策略的安全上下文类型有 4793 个,而规则(Booleans)则有 316 条
[root@localhost ~]# seinfo 

Statistics for policy file: /sys/fs/selinux/policy
Policy Version & Type: v.31 (binary, mls)

   Classes:           130    Permissions:       272
   Sensitivities:       1    Categories:       1024
   Types:            4793    Attributes:        253
   Users:               8    Roles:              14
   Booleans:          316    Cond. Expr.:       362
   Allow:          107834    Neverallow:          0
   Auditallow:        158    Dontaudit:       10022
   Type_trans:      18153    Type_change:        74
   Type_member:        35    Role allow:         37
   Role_trans:        414    Range_trans:      5899
   Constraints:       143    Validatetrans:       0
   Initial SIDs:       27    Fs_use:             32
   Genfscon:          103    Portcon:           614
   Netifcon:            0    Nodecon:             0
   Permissives:         0    Polcap:              5
# 查看用户
[root@localhost ~]# seinfo -u

Users: 8
   sysadm_u
   system_u
   xguest_u
   root
   guest_u
   staff_u
   user_u
   unconfined_u

# 查看角色
[root@localhost ~]# seinfo -r

Roles: 14
   auditadm_r
   dbadm_r
   guest_r
   staff_r
   user_r
   logadm_r
   object_r
   secadm_r
   sysadm_r
   system_r
   webadm_r
   xguest_r
   nx_server_r
   unconfined_r

前面我们知道 crond 进程的类型是 crond_t,那我想知道 crond_t 这个 domain 能够读取那些 type 的文件资源

# 查询 crond_d 主体
[root@localhost ~]# sesearch -A -s crond_t
...
   allow crond_t user_cron_spool_t : file { ioctl read write create getattr setattr lock append unlink link rename open } ;
   allow crond_t user_cron_spool_t : dir { ioctl read write getattr lock add_name remove_name search open } ; 
   allow crond_t unconfined_cronjob_t : process transition ; 
   allow crond_t openshift_domain : process transition ; 
   allow crond_t security_t : lnk_file { read getattr } ; 
...

allow 后面接主体进程以及文件的 SELinux 类型,比如说 crond_t 可以读取 user_cron_spool_t 类型的文件和目录

那如果想要关闭或打开某个 SELinux 规则,该怎么办

# 查询到下面的规则是 off 状态,我们想打开它
[root@localhost ~]# getsebool httpd_enable_homedirs
httpd_enable_homedirs --> off

# 启动
# 一定要加上 -P ,这样才会写入配置文件
[root@localhost ~]# setsebool -P httpd_enable_homedirs 1

安全上下文

第一关考虑 SELinux 三种运行模式,第二关考虑了 SELinux 的策略规则

现在我们来到了第三关——安全上下文比对

关于安全上下的知识我在《SELinux 入门 pt.1》中已经介绍过了,今天我们着重讲下安全上下文的修改

  • chcon 手动修改

chcon 命令的基本语法如下:

chcon [options] context file...

其中,context表示要设置的安全上下文,file...表示要修改的文件或目录路径。下面是一些常用的选项和示例:

  1. -R, --recursive: 递归修改指定目录下所有文件的安全上下文
  2. -t, --type: 指定要设置的新类型标签
  3. -u, --user: 指定要设置的新用户
  4. -r, --role: 指定要设置的新角色

举几个例子

# 修改文件的安全上下文类型:
chcon -t httpd_sys_content_t /var/www/html/index.html

# 递归修改目录及其子目录中的文件安全上下文类型:
chcon -R -t httpd_sys_content_t /var/www/html/

# 修改文件的安全上下文用户和角色:
chcon -u system_u -r object_r /path/to/file
  • restorecon 恢复为默认值

使用 chcon 命令修改安全上下文可能会导致某些文件和目录的访问权限问题

如果对 SELinux 的运作机制和相应的安全策略不熟悉的,可以使用 restorecon 命令恢复默认的 SELinux 上下文

基本语法如下:

restorecon [-R] [-v] [file...]
-R :表示递归地操作目录及其子目录
-v :表示显示详细信息
file... :是要进行恢复的文件或目录路径

举个例子

# 恢复单个文件的安全上下文:
restorecon /var/www/html/index.html

# 递归地恢复目录及其子目录的安全上下文:
restorecon -R /var/www/html/

# 显示详细信息:
restorecon -v /var/www/html/index.html

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

React 全栈体系(三)

第二章 React面向组件编程 四、组件三大核心属性3: refs与事件处理 1. 效果 需求: 自定义组件, 功能说明如下: 点击按钮, 提示第一个输入框中的值当第2个输入框失去焦点时, 提示这个输入框中的值 2. 理解 组件内的标签可以定义ref属性来标识自己 3. 编码 3.1 字符串形式…

【javaweb】学习日记Day7 - Mysql 数据库 DQL 多表设计

之前学习过的SQL语句笔记总结戳这里→【数据库原理与应用 - 第六章】T-SQL 在SQL Server的使用_Roye_ack的博客-CSDN博客 目录 一、DQL 数据查询 1、基本查询 2、条件查询 3、分组查询 (1)聚合函数 ① count函数 ② max min avg sum函数 &…

无涯教程-进程 - 管道(Pipes)

管道是两个或多个相关进程之间的通信介质,它可以在一个进程内,也可以在子进程与父进程之间进行通信。 可以实时查看管道机制,例如用管道将水填充到某个容器(例如桶)中,然后取回某人(例如用杯子)。填充进程只不过是写入管道&#…

【无标题】jenkins消息模板(飞书)

这里写目录标题 Jenkins 安装的插件 发送消息到飞书预览 1 (单Job)预览 2 (多Job,概览) Jenkins 安装的插件 插件名称作用Rebuilder Rebuilder。 官方地址:https://plugins.jenkins.io/rebuild 安装方式&a…

软件研发CI/CD流水线图解

当谈到现代软件开发流程时,持续集成(Continuous Integration,简称CI)和持续交付(Continuous Delivery,简称CD)是两个关键的实践。它们旨在加速开发流程、提高软件质量,并使软件发布更…

java八股文面试[JVM]——元空间

JAVA8为什么要增加元空间 为什么要移除永久代? 知识来源: 【2023年面试】JVM8为什么要增加元空间_哔哩哔哩_bilibili

shopee开店后店铺怎么运营?这几点运营技巧要学会!

Shopee卖家开店后,这几点运营技巧要学会! 1.Listing上架 产品在上架前,卖家要为主打产品需要精细化打造好文案和图片后再上传,尽量不要随意上架或者等到上架后再优化,避免浪费了新品最佳流量时期。 卖家可以从标题、…

【基于Arduino的仿生蚂蚁机器人】

【基于Arduino的仿生蚂蚁机器人】 1. 概述2. Arduino六足位移台–蚂蚁机器人3D模型3. 3D 打印零件4. 组装Arduino六足位移台5. Arduino蚂蚁机器人电路图6. 为Arduino Hexapod设计PCB7. 组装电路板8. 系统代码9. Arduino蚂蚁机器人安卓应用程序在本教程中,我将向您展示如何构建…

Total Uninstall | Windows 专业卸载清理工具

前言:Total Uninstall PC 专业卸载清理工具:彻底清除软件痕迹的神器 在日常使用电脑的过程中,我们常常需要安装和卸载各种软件。然而,传统的卸载方法往往并不能彻底清除软件的痕迹,使得电脑逐渐变慢或者出现各种问题。…

Idea常用快捷键--让你代码效率提升一倍(一)

一、代码编辑相关快捷键 1.单行复制(实现快速创建多个对象)CtrlD 2.空出下一行 ShiftEnter 3.单行注释快捷键 ctrl / 4.快速构建构造函数,setter,getter、toString方法 AltInsert 4.显示快速修复和操作的菜单 altenter 5.格式化代码:C…

leetcode 767. Reorganize String(重组字符串)

重新排列字符串s中的字母,使得任意两个相邻的字母都不相同。 思路: 让相邻字母不同,能想到的办法是先把相同的字母排列, 然后在相同字母的缝隙中插入另一种字母。 比如"aab", 先把"a a"排出来,再…

Python“牵手”拼多多商品列表数据,关键词搜索拼多多API接口数据,拼多多API接口申请指南

拼多多平台API接口是为开发电商类应用程序而设计的一套完整的、跨浏览器、跨平台的接口规范,拼多多API接口是指通过编程的方式,让开发者能够通过HTTP协议直接访问拼多多平台的数据,包括商品信息、店铺信息、物流信息等,从而实现拼…

ssm中小型企业财务管理系统源码和论文

ssm中小型企业财务管理系统源码和论文067 开发工具:idea 数据库mysql5.7 数据库链接工具:navcat,小海豚等 技术:ssm 1、研究目的意义 社会经济的迅速发展和科学技术的全面进步,计算机技术的飞速发展,以及计算机与…

开启网络安全量化时代丨Fortinet AI 驱动型安全运营方案让价值看得见

网络安全投资如何才能体现价值,一直都是困扰企业安全负责人的头等大事。这关系到企业何时进行网络安全产品的更新换代,又该如何判断是否应新增部署工具、人员或流程,以及已有投资是否值得……诸多关键问题。Fortinet与知名研究机构Enterprise…

python替换—Series.replace()与Series.str.replace()的区别及为何replace()无效的解决方法

文章目录 前言一、Series.replace()方法二、Series.str.replace()方法三、replace()与str.replace() 使用方法的区别四、常见的坑:python中replace方法不起作用 前言 在Pandas中,Series是一个由一维数组表示的DataFrame列,而replace和str.re…

借助流程引擎表单,一举创造高效率办公流程化管理!

办公流程化管理,是很多企业的追求目标和发展愿景。如何实现这一目标?如何让企业内部的数据更好地实现价值,创造辉煌前景?借助流程引擎表单,可以助力企业实现高效率办公,让每一个表单制作场景更为顺畅和高效…

Redis 重写 AOF 日志期间,主进程可以正常处理命令吗?

重写 AOF 日志的过程是怎样的? Redis 的重写 AOF 过程是由后台子进程 bgrewriteaof 来完成的,这么做有以下两个好处。 子进程进行 AOF 重写期间,主进程可以继续处理命令请求,从而避免阻塞主进程子进程带有主进程的数据副本。这里…

Verilog 实现状态机自动售卖机

Verilog 实现状态机自动售卖机 教学视频:https://www.bilibili.com/video/BV1Ve411x75W?p33&spm_id_frompageDriver&vd_source19ae31dff4056e52d2729a4ca212602b 功能需求 使用1元、2元、5元面值的纸币进行支付,获取6元的物品,不设…

天津大数据培训机构 全面分析大数据怎么样?

数字化和信息化时代的发展,推动了大数据的高速发展,在这个大数据时代的浪潮中,越来越多人加入到大数据培训,都希望在大数据培训机构中学习最前沿的知识。 大数据人才行业需求 大数据行业近年来仍然呈现出增长态势,并…

Linux centos7 bash编程小训练

训练要求: 求比一个数小的最大回文数 知识点: 一个数字正读反读都一样,我们称为回文数,如5、11、55、121、222等。 我们训练用bash编写一个小程序,由我们标准输入一个整数,计算机将显示出一个比这个数小…