# OpenHarmony SELinuxå¼€å‘说明 ## ç–略目录结构 OpenHarmony SELinuxç–ç•¥æ–‡ä»¶å˜æ”¾åœ¨`//base/security/selinux_adapter/sepolicy/ohos_policy`è·¯å¾„ä¸‹ï¼Œåœ¨è¯¥ç›®å½•ä¸‹æŒ‰ä»¥ä¸‹è§„èŒƒå˜æ”¾ï¼š ```text ├── å系统 │ └── 部件 │ ├── public │ │ └── type1.te │ ├── vendor │ │ └── type2.te │ └── system │ └── type3.te ``` 系统相关ç–ç•¥å˜æ”¾åœ¨system目录下,芯片相关ç–ç•¥å˜æ”¾åœ¨vendor目录下,系统和芯片共用的ç–ç•¥å˜æ”¾åœ¨public目录下。 ## 通用ç–ç•¥æ–‡ä»¶ä»‹ç» é€šç”¨ç–略文件,是指设备开å‘者进行SELinuxç–ç•¥é…置时,涉åŠä¿®æ”¹çš„æ–‡ä»¶ã€‚ | 文件å | 文件说明 | | -------- | -------- | | *.te | SELinuxç–略文件,用于定义类型ã€é…ç½®allowç–ç•¥ã€é…ç½®neverallowç–略。 | | file_contexts | å®žä½“æ–‡ä»¶æ ‡ç¾æ˜ å°„æ–‡ä»¶ï¼Œä½“çŽ°å®žä½“æ–‡ä»¶è·¯å¾„ä¸Žæ ‡ç¾çš„æ˜ 射关系。 | | virtfs_contexts | è™šæ‹Ÿæ–‡ä»¶æ ‡ç¾æ˜ å°„æ–‡ä»¶ï¼Œä½“çŽ°è™šæ‹Ÿæ–‡ä»¶è·¯å¾„ä¸Žæ ‡ç¾çš„æ˜ 射关系。 | | sehap_contexts | åº”ç”¨æ ‡ç¾æ˜ 射文件,体现应用关键信æ¯ä¸Žåº”ç”¨è¿›ç¨‹æ ‡ç¾ã€åº”用数æ®ç›®å½•æ ‡ç¾çš„æ˜ 射关系。 | | parameter_contexts | 傿•°æ ‡ç¾æ˜ å°„æ–‡ä»¶ï¼Œä½“çŽ°å‚æ•°ä¸Žæ ‡ç¾çš„æ˜ 射关系。 | | sevice_contexts | SAæœåŠ¡æ ‡ç¾æ˜ 射文件,体现SAæœåŠ¡ä¸Žæ ‡ç¾çš„æ˜ 射关系。 | | hdf_service_contexts | HDFæœåŠ¡æ ‡ç¾æ˜ 射文件,体现HDFæœåŠ¡ä¸Žæ ‡ç¾çš„æ˜ 射关系。 | ## 基础ç–ç•¥æ–‡ä»¶ä»‹ç» åŸºç¡€ç–略文件,是指SELinux基础框架的SELinuxç–ç•¥æ–‡ä»¶ï¼Œä¸€èˆ¬ä¸æ¶‰åŠä¿®æ”¹ã€‚ | 文件å | 文件说明 | | -------- | -------- | | security_classes | class定义。 | | initial_sids | sid定义。 | | access_vectors | class支æŒçš„具体permission列表。 | | glb_perm_def.spt | classå’Œpermission的全局å®å®šä¹‰ï¼Œå¯ç”¨äºŽç®€åŒ–ç–ç•¥è¯å¥ã€‚ | | glb_never_def.spt | neverallow的全局å®å®šä¹‰ï¼Œå¯ç”¨äºŽç®€åŒ–ç–ç•¥è¯å¥ã€‚ | | mls | 分层安全级别定义。 | | glb_te_def.spt | te规则的全局å®å®šä¹‰ï¼Œå¯ç”¨äºŽç®€åŒ–ç–ç•¥è¯å¥ã€‚ | | attributes | 一些通用集åˆï¼Œåœ¨å®šä¹‰ç–略类型时å¯ä»¥æŒ‡å®šåˆ°ç‰¹å®šçš„集åˆï¼Œåˆ™è¯¥ç–略类型会继承该集åˆçš„æƒé™ã€‚ | | glb_roles.spt | roles定义。 | | users | users定义。 | | initial_sid_contexts | sidçš„åˆå§‹æ ‡ç¾ã€‚ | | fs_use | å„ç±»åž‹æ–‡ä»¶ç³»ç»Ÿçš„é»˜è®¤æ ‡ç¾ã€‚ | ## avcæ—¥å¿—ä¿¡æ¯ å½“ç³»ç»Ÿè¡Œä¸ºè¢«SELinuxæ‹¦æˆªæ—¶ï¼Œä¼šåœ¨å†…æ ¸æ—¥å¿—å’Œhilog䏿‰“å°ç›¸å…³çš„`avc denied`æ—¥å¿—ï¼Œæ ¼å¼å¦‚下: ```text 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 ``` å…¶ä¸ï¼š - `open`ï¼Œè¡¨ç¤ºå½“å‰æ‰§è¡Œçš„æ“ä½œæƒé™ã€‚ - `pid=1658`,表示主体进程`pid`为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`时,表示强制模å¼ï¼Œä¼šå‘Šè¦å¹¶æ‹¦æˆªã€‚ å¼€å‘者å¯ä»¥ä½¿ç”¨å…³é”®å—`avc denied`æ¥è¿‡æ»¤æ—¥å¿—,对于影å“业务的avc告è¦ï¼Œå¯ä»¥åˆ©ç”¨å‘Šè¦æä¾›çš„ä¿¡æ¯æ¥ç¼–写相应的SELinuxç–略,例如: ```text 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 ``` 对应TE规则为: ```text allow hdcd selinuxfs:file open; ``` ## ç–ç•¥æ ¼å¼ SELinuxç–略,åˆç§°SELinux规则,通常以allow或neverallow开头,表示å…è®¸æˆ–ç¦æ¢æŸç§è¡Œä¸ºã€‚在设备上使能SELinux时,SELinux会拦截所有未ç»allow规则授æƒçš„行为,é…ç½®allow规则å¯ä»¥æ”¾è¡Œï¼Œneverallowè§„åˆ™ä¸»è¦æ˜¯æ‹¦æˆªå±é™©è§„则的é…置。通常allow规则如下: ```text allow subject object:class permissions; ``` 表示å…许`subject`对`object`进行`class`ä¸çš„`permissions`æ“作,其ä¸ï¼š - `subject`表示主体,通常为进程的SELinux类型,如`init`。 - `object`表示客体,通常为系统资æºçš„SELinux类型,如`data_file`。 - `class`è¡¨ç¤ºè¦æ‰§è¡Œçš„æ“ä½œçš„ç±»åž‹ï¼Œå¦‚æ–‡ä»¶æ“作fileã€ç›®å½•æ“作dirã€å¥—æŽ¥å—æ“作socket。 - `permissions`è¡¨ç¤ºè¦æ‰§è¡Œçš„具体æ“作,如对文件fileçš„openã€readã€write。 åŒç†ï¼Œ ```text neverallow subject object:class permissions; ``` 表示ä¸å…许`subject`对`object`进行`class`ä¸çš„`permissions`æ“作。 ## ç–ç•¥å®éš”离 在考虑设备开å‘è€…ä¾¿åˆ©çš„åŒæ—¶ï¼Œéœ€è¦å…¼é¡¾å•†ç”¨è®¾å¤‡å®‰å…¨æ€§ï¼Œå› æ¤OpenHarmony SELinuxæä¾›äº†ç–略隔离å®ï¼Œå†³å®šåœ¨ä¸åŒç‰ˆæœ¬ä¸Šç–略是å¦ç”Ÿæ•ˆã€‚OpenHarmony SELinux䏿”¯æŒå¯¹ä»…在root版本生效的ç–ç•¥åšå®éš”离,å®å称为`debug_only`。在用于设备开å‘者调试的root版本ä¸ï¼Œä¹Ÿå°±æ˜¯åœ¨ç‰ˆæœ¬ç¼–è¯‘å‘½ä»¤ä¸æŒ‡å®š`--build-variant root`时,å®å¼€å¯ã€‚在用于商用å‘布的user版本ä¸ï¼Œä¹Ÿå°±æ˜¯åœ¨ç‰ˆæœ¬ç¼–è¯‘å‘½ä»¤ä¸æŒ‡å®š`--build-variant user`时,å®å…³é—。该å®çš„使用方法å‚考如下: ```text debug_only(` allow ueventd init:fd use; ') ``` å¦å¤–,OpenHarmony SELinuxä¸ä¹Ÿæ”¯æŒå¯¹å¼€å‘者模å¼çš„ç–ç•¥åšå®éš”离,å®å称为`developer_only`,该å®é»˜è®¤å¼€å¯ã€‚å¼€å‘者模å¼ç–略是指,为便于使用user版本进行调试开å‘的开å‘者,需è¦å¼€æ”¾çš„一些用于调试的SELinuxç–略。开å‘者模å¼å®çš„使用方法å‚考如下: ```text developer_only(` allow sh init:fd use; ') ``` | éš”ç¦»å® | root版本 | root版本开å‘è€…æ¨¡å¼ | user版本 | user版本开å‘è€…æ¨¡å¼ | | -------- | -------- | -------- | -------- | -------- | | 未隔离的ç–ç•¥ | 生效 | 生效 | 生效 | 生效 | | debug_only隔离的ç–ç•¥ | 生效 |生效 | ä¸ç”Ÿæ•ˆ | ä¸ç”Ÿæ•ˆ | | developer_only隔离的ç–ç•¥ | ä¸ç”Ÿæ•ˆ | 生效 | ä¸ç”Ÿæ•ˆ | 生效 |