16.5 【Linux】SELinux 初探

news2024/12/26 21:36:25

16.5.1 什么是 SELinux

SELinux是“ Security Enhanced Linux ”的缩写,字面上的意义就是安全强化的 Linux。

当初设计的目标:避免资源的误用

SELinux 是由美国国家安全局 (NSA) 开发的,当初开发这玩意儿的目的是因为很多企业界发现, 通常系统出现问题的原因大部分都在于“内部员工的资源误用”所导致的,实际由外部发动的攻击反而没有这么严重。 那么什么是“员工资源误用”呢?举例来说,如果有个不是很懂系统的系统管理员为了自己设置的方便,将网页所在目录 /var/www/html/ 的权限设置为drwxrwxrwx 时,你觉得会有什么事情发生?

传统的文件权限与帐号关系:自主式存取控制, DAC

系统的帐号主要分为系统管理员 (root) 与一般用户,而这两种身份能否使用系统上面的文件资源则与 rwx 的权限设置有关。 不过你要注意的是,各种权限设置对 root 是无效的。因此,当某个程序想要对文件进行存取时, 系统就会根据该程序的拥有者/群组,并比对文件的权限,若通过权限检查,就可以存取该文件了。

这种存取文件系统的方式被称为“自主式存取控制 (Discretionary Access Control, DAC)”,基本上,就是依据程序的拥有者与文件资源的 rwx 权限来决定有无存取的能力。 不过这种DAC 的存取控制有几个困扰,那就是:

root 具有最高的权限:如果不小心某支程序被有心人士取得, 且该程序属于 root 的权限,那么这支程序就可以在系统上进行任何资源的存取。

使用者可以取得程序来变更文件资源的存取权限:如果你不小心将某个目录的权限设置为 777 ,由于对任何人的权限会变成 rwx ,因此该目录就会被任何人所任意存取。

以政策规则订定特定程序读取特定文件:委任式存取控制, MAC

我们知道 DAC 的困扰就是当使用者取得程序后,他可以借由这支程序与自己默认的权限来处理他自己的文件资源。 万一这个使用者对 Linux 系统不熟,那就很可能会有资源误用的问题产生。为了避免 DAC 容易发生的问题,因此 SELinux 导入了委任式存取控制(Mandatory Access Control, MAC) 的方法。

                       图16.5.1、使用 DAC/MAC 产生的不同结果,以 Apache 为例说明

左图是没有 SELinux 的 DAC 存取结果,apache 这只 root 所主导的程序,可以在这三个目录内作任何文件的新建与修改,右边则是加上 SELinux 的 MAC 管理的结果,SELinux 仅会针对 Apache 这个“ process ”放行部份的目录, 其他的非正规目录就不会放行给 Apache 使用。

16.5.2 SELinux 的运行模式

SELinux 是通过 MAC 的方式来控管程序,他控制的主体是程序, 而目标则是该程序能否读取的“文件资源”!

主体 (Subject): SELinux 主要想要管理的就是程序,因此你可以将“主体”跟本章谈到的 process 划上等号;

目标 (Object): 主体程序能否存取的“目标资源”一般就是文件系统。因此这个目标项目可以等文件系统划上等号;

政策 (Policy): 由于程序与文件数量庞大,因此 SELinux 会依据某些服务来制订基本的存取安全性政策。这些政策内还会有详细的规则 (rule) 来指定不同的服务开放某些资源的存取与否。在目前的 CentOS 7.x 里面仅有提供三个主要的政策,分别是:

targeted:针对网络服务限制较多,针对本机限制较少,是默认的政策;

minimum:由 target 修订而来,仅针对选择的程序来保护!

mls:完整的 SELinux 限制,限制方面较为严格。建议使用默认的 targeted 政策即可。

安全性本文 (security context): 我们刚刚谈到了主体、目标与政策面,但是主体能不能存取目标除了政策指定之外,主体与目标的安全性本文必须一致才能够顺利存取。 这个安全性本文 (security context) 有点类似文件系统的 rwx。

由于 SELinux 重点在保护程序读取文件系统的权限,因此我们将上述的几个说明搭配起来,绘制成下面的流程图,比较好理解:

              

                                           图16.5.2、SELinux 运行的各元件之相关性

