实时拦截容器未授权进程调用需构建“过滤—监控—拦截”三层防线:先用seccomp白名单硬拦截高危syscall,再以ebpf结合上下文动态阻断execve等行为,最后通过capabilities裁剪、只读文件系统和no-new-privileges加固环境。

要实时拦截容器内未授权进程调用,关键不是等行为发生后再告警,而是从系统调用层直接阻断。核心手段是结合 Seccomp 的白名单机制、eBPF 的动态策略执行,以及运行时能力裁剪,形成“过滤—监控—拦截”三层防线。
用 Seccomp 做系统调用级硬拦截
Seccomp 是内核原生机制,能在进程发起危险系统调用时立即返回错误(如 EPERM),不依赖用户态代理,拦截零延迟。
- 默认策略已禁用约 40+ 高危 syscall(如
ptrace、mount、chroot),但需确认是否启用:进入容器后执行cat /proc/self/status | grep Seccomp,返回值为2表示 Strict 模式生效 - 推荐使用白名单模式(
"defaultAction": "SCMP_ACT_ERRNO"),只放行业务必需的调用,例如仅允许read、write、openat、socket - 禁止 shell 类进程启动:在 seccomp 规则中显式拒绝
execve调用参数含/bin/sh、/bin/bash等路径(需配合 BPF 过滤器解析 argv)
用 eBPF 实现细粒度行为拦截
Seccomp 只能控制“能不能调”,eBPF 则能判断“该不该执行”,支持基于上下文的动态决策,比如根据容器标签、进程树、命令行参数实时拦截。
- 部署轻量 eBPF 代理(如
cilium/ebpf-agent),挂载到sys_enter_execvetracepoint,捕获每个 exec 尝试 - 规则示例:当检测到容器内执行
nc -lvnp 4444或python3 -c "import socket"时,直接调用bpf_override_return()返回 -1,终止进程创建 - 支持与 OpenPolicy Agent(OPA)集成,将策略逻辑外置,实现 JSON 策略热更新,无需重启容器
配合 Capabilities 和只读文件系统加固执行环境
拦截效果取决于执行环境是否足够受限。若容器仍保有高权能或可写根目录,攻击者可能绕过拦截逻辑。
- 启动容器时强制移除全部 capabilities:
--cap-drop=ALL,再按需添加最小集,如--cap-add=NET_BIND_SERVICE - 启用
--read-only根文件系统,防止写入恶意二进制或篡改配置;对必要可写路径(如/tmp)单独挂载 tmpfs - 禁用新权限获取:
--security-opt no-new-privileges,阻止子进程通过setuid或file capability提权
验证拦截是否真正生效
不能只看日志或告警,要实测阻断能力:
- 在容器内尝试执行
sh、strace、nsenter等工具,观察是否返回Operation not permitted - 用
perf trace -e 'syscalls:sys_enter_*'查看被拦截的系统调用是否出现在 trace 结果中(应无对应事件) - 检查 eBPF map 中的拦截计数器(如
ebpf_map_lookup_elem(map_fd, &key, &value)),确认匹配规则后触发了 drop 动作











