Android 安全策略构建与管理指南
1. 控制策略构建
1.1 build_policy 函数概述
sepolicy 语句会调用 build_policy 函数,该函数在 Android.mk 文件中用于构建 sepolicy、file_contexts、seapp_contexts、property_contexts 和 mac_permissions.xml 等文件,十分重要。它会输出一个完全解析的策略文件路径列表,输入为可变参数的文件名列表,并支持正则表达式。该函数内部有特殊机制,允许在不直接修改 external/sepolicy 目录的情况下,覆盖或追加当前策略构建内容,方便 OEM 和设备制造商为特定设备增强策略。
1.2 控制构建的 make 变量
在构建策略时,可在设备的 Makefile 中设置以下 make 变量来控制构建结果:
| 变量名 | 描述 |
| ---- | ---- |
| BOARD_SEPOLICY_DIRS | 潜在策略文件的搜索路径 |
| BOARD_SEPOLICY_UNION | 用于追加到所有同名文件的策略文件 |
| BOARD_SEPOLICY_REPLACE | 用于覆盖外部 sepolicy 基础策略文件的策略文件 |
| BOARD_SEPOLICY_IGNORE | 根据存储库的相对路径,从构建中移除特定策略文件 |
1.3 以 UDOO 为例的策略编写步骤
- 创建目录:
$ mkdir <PATH>
- 修改 BoardConfig.mk 文件:
$ vim BoardConfig.mk
- 添加搜索路径:
BOARD_SEPOLICY_DIRS += device/fsl/udoo/sepolicy
注意:使用 += 而非 := ,避免覆盖上级设置。更多细节可参考 GNU make 手册 中的变量赋值部分。
-
创建 file_contexts 文件并移动更改:在
device/fsl/udoo/sepolicy目录下创建新的 file_contexts 文件。 -
合并文件:在 BoardConfig.mk 文件中添加以下语句:
BOARD_SEPOLICY_UNION += file_contexts
还可添加其他策略文件,如:
BOARD_SEPOLICY_UNION += file_contexts watchdog.te custom.te
- 覆盖文件:若要覆盖外部 sepolicy 的 watchdog.te 文件,可添加到 BOARD_SEPOLICY_REPLACE:
BOARD_SEPOLICY_REPLACE := watchdog.te
注意:不能替换基础策略中不存在的文件,且同一文件不能同时出现在 UNION 和 REPLACE 中,也不能对同一策略文件有多个 BOARD_SEPOLICY_REPLACE 规范。
1.4 分层构建示例
假设有设备 X 和设备 Y,它们都从设备 A 继承 BoardConfigCommon.mk。
设备 A 的 BoardConfigCommon.mk 包含:
BOARD_SEPOLICY_DIRS += device/OEM/A
BOARD_SEPOLICY_UNION += file_contexts custom.te
设备 X 的 BoardConfig.mk 包含:
BOARD_SEPOLICY_DIRS += device/OEM/X
BOARD_SEPOLICY_UNION += file_contexts custom.te
设备 Y 的 BoardConfig.mk 包含:
BOARD_SEPOLICY_DIRS += device/OEM/Y
BOARD_SEPOLICY_UNION += file_contexts custom.te
构建设备 X 和设备 Y 的策略集如下:
- 设备 X 策略集:
- device/OEM/A/file_contexts
- device/OEM/A/custom.te
- device/OEM/X/file_contexts
- device/OEM/X/custome.te
- external/sepolicy/ (基础策略文件)
- 设备 Y 策略集:
- device/OEM/A/file_contexts
- device/OEM/A/custom.te
- device/OEM/Y/file_contexts
- device/OEM/Y/custom.te
- external/sepolicy/ (基础策略文件)
若不想设备 Y 的策略集包含 device/OEM/A/custom.te,可在设备 Y 的 BoardConfig.mk 中添加:
BOARD_SEPOLICY_IGNORE += device/OEM/A/custom.te
BOARD_SEPOLICY_IGNORE 可与 BOARD_SEPOLICY_REPLACE 一起使用,但同一策略文件只有一个 BOARD_SEPOLICY_REPLACE 语句生效。
1.5 build_policy 函数深入剖析
1.5.1 sepolicy_replace_paths 变量
该变量在 Makefile 评估时被无条件执行。代码会遍历所有 BOARD_SEPOLICY_REPLACE 文件,检查是否在 BOARD_SEPOLICY_UNION 中,若存在则报错。然后扩展这些文件路径,过滤掉 BOARD_SEPOLICY_IGNORE 中的文件,确保只有一个替换文件候选,最后检查文件是否存在于 LOCAL_PATH 或基础策略中:
sepolicy_replace_paths :=
$(foreach pf, $(BOARD_SEPOLICY_REPLACE), \
$(if $(filter $(pf), $(BOARD_SEPOLICY_UNION)), \
$(error Ambiguous request for sepolicy $(pf). Appears in both \
BOARD_SEPOLICY_REPLACE and BOARD_SEPOLICY_UNION), \
) \
$(eval _paths := $(filter-out $(BOARD_SEPOLICY_IGNORE), \
$(wildcard $(addsuffix /$(pf), $(BOARD_SEPOLICY_DIRS))))) \
$(eval _occurrences := $(words $(_paths))) \
$(if $(filter 0,$(_occurrences)), \
$(error No sepolicy file found for $(pf) in $(BOARD_SEPOLICY_DIRS)), \
) \
$(if $(filter 1, $(_occurrences)), \
$(eval sepolicy_replace_paths += $(_paths)), \
$(error Multiple occurrences of replace file $(pf) in $(_paths)) \
) \
$(if $(filter 0, $(words $(wildcard $(addsuffix /$(pf),
$(LOCAL_PATH))))), \
$(error Specified the sepolicy file $(pf) in BOARD_SEPOLICY_REPLACE, \
but none found in $(LOCAL_PATH)), \
) \
)
1.5.2 build_policy 函数
该函数的参数是要扩展为 Android 根相对路径名的文件名,利用 BOARD_SEPOLICY_* 系列变量的功能。例如, $(build_policy, file_contexts) 调用会输出相关路径。函数会遍历所有传入的文件,分别对替换和合并操作进行路径扩展,检查 sepolicy_replace_paths 变量避免文件重复,最后过滤掉 BOARD_SEPOLICY_IGNORE 中的路径:
build_policy = $(foreach type, $(1), \
$(filter-out $(BOARD_SEPOLICY_IGNORE), \
$(foreach expanded_type, $(notdir $(wildcard $(addsuffix /$(type),
$(LOCAL_PATH)))), \
$(if $(filter $(expanded_type), $(BOARD_SEPOLICY_REPLACE)), \
$(wildcard $(addsuffix $(expanded_type), $(sort $(dir
$(sepolicy_replace_paths))))), \
$(LOCAL_PATH)/$(expanded_type) \
) \
) \
$(foreach union_policy, $(wildcard $(addsuffix /$(type),
$(BOARD_SEPOLICY_DIRS))), \
$(if $(filter $(notdir $(union_policy)), $(BOARD_SEPOLICY_UNION)), \
$(union_policy), \
) \
) \
) \
)
1.6 构建 mac_permissions.xml
mac_permissions.xml 的构建较为复杂。它可使用所有 BOARD_SEPOLICY_* 变量,最终生成一个符合这些变量规则的 XML 文件。原始 XML 文件由 sepolicy/tools 中的 insertkeys.py 工具处理,该工具使用 keys.conf 将 XML 文件签名部分的标签与包含证书的 .pem 文件映射。构建过程先对 keys.conf 调用 build_policy 并使用 m4 拼接结果,然后将 keys.conf 和 build_policy() 调用得到的所有 mac_permissions.xml 文件输入 insertkeys.py 工具,该工具会替换签名行,合并 XML 文件并去除空白和注释。此构建与 sepolicy、seapp_contexts、property_contexts 等主要文件无依赖关系。
1.7 构建其他文件
1.7.1 seapp_contexts 文件
该文件受所有 BOARD_SEPOLICY_* 变量影响。build_policy() 调用得到的所有 seapp_contexts 文件会通过 m4 -s 处理,生成包含同步行的单个文件,然后输入 check_seapp 工具检查语法,确保键值对有效、levelFrom 是有效标识符,以及类型和域字段对给定 sepolicy 有效。此构建依赖 sepolicy 进行严格类型检查。
1.7.2 file_contexts 文件
同样受所有 BOARD_SEPOLICY_* 变量影响。结果集通过 m4 -s 处理,单个输出由 checkfc 工具检查语法和类型是否存在于构建的 sepolicy 中,依赖 sepolicy 构建。
1.7.3 property_contexts 文件
处理方式与 file_contexts 构建类似,只是检查的是 property_contexts 文件,也使用 checkfc 工具。
1.8 NSA 研究文件
NSA 的 Enterprise Operations (eops) 工作正在进行中,但该功能未合并到主流 Android 且可能变化较大,此处不做介绍。selinux-network.sh 也属于此类,尚未被广泛采用,可能会从 AOSP 中移除。
1.9 独立工具
1.9.1 sepolicy-check
用于检查给定允许规则是否存在于策略文件中,基本语法为:
sepolicy-check -s <domain> -t <type> -c <class> -p <permission> -P <policy_file>
例如,检查 system_app 是否能对 system_data_file 进行写操作:
$ sepolicy-check -s system_app -t system_data_file -c file -p write -P $OUT/root/sepolicy
1.9.2 sepolicy-analyze
用于检查 SELinux 开发中的常见问题,可检查等效域、重复允许规则和策略类型差异:
- 检查等效域:
$ sepolicy-analyze -e -P $OUT/root/sepolicy
- 检查重复允许规则:
$sepolicy-analyze -D -P $OUT/root/sepolicy
- 检查类型差异:
$sepolicy-analyze -d -P $OUT/root/sepolicy
1.10 进入强制模式
1.10.1 目标
作为工程师,要将 SE for Android 控制应用到 Android 设备以增强安全性。具体操作包括运行、评估和响应 CTS 审计日志,为 UDOO 开发安全策略,切换到强制模式。
1.10.2 更新到 SEPolicy 主分支
自 4.3 版本发布以来,AOSP 主分支的 sepolicy 目录有很多更改。可按以下步骤操作:
1. 克隆外部 sepolicy 项目:
$ git clone https://android.googlesource.com/platform/external/sepolicy
$ cd sepolicy
- 可选:若要精确跟随示例,可检出特定提交:
$ git checkout b5ffb
- 替换 UDOO 4.3 sepolicy:
$ cd ..
$ rm -rf udoo/external/sepolicy
$ cp -r sepolicy udoo/external/sepolicy
- 可选:移除 .git 文件夹:
$ rm –rf udoo/external/sepolicy/.git
- 复制并恢复 audit.te 文件。
- 从 NSA Bitbucket seandroid 存储库恢复 auditd 提交(提交 SHA 为 d270aa3)。
- 移除 udoo/build/core/Makefile 中所有对 setool 的引用,可使用以下命令定位:
$ grep -nw setool udoo/build/core/Makefile
通过以上步骤,我们详细介绍了 Android 安全策略的构建、管理和相关工具的使用,以及如何将 UDOO 设备切换到强制模式,希望能帮助你更好地理解和应用 Android 安全策略。
2. 策略构建与管理总结
2.1 策略构建关键变量总结
| 变量名 | 作用 | 使用注意事项 |
|---|---|---|
| BOARD_SEPOLICY_DIRS | 定义潜在策略文件的搜索路径 | 使用 += 避免覆盖上级设置 |
| BOARD_SEPOLICY_UNION | 用于将指定策略文件合并到同名文件中 | 文件名匹配仅基于基本名称,同一文件不能同时出现在 UNION 和 REPLACE 中 |
| BOARD_SEPOLICY_REPLACE | 用于覆盖基础策略文件 | 不能替换基础策略中不存在的文件,且同一文件不能有多个替换规范 |
| BOARD_SEPOLICY_IGNORE | 从构建中移除特定策略文件 | 使用存储库的相对路径指定要移除的文件 |
2.2 构建流程总结
以下是各文件构建的流程图:
graph LR
classDef startend fill:#F5EBFF,stroke:#BE8FED,stroke-width:2px
classDef process fill:#E5F6FF,stroke:#73A6FF,stroke-width:2px
classDef decision fill:#FFF6CC,stroke:#FFBC52,stroke-width:2px
A([开始]):::startend --> B(设置 BOARD_SEPOLICY_* 变量):::process
B --> C(调用 build_policy 函数):::process
C --> D{构建文件类型}:::decision
D -->|mac_permissions.xml| E(insertkeys.py 处理):::process
D -->|seapp_contexts| F(m4 -s 处理 + check_seapp 检查):::process
D -->|file_contexts| G(m4 -s 处理 + checkfc 检查):::process
D -->|property_contexts| H(m4 -s 处理 + checkfc 检查):::process
E --> I([完成]):::startend
F --> I
G --> I
H --> I
2.3 独立工具使用总结
| 工具名 | 功能 | 示例命令 |
|---|---|---|
| sepolicy-check | 检查给定允许规则是否存在于策略文件中 | sepolicy-check -s system_app -t system_data_file -c file -p write -P $OUT/root/sepolicy |
| sepolicy-analyze | 检查 SELinux 开发中的常见问题,如等效域、重复允许规则和策略类型差异 | - 检查等效域: sepolicy-analyze -e -P $OUT/root/sepolicy - 检查重复允许规则: sepolicy-analyze -D -P $OUT/root/sepolicy - 检查类型差异: sepolicy-analyze -d -P $OUT/root/sepolicy |
2.4 进入强制模式步骤总结
- 更新 SEPolicy 主分支
- 克隆外部 sepolicy 项目:
git clone https://android.googlesource.com/platform/external/sepolicy
cd sepolicy
- 可选:检出特定提交:
git checkout b5ffb
- 替换 UDOO 4.3 sepolicy:
cd ..
rm -rf udoo/external/sepolicy
cp -r sepolicy udoo/external/sepolicy
- 可选:移除 .git 文件夹:
rm –rf udoo/external/sepolicy/.git
- 复制并恢复 audit.te 文件。
- 从 NSA Bitbucket seandroid 存储库恢复 auditd 提交(提交 SHA 为 d270aa3)。
- 移除 udoo/build/core/Makefile 中所有对 setool 的引用:
grep -nw setool udoo/build/core/Makefile
- 运行、评估和响应 CTS 审计日志 :通过分析 CTS 审计日志,发现安全策略中存在的问题,对策略进行调整和优化。
- 为 UDOO 开发安全策略 :根据设备的特点和需求,利用前面介绍的 BOARD_SEPOLICY_* 变量和构建工具,定制适合 UDOO 的安全策略。
- 切换到强制模式 :完成上述步骤后,将 UDOO 设备切换到强制模式,使安全策略生效。
2.5 常见问题及解决方法
| 问题 | 原因 | 解决方法 |
|---|---|---|
| sepolicy_replace_paths 报错“Ambiguous request” | 同一文件同时出现在 BOARD_SEPOLICY_REPLACE 和 BOARD_SEPOLICY_UNION 中 | 检查并确保文件只出现在一个变量中 |
| 构建时找不到 sepolicy 文件 | BOARD_SEPOLICY_DIRS 未包含正确的搜索路径或文件不存在 | 检查 BOARD_SEPOLICY_DIRS 设置,确保文件存在于指定路径 |
| sepolicy-analyze 工具出现段错误 | 可能需要应用补丁 | 从 http://marc.info/?l=seandroid-list&m=141684060409894&w=2 应用补丁 |
2.6 总结与展望
通过本文的介绍,我们详细了解了 Android 安全策略的构建、管理和相关工具的使用,以及如何将 UDOO 设备切换到强制模式。掌握这些知识和技能,能够帮助我们更好地保障 Android 设备的安全性。
在未来的 Android 安全策略开发中,随着技术的不断发展和安全需求的提高,可能会有更多的功能和工具出现。我们需要持续关注相关的技术动态,不断学习和实践,以应对日益复杂的安全挑战。同时,合理运用现有的工具和方法,结合实际需求,定制出更加安全、高效的 Android 安全策略。
超级会员免费看
556

被折叠的 条评论
为什么被折叠?



