用 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% 的容器逃逸尝试

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

相关推荐
余—笙1 小时前
Linux(docker)安装搭建CuteHttpFileServer/chfs文件共享服务器
linux·服务器·docker
奥尔特星云大使1 小时前
《系统规划与管理师教程(第2版)》方法篇 第10章 云原生系统规划 知识点总结
云原生·软考·高级·系规
芥子沫2 小时前
《玩转Docker》[应用篇13]:Docker安装部署Emby及使用技巧:家庭媒体服务器
docker·视频·emby
熙客3 小时前
Kubernetes是如何保证有状态应用数据安全和快速恢复的
mysql·云原生·容器·kubernetes
爱宇阳3 小时前
从容器化到自动化:Spring Boot 项目 Docker 部署与 GitLab CI/CD 集成 Harbor 全流程
spring boot·docker·自动化
Wang's Blog4 小时前
Nestjs框架: 微服务项目工程结构优化与构建方案
微服务·云原生·架构·nestjs
似水流年 光阴已逝5 小时前
Kubernetes Pod 基本原理:全面详解
云原生·容器·kubernetes·pod
PKNLP5 小时前
07.docker介绍与常用命令
运维·docker·容器
阿里云云原生5 小时前
评估工程正成为下一轮 Agent 演进的重点
云原生
人工智能训练7 小时前
在ubuntu系统中如何将docker安装在指定目录
linux·运维·服务器·人工智能·ubuntu·docker·ai编程