确保Docker容器部署安全的3个基本步骤

爱德华Kisller
2021-03-26 00:41

用户添加图片

Docker容器为您的工作负载提供了比传统服务器和虚拟机(VM)模型更安全的环境。它们提供了一种方法,可以将应用程序分解为更小的、松散耦合的组件,每个组件彼此隔离,攻击面大大减少。

这可以限制黑客利用您的计算机系统的机会,并使漏洞更难在攻击事件中传播。

但是,尽管Docker增强了保护级别,您仍然需要了解该技术的安全隐患,并保持最佳实践来保护容器化系统。

这在很大程度上类似于您已经为基于vm的工作负载所做的工作—例如监控容器活动,限制资源消耗各集装箱的环境,维护良好应用程序设计实践中,修补漏洞确保凭证不要让它们进入Docker图像。

但是您还需要采取针对Docker部署的特定安全措施。因此,下面列出了保护托管在容器平台上的应用程序的三个基本步骤。

免费扫描您的Docker映像!
扫描任何图像的安全漏洞在3个简单的步骤,与x射线CLI

扫描码头图像

让我们首先看看IT团队从一开始就需要知道的第一个也是最重要的考虑因素。

1.以非根用户运行容器

默认情况下,Docker为容器中的进程提供了根权限,这意味着它们对容器和主机环境具有完全的管理访问权。

然而,正如您不会在标准Linux服务器上以根用户身份运行进程一样,您也不会在容器中以根用户身份运行它们。

如果没有适当的关心和注意,开发人员很容易忽略这种默认行为,并创建不安全的映像,错误地授予根访问权。

这可能是给黑客的礼物,他们可以利用这个漏洞窃取API密钥、令牌、密码和其他机密数据,或者干扰容器部署的底层主机,并对服务器系统造成恶意破坏。

此外,你的DevOps团队也可能会因为不受限制的访问权限而对Docker环境造成意想不到的后果。例如,它们可能会无意中创建映像,这些映像由具有管理访问权限的Dockerfile命令构建,在启动容器时擦除数据或更改主机系统设置。

如何防止容器以Root身份运行

如果你不确定你的父映像使用什么特权,那么你应该强制你的容器使用一个自定义的用户或组标识符来减少权限。这样,容器进程将只能访问执行预期功能所需的资源。2022世界杯阿根廷预选赛赛程

你可以这样做:

➜在Dockerfile中设置一个非root用户

首先设置一个专用的用户或组标识符,其中只包含应用程序所需的访问权限。

然后添加用户Dockerfile指令指定此用户或组用于在映像构建和容器运行时进程中运行命令。

下面是一个非常基本的Dockerfile示例。但是,您可以重复用户语句,因为有时可能需要运行需要不同权限级别的不同进程。

从centos: 7
执行groupadd -g 1000 basicuser &&
Useradd -r -u 1000 -g basicuser basicuser
用户basicuser

➜包括用户选项。

用户选项中的码头工人运行命令覆盖Dockerfile中指定的任何用户。因此,在下面的示例中,您的容器将始终以最低权限提供的用户标识符(1009也具有最低权限级别)运行。$ docker运行——用户1009 centos:7
但是,这种方法并不能解决映像本身的潜在安全缺陷。因此,最好在Dockerfile中指定一个非根用户,这样容器就能始终安全地运行。

用户添加图片请注意:Linux内核不识别用户名。因此,您必须指定用户或组标识符。

2.使用您自己的私有注册表

私有注册中心是由使用它的组织设置的完全独立的容器映像目录。你可以把它托管在你自己的基础设施上,也可以托管在第三方注册服务上,比如Amazon ECR、Azure Container registry、谷歌Container registry、Red Hat Quay和JFrog 's own容器注册服务

私有注册表使您可以完全控制您如何管理图片通常提供更高级的功能,这可以帮助保持你的库存安全。

