哈喽大家好,我是咸鱼

文章《SELinux 导致 Keepalived 检测脚本无法执行》以【keepalived 无法执行检测脚本】为案例向大家简单介绍了关于 SELinux 的一些概念

比如说什么是自主访问控制 DAC 和 强制访问控制 MAC;SELinux 安全上下文的概念等等

那么今天咸鱼将单独写一篇文章向大家专门介绍一下 SELinux

初识 SELinux

SELinux(Security Enhanced Linux,安全增强型 Linux),这玩意由美国国家安全局(NSA)利用 Linux 安全模块(LSM)开发而成

安全增强型 Linux,看名字就感觉是跟安全相关的。 SELinux 是 Linux 内核中的一个模块,用来解决进程与文件资源之间权限相关的一些问题

提到进程与文件资源之间的权限问题,我们脑子里首先想到的应该就是 rwx 权限了吧

  • 自主访问控制(Discretionary Access Control, DAC)

在传统的 UNIX 类系统中,文件资源都与特定的用户和群组相关联,并且访问权限通过 rwx 来控制

普通用户想要去读写系统中的文件资源受限于其所属的用户和群组的 rwx 权限

对于 root 用户来说rwx权限设置是无效的,因为 root 用户拥有完全访问控制权

比如说某个进程想要对文件进行读写时,系统就会根据该进程的属主和属组去比对文件权限,只有通过权限检查才能进一步操作

这种权限控制方式被称为自主访问控制(Discretionary Access Control, DAC)

DAC 是 Linux 操作系统中的一种基本权限控制机制,用于限制用户对系统资源的访问权限

但是后面大家发现 DAC 有许多不足之处:比如说 root 的权限太高了,如果某个恶意进程拿到了 root 权限,那么将是一件很可怕的事情

又或者不小心把某一个文件的权限设置成了 777,那么这个文件就会被任何人任何进程操作

为了弥补 DAC 的一些不足之处,MAC 模型随之诞生

  • 强制访问控制(MAC,Mandatory Access Control)

MAC 是 Linux 操作系统中一种更加严格和细粒度的访问控制机制,用于加强对系统资源的保护和控制

它有趣的地方在于可以针对特定的进程与特定的文件资源来管理权限,不仅考虑了前面 DAC 机制中的 rwx 权限、还考虑了更多因素(例如安全策略和标签)

即使你是 root 用户,在使用不同的进程时你所能获取的权限也不一定是 root

SELinux 引用了 MAC ,每个进程和系统资源都有一个特殊的安全性标签,称为 SELinux 上下文(context)

依据这个安全上下文,SELinux 制定了一系列规则,用来限制进程之间如何互相交互以及如何与各类系统资源交互

SELinux 的规则能够精细到是否允许特定用户或进程访问特定资源

举个例子:

使用 SELinux时,httpd 进程能够访问 /var/www/html/ ,但是不允许访问 /tmp/var/tmp/ 中的文件

即使你的 web 服务器被攻击,黑客控制了 httpd 进程,就算拥有 root 权限也无法访问 /tmp/var/tmp/ 中的文件



需要注意的是:

  • 对于受 SELinux 管制的进程,会先检查 SELinux 策略规则,然后再检查 DAC 规则
  • 对于不受 SELinux 管制的进程,仍然会执行 DAC 规则
  • 如何看一个进程受不受 SELinux 管制,看它的安全上下文

基础概念

我们知道,SELinux 通过 MAC 的方式来管理进程或用户的权限

即 SELinux 控制的主体是【进程】或【用户】,而【目标】则是该进程或用户能否访问的文件资源

  • 主体(subject):SELinux 主要管理的就是进程,一般代指进程
  • 目标(object):主体能否访问的目标,一般代指文件资源
  • 策略(policy):SELinux 根据特定的服务或应用程序来制定基本的安全策略,以控制进程对文件资源的读写访问;每一个策略都由许多规则组成

关于 SELinux 策略,以 CentOS 7.x 为例:

  1. targeted:针对网络服务限制较多,本机限制较少。默认的策略
  2. minimum:由 target 自定义而来,仅针对选择的进程来保护
  3. mls:完整的 SELinux 限制,限制严格

/etc/selinux/config

# SELINUXTYPE= can take one of three values:
# targeted - Targeted processes are protected,
# minimum - Modification of targeted policy. Only selected processes are protected.
# mls - Multi Level Security protection.

安全上下文

我们知道,每个主体进程和目标资源都有一个安全标签,称为 SELinux 安全上下文(Security Context)

SELinux 会根据主体的安全上下文以及目标的安全上下文来决定是否允许主体访问目标,以及允许何种类型的访问

即主体与目标的安全上下文必须一致才能够顺利读写,有点像 DAC 中的 rwx 权限

安全上下文存放在文件的 inode 内,可以通过下面的命令去查看(需要先开启 SELinux)

