OpenHarmony-SELinux配置

前言

OpenHarmony 上某个进程向samgr注册SA服务,其他进程在与该进程进行IPC通信之前,需要获取该SA服务,SA提供方需要为该SA配置SELinux标签,否则该SA会被SELinux配置为u:object_r:default_service:s0标签,配置访问default_service的策略会被neverallow禁止,本文将介绍如何为新增的SA配置SELinux策略。

一、SELinux简介

SELinux (安全增强式 Linux , Security-Enhanced Linux )是 Linux 的安全组件,包含一组内核修改和用户空间工具,并提供了基于安全策略的强制访问控制机制( Mandatory Access Control ,MAC )。SELinux 已经被添加到各种 Linux 发行版中,其软件架构力图将软件执行与安全策略设计分离。本部件负责对文件、属性、服务等系统资源提供强制访问控制保护。提供neverallow规则限制系统中的高危操作,减少系统安全风险。

访问控制基本流程如下图所示:

1.1 整体架构

1.2 策略目录结构

OpenHarmony SELinux策略文件存放在//base/security/selinux_adapter/sepolicy/ohos_policy路径下,在该目录下按以下规范存放:

├── 子系统
│   └── 部件
│       ├── public
│       │   └── type1.te
│       ├── vendor
│       │   └── type2.te
│       └── system
│           └── type3.te

其中,系统相关策略存放在system目录下,芯片相关策略存放在vendor目录下,系统和芯片共用的策略存放在public目录下。

1.3 通用策略文件

通用策略文件,是指设备开发者进行SELinux策略配置时,涉及修改的文件。

1.4 基础策略文件

基础策略文件,是指SELinux基础框架的SELinux策略文件,一般不涉及修改。

1.5 SELinux模式开关

将镜像烧录到开发板上,开机,通过串口拿到 Shell ,在其中执行:

ls -lZ /         # 查看文件标签
ls -lLZ /        # 查看link源文件标签
ps -eZ           # 查看进程标签
setenforce 1     # 使能selinux强制模式(enforcing)
setenforce 0     # 是能selinux宽容模式,当前默认宽容模式(permissive)
getenforce       # 获取selinux工作模式

selinux模式开关配置文件 :开发板 /etc/selinux/config

二、SELinux策略

2.1 avc日志信息

当系统行为被SELinux拦截时,会在内核日志和hilog中打印相关的avc denied日志,格式如下:

//使用dmesg查看日志
audit: type=1400 audit(1502458430.566:4): avc:  denied  { open } for  pid=1658 comm="setenforce" path="/sys/fs/selinux/enforce" dev="selinuxfs" ino=4 scontext=u:r:hdcd:s0 tcontext=u:object_r:selinuxfs:s0 tclass=file permissive=1//关键字:avc: denied//日志解读
open                                #操作为open
pid=1658                            #访问主体进程号为1658
comm="setenforce"                   #访问主体进程名为setenforce
path="/sys/fs/selinux/enforce"      #被访问客体为/sys/fs/selinux/enforce
dev="selinuxfs"                     #被访问文件属于selinuxfs这一文件系统
ino=4                               #文件节点编号为4
scontext=u:r:hdcd:s0                #访问主体selinux标签为u:r:hdcd:s0
tcontext=u:object_r:selinuxfs:s0   #被访问客体selinux标签为u:object_r:selinuxfs:s0
tclass=file                         #当前告警属于file类型的操作
permissive=1                        #当前selinux处于宽容模式,只告警不做访问拦截。强制模式时,做拦截, permissive=0//分析:
缺少啥权限:denied  { open }
谁缺少权限:scontext=u:r:hdcd:s0
对哪个文件缺少:tcontext=u:object_r:selinuxfs:s0
什么类型:tclass=file
通用公式为:allow {scontext} {tcontext}:{tclass} {denied权限}

开发者可以使用关键字avc denied来过滤日志,对于影响业务的avc告警,可以利用告警提供的信息来编写相应的SELinux策略,例如:

上述avc日志对应的TE规则为

allow hdcd selinuxfs:file open;

2.2 策略格式

SELinux策略,又称SELinux规则,通常以allow或neverallow开头,表示允许或禁止某种行为。在设备上使能SELinux时,SELinux会拦截所有未经allow规则授权的行为,配置allow规则可以放行,neverallow规则主要是拦截危险规则的配置。通常allow规则如下:

