1# OpenHarmony SELinux开发说明
2
3## 策略目录结构
4
5OpenHarmony SELinux策略文件存放在`//base/security/selinux_adapter/sepolicy/ohos_policy`路径下,在该目录下按以下规范存放:
6```text
7├── 子系统
8│   └── 部件
9│       ├── public
10│       │   └── type1.te
11│       ├── vendor
12│       │   └── type2.te
13│       └── system
14│           └── type3.te
15```
16系统相关策略存放在system目录下,芯片相关策略存放在vendor目录下,系统和芯片共用的策略存放在public目录下。
17
18## 通用策略文件介绍
19
20通用策略文件,是指设备开发者进行SELinux策略配置时,涉及修改的文件。
21
22| 文件名 | 文件说明 |
23| -------- | -------- |
24| *.te | SELinux策略文件,用于定义类型、配置allow策略、配置neverallow策略。 |
25| file_contexts | 实体文件标签映射文件,体现实体文件路径与标签的映射关系。 |
26| virtfs_contexts | 虚拟文件标签映射文件,体现虚拟文件路径与标签的映射关系。 |
27| sehap_contexts | 应用标签映射文件,体现应用关键信息与应用进程标签、应用数据目录标签的映射关系。 |
28| parameter_contexts | 参数标签映射文件,体现参数与标签的映射关系。 |
29| sevice_contexts | SA服务标签映射文件,体现SA服务与标签的映射关系。 |
30| hdf_service_contexts | HDF服务标签映射文件,体现HDF服务与标签的映射关系。 |
31
32## 基础策略文件介绍
33
34基础策略文件,是指SELinux基础框架的SELinux策略文件,一般不涉及修改。
35
36| 文件名 | 文件说明 |
37| -------- | -------- |
38| security_classes | class定义。 |
39| initial_sids | sid定义。 |
40| access_vectors | class支持的具体permission列表。 |
41| glb_perm_def.spt | class和permission的全局宏定义,可用于简化策略语句。 |
42| glb_never_def.spt | neverallow的全局宏定义,可用于简化策略语句。 |
43| mls | 分层安全级别定义。 |
44| glb_te_def.spt | te规则的全局宏定义,可用于简化策略语句。 |
45| attributes | 一些通用集合,在定义策略类型时可以指定到特定的集合,则该策略类型会继承该集合的权限。 |
46| glb_roles.spt | roles定义。 |
47| users | users定义。 |
48| initial_sid_contexts | sid的初始标签。 |
49| fs_use | 各类型文件系统的默认标签。 |
50
51## avc日志信息
52
53当系统行为被SELinux拦截时,会在内核日志和hilog中打印相关的`avc denied`日志,格式如下:
54```text
55audit: 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
56```
57
58其中:
59  - `open`,表示当前执行的操作权限。
60  - `pid=1658`,表示主体进程`pid`为1658。
61  - `comm="setenforce"`,表示主体进程名为`setenforce`。
62  - `path="/sys/fs/selinux/enforce"`,表示被访问客体为`/sys/fs/selinux/enforce`。
63  - `dev="selinuxfs"`,表示被访问客体属于selinuxfs这一文件系统。
64  - `ino=4`,表示文件节点编号为4。
65  - `scontext=u:r:hdcd:s0`,表示主体SELinux标签为`u:r:hdcd:s0`。
66  - `tcontext=u:object_r:selinuxfs:s0`,表示被访问客体SELinux标签为`u:object_r:selinuxfs:s0`。
67  - `tclass=file`,表示当前执行file的操作类型。
68  - `permissive=1`,表示当前SELinux处于宽容模式,只告警不拦截。另外,当`permissive=0`时,表示强制模式,会告警并拦截。
69
70开发者可以使用关键字`avc denied`来过滤日志,对于影响业务的avc告警,可以利用告警提供的信息来编写相应的SELinux策略,例如:
71```text
72audit: 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
73```
74
75对应TE规则为:
76```text
77allow hdcd selinuxfs:file open;
78```
79
80## 策略格式
81
82SELinux策略,又称SELinux规则,通常以allow或neverallow开头,表示允许或禁止某种行为。在设备上使能SELinux时,SELinux会拦截所有未经allow规则授权的行为,配置allow规则可以放行,neverallow规则主要是拦截危险规则的配置。通常allow规则如下:
83```text
84allow subject object:class permissions;
85```
86  表示允许`subject`对`object`进行`class`中的`permissions`操作,其中:
87  - `subject`表示主体,通常为进程的SELinux类型,如`init`。
88  - `object`表示客体,通常为系统资源的SELinux类型,如`data_file`。
89  - `class`表示要执行的操作的类型,如文件操作file、目录操作dir、套接字操作socket。
90  - `permissions`表示要执行的具体操作,如对文件file的open、read、write。
91
92同理,
93```text
94neverallow subject object:class permissions;
95```
96表示不允许`subject`对`object`进行`class`中的`permissions`操作。
97
98## 策略宏隔离
99
100在考虑设备开发者便利的同时,需要兼顾商用设备安全性,因此OpenHarmony SELinux提供了策略隔离宏,决定在不同版本上策略是否生效。OpenHarmony SELinux中支持对仅在root版本生效的策略做宏隔离,宏名称为`debug_only`。在用于设备开发者调试的root版本中,也就是在版本编译命令中指定`--build-variant root`时,宏开启。在用于商用发布的user版本中,也就是在版本编译命令中指定`--build-variant user`时,宏关闭。该宏的使用方法参考如下:
101```text
102debug_only(`
103    allow ueventd init:fd use;
104')
105```
106
107另外,OpenHarmony SELinux中也支持对开发者模式的策略做宏隔离,宏名称为`developer_only`,该宏默认开启。开发者模式策略是指,为便于使用user版本进行调试开发的开发者,需要开放的一些用于调试的SELinux策略。开发者模式宏的使用方法参考如下:
108```text
109developer_only(`
110    allow sh init:fd use;
111')
112```
113
114| 隔离宏 | root版本 | root版本开发者模式 | user版本 | user版本开发者模式 |
115| -------- | -------- | -------- | -------- | -------- |
116| 未隔离的策略 | 生效 | 生效 | 生效 | 生效 |
117| debug_only隔离的策略 | 生效 |生效 | 不生效 | 不生效 |
118| developer_only隔离的策略 | 不生效 | 生效 | 不生效 | 生效 |
119