# 查看目录下文件的安全上下文
[root@minion2 ~]# ll -Z
... unconfined_u:object_r:admin_home_t:s0 文件1
... system_u:object_r:admin_home_t:s0 文件2
... unconfined_u:object_r:admin_home_t:s0 文件3

unconfined_u:object_r:admin_home_t 为例,可以看到安全上下文主要用冒号分割了三个字段,分别代表三个主要类型

User(用户)

在 SELinux 中,身份是指操作系统中的用户(User)。每个 user 都有一个唯一的身份标识

不同的 user 可以被分配不同的角色(role)和类型(type),以控制他们对系统资源的访问

比如 unconfined_u(不受限的用户)表示该文件来自于不受限(不受 SELinux 限制)的用户

一般来讲默认的 bash 环境是不受 SELinux 管制的,所以 bash 进程产生的文件 user 大多数为 unconfined_u 不受限用户

比如 system_u ,如果是网络服务所产生或系统服务运行过程中产生的文件,那 user 大部分就是 system_u

role(角色)

角色是 SELinux 中的一个概念,用于定义用户在系统中的角色或角色组

role 可以帮助限制 user 的行为,使其在不同的角色下有不同的权限

通过 role ,就可以知道这个数据是属于进程还是文件资源,_r 表示 role

  1. object_r(文件或目录)

  2. system_r(进程)

type(类型)

type 是 SELinux 中非常重要的一个概念,它用于对文件、进程等资源进行分类,每个文件、进程都被赋予一个唯一的 type 标识

type 定义了资源可以被哪些进程和用户访问,以及资源可以访问哪些其他资源

这种基于类型的访问控制使得即使用户有相同的权限,但只有在特定的 type 下才能进行访问,从而增强了系统的安全性

type 在文件与进程方面的定义有一些区别:

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

2)domain:在主体进程(Subject)上面称为域(domain)

typedomain 需要相互适配,该进程才能够顺利读取文件资源

crond 为例,先看下 crond 进程的安全上下文内容

# 可以看到 crond 进程的 type(即 domain) 为 crond_t
[root@localhost ~]# ps -eZ | grep crond
system_u:system_r:crond_t:s0-s0:c0.c1023 681 ? 00:00:00 crond
system_u:system_r:crond_t:s0-s0:c0.c1023 688 ? 00:00:00 atd

再来看下 crond 的执行文件、配置文件等安全上下文内容

# 可以看到文件资源的 type 为 crond_exec_t、system_cron_spool_t
[root@localhost ~]# ll -Zd /usr/sbin/crond /etc/crontab /etc/cron.d
drwxr-xr-x. root root system_u:object_r:system_cron_spool_t:s0 /etc/cron.d
-rw-r--r--. root root system_u:object_r:system_cron_spool_t:s0 /etc/crontab
-rwxr-xr-x. root root system_u:object_r:crond_exec_t:s0 /usr/sbin/crond

当我们执行 /usr/sbin/crond 之后,这个进程的 domain 类型是 crond_t,能够读取的配置文件则为 system_cron_spool_t 这种类型

如果配置文件的 type 不是 system_cron_spool_t ,就算进程拥有 rwx 权限也无法读取

总结

最后总结一下,SELinux 基于 MAC 模型进一步更加严格和细分地对进程与资源之间的权限进行控制,用于加强对系统资源的保护

在 SELinux 中,有三个重要的概念:

  • 主体(subject):SELinux 主要管理的就是进程,一般代指进程
  • 目标(object):主体能否访问的目标,一般代指文件资源
  • 策略(policy):SELinux 根据特定的服务或应用程序来制定基本的安全策略,以控制进程对文件资源的读写访问;每一个策略都由许多规则组成

SELinux 控制的主体是【进程】或【用户】,而【目标】则是该进程或用户能否访问的文件资源

SELinux 为每个主体进程和目标资源都打上一个安全标签,称为 SELinux 安全上下文(Security Context),它会根据主体的安全上下文以及目标的安全上下文来决定是否允许主体访问目标,以及允许何种类型的访问

即主体与目标的安全上下文必须一致才能够顺利读写,有点像 DAC 中的 rwx 权限