上图的重点在“主体”如何取得“目标”的资源存取权限! 由上图我们可以发现,(1)主体程序必须要通过 SELinux 政策内的规则放行后,就可以与目标资源进行安全性本文的比对,(2)若比对失败则无法存取目标,若比对成功则可以开始存取目标。问题是,最终能否存取目标还是与文件系统的 rwx 权限设置有关。如此一来,加入了 SELinux 之后,出现权限不符的情况时,你就得要一步一步的分析可能的问题了!

安全性本文 (Security Context)

CentOS 7.x 的 target 政策已经帮我们制订好非常多的规则了,因此你只要知道如何打开/关闭某项规则的放行与否即可。 那个安全性本文比较麻烦!因为你可能需要自行设置文件的安全性本文呢!为何需要自行设置啊? 举例来说,你不也常常进行文件的 rwx 的重新设置吗?这个安全性本文你就将他想成 SELinux 内必备的 rwx 就是了。

安全性本文存在于主体程序中与目标文件资源中。程序在内存内,所以安全性本文可以存入是没问题。 那文件的安全性本文是记录在哪里呢?事实上,安全性本文是放置到文件的inode 内的,因此主体程序想要读取目标文件资源时,同样需要读取 inode , 这 inode 内就可以比对安全性本文以及 rwx 等权限值是否正确,而给予适当的读取权限依据。

那么安全性本文到底是什么样的存在呢?我们先来看看 /root 下面的文件的安全性本文好了。观察安全性本文可使用“ ls -Z ”去观察如下:

如上所示,安全性本文主要用冒号分为三个字段,这三个字段的意义为:

身份识别 (Identify):

相当于帐号方面的身份识别!主要的身份识别常见有下面几种常见的类型:

unconfined_u:不受限的用户,也就是说,该文件来自于不受限的程序所产生的!一般来说,我们使用可登陆帐号来取得 bash 之后, 默认的 bash 环境是不受 SELinux 管制的,因为 bash 并不是什么特别的网络服务!因此,在这个不受 SELinux 所限制的 bash程序所产生的文件, 其身份识别大多就是 unconfined_u 这个“不受限”用户。

system_u:系统用户,大部分就是系统自己产生的文件。

基本上,如果是系统或软件本身所提供的文件,大多就是 system_u 这个身份名称,而如果是我们用户通过 bash 自己创建的文件,大多则是不受限的 unconfined_u 身份~如果是网络服务所产生的文件,或者是系统服务运行过程产生的文件,则大部分的识别就会是 system_u。

系统安装主动产生的 anaconda-ks.cfs 及 initial-setup-ks.cfg 就会是 system_u,而我们自己从网络上面抓下来的 regular_express.txt 就会是 unconfined_u 这个识别。

角色 (Role):

通过角色字段,我们可以知道这个数据是属于程序、文件资源还是代表使用者。一般的角色有:

object_r:代表的是文件或目录等文件资源,这应该是最常见的

system_r:代表的就是程序

类型 (Type)

在默认的 targeted 政策中, Identify 与 Role 字段基本上是不重要的!重要的在于这个类型(type) 字段! 基本上,一个主体程序能不能读取到这个文件资源,与类型字段有关!而类型字段在文件与程序的定义不太相同,分别是:

type:在文件资源 (Object) 上面称为类型 (Type);

domain:在主体程序 (Subject) 则称为领域 (domain) 了

domain 需要与 type 搭配,则该程序才能够顺利的读取文件资源。

程序与文件 SELinux type 字段的相关性

基本上,这些对应数据在 targeted 政策下的对应如下:

如上所述,在默认的 target 政策下,其实最重要的字段是类型字段 (type), 主体与目标之间是否具有可以读写的权限,与程序的 domain 及文件的 type 有关!这两者的关系我们可以使用 crond 以及他的配置文件来说明! 亦即是 /usr/sbin/crond, /etc/crontab, /etc/cron.d等文件来说明。

      图16.5.3、主体程序取得的 domain 与目标文件资源的 type 相互关系以 crond 为例

上图的意义我们可以这样看的:

1. 首先,我们触发一个可执行的目标文件,那就是具有 crond_exec_t 这个类型的/usr/sbin/crond 文件;

2. 该文件的类型会让这个文件所造成的主体程序 (Subject) 具有 crond 这个领域(domain), 我们的政策针对这个领域已经制定了许多规则,其中包括这个领域可以读取的目标资源类型;

