解释 `--security-opt apparmor=unconfined` 对 CRIU 的必要性
解读
在国内金融、运营商、政务云等生产环境,容器热迁移与秒级弹性伸缩是高频面试考点。CRIU(Checkpoint/Restore In Userspace)作为唯一被 Docker 官方集成的用户态热迁移工具,必须穿透 AppArmor 的强制访问控制(MAC)才能冻结与恢复进程树。若未关闭 AppArmor,restore 阶段会触发 ptrace、mprotect、process_vm_readv 等系统调用的 DENIED 审计日志,导致热迁移失败,直接违反业务连续性 SLA。面试官通过此题考察候选人对“安全加固 vs 热迁移可用性”权衡的深度理解。
知识点
- AppArmor 模式:enforce 与 complain 两种状态,enforce 下拒绝未显式授权的操作。
- CRIU 核心系统调用:ptrace(PTRACE_SEIZE)、process_vm_readv/writev、mprotect、prctl(PR_SET_MM)、userfaultfd。
- Docker 默认 AppArmor 策略:docker-default 仅允许白名单内的 capability 与路径,未覆盖 CRIU 所需的全部 ptrace 与内存映射权限。
--security-opt apparmor=unconfined本质:将容器进程置于无 AppArmor 配置文件的“未限制”域,等同于宿主机 unconfined 域,绕过所有 MAC 检查。- 国内合规要求:等保 2.0 三级以上场景需保留审计日志,因此不可直接关闭 AppArmor,而应编写自定义 apparmor-criu 配置文件并
--security-opt apparmor=apparmor-criu,兼顾安全与功能。
答案
CRIU 在 restore 阶段需要执行 ptrace、process_vm_readv、mprotect 等高危系统调用来重建进程地址空间与线程状态。Docker 默认的 apparmor=docker-default 策略未授权这些调用,会触发内核审计拒绝,导致 restore 失败。使用 --security-opt apparmor=unconfined 可临时解除 AppArmor 强制访问控制,使 CRIU 获得全部所需权限,从而完成热迁移。生产环境建议自定义最小权限 AppArmor 配置文件替代 unconfined,以满足国内等保合规要求。
拓展思考
- 与 seccomp 的叠加限制:即使加了 apparmor=unconfined,若 seccomp 默认过滤器未放行 userfaultfd,CRIU 仍可能失败;需同时
--security-opt seccomp=criu.json。 - rootless Docker 场景:国内部分银行采用 rootless 模式,CRIU 需要新的uidmap+mnt 隔离与 AppArmor 命名空间支持,unconfined 可能无效,需内核 ≥5.15 并启用 apparmor_ns。
- 替代方案:使用 criu-image-streamer + pre-dump 策略,在业务低峰期提前生成内存增量镜像,降低对 unconfined 的依赖,实现“安全加固下的热迁移”。