第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.modulesMakefile 构建规则,定义模块编译次序
Makefile顶层构建入口

3.3 理解四个核心目录

每个目录承载不同的语法和职责,开发时需交叉修改。

目录文件后缀内容示例核心职责
te/.tetype sshd_t;
allow sshd_t var_log_t:file { read write };
定义类型/属性、allow 规则、角色声明
m4/.m4define(`read_files_pattern',`allow $1 $2:$3 { getattr read open };')封装可复用的宏,减少重复代码
if/.ifinterface(`files_read_var_log',`gen_require(`type var_log_t;'); read_files_pattern($1, var_log_t, file)')定义对外接口,供其他模块调用
conf/.conf# 版本号
POLICY_VERSION = 33
# 模块编译开关
MODS = [...]
配置编译参数、模块列表、策略版本
关键原则:.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 和全量重编,避免残留旧二进制导致系统策略不一致。
Reference Policy 源码结构及编译流程 refpolicy-2.x policy/modules/ Rules.modules Makefile te/ m4/ if/ conf/ make clean make -j$(nproc) sudo make install 编译产物 policy.33(二进制策略)、file_contexts、users、booleans 位于 policy/ 目录下 可通过 checkpolicy 反编译验证

3.6 本章小结