Docker 简明教程

Docker - Security

Docker 安全性对于确保容器化应用程序保持完全功能和可靠性至关重要。与 Docker 安全性相关的首要关注点之一是有效的容器隔离,以防止恶意活动传播。Docker 利用 Linux 内核命名空间和组或控制组来隔离进程和资源。

通过建立命名空间,每个容器都可以拥有一个独占的环境,并且无法直接访问其他容器持有的资源。另一方面,组限制容器可以消耗的资源,无论是 CPU、内存、磁盘 I/O 等,以保持公平的分配并防止系统耗尽。仅仅使用 Linux 内核的这些特性,Docker 就维护了一个出色的基线安全模型,从而有助于减轻常见的威胁。

镜像管理和正确处理 Docker 守护程序成为确保 Docker 安全的另一个关键领域。这包括确保镜像来自受信任的存储库并定期扫描漏洞,这是不部署受损容器的一种方式。用于验证镜像的完整性和安全性的典型工具是 Docker Content Trust 和镜像扫描服务。

在审查 Docker security 时需要考虑以下 four major areas

  1. 内核的内在安全性以及对命名空间和 cgroup 的支持

  2. 仅 Docker 守护程序暴露的攻击面

  3. 容器配置配置文件中的漏洞,无论是默认情况下还是用户自定义漏洞。

  4. 内核的“强化”安全特性和安全特性如何与容器交互。

让我们在这章中讨论 Docker 容器安全的更多方面。

Kernel Namespaces

Namespace 基本是 Docker 用于隔离容器运行的东西。这些 namespace 将内核资源分区,其中一组进程看到一组资源,而另一组进程看到的是另一组资源。

Docker 使用以下类型的 namespace -

  1. PID Namespace − 它隔离进程 ID,这意味着容器中的进程 ID 将不同于主机上的进程 ID。

  2. Mount Namespace − 这分离了文件系统中的挂载点,以确保容器中看到的与主机上的文件系统分离。

  3. Network Namespace − 通过接口、IP 地址和路由表隔离网络。

  4. UTS Namespace − 隔离内核和版本标识符。

  5. IPC Namespace − 隔离 IPC 资源,包括消息队列、信号量和共享内存等。

  6. User Namespace − 隔离用户和组 ID,允许容器在容器中以非 root 身份运行,但在主机上映射到 root。

Docker 通过使用这些 Namespace 实现容器相互之间和主机之间的隔离。

Control Groups

Docker 的另一项基本安全特性是提供资源隔离和管理,即 Control Group。Cgroup 控制容器可以消耗的系统资源量,防止一个容器耗尽系统资源并吸附在主机的系统上到其他容器。

Cgroup 提供的一些关键资源控制示例有 -

  1. CPU − 与容器共享 CPU 并设置容器的 CPU 使用限制。

  2. Memory − 限制容器的内存使用量,以及交换内存 - 以防止容器使用超出分配的内存。

  3. Disk I/O − 确定程序对磁盘读写速度有多快。

  4. Network − 管理网络的带宽分配。

Docker 在容器之间对资源进行了公平分配,避免了资源争用,从而增强了整体系统稳定性和安全性。

Docker Daemon Attack Surface

Docker 守护程序以 root 级权限运行,这是一个严重的安全问题。攻击者可以破坏它并控制整个主机系统。为减小攻击面,必须遵循最佳实践 −

  1. Limit Access −仅允许特定用户访问 Docker 守护进程,同时控制可以运行 Docker 命令的人员 - 限制了对使用 Unix 套接字权限或使用 TLS 的 TCP 进行安全通信的访问。

  2. Use Rootless Mode −尽可能多地使用 Docker 的无根模式;在此模式下,守护进程和容器不使用 root 权限运行。它被认为是减少特权升级可能性的方法。

  3. Network Security −确保不对公共互联网公开 Docker 守护进程 API。如果需要从远程位置访问 Docker 守护进程 API,请通过防火墙规则和 VPN 进行保护。

  4. Regular Updates −保持 Docker 和基本操作系统更新,以防止任何已识别的漏洞。

Capabilities of the Linux Kernel

Linux 内核功能提供了对提供给进程的特权的细粒度控制。Docker 使用功能来减少可以分配给容器的特权数量,其中容器通常仅分配其操作所需的必要功能。以下功能正在使用中——

  1. CAP_NET_BIND_SERVICE −允许绑定到 1024 以下的端口。

  2. CAP_SYS_ADMIN −此功能允许执行许多不同的系统管理操作。

  3. CAP_SYS_PTRACE −此功能允许进程追踪其他进程。

Docker 默认放弃许多功能,以减少特权升级的可能性。用户可以使用 --cap-add--cap-drop 选项分别在启动容器后添加或放弃其他特定功能,从而可以将安全配置文件微调到其应用程序的特定需求。

Docker Content Trust Signature Verification

Docker Content Trust (DCT) 提供图像签名和验证。这保证了图像未被篡改,并且来自它们出现的位置。当启用 DCT 时,Docker 将在拉取或运行之前检查图像的数字签名,以确保仅使用受信任的图像。

以下是一些让 DCT 成为安全供应链如此重要组成部分的关键特性−

  1. Image Signing − 开发人员可以使用其私钥签署图像。

  2. Signature Validation − Docker 根据附加的公钥验证这些签名,以确保图像未被更改或未被篡改。

  3. Immutable Tags − 防止意外覆盖已签名的图像。