3. 由于 crond domain 被设置为可以读取 system_cron_spool_t 这个类型的目标文件(Object), 因此你的配置文件放到 /etc/cron.d/ 目录下,就能够被 crond 那支程序所读取了;

4. 但最终能不能读到正确的数据,还得要看 rwx 是否符合 Linux 权限的规范!

上述的流程告诉我们几个重点,第一个是政策内需要制订详细的 domain/type 相关性;第二个是若文件的 type 设置错误, 那么即使权限设置为 rwx 全开的 777 ,该主体程序也无法读取目标文件资源。

从上面的测试案例来看,我们的配置文件确实没有办法被 crond 这个服务所读取喔!而原因在登录文件内就有说明, 主要就是来自 SELinux 安全本文 (context) type 的不同所致。

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

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

相关文章

Centos7完全卸载已安装的Nginx

查看服务器上安装的nginx版本号,主要是通过ngix的-v或-V选项 Linux下查看Nginx安装目录、版本号信息? -v 显示 nginx 的版本。 -V 显示 nginx 的版本,编译器版本和配置参数。 [rootwww ~]# /usr/local/nginx/sbin/nginx -v nginx version: nginx/1.…

移动硬盘已识别但无法读取怎么办?

移动硬盘已识别但无法读取问题是一个比较常见的问题,通常会以“硬盘无法访问”的提示弹窗形式出现,也曾让很多人苦闷烦恼不已。那么具体的移动硬盘无法读取原因是什么呢? 移动硬盘无法读取的原因 硬盘驱动器可能是没有分区的新驱动器。如果您…

记一次:线程池源码解析

前言:很多时候我们需要使用线程池来处理逻辑,但实际上线程池是如何添加线程,如何执行的呢? 0:创建线程池--略(7个参数) 1:提交线程池源码 public void execute(Runnable command)…

基于 spring boot 的毕业生信息招聘管理系统【源码在文末】

向上的路,并不拥挤,拥挤是因为大部分人选择了安逸 大学生嘛,论文写不出,代码搞不懂不要紧,重要的是,从这一刻就开始学习,立刻马上! 今天带来的是最新的选题,基于 spring…

Python绘图系统5:自定义一个坐标设置控件

文章目录 封装成类数据输入方案设置数据源代码 Python绘图系统:将matplotlib嵌入到tkinter 📈简单的绘图系统 📈数据导入📈三维绘图系统 封装成类 xyz这三行其实从代码的角度来说是完全一样的,而且在写这三行组件的时…

Python学习笔记_基础篇(九)_面向对象编程

本篇内容: 1、反射2、面向对象编程3、面向对象三大特性4、类成员5、类成员修饰符6、类的特殊成员7、单例模式 反射 python中的反射功能是由以下四个内置函数提供:hasattr、getattr、setattr、delattr,改四个函数分别用于对对象内部执行:检…

VS2012+AO 10.2.2 项目错误 之内部编译器错误: 步骤“EMIT”

调试时异常消息&#xff1a; 内部编译器错误: 步骤“EMIT” 内部编译器错误: 步骤“COMPILE”的符号 内部编译器错误: 步骤“COMPILE”的符号“<全局命名空间>” 内部编译器错误(0xc0000005 位于地址 00C9FDDC 处): 可能的原因是“CODEGEN”。 好好的项目&…

【逐步剖C++】-第一章-C++入门知识

前言&#xff1a;本文主要介绍有关C入门需掌握的基础知识&#xff0c;包括但不限于以下几个方面&#xff0c;这里是文章导图&#xff1a; 本文较长&#xff0c;内容较多&#xff0c;大家可以根据需求跳转到自己感兴趣的部分&#xff0c;希望能对读者有一些帮助 那么本文也主要以…

springcloud3 hystrix实现服务降级的案例配置2

一 服务降级的说明 1.1 服务降级说明 "服务器忙&#xff0c;请稍后在试"不让客户达等待&#xff0c;立即返回一个友好的提示。 1.2 服务降级的触发情况 1.程序运行异常&#xff1b; 2.超时&#xff1b; 3.服务熔断触发服务降级&#xff1b;4 .线程池/信号量打…

Linux命令200例:ps用于查看当前系统中运行的进程信息(常用)

