• 首发公号:Rand_cs

SELinux 基本原理

本文讲述 SELinux 保护安全的基本原理

安全检查顺序

不废话,直接先来看张图

当我们执行系统调用的时候,会首先对某些错误情况进行检查,如果失败通常会得到一些 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_open
do_filp_open
path_openat
do_open
vfs_open
do_dentry_open
security_file_open
error = 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

SELinux 基本原理的更多相关文章

  1. Android : SELinux 简析&修改

    一 SELinux背景知识 SELinux出现之前,Linux上的安全模型叫DAC,全称是Discretionary Access Control,翻译为自主访问控制.DAC的核心思想很简单,就是: ...

  2. 安全增强 Linux (SELinux) 剖析

    架构和实现 Linux® 一直被认为是最安全的操作系统之一,但是通过引入安全增强 Linux(Security-Enhanced Linux,SELinux),National Security Ag ...

  3. Ognl表达式基本原理和使用方法

    Ognl表达式基本原理和使用方法 1.Ognl表达式语言 1.1.概述 OGNL表达式 OGNL是Object Graphic Navigation Language(对象图导航语言)的缩写,他是一个 ...

  4. Android自定义控件之基本原理

    前言: 在日常的Android开发中会经常和控件打交道,有时Android提供的控件未必能满足业务的需求,这个时候就需要我们实现自定义一些控件,今天先大致了解一下自定义控件的要求和实现的基本原理. 自 ...

  5. 关闭selinux

    1.查看SELinux状态:getenforce Enforcing(启动) disable(禁用) 1.禁用SELinux(重启后依然生效) 修改 vi /etc/sysconfig/selinux ...

  6. 关闭SELinux和iptables防火墙

    1.关闭SELinux: 编辑SELinux配置文件: [root@Redis selinux]# vim /etc/selinux/config 修改SELINUX配置项为disable SELIN ...

  7. HMM基本原理及其实现(隐马尔科夫模型)

    HMM(隐马尔科夫模型)基本原理及其实现 HMM基本原理 Markov链:如果一个过程的“将来”仅依赖“现在”而不依赖“过去”,则此过程具有马尔可夫性,或称此过程为马尔可夫过程.马尔可夫链是时间和状态 ...

  8. 开发thinkphp的第一步就是给Application目录(不包括其下的文件)777权限, 关闭selinux

    开发thinkphp的时候, 总是会出现各种个样 的奇怪的毛病, 比如: 说什么Application目录不可写, 比如: 说什么 _STORAGE_WRITE_ERROR, 不能生成 Runtime ...

  9. 动态令牌-(OTP,HOTP,TOTP)-基本原理

    名词解释和基本介绍 OTP 是 One-Time Password的简写,表示一次性密码. HOTP 是HMAC-based One-Time Password的简写,表示基于HMAC算法加密的一次性 ...

  10. linux系统的初化始配置(包括网络,主机名,关闭firewalld与selinux)

    每次我们使用Linux都会对系统进行初始化的配置,下面我们一一列出来. 1.服务的开启 systemctl enable firewalld.service //将指定的服务设置为开机启动 syste ...

随机推荐

  1. java中jar文件

    1.文档性质的jar文件 可以将有包名的类的字节码文件压缩成一个jar文件,供其他源文件用import语句导入jar文件中的类. 以下结合具体的两个类给出生成的jar文件的步骤eg23中TestTwo ...

  2. Java 断言 Assert 使用教程与最佳实践

    本文收录于 Github.com/niumoo/JavaNotes,Java 系列文档,数据结构与算法! 本文收录于网站:https://www.wdbyte.com/,我的公众号:程序猿阿朗 作为一 ...

  3. 有效预警6要素:亿级调用量的阿里云弹性计算SRE实践

    简介: 关注保持良好的预警处理,持续解决系统隐患,促进系统稳定健康发展. 编者按:随着分布式系统和业务需求的飞速发展,监控告警在我们保障系统稳定性和事故快速恢复的全周期中都是至关重要的.9月3号,阿里 ...

  4. 地址标准化服务AI深度学习模型推理优化实践

    简介: 深度学习已在面向自然语言处理等领域的实际业务场景中广泛落地,对它的推理性能优化成为了部署环节中重要的一环.推理性能的提升:一方面,可以充分发挥部署硬件的能力,降低用户响应时间,同时节省成本:另 ...

  5. Serverless JOB | 传统任务新变革

    简介: SAE Job 重点解决了用户的效率和成本问题,在兼具传统任务使用体验和功能的同时按需使用,按量计费,做到低门槛任务上云,节省闲置资源成本. Job 作为一种运完即停的负载类型,在企业级开发中 ...

  6. 无缝融入 Kubernetes 生态 | 云原生网关支持 Ingress 资源

    ​简介:Kubernetes 一贯的作风是通过定义标准来解决同一类问题,在解决集群对外流量管理的问题也不例外.Kubernetes 对集群入口点进行了进一步的统一抽象,提出了 3 种解决方案:Node ...

  7. 一文详解Redis中BigKey、HotKey的发现与处理

    简介: 在Redis的使用过程中,我们经常会遇到BigKey(下文将其称为"大key")及HotKey(下文将其称为"热key").大Key与热Key如果未能及 ...

  8. [ML] 深度学习的数学基础: 函数/参数优化/矩阵运算/向量化/卷积运算/张量运算

      1. 函数与导数 函数是一种映射关系,将一个或多个自变量的取值映射为一个因变量的取值. 函数的导数表示函数在某一点处的变化率,即函数图像在该点的切线斜率. 导数可以用来求解函数的最值.优化问题.拟 ...

  9. [FAQ] 部署二进制运行时 go-ego/gse 如何正确加载分词字典

    运行Golang编译后二进制运行时,此时运行二进制时所在目录就是Golang源码程序认为的根目录了. 所以只需要把字典文件拷贝到与二进制所在同一目录内,然后使用 seg.LoadDict('dicti ...

  10. [Contract] Solidity 合约发布到测试网 ropsten 的作用

    当我们本地完成了一系列测试以后,接下来就是准备上线了. 关于合约部署可以参考这篇:Solidity 合约使用 truffle 部署到测试网和主网 你可能有一个疑问,在上主网之前,先上测试网的作用是什么 ...