启用 DCT 支持增强整个系统的安全性,从而仅部署经过验证和受信任的图像,否则从被篡改或恶意的图像中得到保护。

Other Kernel Security Features

除了名称空间、组和功能之外,其他增强 Docker 中安全性的 Linux 内核安全特性如下——

Seccomp (Secure Computing Mode)

Linux 中的一个内核特性,可用于过滤容器可以进行的特定系统调用,从而降低执行潜在危险操作的能力。Docker 使用 seccomp 配置文件来定义允许和拒绝的系统调用。

AppArmor 是一种限制应用程序的应用程序,它限制了 Linux 中的程序行为。Docker 使用 AppArmor 配置文件对容器应用强制访问控制规则,从而限制了它们的权限。

SELinux

这是另一个安全模块,可用于实现有关应用程序如何访问资源的安全策略。Docker 可以配置为使用 SELinux 来获得额外的高度安全性。

User Namespace Remapping

将容器内的用户 ID 和组 ID 映射到主机上的不同 ID,本质上是通过隔离容器进程和主机进程来提高安全性。

Docker Security Best Practices

虽然 Docker 使创建、分发和部署应用程序变得更加容易,但也有人对容器化环境的安全提出了一些担忧。Docker 安全性的基本方面之一就是选择和管理 Docker 镜像。通过实施有关镜像选择、构建流程和漏洞扫描的最佳实践,可以极大地提高 Docker 部署的安全性。

Choosing the Right Base Image from a Trusted Source and Keeping It Small

首先,在确定需要使用 Docker 镜像后,需要选择一个基础镜像。基础镜像始终需要从任何官方来源(如 Docker Hub)或任何其他信誉良好的存储库获取。官方镜像会定期更新,并且漏洞较少。此外,保持基础镜像的精简将减少其攻击面,并最大限度地减少不必要的软件包和依赖项的包含;因此,它可能没那么容易受到攻击。

Use Multi-Stage Builds

多阶段构建是 Docker 中的一项功能,允许在单个 Dockerfile 中使用多个 FROM。在构建更小、更安全的镜像时,此功能最有用。例如,您可以使用一个较大的基础镜像来构建和编译您的应用程序工件,然后将这些工件复制到一个小型的最终镜像中。这减少了最终镜像的大小,并且无需将所有构建工具和依赖项包含在最终镜像中,而这些工具和依赖项往往会最大限度地减少安全漏洞。

Rebuilding Images

定期重新构建 Docker 镜像,以便始终受益于最新的安全补丁和更新。如果您在构建基础镜像或其依赖项后发现其中有任何缺陷,则必须重新构建这些镜像以合并修复。自动构建和部署确保在有安全更新可用时对镜像进行重建和重新上传。

Verifying Your Image for Vulnerabilities

在将 Docker 镜像部署到生产环境之前,必须对其进行漏洞扫描。有几种可用工具可以帮助您扫描 Docker 镜像的已知漏洞,包括 Clair、Docker Security Scanning 和其他第三方漏洞扫描服务。这些工具会识别您镜像中的安全问题,并建议如何减轻这些问题,例如更新依赖项或使用不同的基础镜像。

Conclusion

保护 Docker 镜像是安全的容器化环境的关键。围绕选择受信任的基础镜像、确保它们的小尺寸、多阶段构建、频繁镜像重建和漏洞扫描的适当实践将有助于减少安全漏洞的风险,并确保 Docker 部署的完整性。此类实践不仅会增强安全态势,而且对于 Docker 环境的可靠性和性能至关重要。此外,深入了解内核命名空间、CGroup、DCT 等的工作原理有助于获得更精细的控制。

FAQ

Q 1. What are the main security concerns when using Docker?

Docker 与任何其他技术一样,都有其安全问题。这包括容器镜像、Docker 引擎或容器的漏洞;在容器中会泄露敏感数据或端口的错误配置;以过多的权限运行容器;以及针对主机系统通过容器漏洞的攻击。

Q 2. How can I ensure the security of my Docker images?

为基础镜像使用受信任的来源。从受信任的来源构建镜像 - 定期更新它们,以便修补所有漏洞。不要在镜像中包含密码和 API 密钥等敏感信息。使用扫描工具检查镜像的潜在 CVE,并对镜像进行签名以确保其完整性。

Q 3. What are some best practices for securely running Docker containers?

根据最小权限原则运行容器:仅允许所需的操作。尽可能避免以 root 身份运行容器。非常仔细地在开放端口级别配置网络访问,并使用防火墙限制流量。监控容器的活动及其日志中的任何可疑行为。

Q 4. Should I worry about Docker containers impacting the security of my host system?

虽然容器创建了隔离,但它们不能免受潜在威胁的侵害。例如,在某些情况下,运行在容器中的恶意代码可以利用 Docker 引擎或主机内核中的某些漏洞来突破容器并进入主机系统。让您的 Docker 安装和主机操作系统保持最新状态并应用最新的安全补丁,以使此风险最小。

是的,有相当多的工具和实践可以增强 Docker 安全性。使用镜像扫描工具(如 Clair 或 Trivy)来检测漏洞。您可能希望应用 AppArmor 或 SELinux 等其他工具,以便对容器实施更严格的安全策略 - 定期审查和审核 Docker 配置是否存在潜在错误配置。及时了解 Docker 安全更新和建议,以迅速解决新出现的威胁。