SELinux 基本原理

本文讲述 SELinux 保护安全的基本原理
首发公号:Rand_cs

安全检查顺序

不废话,直接先来看张图

在这里插入图片描述

当我们执行系统调用的时候,会首先对某些错误情况进行检查,如果失败通常会得到一些 error 信息,通过查看全局变量 errno 可以知道到底是哪一类错误

随后进行 DAC 检查,简单理解就是 Linux 里面 rwx 那一套检查逻辑,如果检查失败,通常会得到类似 permission denied 的信息

再之后便会进行 MAC 检查,在这里就是进行 SELinux 的检查,它会根据当前主体和客体的类型,查询策略,检查是否允许当前类型的主体访问客体,检查失败的话,则也是会得到类似 permission denied 的信息

以上检查都通过,则该调用执行成功。

何时检查?

从上图可以知道,是在 LSM Hook 点出执行的 SELinux 检查,大家可能对 LSM 概念比较陌生。LSM 全称 Linux Security Module,但其实并不是一个模块,而是一个安全框架,为安全模块提供的一个安全框架。

Linux 源码目录中有个 security 的目录,其下的子目录比如说 apparmor,selinux 等等就是目前 Linux 支持的一些安全模块。此系列文章主要就是讨论其中的一个安全模块 SELinux。

LSM 框架提供的服务之一就是在内核中的关键处埋下了许多 hook 点,在看内核代码的时候,你应该会经常发现类似 security_xxx 的函数,这就是 LSM Hook 点。

举个例子,经典的调用 open 打开一个文件,其简化版的调用路径如下所示:

open
-------sys_opendo_filp_openpath_openatdo_openvfs_opendo_dentry_opensecurity_file_openerror = security_file_open(f);if (error)goto cleanup_all;

其中 security_file_open 就是 open 系统调用的一个 LSM Hook 点,当执行到此处的时候,它会执行所有挂在此hook点上的安全检查函数,如果 SELinux 使能,那么便会执行 selinux_file_open 函数来检查当前的进程(主体)是否被允许打开文件(客体)。

这一步还不止一个安全检查函数?是的,这取决于当前系统使能了多少个 LSM 安全模块,如果使能了 A,B,C 三个安全模块,那么每到 security_xxx hook 点,便会将 A、B、C 对应的安全检查函数启动顺序全都执行一遍。每一个检查都通过,才算最终通过,如果这一步检查不过,可以看出直接就返回了。

如何检查?

在这里插入图片描述

这是 SELinux 在内核中的一个极简的架构图,当需要权限检查的时候,首先去访问 AVC(Access Vector Cache),从名称当中就可以看出它是存放权限访问的一个 cache,如果能从 AVC 里面直接查询到是否允许访问的结果,那么将查询结果返回。

如果 AVC 中没有相关权限访问的结果,则去 Security Server 查找,Security Server 会去查询策略,然后将查询的结果存储到 AVC,再将结果返回。

所以 SELinux 的权限检查主要就是这么一个逻辑哈,我们从头用一个例子来捋一捋,比如说 p_t 类型的 P 进程想要打开 f_t 类型的 F 文件,这期间会进行的安全检查:

  1. 首先检查是否有逻辑错误存在,比如说 F 文件不存在?
  2. 然后进行 DAC 检查,当前进程有效id和文件属主id比较等等操作
  3. 进入 security_file_open 这个 LSM hook 点,执行每一个使能的安全模块对应的 xxx_file_open 函数,来进行安全检查。
    1. 执行 selinux_file_open 函数来执行 SELinux 权限检查
    2. 首先查找 AVC,查询 p_t 对 f_t 类型的文件是否有 open 权限,如果 AVC 中有记录,将结果返回
    3. 如果 AVC 中没有记录,Security Server 查询策略库,将查询结果写到 AVC,然后将结果返回

以上检查都通过,基本上 open 系统调用就成功了,如果第一步失败,则可以从 errno 找到错误原因,如果后面的 DAC 和 MAC 权限检查失败,通常则会出现 permission denied 的提示

好了,本文就先到这里,有什么问题欢迎来讨论交流
首发公号:Rand_cs

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

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