&#x1f3c6;作者简介&#xff0c;黑夜开发者&#xff0c;全栈领域新星创作者✌。CSDN专家博主&#xff0c;阿里云社区专家博主&#xff0c;2023年6月csdn上海赛道top4。 &#x1f3c6;数年电商行业从业经验&#xff0c;历任核心研发工程师&#xff0c;项目技术负责人。 &…

【Python】Web学习笔记_flask(5)——会话cookie对象

HTTP是无状态协议&#xff0c;一次请求响应结束后&#xff0c;服务器不会留下对方信息&#xff0c;对于大部分web程序来说&#xff0c;是不方便的&#xff0c;所以有了cookie技术&#xff0c;通过在请求和响应保温中添加cookie数据来保存客户端的状态。 html代码&#xff1a; …

redis Windows版本安装过程(5.0.14)

官网不提供Windows版本的redis安装包&#xff0c;但可以在GitHub网站上找到redis的安装包&#xff1a; Releases tporadowski/redis GitHub &#xff08;相比较Linux其他版本的Redis,Windows版的redis的缺点是版本比较老&#xff0c;官方不提供且不更新&#xff09; 1、zip…

界面组件Telerik UI for WinForms R2 2023——拥有VS2022暗黑主题

Telerik UI for WinForms拥有适用Windows Forms的110多个令人惊叹的UI控件。所有的UI for WinForms控件都具有完整的主题支持&#xff0c;可以轻松地帮助开发人员在桌面和平板电脑应用程序提供一致美观的下一代用户体验。 Telerik UI for WinForms R2 2023于今年6月份发布&…

Vue2到3 Day6 全套学习内容,众多案例上手(内付源码)

简介&#xff1a; Vue2到3 Day1-3 全套学习内容&#xff0c;众多案例上手&#xff08;内付源码&#xff09;_星辰大海1412的博客-CSDN博客本文是一篇入门级的Vue.js介绍文章&#xff0c;旨在帮助读者了解Vue.js框架的基本概念和核心功能。Vue.js是一款流行的JavaScript前端框架…

[C++]笔记 - 知识点积累

一.运算符的优先级 一共15个级别 最高优先级 : () []最低优先级 :逗号表达式倒数第二低优先级 : 赋值和符合赋值(,,-...) ! >算术运算符 > 关系运算符 > && >> || >赋值运算符 二.数据类型转换 隐式类型转换 算数转换 char int long longlong flo…

【2023年11月第四版教材】《第5章-信息系统工程之软件工程(第二部分)》

《第5章-信息系统工程之软件工程&#xff08;第二部分&#xff09;》 1.3 软件设计1.4 软件实现&#xff3b;补充第三版教材内容&#xff3d; 1.5 部署交付 1.3 软件设计 1、结构化设计SD是一种面向数据流的方法&#xff0c;它以SRS和SA阶段所产生的DFD和数据字 典等文档为基础…

如何使用CSS实现一个渐变背景效果?

聚沙成塔每天进步一点点 ⭐ 专栏简介⭐ 使用CSS实现渐变背景效果⭐ 线性渐变&#xff08;Linear Gradient&#xff09;⭐ 径向渐变&#xff08;Radial Gradient&#xff09;⭐ 写在最后 ⭐ 专栏简介 前端入门之旅&#xff1a;探索Web开发的奇妙世界 记得点击上方或者右侧链接订…

genism word2vec方法

文章目录 概述使用示例模型的保存与使用训练参数详解&#xff08;[原链接](https://blog.csdn.net/weixin_44852067/article/details/130221655)&#xff09;语料库训练 概述 word2vec是按句子来处理的Sentences(句子们) 使用示例 from gensim.models import Word2Vec #sent…

ThreadLocal(超详细介绍!!)

关于ThreadLocal&#xff0c;可能很多同学在学习Java的并发编程部分时&#xff0c;都有所耳闻&#xff0c;但是如果要仔细问ThreadLocal是个啥&#xff0c;我们可能也说不清楚&#xff0c;所以这篇博客旨在帮助大家了解ThreadLocal到底是个啥&#xff1f; 1.ThreadLocal是什么&…

AgentBench::AI智能体发展的潜在问题一

从历史上看,几乎每一种新技术的广泛应用都会在带来新机遇的同时引发很多新问题,AI智能体也不例外。从目前的发展看,AI智能体的发展可能带来的新问题可能包括如下方面: 第一是它可能带来涉及个人数据、隐私,以及知识产权的法律纠纷的大幅增长。要产生一个优秀的AI智能体,除…