第3章 核心策略源文件结构:下载、解包与重编译
参考策略(Reference Policy,简称 refpolicy)是 SELinux 策略编写的业界标准起点。它提供了完整的类型强制(TE)、接口(Interface)、M4 宏、文件上下文(File Context)和可选模块框架。掌握其目录结构和重编译流程,是自定义策略开发的基础。
学习目标:能够独立下载 refpolicy 源码包、解包并识别
te、m4、if、conf 四大核心目录的作用;能够执行完整 make 重编译,生成二进制策略文件。
3.1 下载 Reference Policy
官方 release 包托管于 GitHub 及 SELinux 用户空间仓库。推荐使用稳定版本(如 refpolicy-2.20240711),避免使用不稳定的 git 主干。
# 下载最新稳定版(示例版本号)
wget https://github.com/SELinuxProject/refpolicy/releases/download/refpolicy-2.20240711/refpolicy-2.20240711.tar.bz2
# 校验签名(可选)
wget https://github.com/SELinuxProject/refpolicy/releases/download/refpolicy-2.20240711/refpolicy-2.20240711.tar.bz2.asc
gpg --verify refpolicy-2.20240711.tar.bz2.asc
注意:若下载过慢,可使用国内镜像或代理。务必核对版本号与发行说明的一致性。
3.2 解包与目录概览
tar -xjf refpolicy-2.20240711.tar.bz2
cd refpolicy-2.20240711
ls -la
解包后顶层目录包含以下关键组件:
| 目录/文件 | 作用 |
|---|---|
policy/modules/ | 按类别组织的模块源码(核心) |
policy/te/ | 类型强制规则文件(.te) |
policy/m4/ | M4 宏定义文件(.m4) |
policy/if/ | 接口文件(.if) |
policy/conf/ | 模块配置文件(.conf),如策略版本、模块启用开关 |
Rules.modules | Makefile 构建规则,定义模块编译次序 |
Makefile | 顶层构建入口 |
3.3 理解四个核心目录
每个目录承载不同的语法和职责,开发时需交叉修改。
| 目录 | 文件后缀 | 内容示例 | 核心职责 |
|---|---|---|---|
te/ | .te | type sshd_t;allow sshd_t var_log_t:file { read write }; | 定义类型/属性、allow 规则、角色声明 |
m4/ | .m4 | define(`read_files_pattern',`allow $1 $2:$3 { getattr read open };') | 封装可复用的宏,减少重复代码 |
if/ | .if | interface(`files_read_var_log',`gen_require(`type var_log_t;'); read_files_pattern($1, var_log_t, file)') | 定义对外接口,供其他模块调用 |
conf/ | .conf | # 版本号 | 配置编译参数、模块列表、策略版本 |
关键原则:
.te 写主体规则,.if 写可重用接口,.m4 写底层宏,.conf 控制编译行为。生产环境中推荐将重复的 allow 规则封装成接口,并在 .if 中引用。
3.4 make 重编译流程
refpolicy 的构建基于 GNU Make,支持模块化编译和全量编译。以下为典型重编译步骤:
# 1. 清理旧产物
make clean
# 2. 配置模块启用情况(可在 policy/conf/modules.conf 中修改)
# 常用选项:
# - MOD_OPTIONAL : 可选模块
# - MOD_BASE : 基础模块(强制)
# 开发阶段建议保留默认配置,只增加自定义模块
# 3. 生成策略二进制文件(policy.33 等)
make -j$(nproc)
# 4. 安装到系统(需要 root)
sudo make install
# 5. 加载新策略(可选,安全测试时常用)
sudo load_policy
编译产物:
policy.xx 二进制文件(xx 为策略版本),存储在 refpolicy-2.20240711/policy/ 下。同时生成 file_contexts、users、booleans 等附属文件。
3.5 常见错误与调试
| 错误现象 | 可能原因 | 解决方法 |
|---|---|---|
make: *** No rule to make target 'policy.33' | 未正确设置 POLICY_VERSION | 检查 conf/ 目录中的版本配置,与系统内核支持的策略版本一致 |
semodule: 未找到模块 | 模块编译后未安装或模块名冲突 | 执行 sudo make install 并重启 systemd-selinux |
TE 规则语法错误 | .te 文件缺少分号或不匹配的花括号 | 运行 make validate 或手动检查 checkpolicy -c 33 -M policy.conf |
接口未定义 | .if 文件拼写错误或未包含对应模块 | 确保在 modules.conf 中启用了依赖模块,并检查接口名称大小写 |
安全提示:在开发机上测试新策略前,务必先执行
make clean 和全量重编,避免残留旧二进制导致系统策略不一致。