SELinux 入门 pt.2
哈喽大家好,我是咸鱼
在《SELinux 入门 pt.1》中,咸鱼向各位小伙伴介绍了 SELinux 所使用的 MAC 模型、以及几个重要的概念(主体、目标、策略、安全上下文)
我们还讲到:
- 对于受 SELinux 管制的进程,会先检查 SELinux 策略规则,然后再检查 DAC 规则
- 对于不受 SELinux 管制的进程,仍然会执行 DAC 规则
也就是说对于受 SELinux 管制的进程而言,想要对文件资源进行操作,需要先经过 SELinux 策略规则的三个关卡(SELinux 模式查看——>策略规则比对——>安全上下文比对),然后再经过 DAC 规则中的 rwx 权限比对
过程如下图所示

需要注意的是,并不是所有的程序都会被 SELinux 所管制,被 SELinux 管制的进程主体被称为【受限程序主体】
举个例子,我们看一下 crond 进程和 bash 进程
# 通过 ps 命令查看
[root@localhost ~]# ps -eZ | grep -E 'cron|bash'
system_u:system_r:crond_t:s0-s0:c0.c1023 1340 ? 00:00:00 atd
unconfined_u:unconfined_r:unconfined_t:s0-s0:c0.c1023 28094 pts/0 00:00:00 bash
system_u:system_r:crond_t:s0-s0:c0.c1023 28174 ? 00:00:00 crond
可以看到,crond 是受限的主体进程(crond_t),而 bash 因为是本机进程,因此就是不受限 unconfined_t 的类型,即 bash 可以直接进行 rwx 权限比对,而不需要进行 SELinux 策略规则比对
接下来我们来分别看一下 SELinux 策略规则比对中的三个关卡
SELinux 运行模式
受限程序主体首先来到第一关:SELinux 运行模式比对
SELinux 有三种运行模式,用于控制系统中进程和文件资源访问的安全性
这三种模式分别是:
- Enforcing(强制)
这个是默认的模式,在这个模式下 SELinux 正常运行,会强制执行访问控制规则,限制进程和用户对系统资源的访问
如果一个进程试图执行未经授权的操作,如读取或修改受限文件,强制模式会阻止这些操作并记录相关的安全事件
- permissive(宽松)
在宽松模式下,SELinux 会记录违反访问规则的操作,但不会阻止它们
这允许用户查看哪些操作会受到限制,但不会影响应用程序的正常运行
宽容模式通常用于识别需要修改的规则,以确保应用程序在强制模式下可以正常运行
- disabled(禁用)
在禁用模式下,SELinux 完全被关闭,不再对进程和文件访问进行任何安全限制
如何查看当前 SELinux 的运行模式?
[root@localhost ~]# getenforce
Enforcing
如果返回结果是 Enforcing,表示当前运行在强制模式;如果是 Permissive,表示运行在宽容模式;如果是 Disabled,表示 SELinux 被禁用
如何切换 SELinux 运行模式?
- 临时切换
# 更改为 enforcing 模式
[root@localhost ~]# setenforce 1
# 更改为 permissive 模式
[root@localhost ~]# setenforce 0
PS:临时切换系统重启后会恢复为默认模式
如果 SELinux 为 disabled 运行模式,表示 SELinux 已经关闭,是无法切换成 Enforcing 模式或 Permissive 模式的
- 永久切换
如果要永久更改,需要修改配置文件
以 CentOS 7.x 为例
[root@localhost ~]# vim /etc/selinux/config
将 SELINUX 的值更改为 enforcing、permissive 或 disabled,保存文件然后重启系统
策略与规则
受限主体程序通过第一关之后来到第二关——策略(policy)和规则(rule)比对
可以使用 sestatus 来查看当前 SELinux 使用那些策略
sestatus
-v:检查位于 /etc/sestatus.conf 中的文件与进程的安全上下文
-b:显示当前策略的规则(以布尔值列出)
[root@localhost ~]# sestatus
SELinux status: enabled # selinux 是否启动
SELinuxfs mount: /sys/fs/selinux # selinux 相关文件挂载点
SELinux root directory: /etc/selinux # 根目录
Loaded policy name: targeted # 当前策略
Current mode: permissive # 当前模式
Mode from config file: enforcing # 当前在配置文件内的模式
Policy MLS status: enabled # 是否包含 MLS 模式
Policy deny_unknown status: allowed # 是否预设抵挡未知的主体进程
Max kernel policy version: 31
如果想要查看当前策略下的规则,可以使用setatus -b 或者 getsebool 命令
[root@localhost ~]# sestatus -a
[root@localhost ~]# getsebool
[root@localhost ~]# getsebool -a
abrt_anon_write --> off
abrt_handle_event --> off
abrt_upload_watch_anon_write --> on
antivirus_can_scan_system --> off
antivirus_use_jit --> off
auditadm_exec_content --> on
authlogin_nsswitch_use_ldap --> off
authlogin_radius --> off
authlogin_yubikey --> off
awstats_purge_apache_log_files --> off
boinc_execmem --> on
cdrecord_read_content --> off
cluster_can_network_connect --> off
cluster_manage_all_files --> off
cluster_use_execmem --> off
cobbler_anon_write --> off
...
我们可以看到上面的输出中有特别多的 SELinux 规则,但是每个规则中具体是怎么限制的我们却还不知道
我们可以通过 seinfo 等工具进行查看
# 需要先下载
[root@localhost ~]# yum install -y setools-console
# 可以看到策略是 targeted,这个策略的安全上下文类型有 4793 个,而规则(Booleans)则有 316 条
[root@localhost ~]# seinfo
Statistics for policy file: /sys/fs/selinux/policy
Policy Version & Type: v.31 (binary, mls)
Classes: 130 Permissions: 272
Sensitivities: 1 Categories: 1024
Types: 4793 Attributes: 253
Users: 8 Roles: 14
Booleans: 316 Cond. Expr.: 362
Allow: 107834 Neverallow: 0
Auditallow: 158 Dontaudit: 10022
Type_trans: 18153 Type_change: 74
Type_member: 35 Role allow: 37
Role_trans: 414 Range_trans: 5899
Constraints: 143 Validatetrans: 0
Initial SIDs: 27 Fs_use: 32
Genfscon: 103 Portcon: 614
Netifcon: 0 Nodecon: 0
Permissives: 0 Polcap: 5
# 查看用户
[root@localhost ~]# seinfo -u
Users: 8
sysadm_u
system_u
xguest_u
root
guest_u
staff_u
user_u
unconfined_u
# 查看角色
[root@localhost ~]# seinfo -r
Roles: 14
auditadm_r
dbadm_r
guest_r
staff_r
user_r
logadm_r
object_r
secadm_r
sysadm_r
system_r
webadm_r
xguest_r
nx_server_r
unconfined_r
前面我们知道 crond 进程的类型是 crond_t,那我想知道 crond_t 这个 domain 能够读取那些 type 的文件资源
# 查询 crond_d 主体
[root@localhost ~]# sesearch -A -s crond_t
...
allow crond_t user_cron_spool_t : file { ioctl read write create getattr setattr lock append unlink link rename open } ;
allow crond_t user_cron_spool_t : dir { ioctl read write getattr lock add_name remove_name search open } ;
allow crond_t unconfined_cronjob_t : process transition ;
allow crond_t openshift_domain : process transition ;
allow crond_t security_t : lnk_file { read getattr } ;
...
allow 后面接主体进程以及文件的 SELinux 类型,比如说 crond_t 可以读取 user_cron_spool_t 类型的文件和目录
那如果想要关闭或打开某个 SELinux 规则,该怎么办
# 查询到下面的规则是 off 状态,我们想打开它
[root@localhost ~]# getsebool httpd_enable_homedirs
httpd_enable_homedirs --> off
# 启动
# 一定要加上 -P ,这样才会写入配置文件
[root@localhost ~]# setsebool -P httpd_enable_homedirs 1
安全上下文
第一关考虑 SELinux 三种运行模式,第二关考虑了 SELinux 的策略规则
现在我们来到了第三关——安全上下文比对
关于安全上下的知识我在《SELinux 入门 pt.1》中已经介绍过了,今天我们着重讲下安全上下文的修改
- chcon 手动修改
chcon 命令的基本语法如下:
chcon [options] context file...
其中,context表示要设置的安全上下文,file...表示要修改的文件或目录路径。下面是一些常用的选项和示例:
- -R, --recursive: 递归修改指定目录下所有文件的安全上下文
- -t, --type: 指定要设置的新类型标签
- -u, --user: 指定要设置的新用户
- -r, --role: 指定要设置的新角色
举几个例子
# 修改文件的安全上下文类型:
chcon -t httpd_sys_content_t /var/www/html/index.html
# 递归修改目录及其子目录中的文件安全上下文类型:
chcon -R -t httpd_sys_content_t /var/www/html/
# 修改文件的安全上下文用户和角色:
chcon -u system_u -r object_r /path/to/file
- restorecon 恢复为默认值
使用 chcon 命令修改安全上下文可能会导致某些文件和目录的访问权限问题
如果对 SELinux 的运作机制和相应的安全策略不熟悉的,可以使用 restorecon 命令恢复默认的 SELinux 上下文
基本语法如下:
restorecon [-R] [-v] [file...]
-R :表示递归地操作目录及其子目录
-v :表示显示详细信息
file... :是要进行恢复的文件或目录路径
举个例子
# 恢复单个文件的安全上下文:
restorecon /var/www/html/index.html
# 递归地恢复目录及其子目录的安全上下文:
restorecon -R /var/www/html/
# 显示详细信息:
restorecon -v /var/www/html/index.html
SELinux 入门 pt.2的更多相关文章
- SELinux入门
导读 如果你在之前的Linux生涯中都禁用或忽略了SELinux,这篇文章就是专门为你写的:这是一篇对存在于你的Linux桌面或服务器之下的SELinux系统的介绍,它能够限制权限,甚至消除程序或守护 ...
- SELinux入门简介
操作系统有两类访问控制:自主访问控制(DAC)和强制访问控制(MAC).标准Linux安全是一种DAC,SELinux为Linux增加了一个灵活的和可配置的的MAC. 进程启动时所拥有的权限就是运行此 ...
- SELinux 入门【转】
一.前言 安全增强型 Linux(Security-Enhanced Linux)简称 SELinux,它是一个 Linux 内核模块,也是 Linux 的一个安全子系统.SELinux 主要由美国国 ...
- SELinux 入门
几乎可以肯定每个人都听说过 SELinux (更准确的说,尝试关闭过),甚至某些过往的经验让您对 SELinux 产生了偏见.不过随着日益增长的 0-day 安全漏洞,或许现在是时候去了解下这个在 L ...
- SELinux入门学习总结
前言 安全增强型 Linux(Security-Enhanced Linux)简称 SELinux,它是一个 Linux 内核模块,也是 Linux 的一个安全子系统. SELinux 主要由美国国家 ...
- /etc/selinux/config
/etc/selinux/configSELINUX=disabled改成了SELINUX=enforcing机器无法启动 linux无法启动怎么解决:[1]selinux配置错误 SELinux 入 ...
- 因SELinux引起的用户登录问题解决案例
增强安全性带来的负作用往往是牺牲便利性,就像北京地铁的安检一样,但有些时候我们确实需要它. 案例是,用户有一台安装了KylinOS(国产麒麟,使用的是redhat的内核)的系统,当我们对其系统文件 ...
- [转]linux之初识SELinux
转自:http://www.linuxidc.com/Linux/2014-07/104447.htm 1.selinux的概述 selinux相信大家一定不会陌生,它的全称是内核级加强型防火墙.在服 ...
- linuxtoy.org资源
https://linuxtoy.org/archives.html Archives 在 Android 系统上安装 Debian Linux 与 R (2015-07-14) Pinos:实现摄像 ...
- Apache Hadoop2.x 边安装边入门
完整PDF版本:<Apache Hadoop2.x边安装边入门> 目录 第一部分:Linux环境安装 第一步.配置Vmware NAT网络 一. Vmware网络模式介绍 二. NAT模式 ...
随机推荐
- 关于Maven执行mvn help:system命令报错
报错: [ERROR] Error executing Maven.[ERROR] 2 problems were encountered while building the effective s ...
- jdk21的外部函数和内存API(MemorySegment)(官方翻译)
1.jdk21: 引入一个 API,通过该 API,Java 程序可以与 Java 运行时之外的代码和数据进行互操作.通过有效地调用外部函数(即JVM外部的代码)和安全地访问外部内存(即不由JVM ...
- [USACO2007OPENS] City Horizon S
题目描述 Farmer John has taken his cows on a trip to the city! As the sun sets, the cows gaze at the cit ...
- 如何判断lib和dll是32位还是64位?答案是使用微软的dumpbin工具,后面讲了如何使用gcc生成lib和dll
为什么我会考虑这个问题呢?因为我在使用java去调用一个c的lib库的时候,弹出以下警告: D:\work\ideaworkpaces\jdk21Test001\src\main\java\lib\h ...
- tensorflow GPU版本配置加速环境
import tensorflow as tf tf.test.is_gpu_available() 背景 环境:Anaconda .tensorflow_gpu==1.4.0 (这里就用1.4.0版 ...
- wife-wife【原型链污染】
wife-wife[原型链污染][难度:4] 题目界面 登录界面 注册界面 思路:在注册界面,利用原型链污染漏洞,获得管理员权限. 步骤 在注册界面输入用户名-密码-邀请码,勾选admin选项,抓包 ...
- 华企盾DSC备用服务器无法启动,日志显示“主服务器停机超过十天”
出现该问题有三种情况: 1.主服务器未启动或授权到期: 2.主服务器申请的在线授权且ERP上存在到期的相同序列号: 3.备用服务器的数据库与主服务器连的不是同一个(检查IP和端口以及数据库名).
- NC65单据模板公式使用
单据模板公式使用 (一) 公式使用场景 用户使用产品时,往往对单据上的字段取值有各种不同的需求.为此单据模板提供 了模板公式功能,可以让实施顾问或者用户通过配置各种公式,并且不用修改代码,从 而满足用 ...
- 文心一言 VS 讯飞星火 VS chatgpt (58)-- 算法导论6.4 2题
文心一言 VS 讯飞星火 VS chatgpt (58)-- 算法导论6.4 2题 二.试分析在使用下列循环不变量时,HEAPSORT 的正确性:在算法的第 2~5行 for 循环每次迭代开始时,子数 ...
- 使用Terraform部署华为云和kubernetes资源
本文分享自华为云社区<使用Terraform部署华为云和kubernetes资源>,作者: 可以交个朋友. Terraform概述 Terraform 是由 HashiCorp 创建的开源 ...