2.2 设计FMEA步骤二:结构分析

2.2.1 目的 设计结构分析的目的是将设计识别和分解为系统、子系统、组件和零件,以便进行技术风险分析。其主要目标包括: 可视化分析范围结构化表示:方块图、边界图、数字模型、实体零件识别设计接口、交互作用和间隙促进顾客和供应商工程团队之间的协作(接口责任)为功能分…

微服务(11)

目录 51.pod的重启策略是什么? 52.描述一下pod的生命周期有哪些状态? 53.创建一个pod的流程是什么? 54.删除一个Pod会发生什么事情? 55.k8s的Service是什么? 51.pod的重启策略是什么? 可以通过命令kub…

【熔断限流组件resilience4j和hystrix】

文章目录 🔊博主介绍🥤本文内容起因resilience4j落地实现pom.xml依赖application.yml配置接口使用 hystrix 落地实现pom.xml依赖启动类上添加注解接口上使用 📢文章总结📥博主目标 🔊博主介绍 🌟我是廖志伟…

BLP模型

本篇文章是调研了许多资料后对 BLP 模型的一个总结 首发公号:Rand_cs MLS,Multi-level Security,主要关心的是数据机密性 D. Elliott Bell 和 Leonard J. LaPadula 在 1996 年提出了基本的 BLP 模型,主要有两个性质:…

【形式语言与自动机/编译原理】CFG-->Greibach-->NPDA(2)

本文将详细讲解《形式语言与自动机》(研究生课程)或《编译原理》(本科生课程)中的上下文无关文法(CFG)转换成Greibach范式,再转成下推自动机(NPDA)识别语言是否可以被接受…

机器学习部分相关概念

数据集(Data Set)即数据的集合,每一条单独的数据被称为样本(Sample)。 对于每个样本,它通常具有一些属性(Attribute)或者特征(Feature), 特征所具体取得值被称为特征值(Feature Value)。 西瓜数据集 色泽根蒂纹理青绿稍蜷模糊乌黑蜷缩清晰 …

基于JavaWeb实验室预约管理系统(源码+数据库+文档)

一、项目简介 本项目是一套基于JavaWeb实验室预约管理系统,主要针对计算机相关专业的正在做毕设的学生与需要项目实战练习的Java学习者。 包含:项目源码、数据库脚本等,该项目附带全部源码可作为毕设使用。 项目都经过严格调试,e…

C++程序编译

GCC编译器 文章目录 GCC编译器 源文件 为 Main.cpp 注意cpp文件 一定要用g命令 否则没办法执行 预处理(Pre-Processing):首先会经过预处理器将程序中的预编译指令进行处理,然后把源文件中的注释这些没用的东西都给扬了。 g -E Mai…

redis 三主六从高可用docker(不固定ip)

redis集群(cluster)笔记 redis 三主三从高可用集群docker swarm redis 三主六从高可用docker(不固定ip) 此博客解决,redis加入集群后,是用于停掉后重启,将nodes.conf中的旧的Ip替换为新的IP,从而达到不会因为IP变化导致集群无法…

《VulnHub》DC:1

title: 《VulnHub》DC:1 date: 2024-01-01 12:46:49 updated: 2024-01-01 12:46:50 categories: WriteUp:Cyber-Range excerpt: 主机发现、目标信息扫描、漏洞扫描、网站指纹信息识别、网站目录扫描、drupal CMS 漏洞利用(CVE 2014-3704&…

爱思唯尔的KBS——模板、投稿、返修、接收的总结

第二篇论文终于是接受了QAQ,被审稿人疯狂拖时间,KBS是真难绷啊 由于之前发布过关于爱思唯尔旗下的ESWA博客,KBS和ESWA是类似的,因此本篇博客主要说下区别以及期间碰到的各种情况,有疑问依然可以在评论区说,…

5个用于构建Web应用程序的Go Web框架

探索高效Web开发的顶级Go框架 Go(或称为Golang)以其简洁性、高效性和出色的标准库而闻名。然而,有几个流行的Go Web框架和库为构建Web应用程序提供了额外的功能。以下是五个最值得注意的Go框架: 1. Gin: Gin是一个高…