用 AppArmor 与 Seccomp 锁死容器的“危险行为”!

不给容器"作妖"的机会,从系统调用层掐断它!


之前的文章我们讲解了如何通过 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% 的容器逃逸尝试

安全从来不是靠日志拦截,而是靠策略封堵!

相关推荐
别骂我h2 小时前
容器技术技术入门与Docker环境部署
java·spring cloud·docker
showyoui2 小时前
Dockerfile 最佳实践
容器
最不会程序的程序猿3 小时前
docker执行yum报错Could not resolve host: mirrorlist.centos.org
docker·容器·centos
蚊子不吸吸3 小时前
在Docker、KVM、K8S常见主要命令以及在Centos7.9中部署的关键步骤学习备存
linux·学习·docker·kubernetes·centos·k8s·kvm
萌新小码农‍3 小时前
Docker简单介绍与使用以及下载对应镜像(项目前置)
docker·容器·eureka
UFIT3 小时前
容器技术入门与docker环境部署
云原生·eureka
风清再凯4 小时前
docker基础入门于应用的实践
运维·docker·容器
惊起白鸽4506 小时前
容器技术技术入门与Docker环境部署
java·spring cloud·docker