它们通常包括功能,例如:

  • 复杂的图像扫描工具,用于识别妥协和未修补的漏洞。
  • 严格的治理,例如基于角色的访问控制(RBAC)和遵从性监视。
  • 数字签名、图像验证和其他篡改保护功能。
  • 用于开发、测试和生产的隔离注册中心。

相比之下,公共注册中心,例如码头工人中心,基本上只提供基本的服务——你必须信任图片发布者,他们可能不遵守同样高的安全标准。

因此,您可能会得到包含恶意代码或过时代码的映像,并最终得到对数据泄露非常开放的容器环境。

扫描您的Docker映像!
扫描任何图像在3个简单的步骤

现在扫描

3.保持你的图片简洁明了

图像越大,Docker容器的攻击面就越大。

对于成熟的VM,您别无选择,只能使用完整的操作系统。但是对于Docker工作负载,容器只需提供应用程序所需的资源。2022世界杯阿根廷预选赛赛程

选择最小化的父映像

首先,您应该意识到Docker Hub上的一些图像比其他图像更流线型。例如,在ubuntu存储库中,一些映像的大小是其他映像的两倍多。

因此,您不应该只是自动提取最新的图像。理想情况下,您应该寻找占用空间最小的应用程序,然后添加支持应用程序所需的任何包和依赖项。

Docker Hub显示了存储库中每个图像的压缩大小,如下图所示的Minimal Ubuntu版本。
用户添加图片

拖动图像后,可以使用码头工人的图片命令。
$ docker图像
然后寻找刚才下载的图像的条目,如下所示。

存储库标记映像id创建大小
ubuntu 18.04 ccc6e87d48b 4 days ago

在Dockerfile和.dockerignore中优化图像

接下来,您需要创建一个Dockerfile来为容器构建自己的流线型映像。这将由你的父图像和你自己的图层组成最终的图像构建。

当您添加这些层时,您将创建不是运行时环境的必要部分的工件。要排除这些,您应该在根目录中设置一个.dockerignore文件,您打算从根目录构建映像。

使用多级构建

最后,另一种减小图像大小的方法是使用Docker多级构建特性版本17.05及更高版本支持。

这允许您使用不止一个指令在你的Dockerfile。

随着每一个新的语句时,您可以使用表示构建的新阶段的不同父映像。然后,您可以有选择地将您想要的工件从一个阶段复制到下一个阶段,在构建图像层时留下多余的部分。

下面的Dockerfile是一个实际的多阶段构建示例。


从golang: 1.7.3
WORKDIR /去/ src / github.com/alexellis/href-counter/
运行,获取-d -v golang.org/x/net/html
复制app.go。
运行CGO_ENABLED=0 GOOS=linux go build -a -installsuffix cgo -o app。

从高山:最新
执行命令apk -no-cache add ca-certificates
WORKDIR /root/
COPY -from =0 /go/src/github.com/alexellis/href-counter/app。
CMD(“。/应用程序”)

验证图像完整性

另一种提高容器安全性的方法是在从Docker Hub提取映像之前验证映像。

Docker守护进程默认提取Docker映像而不检查它们的完整性。然而,随着Docker Engine 1.8的发布,平台引入了一个新功能,Docker内容信任,支持数字签名而且身份验证的图像。

此服务允许您向发布到远程目录的映像添加加密签名。与此同时,当您试图提取图像时,它会自动验证数字签名。这样,您就可以确定映像的所有者就是他们声称的那个人。

要激活Docker内容信任,您需要在Linux中设置以下变量出口命令。$ export DOCKER_CONTENT_TRUST=1
这将只设置当前shell中的特性。如果你想全面持久地启用Docker内容信任,那么你需要在所有用户共享的默认环境变量中设置它。

尽管Docker Content Trust无法验证图像的质量,但它可以帮助您保持图像的干净,防止在传输过程中被破坏或通过未经授权的访问存储库来存储图像。

了解更多关于Docker的信息