SELinux策略语法以及示例策略
首发公号:Rand_cs
本文来讲述 SELinux 策略常用的语法,然后解读一下 SELinux 这个项目中给出的示例策略
安全上下文
首先来看一下安全上下文的格式:
user : role : type : level
每一个主体和客体都有一个安全上下文,通常也称安全标签、标签,由 4 部分组成(最后一部分 mls 是可选的)
- user,user 为 SELinux User,而非传统意义上的 Linux User。用户登录系统后,login 程序根据当前策略配置文件,将 Linux User 映射到相应 SELinux User。
- role,不同 SELinux User 所能扮演的 SELinux Role 不同,而不同 SELinux Role 具有不同的能力(权限)。从而方便地给不同的 Linux User 定义不同的能力。
- 客体的 role 都默认为 object_r,这是一个内置变量(代码里面写死的)
NOTE:上述两部分则是 SELinux 提供的 RBAC (Role Based Access Control) 安全模型,目前我们大部分示例不会用到这两个部分。但是根据 SELinux 语法规则,必须要定义至少一个 user 和 role。比如说 Android 运用的策略便没有使用 user、role,在 Android 上,所有 user 部分都是 u,所有 role 部分都是 r (客体的 role 为 object_r)
- type,SELinux 中最重要的部分,SELinux 提供的 TE(Type Enforcement) 安全模型就是基于此来实现的)。每个主体和客体都有自己的类型,但是英文中叫法有点不一样,主体也就是进程的类型叫做 domain,客体(不止文件)的类型就叫做 type,这里看英文文档的时候需要稍微注意一下。
- mls,此部分与文件机密性有关,这是 SELinux 对 BLP 模型的实现,具体的后面再详述
策略语法
标签各部分定义
定义类型属性
type a; #定义一个类型 a
type a_t; #定义一个类型 a_tattribute TestFile; #定义一个属性 TestFiletype b_t, TestFile; #定义一个类型 b_t,具有属性 TestFiletypeattribute a_t TestFile; #使a_t也具有TestFile属性
NOTE:
- type 和 attribute 两者位于同一个命名空间,也就是说如果定义了 type a,那就不能定义 attribute a
- a_t,后面有个 t 是表示 “type” 类型,这是 PC 端 SELinux 策略常见写法,但是 Android 不这样用,没有后缀
- 对于属性的理解,用上面的示例来说,可以理解为 a_t 和 b_t 都具有相同的属性 TestFile,也可以理解为 TestFile 它是一个 {a_t, b_t} 的集合
定义角色
type p_t; # 定义了一个类型 p_t
role rand; # 定义了一个角色 rand
role rand types p_t; #rand 这个角色与 p_t 关联(具有 p_t 的能力)
对于 role 拥有能力的理解:拿上面的例子来说,加入 p_t 对 a_t 这个类型的文件有读写权限,那么因为 rand 与 p_t 关联,我们就认为 rand 这个角色拥有读写 a_t 类型文件的能力
定义用户
user Lyy roles rand; # Lyy 这个 SELinux user 可以扮演 rand 这个角色
定义 mls
sensitivity s0; //定义灵敏度 s0
sensitivity s1; //定义灵敏度 s1
dominance { s0 s1 } //表示 s0 的机密性 低于 s1
这里只是顺便提一下 sensitivity 如何定义,关于 mls 不只有 sensitivity 还有 category,这部分后面的文章再讲,后续的示例策略也不会包含 mls 部分。
客体类别和权限
class file #定义名为 file 的客体类别。注意没有 ';'
class file { read, write } #针对 file 类别的客体,相关权限有 read、write。注意还是没有 ';'common file { read, write } #定义一个权限集合,此集合名为 file
class file inherits file { create } #上述 file 类别关联的权限也可以如此定义,表示 file 类别的权限有 read write create
Acess Vector Rules
有 4 个,allow、dontaudit、auditallow、neverallow
语法格式都是一样的
# a_t 类型的进程 对于 c_t类型的字符文件 有read、write权限
allow a_t c_t : chr_file { read, write };# a_t 访问 c_t:chr_file 失败后,不做日志统计
dontaudit a_t c_t : chr_file { read, write };
# a_t 即使成功访问 c_t:chr_file,也要做日志统计
auditallow a_t c_t : chr_file { read, write };
# 绝不允许 a_t 以 {read,write} 的形式访问 c_t:chr
neverallow a_t c_t : chr_file { read, write };
赋予权限的只有 allow 语句,注意 auditallow 语句也没有赋予权限,只是说即使访问成功,也需要记录此条访问.
allow 语句使用的最为广泛
如果某些访问本就应该拒绝,拒绝是我们期望的,SELinux 默认只要拒绝就会有一条日志记录,但是我们可以使用 dontaudit 语句使其不产生日志记录
auditallow 用于某些重要数据访问,因为它们很重要,即使一些进程有权限访问它们,但也希望有日志记录
neverallow 会在策略编译期间起作用,再举个例子
type a1, A;
type a2, A;
type b1, B;
type b2, B;
neverallow A B:file {read};
allow a1 b1:file {read}; #error
编译的时候便会检查到这类错误
类型转换规则
type_transition a_t b_exec_t : process b_t;
a_t 类型的进程执行 b_exec_t 类型的可执行程序后,类型转变为 b_t。通常进程要进行类型转换都是在执行不同的 exec 之后转换的。
此语句要生效,还需要 3 条 allow 语句:
# 允许 a_t 到 b_t 的转换
# type_transition 只是指了一条路说你可以执行这个可执行文件来改变自己的类型,
# 但并没有给出实际的权限
allow a_t b_t : process transition;# a_t 类型的进程 需要对 b_exec_t 类型的可执行文件有 执行、读、获取属性 的权限
allow a_t b_exec_t : file { execute read getattr };# b_t 需要对 b_exec_t 有 entrypoint 权限
allow b_t b_exec_t : file entrypoint;
文件系统
SELinux 对文件系统上面的文件提供了几种标记方式,标记方式就是说以何种方式决定文件系统上文件的标签
fs_use_xattr ext4 system_u:object_r:fs_t;
fs_use_xattr 针对支持扩展属性的文件系统,比如说 ext4 文件系统,其上的文件的标签由自身的 xattr 中名为 security.selinux 的扩展属性决定。
后面的 system_u:object_r:fs_t表示文件系统这个客体(具体到数据结构就是 超级块)的标签为 system_u:object_r:fs_t
fs_use_task pipefs system_u:object_r:fs_t;
fs_use_task 用于伪文件系统,比如说 pipefs。使用 fs_use_task 修饰的文件系统,其上的文件的标签都由创建它的父进程决定。同样的对于 pipefs 文件系统本身也就是超级块,其标签为 system_u:object_r:fs_t
fs_use_trans devpts system_u:object_r:devpts_t;
type_transition sysadm_t devpts_t : chr_file sysadm_devpts_t;
fs_use_trans,顾名思义,要基于 transition 规则,比如说如上定义了一条 type_transition 规则,意思是说,当 sysadm_t 类型的进程 在 devpts_t 类型的文件系统上面 创建的文件类型应为 sysadm_devpts_t
如果没有 type_transition 规则,那么其上的文件和文件系统的标签是一致的,对于此例来说就是 devpts_t
genfscon proc / system_u:object_r:proc_t
genfscon proc /kmsg system_u:object_r:proc_kmsg_t
genfscon proc /kcore system_u:object_r:proc_kcore_t
genfscon proc /mdstat system_u:object_r:proc_mdstat_t
genfscon 可以很灵活的定义某个文件系统上的文件的标签,从其上的例子应该就能看出,它能指定一个文件系统下某个目录甚至某个文件的标签。
示例策略
该示例策略来自:https://github.com/SELinuxProject/selinux-notebook/tree/main/src/notebook-examples/selinux-policy
按照文档所述将其编译,得到一个 policy.conf 文件,让我们来简单的过一遍,
# 这里是定义客体类别
class security
class process
class system
....# 这与系统刚启动,selinux 初始化的时候有关,先跳过
sid kernel
sid security
sid unlabeled
sid fs
...# 定义一些权限集合,后面方便与 class 关联
common file {ioctl read write create getattr setattr lock relabelfrom relabelto append map unlink link rename execute quotaon mounton audit_access open execmod watch watch_mount watch_sb watch_with_perm watch_reads }
common socket {ioctl read write create getattr setattr lock relabelfrom relabelto append map bind connect listen accept getopt setopt shutdown recvfrom sendto name_bind }
...# 将 class 与 权限关联起来
class security { compute_av compute_create compute_member check_context load_policy compute_relabel compute_user setenforce setbool setsecparam setcheckreqprot read_policy validate_trans }
class process { fork transition sigchld sigkill sigstop signull signal ptrace getsched setsched getsession getpgid setpgid getcap setcap share getattr setexec setfscreate noatsecure siginh setrlimit rlimitinh dyntransition setcurrent execmem execstack execheap setkeycreate setsockcreate getrlimit }
class system { ipc_info syslog_read syslog_mod syslog_console module_request module_load halt reboot status start stop enable disable reload }# 为了更加动态灵活的控制权限,SELinux 推出 bool,cap 等特性,先跳过
# 如果你想尝试在你的机器上应用此策略,务必务必务必加上 bool xserver_object_manager false;
# 不要问我为什么有三个 务必
policycap network_peer_controls;
bool xserver_object_manager false;# 定义一个类型 unconfined_t
type unconfined_t;
# 定义一个角色 unconfined_r
role unconfined_r;
# unconfined_r 拥有 unconfined_t 的能力
role unconfined_r types { unconfined_t };# 接下来是一系列的 allow 语句,因为是示例策略,且只有一个类型,这里直接使用通配符 * 授予所有权限
allow unconfined_t unconfined_t:security *;
allow unconfined_t unconfined_t:process *;
....# 定义 seuser unconfined_u,可以扮演 unconfined_r 这个角色
user unconfined_u roles { unconfined_r };
# 定义 seuser system_u,可以扮演 unconfined_r 这个角色
user system_u roles { unconfined_r };# 系统启动时初始化相关,先跳过
sid kernel system_u:unconfined_r:unconfined_t
sid security system_u:object_r:unconfined_t
sid unlabeled system_u:object_r:unconfined_t# 定义文件系统标记方式
fs_use_xattr ext2 system_u:object_r:unconfined_t;
fs_use_xattr ext3 system_u:object_r:unconfined_t;
...fs_use_task pipefs system_u:object_r:unconfined_t;
fs_use_task sockfs system_u:object_r:unconfined_t;fs_use_trans mqueue system_u:object_r:unconfined_t;
fs_use_trans devpts system_u:object_r:unconfined_t;
...genfscon selinuxfs / system_u:object_r:unconfined_t
genfscon proc / system_u:object_r:unconfined_t
...
这么一套下来,感觉策略还是挺简单的哈,没那么复杂,像 Android sepolicy、refpolicy 这些策略也就是加了亿点点细节而已,没什么大不了的。
如果想试试这个初始策略,可以按照前文,修改 /etc/selinux/config,然后重启,,,务必记得第一次一定要设置为 permissive 模式
首发公号:Rand_cs
相关文章:
SELinux策略语法以及示例策略
首发公号:Rand_cs 本文来讲述 SELinux 策略常用的语法,然后解读一下 SELinux 这个项目中给出的示例策略 安全上下文 首先来看一下安全上下文的格式: user : role : type : level每一个主体和客体都有一个安全上下文,通常也称安…...
电路笔记 :自激振荡电路笔记 电弧打火机
三极管相关 三极管的形象描述 二极管 简单求解(理想) 优先导通(理想) 恒压降 稳压管(二极管plus) 基础工作模块 理想稳压管的工作特性 晶体管之三极管(“两个二极管的组合” ) 电弧打火机电路 1.闭合开…...
prometheus grafana linux服务器监控
文章目录 前传node-exporter安装配置promethues监控node节点grafana操作查看监控:外传 前传 prometheus grafana的安装使用:https://nanxiang.blog.csdn.net/article/details/135384541 本文说下监控nginx,prometheus grafana linux 安装配…...
有哪些有用的工作技巧?
有效沟通免去麻烦 说起职场的工作技巧,首先不得不提的便是有效沟通。高效的职场沟通不仅能显著提高工作效率,通过清晰准确地传递信息,减少误解和错误,还能促进团队间的紧密合作,建立起相互信任和理解的环境。在面临挑…...
k8s的网络类型
部署 CNI 网络组件 部署 flannel K8S 中 Pod 网络通信: Pod 内容器与容器之间的通信 在同一个 Pod 内的容器(Pod 内的容器是不会跨宿主机的)共享同一个网络命名空间, 相当于它们在同一台机器上一样,可以用 localho…...
《元宇宙2086》团队发布AI创作的元宇宙之歌
《元宇宙2086》团队发布AI创作的元宇宙之歌 数字科技领域著名IP——《元宇宙2086》的团队发布AI创作的《元宇宙之歌》,歌词是AI与人共同完成,作曲、混音、人声合成全部由AI完成并且演唱,歌曲描绘了未来的元宇宙世界。 “踏入元宇宙的奇境&am…...
【数据结构】数组实现队列(详细版)
目录 队列的定义 普通顺序队列的劣势——与链队列相比 顺序队列实现方法: 一、动态增长队列 1、初始化队列 2、元素入队 3、判断队列是否为空 4、元素出队 5、获取队首元素 6、获取队尾元素 7、获取队列元素个数 8、销毁队列 总结: 动态增长队列…...
Sharding-JDBC快速使用【笔记】
1 引言 最近在使用Sharding-JDBC实现项目中数据分片、读写分离需求,参考官方文档(Sharding官方文档)感觉内容庞杂不够有条理,重复内容比较多;现结合项目应用整理笔记如下供大家参考和自己回忆使用; 在…...
总结MySQL 的一些知识点:MySQL 排序
🌷🍁 博主猫头虎(🐅🐾)带您 Go to New World✨🍁 🦄 博客首页——🐅🐾猫头虎的博客🎐 🐳 《面试题大全专栏》 🦕 文章图文…...
Linux中经常使用的相关命令
查看硬盘存储容量使用情况: df -lh 列出 /bin 目录中的 5 个最大文件: ls -lSh /bin | head -5 删除文件和文件夹 在Linux中,要删除文件的命令是rm。你可以使用以下命令来删除一个文件: rm file_name如果要删除多个文件,可…...
2022-2023年度广东省职业院校学生专业技能大赛“软件测试”赛项性能测试题目-Jmeter
性能测试-JM 1、脚本添加: 脚本文件名称:SuppAndComp,测试计划名称:SuppAndComp。测试计划下添加两个线程组: (1)线程组一操作内容:系统管理员登录、进行新增供应商操作。 线程组名称SuppAdd。具体要求如下: 登录操作存放到仅一次控制器中,供应商名称前4位为固定…...
R304S 指纹识别模块的硬件接口说明
一.外部接口尺寸图 二.串行通讯 R304S 指纹模块通讯接口定义: 引脚号名称定义描述15V电源输入电源正输入端 DC 4.2--6V2GND电源和信号地电源和信号地3TXD数据发送串行数据输出,TTL 逻辑电平4RXD数据接收串行数据输入,TTL 逻辑电平 三.USB通…...
postman使用-05新建测试集
文章目录 两种方式新建测试集测试集:允许用户以项目或模块的方式对多个接口进行分类和管理。每一个测试请求都可以被看作是一个独立的测试用例,而collections则可以同时管理多个测试用例的执行。方法一:点击左上角直接创建测试方法二…...
oracle 子查询和窗口函数
描述:给定一张学生学科成绩表base_student_grade,字段id表示学生学号,name为姓名,subject表示学科,grade为某学科成绩。使用子查询和窗口函数查询每个学生成绩最高的学科和分数。 select id,name,subject,grade from (select id,…...
数据库开发与设计过程中的问题分析总结
数据库设计的过程是将数据库系统与现实世界密切地、有机地、协调一致地结合起来的过程。数据库的设计质量与设计者的知识、经验和水平密切相关。作为数据库应用系统的重要组成部分,数据库设计的成败往往直接关系到整个应用系统的成败。以数据库为基础的数据库应用系…...
《数据库开发实践》之存储过程【知识点罗列+例题演练】
一、什么是存储过程? 1.概念理解: 存储过程是一组为了完成特定功能的SQL语句集。通过组成SQL语句和控制语句,提供一种封装任务的方法。因此在创建编译好某个存储过程后,因为存储过程中有可执行操作的sql语句,用户可以…...
Linux进程地址空间
🎬慕斯主页:修仙—别有洞天 ♈️今日夜电波:HEART BEAT—YOASOBI 2:20━━━━━━️💟──────── 5:35 🔄 ◀️ ⏸ ▶️ ☰ …...
2024.1.3 关于 Redis 渐进式遍历 和 数据库管理命令
目录 引言 渐进式遍历 SCAN 命令 数据库管理命令 切换数据库 获取数据库 key 个数 删除数据库所有 key 同步删除 SYNC 异步删除 ASYNC 阅读下述文章之前建议点击下方链接熟悉 keys 命令的用法和特点 Redis 全局通用命令 渐进式遍历 keys * 命令一次性将 Redi…...
并发编程:线程同步基础:5、读写锁。ReentrantReadWriteLock
1、主要方法 .readLock().lock();获取读锁 读锁之间互不干扰。 .writeLock().lock();获取写锁 写锁可以锁定住读锁和其他写操作。 2、主程序 package xyz.jangle.thread.test.n2_5.rwlock;import java.util.concurrent.TimeUnit;/*** * 读写锁。ReentrantReadWriteLock* a…...
SpringBoot 集成 Kafka消息中间件,Docker安装Kafka环境
前述 提供kafka、zooker在docker环境下进行安装的示例,springBoot集成kafka实现producer-生产者和consumer-消费者(监听消费:single模式和batch模式)的功能实现 环境安装 # 拉取镜像 docker pull wurstmeister/zookeeper docker pull wurstmeister/kafka# 运行zooker docker …...
Python爬虫实战:研究feedparser库相关技术
1. 引言 1.1 研究背景与意义 在当今信息爆炸的时代,互联网上存在着海量的信息资源。RSS(Really Simple Syndication)作为一种标准化的信息聚合技术,被广泛用于网站内容的发布和订阅。通过 RSS,用户可以方便地获取网站更新的内容,而无需频繁访问各个网站。 然而,互联网…...
1.3 VSCode安装与环境配置
进入网址Visual Studio Code - Code Editing. Redefined下载.deb文件,然后打开终端,进入下载文件夹,键入命令 sudo dpkg -i code_1.100.3-1748872405_amd64.deb 在终端键入命令code即启动vscode 需要安装插件列表 1.Chinese简化 2.ros …...
第25节 Node.js 断言测试
Node.js的assert模块主要用于编写程序的单元测试时使用,通过断言可以提早发现和排查出错误。 稳定性: 5 - 锁定 这个模块可用于应用的单元测试,通过 require(assert) 可以使用这个模块。 assert.fail(actual, expected, message, operator) 使用参数…...
【Go】3、Go语言进阶与依赖管理
前言 本系列文章参考自稀土掘金上的 【字节内部课】公开课,做自我学习总结整理。 Go语言并发编程 Go语言原生支持并发编程,它的核心机制是 Goroutine 协程、Channel 通道,并基于CSP(Communicating Sequential Processes࿰…...
优选算法第十二讲:队列 + 宽搜 优先级队列
优选算法第十二讲:队列 宽搜 && 优先级队列 1.N叉树的层序遍历2.二叉树的锯齿型层序遍历3.二叉树最大宽度4.在每个树行中找最大值5.优先级队列 -- 最后一块石头的重量6.数据流中的第K大元素7.前K个高频单词8.数据流的中位数 1.N叉树的层序遍历 2.二叉树的锯…...
项目部署到Linux上时遇到的错误(Redis,MySQL,无法正确连接,地址占用问题)
Redis无法正确连接 在运行jar包时出现了这样的错误 查询得知问题核心在于Redis连接失败,具体原因是客户端发送了密码认证请求,但Redis服务器未设置密码 1.为Redis设置密码(匹配客户端配置) 步骤: 1).修…...
企业如何增强终端安全?
在数字化转型加速的今天,企业的业务运行越来越依赖于终端设备。从员工的笔记本电脑、智能手机,到工厂里的物联网设备、智能传感器,这些终端构成了企业与外部世界连接的 “神经末梢”。然而,随着远程办公的常态化和设备接入的爆炸式…...
PAN/FPN
import torch import torch.nn as nn import torch.nn.functional as F import mathclass LowResQueryHighResKVAttention(nn.Module):"""方案 1: 低分辨率特征 (Query) 查询高分辨率特征 (Key, Value).输出分辨率与低分辨率输入相同。"""def __…...
JavaScript基础-API 和 Web API
在学习JavaScript的过程中,理解API(应用程序接口)和Web API的概念及其应用是非常重要的。这些工具极大地扩展了JavaScript的功能,使得开发者能够创建出功能丰富、交互性强的Web应用程序。本文将深入探讨JavaScript中的API与Web AP…...
CSS | transition 和 transform的用处和区别
省流总结: transform用于变换/变形,transition是动画控制器 transform 用来对元素进行变形,常见的操作如下,它是立即生效的样式变形属性。 旋转 rotate(角度deg)、平移 translateX(像素px)、缩放 scale(倍数)、倾斜 skewX(角度…...
