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.pswp.cn/web/72030.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/72030.shtml
英文地址,請注明出處:http://en.pswp.cn/web/72030.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

SQL開發中改善查詢性能的N種寫法

文章目錄 1. 使用 SELECT *2. 在 WHERE 子句中使用函數或計算3. 使用隱式類型轉換4. 不使用索引的列進行連接(JOIN)或過濾5. 使用 OR 代替 IN6. 在子查詢中使用 SELECT *7. 忽略索引統計信息8. 嵌套子查詢過多9. 過度使用 DISTINCT10. 使用不當的 JOIN 類…

第十八:go 并發 goroutine

channel 可以讓多個goroutine 之間實現通信 Add方法調用時機:必須在goroutine 啟動之前調用Add方法來增加計數器的值。 如果在goroutine已經啟動之后再調用Add,可能會導致Wait方法提前返回,因為計數器沒有正確反映正在運行的goroutine的數量…

數字IC后端項目典型問題(2025.03.10數字后端項目問題記錄)

小編發現今天廣大學員發過來的問題都比較好,立即一頓輸出分享給大家(每天都有好多種類的數字后端問題)。后續可能會經常通過這種方式來做分享。其實很多問題都是實際后端項目中經常遇到的典型問題。希望通過這種方式的分享能夠幫助到更多需要…

課程《Deep Learning Specialization》

在coursera上,Deep Learning Specialization 課程內容如下圖所示: Week2 assignment, Logistic Regression.

LLM推理和優化(1):基本概念介紹

一、LLM推理的核心過程:自回歸生成 LLM(如DeepSeek、ChatGPT、LLaMA系列等)的推理本質是自回歸生成:從初始輸入(如[CLS]或用戶prompt)開始,逐token預測下一個詞,直到生成結束符&…

【從零開始學習計算機科學】編譯原理(一)編譯過程概述

【從零開始學習計算機科學】編譯原理(一)編譯過程概述 緒論編譯過程概述詞法分析語法分析代碼優化代碼生成其他功能編譯器的前端和后端緒論 什么叫編譯程序?為什么我們需要編譯程序?編譯程序就是一個程序,將便于人編寫、閱讀、維護的高級計算機語言所寫作的源代碼程序,翻…

3-001:MySQL 中的回表是什么?

1. 什么是回表? 回表(Back to Table) 指的是 在使用非聚簇索引(輔助索引)查詢時,MySQL 需要 先通過索引找到主鍵 ID,然后再回到主鍵索引(聚簇索引)查詢完整數據&#xf…

【AIGC】計算機視覺-YOLO系列家族

YOLO系列家族 (1)YOLO發展史(2) YOLOX(3) YOLOv6(4) YOLOv7(5) YOLOv8(6) YOLOv9(7)YOLOv10(8&…

基于Python懂車帝汽車數據分析平臺(源碼+lw+部署文檔+講解),源碼可白嫖!

摘要 時代在飛速進步,每個行業都在努力發展現在先進技術,通過這些先進的技術來提高自己的水平和優勢,汽車數據分析平臺當然不能排除在外。本次我所開發的懂車帝汽車數據分析平臺是在實際應用和軟件工程的開發原理之上,運用Python…

Prompt 工程

一、提示原則 import openai import os import openai from dotenv import load_dotenv, find_dotenv from openai import OpenAI def get_openai_key():_ load_dotenv(find_dotenv())return os.environ[OPENAI_API_KEY]client OpenAI(api_keyget_openai_key(), # This is …

MySQL -- 數據庫基礎

1、基礎登錄操作 mysql 指定選項 選項&#xff1a; <1> -h 指定ip地址&#xff0c;即連接的主機&#xff0c;不帶時&#xff0c;默認連本機 <2> -P 指定的端口號&#xff0c;指定默認端口號&#xff08;配置文件中進行配置&#xff09; <3>-u 指定的用戶 &l…

02C#基本結構篇(D3_內部類-代碼塊-數據類型-變量-常量-字面量-運算符-流程控制語句)

目錄 一、內部類 1. 定義內部類 2. 創建內部類的實例 3. 訪問外部類的私有成員 4. 內部靜態類 5. 使用場景和優點 6. 注意事項 ------------------------------------------- 二、代碼塊 1. 控制流語句 1.1. 條件語句 1> if 語句 2> switch 語句 1.2. 循環語…

15 | 定義簡潔架構 Store 層的數據類型

提示&#xff1a; 所有體系課見專欄&#xff1a;Go 項目開發極速入門實戰課&#xff1b;歡迎加入 云原生 AI 實戰 星球&#xff0c;12 高質量體系課、20 高質量實戰項目助你在 AI 時代建立技術競爭力&#xff08;聚焦于 Go、云原生、AI Infra&#xff09;&#xff1b;本節課最終…

CSDN統計個人創作總字數

前言 不是很懂爬蟲&#xff0c;所以就叫deepseek寫了一個 用起來很簡單&#xff0c;但是有一個小問題&#xff0c;就是統計的是總字符數。代碼片會被統計進去&#xff0c;Markdown語法也會被統計進去。 不過我沒有太多需求&#xff0c;能大概統計一下滿足以下小小的好奇心和成…

React.js 基礎與進階教程

React.js 基礎與進階教程 React.js 是由 Facebook 開發的流行前端 JavaScript 庫&#xff0c;專為構建用戶界面&#xff08;UI&#xff09;設計&#xff0c;尤其適用于單頁面應用&#xff08;SPA&#xff09;。它采用組件化開發模式&#xff0c;使 UI 結構更加清晰、可維護性更…

msf(Metasploit)中Session與Channel的區別與關系解析

在 Metasploit Framework&#xff08;MSF&#xff09;中&#xff0c;Session 和 Channel 都是與目標主機的交互方式&#xff0c;但它們的作用和概念有所不同。本文將解析這兩個術語的區別。 一、Session&#xff08;會話&#xff09; Session 是指通過 Metasploit 成功利用目標…

設計模式-結構型模式-裝飾器模式

概述 裝飾器模式 : Decorator Pattern : 是一種結構型設計模式. 作用 &#xff1a; 允許你動態地給對象添加功能或職責&#xff0c;而無需修改其原始類的代碼,非常的符合 開閉原則。 實現思路 &#xff1a;通過創建一個包裝對象&#xff08;即裝飾器&#xff09;&#xff0c;來…

Qt/C++音視頻開發82-系統音量值獲取和設置/音量大小/靜音

一、前言 在音視頻開發中&#xff0c;音量的控制分兩塊&#xff0c;一個是控制播放器本身的音量&#xff0c;絕大部分場景都是需要控制這個&#xff0c;這個不會影響系統音量的設置。還有一種場景是需要控制系統的音量&#xff0c;因為播放器本身的音量是在系統音量的基礎上控…

基于深度學習的醫學CT圖像肺結節智能檢測與語音提示系統【python源碼+Pyqt5界面+數據集+訓練代碼】

《------往期經典推薦------》 一、AI應用軟件開發實戰專欄【鏈接】 項目名稱項目名稱1.【人臉識別與管理系統開發】2.【車牌識別與自動收費管理系統開發】3.【手勢識別系統開發】4.【人臉面部活體檢測系統開發】5.【圖片風格快速遷移軟件開發】6.【人臉表表情識別系統】7.【…

前端小食堂 | Day14 - Vue 3 の傳送門與懸念

&#x1f300; 今日秘技&#xff1a;Teleport 與 Suspense の時空魔法 1. Teleport 任意門 <template> <!-- &#x1f6aa; 將組件傳送到 body 末尾 --> <Teleport to"body"> <div class"modal"> <h2>重要通知&#x…