Docker 简明教程
Docker - Security
Docker 安全性对于确保容器化应用程序保持完全功能和可靠性至关重要。与 Docker 安全性相关的首要关注点之一是有效的容器隔离,以防止恶意活动传播。Docker 利用 Linux 内核命名空间和组或控制组来隔离进程和资源。
通过建立命名空间,每个容器都可以拥有一个独占的环境,并且无法直接访问其他容器持有的资源。另一方面,组限制容器可以消耗的资源,无论是 CPU、内存、磁盘 I/O 等,以保持公平的分配并防止系统耗尽。仅仅使用 Linux 内核的这些特性,Docker 就维护了一个出色的基线安全模型,从而有助于减轻常见的威胁。
镜像管理和正确处理 Docker 守护程序成为确保 Docker 安全的另一个关键领域。这包括确保镜像来自受信任的存储库并定期扫描漏洞,这是不部署受损容器的一种方式。用于验证镜像的完整性和安全性的典型工具是 Docker Content Trust 和镜像扫描服务。
在审查 Docker security 时需要考虑以下 four major areas −
-
内核的内在安全性以及对命名空间和 cgroup 的支持
-
仅 Docker 守护程序暴露的攻击面
-
容器配置配置文件中的漏洞,无论是默认情况下还是用户自定义漏洞。
-
内核的“强化”安全特性和安全特性如何与容器交互。
让我们在这章中讨论 Docker 容器安全的更多方面。
Kernel Namespaces
Namespace 基本是 Docker 用于隔离容器运行的东西。这些 namespace 将内核资源分区,其中一组进程看到一组资源,而另一组进程看到的是另一组资源。
Docker 使用以下类型的 namespace -
-
PID Namespace − 它隔离进程 ID,这意味着容器中的进程 ID 将不同于主机上的进程 ID。
-
Mount Namespace − 这分离了文件系统中的挂载点,以确保容器中看到的与主机上的文件系统分离。
-
Network Namespace − 通过接口、IP 地址和路由表隔离网络。
-
UTS Namespace − 隔离内核和版本标识符。
-
IPC Namespace − 隔离 IPC 资源,包括消息队列、信号量和共享内存等。
-
User Namespace − 隔离用户和组 ID,允许容器在容器中以非 root 身份运行,但在主机上映射到 root。
Docker 通过使用这些 Namespace 实现容器相互之间和主机之间的隔离。
Control Groups
Docker 的另一项基本安全特性是提供资源隔离和管理,即 Control Group。Cgroup 控制容器可以消耗的系统资源量,防止一个容器耗尽系统资源并吸附在主机的系统上到其他容器。
Cgroup 提供的一些关键资源控制示例有 -
-
CPU − 与容器共享 CPU 并设置容器的 CPU 使用限制。
-
Memory − 限制容器的内存使用量,以及交换内存 - 以防止容器使用超出分配的内存。
-
Disk I/O − 确定程序对磁盘读写速度有多快。
-
Network − 管理网络的带宽分配。
Docker 在容器之间对资源进行了公平分配,避免了资源争用,从而增强了整体系统稳定性和安全性。
Docker Daemon Attack Surface
Docker 守护程序以 root 级权限运行,这是一个严重的安全问题。攻击者可以破坏它并控制整个主机系统。为减小攻击面,必须遵循最佳实践 −
-
Limit Access −仅允许特定用户访问 Docker 守护进程,同时控制可以运行 Docker 命令的人员 - 限制了对使用 Unix 套接字权限或使用 TLS 的 TCP 进行安全通信的访问。
-
Use Rootless Mode −尽可能多地使用 Docker 的无根模式;在此模式下,守护进程和容器不使用 root 权限运行。它被认为是减少特权升级可能性的方法。
-
Network Security −确保不对公共互联网公开 Docker 守护进程 API。如果需要从远程位置访问 Docker 守护进程 API,请通过防火墙规则和 VPN 进行保护。
-
Regular Updates −保持 Docker 和基本操作系统更新,以防止任何已识别的漏洞。
Capabilities of the Linux Kernel
Linux 内核功能提供了对提供给进程的特权的细粒度控制。Docker 使用功能来减少可以分配给容器的特权数量,其中容器通常仅分配其操作所需的必要功能。以下功能正在使用中——
-
CAP_NET_BIND_SERVICE −允许绑定到 1024 以下的端口。
-
CAP_SYS_ADMIN −此功能允许执行许多不同的系统管理操作。
-
CAP_SYS_PTRACE −此功能允许进程追踪其他进程。
Docker 默认放弃许多功能,以减少特权升级的可能性。用户可以使用 --cap-add
和 --cap-drop
选项分别在启动容器后添加或放弃其他特定功能,从而可以将安全配置文件微调到其应用程序的特定需求。
Docker Content Trust Signature Verification
Docker Content Trust (DCT) 提供图像签名和验证。这保证了图像未被篡改,并且来自它们出现的位置。当启用 DCT 时,Docker 将在拉取或运行之前检查图像的数字签名,以确保仅使用受信任的图像。
以下是一些让 DCT 成为安全供应链如此重要组成部分的关键特性−
-
Image Signing − 开发人员可以使用其私钥签署图像。
-
Signature Validation − Docker 根据附加的公钥验证这些签名,以确保图像未被更改或未被篡改。
-
Immutable Tags − 防止意外覆盖已签名的图像。
启用 DCT 支持增强整个系统的安全性,从而仅部署经过验证和受信任的图像,否则从被篡改或恶意的图像中得到保护。
Other Kernel Security Features
除了名称空间、组和功能之外,其他增强 Docker 中安全性的 Linux 内核安全特性如下——
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。在构建更小、更安全的镜像时,此功能最有用。例如,您可以使用一个较大的基础镜像来构建和编译您的应用程序工件,然后将这些工件复制到一个小型的最终镜像中。这减少了最终镜像的大小,并且无需将所有构建工具和依赖项包含在最终镜像中,而这些工具和依赖项往往会最大限度地减少安全漏洞。
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 身份运行容器。非常仔细地在开放端口级别配置网络访问,并使用防火墙限制流量。监控容器的活动及其日志中的任何可疑行为。