保护Docker容器部署的3个基本步骤

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

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

但是,无论Docker的保护级别如何增强,您仍然需要了解该技术的安全缺陷,并维护最佳实践来保护您的容器化系统。

这与您已经为基于vm的工作负载所做的工作非常相似,例如监控集装箱活动,限制资源消耗对每个容器环境,维护良好应用程序设计实践中,修补漏洞确保凭证不要让它们进入你的Docker镜像。

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

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

扫描docker映像

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

1.以非root用户运行container

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

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

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

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

此外,您的DevOps团队还可能与不受限制的访问权限发生冲突,从而给您的Docker环境带来意想不到的后果。例如,它们可能无意中创建映像,这些映像是由具有管理权限的Dockerfile命令构建的,当它们启动容器时,这些映像会擦除数据或更改主机系统设置。

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

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

你可以这样做:

寻求机会在你的Dockerfile中设置一个非root用户

首先设置一个专用的用户或组标识符,仅具有应用程序所需的访问权限。

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

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

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

应寻求机会用户选项,在你的Docker运行命令。

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

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

2.使用你自己的私人注册表

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

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

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

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

相比之下,公共注册中心,如码头工人中心在这种情况下,您必须信任图像发布者,他们可能不会遵循相同的高安全标准。

因此,您最终可能会得到包含恶意代码或过时代码的映像,并最终导致对数据泄露敞开大门的实时容器环境。

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

现在扫描

3.保持你的形象简洁干净

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

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

选择最小化父图像

首先,您应该知道Docker Hub上的一些图像比其他图像更精简。例如,在ubuntu存储库中,一些映像的大小是其他映像的两倍多。

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

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

提取图像后,可以使用码头工人的图片命令。
$ docker images
然后查找刚刚下载的图像的条目,如下所示。

存储库标记图像id创建的大小
ubuntu 18.04 ccc6e87d482b 4 days ago 64.2MB

优化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 gos =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 Content Trust,它支持数字签名身份验证的图像。

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

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

虽然Docker Content Trust无法验证映像的质量,但它可以通过防止传输过程中的危害或通过未经授权访问存储映像的存储库来帮助保持映像的干净。

了解更多关于Docker的信息