SELinux 入门 pt.1的更多相关文章

  1. SELinux入门

    导读 如果你在之前的Linux生涯中都禁用或忽略了SELinux,这篇文章就是专门为你写的:这是一篇对存在于你的Linux桌面或服务器之下的SELinux系统的介绍,它能够限制权限,甚至消除程序或守护 ...

  2. SELinux入门简介

    操作系统有两类访问控制:自主访问控制(DAC)和强制访问控制(MAC).标准Linux安全是一种DAC,SELinux为Linux增加了一个灵活的和可配置的的MAC. 进程启动时所拥有的权限就是运行此 ...

  3. SELinux 入门【转】

    一.前言 安全增强型 Linux(Security-Enhanced Linux)简称 SELinux,它是一个 Linux 内核模块,也是 Linux 的一个安全子系统.SELinux 主要由美国国 ...

  4. SELinux 入门

    几乎可以肯定每个人都听说过 SELinux (更准确的说,尝试关闭过),甚至某些过往的经验让您对 SELinux 产生了偏见.不过随着日益增长的 0-day 安全漏洞,或许现在是时候去了解下这个在 L ...

  5. SELinux入门学习总结

    前言 安全增强型 Linux(Security-Enhanced Linux)简称 SELinux,它是一个 Linux 内核模块,也是 Linux 的一个安全子系统. SELinux 主要由美国国家 ...

  6. /etc/selinux/config

    /etc/selinux/configSELINUX=disabled改成了SELINUX=enforcing机器无法启动 linux无法启动怎么解决:[1]selinux配置错误 SELinux 入 ...

  7. 因SELinux引起的用户登录问题解决案例

    增强安全性带来的负作用往往是牺牲便利性,就像北京地铁的安检一样,但有些时候我们确实需要它.   案例是,用户有一台安装了KylinOS(国产麒麟,使用的是redhat的内核)的系统,当我们对其系统文件 ...

  8. [转]linux之初识SELinux

    转自:http://www.linuxidc.com/Linux/2014-07/104447.htm 1.selinux的概述 selinux相信大家一定不会陌生,它的全称是内核级加强型防火墙.在服 ...

  9. linuxtoy.org资源

    https://linuxtoy.org/archives.html Archives 在 Android 系统上安装 Debian Linux 与 R (2015-07-14) Pinos:实现摄像 ...

  10. Apache Hadoop2.x 边安装边入门

    完整PDF版本:<Apache Hadoop2.x边安装边入门> 目录 第一部分:Linux环境安装 第一步.配置Vmware NAT网络 一. Vmware网络模式介绍 二. NAT模式 ...

随机推荐

  1. 大立科技DM63红外相机SDK开发Ⅰ-连接仪器

    1.开发准备 为了方便发开,需要下载Visual Studio,本开发基于Visual Studio 2022,使用C++. 通过Visual Studio创建好项目后,将DMSDK V1.16.3内 ...

  2. 深入了解PBKDF2加密技术:原理与实践

    摘要:本文详细介绍了PBKDF2(Password-Based Key Derivation Function 2)加密技术,包括其原理.算法流程和实际应用,旨在帮助读者更好地理解这一重要的加密方法. ...

  3. 【Javaweb】了解link标签

    link标签的属性 标签就是定义文档和外部的关系,常见用途是链接样式表.通常指存在于head部分. 规定被连接文档的位置 <link rel='stylesheet' href='./ease. ...

  4. GOF23--23种设计模式(一)

    一.什么是设计模式 设计模式(Design  Pattern)是前辈们对代码开发经验的总结,是解决一系列特定问题的套路. 它不是语法规定,而是一套用来提高代码复用性,可读性,可维护性,稳健性,安全性的 ...

  5. 文心一言 VS 讯飞星火 VS chatgpt (154)-- 算法导论12.3 1题

    一.用go语言,给出 TREE-INSERT 过程的一个递归版本. 文心一言,代码不能运行: 下面是用 Go 语言实现一个递归版本的 TREE-INSERT 过程的代码: package main i ...

  6. 后端程序员必会的前端知识-02:JavaScript

    第二章. Javascript 它是一种脚本语言,可以用来更改页面内容,控制多媒体,制作图像.动画等等 例子 修改页面内容 js 代码位置 <script> // js 代码 </s ...

  7. Lucas定理 、斯特灵公式

    斯特灵公式是一条用来取n阶乘的近似值的数学公式. 公式为: 用该公式我们可以用来估算n阶乘的值:估算n阶乘的在任意进制下的位数. 如何计算在R进制下的位数:我们可以结合对数来计算,比如十进制就是lg( ...

  8. 【UniApp】-uni-app-处理项目输入数据(苹果计算器)

    前言 上一篇文章完成了项目的基本布局,这一篇文章我们来处理一下项目的输入数据 项目的输入数据主要是通过按键来输入的,所以我们需要对按键进行处理 那么我们就来看一下 uni-app-处理项目输入数据 步 ...

  9. Hugging Face 年度回顾:2023,开源大模型之年

    在 2023 年,大型语言模型(Large Language Models,简称 LLMs)受到了公众的广泛关注,许多人对这些模型的本质及其功能有了基本的了解.是否开源的议题同样引起了广泛的讨论.在 ...

  10. 『UniApp』uni-app-打包成App

    前言 大家好,我是 BNTang, 在上一节文章中,我给大家详细的介绍了如何将我开发好的项目打包为微信小程序并且发布到微信小程序商店 趁热打铁,在来一篇文章,给大家详细的介绍如何将项目打包成APP. ...