selinux策略热加载指不重启系统、不中断服务地动态加载新策略,主要通过semodule增量安装模块实现;load_policy用于替换整套策略,属慎用场景。

SELinux 策略热加载,是指在不重启系统、不中断服务的前提下,将新策略或模块动态载入内核并立即生效。关键在于区分两类操作:一是用 load_policy 加载完整编译后的二进制策略(通常用于初始启动或重大策略更新);二是用 semodule 增量安装/卸载策略模块(这才是日常运维中的“热加载”主力)。后者无需重启、不影响运行中进程的当前域,新增规则对后续访问行为即时生效。
确认 SELinux 处于可热加载状态
热加载的前提是 SELinux 已启用且运行在 Enforcing 或 Permissive 模式:
- 运行
getenforce,输出必须是 Enforcing 或 Permissive;若为 Disabled,需先修改/etc/selinux/config中SELINUX=enforcing,再重启——这不属于热加载范畴 - 运行
sestatus,确认 Loaded policy name 显示当前策略名(如targeted),且 Policy from config file 与之匹配 - 确保
policycoreutils和policycoreutils-python已安装(CentOS/RHEL)或selinux-utils(Ubuntu)
使用 semodule 增量加载自定义模块(推荐热加载方式)
这是最常用、最安全的热加载方法,适用于添加功能策略(如支持新服务)、修复拒绝日志(AVC denials)等场景:
Linux 性能分析与调优专家,覆盖 CPU、内存、磁盘 I/O、网络、内核参数、编译优化、容器/K8s。适用场景:系统卡顿/高负载、内存不足/OOM/Swap 高、CPU 异常/iowait 高。
- 准备一个编译好的
.pp文件(例如myapp.pp),可通过checkmodule+semodule_package生成,或由audit2allow -M myapp自动生成 - 执行加载:
sudo semodule -i myapp.pp;若同名模块已存在,该命令会自动升级 - 验证是否成功:
sudo semodule -l | grep myapp应显示模块名及版本 - 模块加载后立即生效:新启动的进程、新打开的文件、新建立的网络连接均按新规则判断;已有进程若发生域转换(如执行
exec)也会受新策略约束
特殊场景:用 load_policy 替换整套策略(慎用)
此操作会完全替换当前内核中的策略数据库,属于“冷切换”,虽不需重启系统,但可能影响正在运行的服务行为,仅建议在测试环境或策略重构时使用:
- 确保新策略已编译为二进制格式(如
policy.bin),通常位于/etc/selinux/targeted/policy/下 - 执行:
sudo load_policy -q /etc/selinux/targeted/policy/policy.xxx(-q抑制警告,-i仅限 initramfs 初始化阶段,生产环境不用) - 重要特性:该命令会自动保留所有已设置的布尔值(
setsebool的开关),无需重新配置 - 注意:此操作不会重置文件上下文,但若新策略中文件类型(type)定义变更,需配合
restorecon修复实际文件标签
加载后必做的验证与调试
热加载不是“一装了事”,必须验证效果并观察副作用:
- 查看模块列表:
sudo semodule -l | head -10,确认目标模块在列 - 检查是否有新 AVC 拒绝:
sudo ausearch -m avc -ts recent | audit2why,若仍有拒绝,说明策略未覆盖全 - 模拟关键操作(如启动服务、读写特定目录、建立监听端口),观察是否仍被阻止
- 如需回滚,可用
sudo semodule -r myapp卸载模块(前提是没被其他模块依赖)










