SELinux 入门 pt.1

SELinux,门 · 浏览次数 : 36

小编点评

**文件资源的类型:crond_exec_t** **文件的类型:crond_exec_t** **文件的类型:crond_exec_t** **文件的类型:crond_exec_t** **文件的类型:crond_exec_t** **文件的类型:crond_exec_t** **文件的类型:crond_exec_t** **文件的类型:crond_exec_t** **文件的类型:crond_exec_t** **文件的类型:crond_exec_t**

正文

哈喽大家好,我是咸鱼

文章《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 来控制
image

普通用户想要去读写系统中的文件资源受限于其所属的用户和群组的 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/ 中的文件

image
需要注意的是:

  • 对于受 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 权限
image

安全上下文存放在文件的 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 权限也无法读取
image

总结

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

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

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

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

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

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

与SELinux 入门 pt.1相似的内容:

SELinux 入门 pt.1

哈喽大家好,我是咸鱼 文章《[SELinux 导致 Keepalived 检测脚本无法执行](https://mp.weixin.qq.com/s?__biz=MzkzNzI1MzE2Mw==&mid=2247486319&idx=1&sn=4932d10d7ad39d02d2536be1a70b1

SELinux 入门 pt.2

哈喽大家好,我是咸鱼 在《[SELinux 入门 pt.1](https://mp.weixin.qq.com/s?__biz=MzkzNzI1MzE2Mw==&mid=2247486365&idx=1&sn=4b81b3cc70b085eec6f0a595fda719fb&chksm=c2930b

SElinux 导致 Keepalived 检测脚本无法执行

哈喽大家好,我是咸鱼 今天我们来看一个关于 `Keepalived` 检测脚本无法执行的问题 一位粉丝后台私信我,说他部署的 `keepalived` 集群 `vrrp_script` 模块中的脚本执行失败了,但是手动执行这个脚本却没有任何问题 ![image](https://img2023.cn

[转帖]CentOS7搭建时间服务器-chrony

操作系统:CentOS7防火墙: 关闭防火墙和selinux时间软件:chronyCentOS7我们一直用的ntp时间服务器,虽然到CentOS7上也可以装ntp。chrony与ntp都是时间同步软件,两个软件不能够同时开启,会出现时间冲突.但是由于各种问题,所以建议CentOS7使用chrony同

在kubernetes里使用AppArmor限制容器对资源的访问

在kubernetes里使用AppArmor限制容器对资源的访问,AppArmor,强制访问控制(MAC),SELinux,使用AppArmor限制nginx程序访问目录,complain模式,enforce模式,aa-autodep,aa-logprof,aa-complain,aa-enforc...

Systemd设置ulimit的方式与方法

Systemd设置ulimit的方式与方法 摘要 Linux安装完成之后前面几件事情一般是处理selinux 以及处理ulimit 其实处理文件打开数有多种方法,之前也总结过, 但是最近因为systemd部署的服务问题 有一些疑惑 所以想着一起进行一下总结 ulimit持久化参数的设置 一般处理ul

OpenStack Centos7 T版本搭建

目录Centos7搭建OpenStack T版本 --上1. 环境准备(所有节点操作)1.1 修改主机名1.2 关闭selinux 以及防火墙1.3 修改hosts1.4 配置时间同步controller 操作compute以及其他节点操作1.5 配置OpenStack 软件包1.6 安装数据库1.

[转帖]nfs丢包现象

nfs丢包现象 1.nfs mount出错整理:mount -t nfs -o nolock 192.168.1.99:/pub/share /mnt出现 RPC: Timed out 原因整理:A. 防火墙,SELinuxB. iptables规则(或者直接关掉防火墙)C. /etc/export

Kolla-ansible部署openStack

目录Kolla-ansible部署openStack1. 简介2. 环境准备3. 部署3.1 基础环境配置3.1.1 配置主机名,所有节点操作,这里以openstack01为例3.1.2 添加hosts3.1.3 配置免密登录3.1.4 关闭防火墙以及selinux3.1.5 设置yum源3.1.6

Ceph 架构以及部署

目录Ceph架构存储类型为什么用到Ceph?1. NFS2. MooseFSMooseFS瓶颈3. GlusterFS4. CephCeph的组件Ceph部署前期准备1.1 修改主机名1.2 关闭防火墙以及selinux1.3 配置hosts1.4 配置时间同步2. 安装cephadm2.1 安装g