不给容器"作妖"的机会,从系统调用层掐断它!
之前的文章我们讲解了如何通过 Falco 等工具进行容器运行时的行为监控。但监控不是防御,事后追责远不如事前封堵。
容器天生就运行在主机内核之上,可以访问宿主机提供的系统调用(syscall),这也是最容易被攻击者利用的突破口。一旦容器逃逸成功,整个宿主机就可能沦陷。
那么有没有办法从源头上阻止容器发起危险调用 呢?有!这正是 AppArmor 和 Seccomp 的职责所在。
一、容器逃逸的"根"在哪?
容器并非真正的虚拟化技术,它们共用主机的内核。因此,如果攻击者能让容器执行某些敏感系统调用,如:
- mount:挂载新目录
- ptrace:附加调试其他进程
- clone:创建新命名空间
- mknod:创建块设备或字符设备
- cap_sys_admin:万金油权限,可干很多事
就有可能突破容器边界,执行"容器逃逸"。
二、容器系统调用控制机制概览

AppArmor:基于文件路径和权限的强制访问控制(MAC)系统
Seccomp:用于限制程序可用的系统调用集合(白名单机制)
这两者可以同时作用,共同构建一套容器系统调用的"限制墙"。
三、Seccomp:从内核级锁死危险系统调用
3.1 什么是 Seccomp?
Seccomp,全称 Secure Computing Mode,是 Linux 内核原生支持的功能,最早用于沙箱环境,现在广泛用于容器中。它通过白名单机制,明确哪些系统调用是允许的,其余的全部拒绝。
3.2 Docker 默认启用了 Seccomp
Docker 默认就启用了 seccomp,使用内置的 default.json 策略,屏蔽了 44 个危险 syscall(如 keyctl、add_key 等)。
你可以通过如下命令查看默认配置:
bash
docker info | grep -i seccomp
# Output: Seccomp: true
四、Seccomp 策略实战
4.1 查看默认策略
bash
cat /usr/share/docker/seccomp.json
4.2 自定义 Seccomp 策略
示例:禁止容器使用 chmod 命令
bash
{
"defaultAction": "SCMP_ACT_ALLOW",
"syscalls": [
{
"name": "chmod",
"action": "SCMP_ACT_ERRNO"
}
]
}
运行容器时加载策略:
bash
docker run --rm --security-opt seccomp=custom.json alpine chmod 777 test.txt
# 会报错,调用被拒绝
五、AppArmor:路径级安全管控
5.1 什么是 AppArmor?
AppArmor 是 Ubuntu 系统默认启用的 MAC(Mandatory Access Control)机制,用于限定程序对文件系统、网络资源、capabilities 的访问权限。
5.2 AppArmor 策略结构
AppArmor 的规则文件类似于:
bash
# 示例:只允许读 /etc/passwd
/etc/passwd r,
/etc/shadow r,
deny /bin/bash x,
规则文件放置在 /etc/apparmor.d/ 中,使用 aa-complain、aa-enforce 命令切换模式。
六、Docker 中启用 AppArmor
6.1 查看系统支持的 AppArmor 配置文件
bash
ls /etc/apparmor.d/docker*
Ubuntu 系统默认启用了 docker-default 配置。
6.2 自定义 AppArmor 策略文件
示例策略 my-apparmor-profile:
bash
profile my-apparmor-profile flags=(attach_disconnected) {
# 允许只读访问 /etc
/etc/** r,
# 拒绝写入 /bin
deny /bin/** w,
# 拒绝执行 shell
deny /bin/sh x,
}
加载并生效:
bash
apparmor_parser -r my-apparmor-profile
启动容器绑定策略:
bash
docker run --rm --security-opt apparmor=my-apparmor-profile alpine
七、组合防御机制示意图

这是一种"最小权限原则"的体现:不让容器接触任何它不需要的资源与调用能力。
八、Kubernetes 中的 Seccomp 与 AppArmor
8.1 SeccompProfile in PodSpec
bash
apiVersion: v1
kind: Pod
metadata:
name: secure-pod
annotations:
seccomp.security.alpha.kubernetes.io/pod: localhost/my-seccomp.json
spec:
containers:
- name: myapp
image: myimage
Kubernetes 1.19+ 开始正式 GA 支持 SeccompProfile 字段(非 Alpha)。
8.2 AppArmorProfile in PodSpec
bash
metadata:
annotations:
container.apparmor.security.beta.kubernetes.io/myapp: localhost/my-apparmor-profile
注意:需要宿主机支持 AppArmor,并且策略文件需手动放在对应节点的 /etc/apparmor.d/ 中。
九、实战防御技巧总结
安全机制 | 优势 | 建议策略 |
---|---|---|
Seccomp | 控制系统调用粒度精细 | 白名单机制,删除所有不必要 syscall |
AppArmor | 控制路径、权限行为 | 拒绝写入系统目录,禁止执行 shell |
双重保护 | 层层加固,互补增强 | 同时启用 AppArmor + Seccomp,形成内外闭环防护 |
十、总结
与其依赖容器被攻击后的监控,不如在最开始就让容器"动不了"。AppArmor 和 Seccomp 是原生的、性能几乎无影响的安全机制,一旦配置得当,可以抵御 90% 的容器逃逸尝试。
安全从来不是靠日志拦截,而是靠策略封堵!