Docker容器加固指南

「鸿蒙心迹」“2025・领航者闯关记“主题征文活动 10w+人浏览 520人参与

1. 保护 Docker 守护进程 (Protecting the Docker Daemon)

如果攻击者能够与 Docker 守护进程 (Docker Daemon) 交互,他们就可以控制你系统上的所有容器和镜像。默认情况下,Docker 守护进程不暴露于网络,但手动暴露它是一种常见做法(尤其是在 CI/CD 等云环境中)。因此,必须通过以下方法对其进行保护。

方法一:使用 SSH (Method 1: Using SSH)

通过 Docker 上下文 (contexts),你可以安全地通过 SSH 与远程 Docker 守护进程交互。

  1. 创建上下文: 在你的客户端机器上,创建一个指向远程主机的 Docker 上下文。

    Bash

    docker context create \
    --docker host=ssh://myuser@remotehost \
    --description="Development Environment" \
    development-environment-host
    
  2. 切换上下文: 切换到新创建的上下文。此后,所有 docker 命令都将在远程主机上执行。

    Bash

    docker context use development-environment-host
    
  3. 切换回默认: 要管理本地 Docker 守护进程,可以切换回默认上下文。

    Bash

    docker context use default
    
方法二:使用 TLS 加密 (Method 2: Using TLS Encryption)

你可以配置 Docker 守护进程,使其只接受通过 TLS 证书认证的客户端的连接。

  • 启动服务器 (守护进程):

    Bash

    dockerd --tlsverify \
    --tlscacert=myca.pem \
    --tlscert=myserver-cert.pem \
    --tlskey=myserver-key.pem \
    -H=0.0.0.0:2376
    
  • 连接客户端:

    Bash

    docker --tlsverify \
    --tlscacert=myca.pem \
    --tlscert=client-cert.pem \
    --tlskey=client-key.pem \
    -H=SERVERIP:2376 info
    
  • 参数说明:

    • --tlscacert: 指定用于验证的证书颁发机构 (CA) 的证书。

    • --tlscert: 指定用于识别设备的证书。

    • --tlskey: 指定用于解密通信的私钥。

2. 实施控制组 (cgroups) (Implementing Control Groups)

控制组 (cgroups) 是 Linux 内核的一项功能,用于限制和隔离进程的资源使用(CPU、内存等)。在 Docker 中使用 cgroups 可以防止有故障或恶意的容器耗尽整个主机的资源。

限制容器资源 (Limiting Container Resources)
资源参数示例命令
CPU--cpus="<cores>"docker run -it --cpus="1.5" mycontainer
内存--memory="<size>"docker run -it --memory="512m" mycontainer
  • 更新运行中的容器:

    Bash

    docker update --memory="1g" mycontainer
    
  • 查看资源限制:

    Bash

    docker inspect mycontainer
    
3. 防止特权容器 (Preventing Privileged Containers)

运行带有 --privileged 标志的容器极其危险,因为它会完全移除容器与主机之间的所有隔离机制,给予容器对主机的完全 root 访问权限,使其可以轻松“逃逸”。

Linux 能力 (Linux Capabilities)

作为 --privileged 的一个更安全的替代方案,Linux 能力 (Capabilities) 允许你以细粒度的方式为容器授予其真正需要的特定权限,而不是给予全部 root 权限。

能力描述常见用例
CAP_NET_BIND_SERVICE允许进程绑定到 1024 以下的端口。允许 Web 服务器容器在无需 root 权限的情况下绑定到 80/443 端口。
CAP_SYS_ADMIN授予多种管理权限,如挂载文件系统、修改网络设置等。用于需要执行管理任务的自动化脚本容器。
CAP_SYS_RESOURCE允许进程修改其资源限制。用于需要动态调整自身资源消耗的性能敏感型应用。

最佳实践: 绝不使用 --privileged。应使用 --cap-add--cap-drop 来精确地为容器授予其完成任务所需的最小权限集。

Bash

# 为容器添加绑定低位端口的能力
docker run -d --cap-add=NET_BIND_SERVICE my-web-server
4. 高级隔离:Seccomp 与 AppArmor (Advanced Isolation: Seccomp & AppArmor)
Seccomp (安全计算模式)

Seccomp 是一个 Linux 内核安全功能,它通过一个配置文件来限制容器可以执行的系统调用 (syscalls)。这就像一个白名单,只允许容器执行其正常功能所必需的系统调用。

  • 示例 Seccomp 配置文件 (profile.json):

    此配置文件允许文件读写,但禁止所有网络相关的系统调用(如 socket, connect)。

    JSON

    {
      "defaultAction": "SCMP_ACT_ALLOW",
      "architectures": ["SCMP_ARCH_X86_64"],
      "syscalls": [
        { "name": "socket", "action": "SCMP_ACT_ERRNO" },
        { "name": "connect", "action": "SCMP_ACT_ERRNO" },
        { "name": "bind", "action": "SCMP_ACT_ERRNO" }
      ]
    }
    
  • 应用 Seccomp 配置文件:

    Bash

    docker run --rm -it --security-opt seccomp=/path/to/profile.json mycontainer
    
AppArmor (应用程序盔甲)

AppArmor 是一个强制访问控制 (MAC) 系统,它通过一个配置文件来限制应用程序可以访问的资源(如文件路径、网络端口、Linux 能力)。

  • 应用流程:

    1. 创建 AppArmor 配置文件: 编写一个定义允许和拒绝规则的文本文件。

    2. 加载配置文件到 AppArmor:

      Bash

      sudo apparmor_parser -r -W /path/to/apparmor_profile
      
    3. 运行容器并应用配置文件:

      Bash

      docker run --rm -it --security-opt apparmor=your_profile_name mycontainer
      
Seccomp vs. AppArmor:有什么区别?
  • AppArmor: 关注**“应用程序可以访问什么”**(例如,它可以读写 /var/log,但不能读取 /etc/passwd)。

  • Seccomp: 关注**“应用程序可以做什么”**(例如,它可以执行 readwrite 系统调用,但不能执行 socket 系统调用)。

纵深防御: 这两者不是互斥的。最佳安全实践是同时使用 AppArmor 和自定义的 Seccomp 配置文件,为容器创建多层安全防护。

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值