哈喽大家好,我是咸鱼

文章《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. 三维形体的表面积(3.25leetcode每日打卡)

    在 N * N 的网格上,我们放置一些 1 * 1 * 1  的立方体. 每个值 v = grid[i][j] 表示 v 个正方体叠放在对应单元格 (i, j) 上. 请你返回最终形体的表面积.   ...

  2. 【开源项目推荐】通用SQL数据血缘分析工具——Sqllineage

    大家好,我是独孤风,从本周开始,争取每周为大家带来一个优秀的开源项目推荐. 开源项目不仅促进了技术的发展和普及,还为全球范围内的开发者和用户社区建立了一个共享知识.协作和创新的平台.站在巨人的肩膀上才 ...

  3. [ABC282Ex] Min + Sum

    Problem Statement You are given two sequences of integers of length $N$: $A = (A_1, A_2, \ldots, A_N ...

  4. linux环境下脚本部署项目出现nohup: redirecting stderr to stdout问题

    解决办法: 把后面的 "&" 改成 "2>&1 &" 最终改为: nohup java -jar ${JAR_NAME} --lo ...

  5. 一款基于.NET Core的快速开发框架、支持多种前端UI、内置代码生成器

    前言 经常看到有小伙伴在技术群里问有没有什么好用且快速的开发框架推荐的,今天就给大家分享一款基于MIT License协议开源.免费的.NET Core快速开发框架.支持多种前端UI.内置代码生成器. ...

  6. Javascript面向对象的程序设计 —— 自定义类实现继承的6种方法

    许多OO语言都支持两种继承方式: 接口继承:只继承方法签名: 实现继承:继承实际的方法.ECMAScript只支持实现继承,实现继承是继承实际的方法,依靠原型链来实现.1.原型链原型链是实现继承的主要 ...

  7. 【UniApp】-uni-app-打包成网页

    前言 经过上一篇文章的介绍,已经将这个计算器的计算功能实现了,接下来就是我们项目当中的一个发包上线阶段,我模拟一下,目的就是为了给大家介绍一下,uni-app是如何打包成网页的. 除了可以打包成网页, ...

  8. Python 实现HTML 转Word

    之前文章分享过如何使用Spire.Doc for Python库将Word文档转为HTML格式,反过来,该库也能实现HTML到Word文档的转换.通过代码进行转换,避免了手动复制粘贴费时间,并且可能会 ...

  9. TypeScript核心基础

    前言 为了方便我们直接使用脚手架让他帮我们直接编译就完事了 创建一个 Vue 应用 前提条件 熟悉命令行 已安装 16.0 或更高版本的 Node.js npm init vue@latest 这一指 ...

  10. 搭建vulfocus靶场

    搭建vulfocus靶场 第一种方法 docker pull一下执行如下命令即可 docker pull vulfocus/vulfocus:latest docker run -d -p 8081: ...