allow subject object:class permissions;

表示允许subjectobject进行class中的permissions操作,其中:

  • subject表示主体,通常为进程的SELinux类型,如init
  • object表示客体,通常为系统资源的SELinux类型,如data_file
  • class表示要执行的操作的类型,如文件操作file、目录操作dir、套接字操作socket。
  • permissions表示要执行的具体操作,如对文件file的open、read、write。

同理,

neverallow subject object:class permissions;

表示不允许subjectobject进行class中的permissions操作。

2.3 策略宏隔离

在考虑设备开发者便利的同时,需要兼顾商用设备安全性,因此OpenHarmony SELinux提供了策略宏隔离,决定在不同版本上策略是否生效。OpenHarmony SELinux中支持对仅在root版本生效的策略做宏隔离,宏名称为debug_only。在用于设备开发者调试的root版本中,也就是在版本编译命令中指定--build-variant root时,宏开启。在用于商用发布的user版本中,也就是在版本编译命令中指定--build-variant user时,宏关闭。该宏的使用方法参考如下:

debug_only(`allow ueventd init:fd use;
')

另外,OpenHarmony SELinux中也支持对开发者模式的策略做宏隔离,宏名称为developer_only,该宏默认开启。开发者模式策略是指,为便于使用user版本进行调试开发的开发者,需要开放的一些用于调试的SELinux策略。开发者模式宏的使用方法参考如下:

developer_only(`allow sh init:fd use;
')

三、配置SELinux策略

此处以开发activation_sa激活服务为例,详细介绍如何为sa服务配置selinux策略。

3.1 配置service_contexts

在sepolicy/base/public/service_contexts文件内,新增SAID与SA标签的映射关系:(SAID在activation_sa服务中定义,如foundation/activation/activation/sa_profile/BUILD.gn)

10                                     u:object_r:sa_render_service:s0
...                                    ...
7002                                   u:object_r:sa_ui_appearance:s0
8001                                   u:object_r:sa_ca_daemon_service:s0
10000                                  u:object_r:sa_activation_sa:s0

在service.te中定义对应的sa_activation_sa,使对应的标签合法:

type sa_activation_sa, sa_service_attr

3.2 配置type.te

由init通过cfg文件孵化的SA服务进程,需要在sa服务的本进程cfg文件中新增secon字段(本例子为 foundation/activation/activation/etc/activation_sa.cfg),建立进程与标签的映射关系。如果未配置secon字段,进程在SELinux使能状态会被拦截启动。

{"services" : [{"name" : "activation_sa","path" : ["/system/bin/sa_main", "/system/profile/activation_sa.json"],"uid" : "system","gid" : ["system", "shell"],"start-mode" : "boot","secon" : "u:r:activation_sa:s0"}]
}

因此,需要在type.te中定义SELinux标签u:r:activation_sa:s0中的SELinux类型activation_sa,使u:r:activation_sa:s0是合法的:

type activation_sa, sadomain, domain;

此外,需要调用binder_call,在activation_sa.te中添加

binder_call(activation_sa, samgr);
allow activation_sa sa_activation_sa:samgr_class { get add };

3.3 查看avc日志信息

dmesg |grep activation_sa
[   11.766938] [pid=1][Init][INFO][init_service_manager.c:1088]Start service activation_sa
[   11.768130] [pid=1][Init][INFO][init_common_service.c:567]Service activation_sa(pid 606) started
[   34.494845] audit: type=1400 audit(1502631529.323:301): avc:  denied  { getattr } for  pid=1395 comm="ps" path="/proc/606" dev="proc" ino=27789 scontext=u:r:sh:s0 tcontext=u:r:activation_sa:s0 tclass=dir permissive=1
[   45.994459] audit: type=1400 audit(1502631540.823:317): avc:  denied  { read } for  pid=1426 comm="ps" name="stat" dev="proc" ino=30816 scontext=u:r:sh:s0 tcontext=u:r:activation_sa:s0 tclass=file permissive=1
[   45.994494] audit: type=1400 audit(1502631540.823:318): avc:  denied  { open } for  pid=1426 comm="ps" path="/proc/606/stat" dev="proc" ino=30816 scontext=u:r:sh:s0 tcontext=u:r:activation_sa:s0 tclass=file permissive=1
[   51.714670] audit: type=1400 audit(1502631546.543:334): avc:  denied  { getattr } for  pid=1443 comm="ps" path="/proc/606" dev="proc" ino=27789 scontext=u:r:sh:s0 tcontext=u:r:activation_sa:s0 tclass=dir permissive=1
[   51.714712] audit: type=1400 audit(1502631546.543:335): avc:  denied  { search } for  pid=1443 comm="ps" name="606" dev="proc" ino=27789 scontext=u:r:sh:s0 tcontext=u:r:activation_sa:s0 tclass=dir permissive=1

根据日志配置te策略,新增sepolicy/ohos_policy/activation/test/system/sh.te

allow sh activation_sa:dir { getattr search };
allow sh activation_sa:file { read open getattr };

注意:随着策略不断配置,还会出现很多新的avc日志,要全部配置完全。

3.4 其他

如果配置完上述策略后,应用程序还是无法调用activation_sa中的方法,那么还需在对应等级的应用te文件(如settings应用权限等级为system_basic,那么对应新增system_basic_hap.te)中添加:

allow system_basic_hap_attr activation_sa:binder { call transfer };
allow system_basic_hap_attr sa_activation_sa:samgr_class { get };

通过上述一系列配置,新增的activation_sa服务能够在selinux开启强制模式下正常启动,且应用程序能够调用到activation_sa服务中定义的接口。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/32272.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

信息安全访问控制、抗攻击技术、安全体系和评估(高软42)

系列文章目录 信息安全访问控制、抗攻击技术、安全体系和评估 文章目录 系列文章目录前言一、信息安全技术1.访问控制2.抗攻击技术 二、欺骗技术1.ARP欺骗2.DNS欺骗3.IP欺骗 三、抗攻击技术1.端口扫描2.强化TCP/IP堆栈 四、保证体系和评估1.保证体系2.安全风险管理 五、真题在…

使用Nodejs基于DeepSeek加chromadb实现RAG检索增强生成 本地知识库

定义 检索增强生成(RAG)的基本定义 检索增强生成(Retrieval-Augmented Generation,简称RAG)是一种结合了信息检索技术与语言生成模型的人工智能技术。RAG通过从外部知识库中检索相关信息,并将其作为提示&…

LeeCode题库第五十二题

52.N皇后 项目场景: n 皇后问题 研究的是如何将 n 个皇后放置在 n n 的棋盘上,并且使皇后彼此之间不能相互攻击。 给你一个整数 n ,返回 n 皇后问题 不同的解决方案的数量。 示例 1: 输入:n 4 输出:2…

48. 旋转图像(C++)

题目 给定一个 n n 的二维矩阵 matrix 表示一个图像。请你将图像顺时针旋转 90 度。 你必须在 原地 旋转图像,这意味着你需要直接修改输入的二维矩阵。请不要 使用另一个矩阵来旋转图像。 示例 1: 输入:matrix [[1,2,3],[4,5,6],[7,8,9]…

Ragflow技术栈分析及二次开发指南

Ragflow是目前团队化部署大模型+RAG的优质方案,不过其仍不适合直接部署使用,本文将从实际使用的角度,对其进行二次开发。 1. Ragflow 存在问题 Ragflow 开源仓库地址:https://github.com/infiniflow/ragflow Ragflow 当前版本: v0.17.0 Ragflow 目前主要存在以下问题: …

【医院成本核算专题】8.大数据与医院成本核算的关联点:开启医疗成本管理新时代

医院成本核算、绩效管理、运营统计、内部控制、管理会计专题索引 一、引言 在当今数字化飞速发展的时代,大数据已成为各行业变革与发展的关键驱动力。自 2011 年麦肯锡公司提出 “大数据时代” 以来,数据量呈爆发式增长。据 IDC 统计,2011 年全世界创建和复制的数据总量达…

QT:串口上位机

创建工程 布局UI界面 设置名称 设置数据 设置波特率 波特率默认9600 设置数据位 数据位默认8 设置停止位 设置校验位 调整串口设置、接收设置、发送设置为Group Box 修改配置 QT core gui serialport 代码详解 mianwindow.h 首先在mianwindow.h当中定义一个串口指…

C# Enumerable类 之 集合操作

总目录 前言 在 C# 中,System.Linq.Enumerable 类是 LINQ(Language Integrated Query)的核心组成部分,它提供了一系列静态方法,用于操作实现了 IEnumerable 接口的集合。通过这些方法,我们可以轻松地对集合…

网络安全 api 网络安全 ast技术

随着应用或者API被攻击利用已经越来越多,虽然来自开源组件的漏洞加剧了这一现象的发生,但是,其实主要还是在于应用程序或者API本身没有做好防范,根源在于源代码本身的质量没有严格把控。AST是指Application Security Testing&…

【2025前端高频面试题——系列一之MVC和MVVM】

前端高频面试题——系列一之MVC和MVVM 前言一、MVC的基本逻辑二、MVVM的基本逻辑总结 提示:片尾总结了要点,硬背的话直接跳到最后 前言 相信持续关注我文章的小伙伴知道我之前就MVC和MVVM做过较为详细的讲解,但是我发现,他依旧是…

axure11安装教程包含下载、安装、汉化、授权(附安装包)图文详细教程

文章目录 前言一、axure11安装包下载二、axure11安装教程1.启动安装程序2.安装向导界面3.安装协议协议页面2.选择安装位置3.开始安装4.完成安装 三、axure11汉化教程1.axure11汉化包2.axure11汉化设置 四、axure11授权教程1.打开axure112.设置使用方式3.输入许可证号4.axure11安…

Ubuntu 22.04使用pigz多线程快速解压/压缩文件

最近搞项目,资料太大,解压时间太久,于是想办法解决。 开贴记录。 1.安装pigz sudo apt install pigz 2.解压资料 解压命令为 tar --use-compress-programpigz -xvpf ***.tar.gz 将最后的部分***.tar.gz换成你自己的文件即可 例如 ti…

版本控制器Git(3)

文章目录 前言一、分支管理策略二、Bug分支管理遇到Bug时的处理方法使用 git stash 暂存工作区内容创建并切换到Bug修复分支恢复之前的工作 三、临时分支的删除总结 前言 我们在上篇讲到了分支,现在我们就着这个继续来讲解! 一、分支管理策略 master分支…

pytest+allure+jenkins

本地运行参考:pytestallure 入门-CSDN博客 jenkins运行如下: 安装插件:allure 配置allure安装目录 配置pytest、allure 环境变量 配置流水线 进行build,结果如下 ,点击allure report 查看结果

AI术语整理(持续更新)

在AI相关的学习和使用中,经常会被各种术语混淆,搞清楚术语本来的含义是关键,本文收集整理了部分AI相关术语,会持续更新。 基础概念 人工智能(Artificial Intelligence,AI):一种模…

【蓝桥杯单片机】第十一届省赛

一、真题 二、创建工程 1.在C盘以外的盘新建文件夹,并在文件夹里面创建两个文件夹Driver 和Project 2.打开keil软件,在新建工程并选择刚刚建好的project文件夹,以准考证号命名 3.选择对应的芯片型号 4.选择否,即不创建启动文件 …

GMT绘图笔记:用深度作为表面高度(Z 值),用其他物理量(泊松比)给表面着色

之前用GMT绘制莫霍面的三维示意图是用的莫霍面的深度作为表面着色。 GMT绘图笔记:绘制堆叠三维图_gmt画图-CSDN博客 如果要换成其他的物理场,比如泊松比,则需要使用以下的代码 gmt begin BS_figures2 png,pdf E600 # 绘制底图 # Chistrong…

docker搭建elk

文章目录 1.拉取镜像2.ES配置3.logstash配置4.kibana配置5.创建自定义网络6.docker-compose.yml文件7.springboot对接Logstash1.创建一个springboot项目引入主要依赖2.application.yml配置3.resources目录中新增logback-spring.xml4.启动项目,搞点日志5.进入kibana控…

golang算法快慢指针

876. 链表的中间结点 给你单链表的头结点 head ,请你找出并返回链表的中间结点。 如果有两个中间结点,则返回第二个中间结点。 示例 1: 输入:head [1,2,3,4,5] 输出:[3,4,5] 解释:链表只有一个中间结…

瑞云渲染专访奥斯卡提名制片人兼女性动画人协会副主席Jinko Gotoh!

都说CG行业男多女少,女同胞都是珍稀资源,但艺术领域怎么可以没有女性视角呢?本期推文我们邀请到了动画行业资深大佬后藤纯子Jinko Gotoh,作为奥斯卡提名制片人兼女性动画人协会副主席,后藤纯子始终以多元文化倡导者与创…