在构建、共享和运行Docker容器安全应用程序时,您需要考虑一些Docker安全最佳实践。Docker是一个开源平台,用于构建、共享和运行您的容器化应用程序。您可以轻松构建包含应用程序的Docker映像,在团队内部或团队外部共享它们,并且只需一个命令即可运行您的应用程序。看起来很容易,对吧?然而,确实如此。
您可能已经知道Docker是什么以及它是如何工作的。因此,我们不会详细介绍它。本博客将介绍使用Docker平台时需要考虑的12大Docker安全最佳实践。
为什么需要保护Dockerfile、容器?容器化因其应用程序可以在任何地方部署的灵活性而风靡全球。但是,这也引入了一些安全漏洞。Docker和Docker容器使构建、共享和部署应用程序变得非常容易,因此在部署后很难发现、检测、报告和修复安全问题。通过向左移动安全性,可以防止和最小化大部分开销。因此,保护从Dockerfile到Docker容器的所有内容以确保Docker容器安全性至关重要。
12大Docker安全最佳实践从一开始就可以通过各种专业来提高Docker容器安全性,即从编写Dockerfile到运行Docker容器。让我们继续看看可以将Docker容器安全性落实到位的12大Docker安全最佳实践。
1.使Docker主机和Docker引擎与Docker映像一起保持最新Docker容器在主机上可用的Docker引擎上运行。这些主机可以是Linux/Mac或Windows。Docker引擎可以是可用版本之一。使用最新的稳定版本至关重要,它更新了以前版本中的已知问题。这同样适用于主机操作系统。
例如,截至年12月27日,如果您使用Ubuntu作为主机操作系统,那么您可以使用Ubuntu20.04LTS而不是Ubuntu16.04LTS,对于Docker引擎,您可以使用20.10.11。查找Docker发行说明以获取更多信息,并检查Docker支持的操作系统平台。
安装更新或补丁非常重要,因为每个补丁都可以解决CVE--等漏洞。这个特定的补丁修复了用于从CLI登录docker注册表的凭据被发送到“registry-1.docker.io”而不是预期的私有注册表的错误;这通常是由于配置错误的配置文件(通常是`~/.docker/config.json`)列出了`credsStore`或`credHelpers.
请参考以下截图了解UbuntuOS的发布周期。
2.避免在Dockerfile指令中存储机密数据Dockerfile包含用于创建Docker映像的指令。COPY、RUN、ADD、CMD、ENTRYPOINT等。这些是一些可能是Dockerfile一部分的命令指令。我们还可以使用ENV和ARGS在运行时或构建时设置变量,具体取决于要求。您可以使用ENV或ARGS指令在Docker容器中使用环境变量。在设置环境变量时,您应该注意永远不要将机密、凭据、密码等分配给Dockerfile中的变量,也不应该在任何命令中进行硬编码。将此视为Dockerfile安全最佳实践之一,因为忽略它可能会导致潜在的安全威胁,并且可能会花费您很多钱。
例如,如果您在Dockerfile中硬编码数据库的密码或连接详细信息,将它们分配给环境变量,然后将Dockerfile上传到公共存储库,则任何有权访问存储库的人都可以获得这些凭据并可以访问详细信息或连接到数据库。
FROMmysql:5.7ENVDATABASE_USERNAME=admin#-SettingusernameisacceptableENVDATABASE_PASSWORD=mypassword
!##-Avoidsettingpasswordatanycost.避免使用不受信任的镜像注册表镜像注册表是存储Docker镜像的地方。它可以是私有的或公共的。DockerHub是Docker官方的基于云的Docker镜像注册表,它是安装时的默认注册表。如果您未配置任何注册表,则将从该公共存储库中提取图像。
当您从任何公共注册表中提取Docker镜像时,请注意来源,因为您可能不知道是谁构建了它们,它们是如何构建的,或者它们是否值得信赖。每当您从不受信任的发布者拉取镜像时,请不要忘记验证源注册表和用于构建镜像的Dockerfile。此外,您的Dockerfile的基本映像,即FROM指令。
FROMregistry/image:tag#-Verifythebaseimagebeforeyouuseit
4.提防递归复制在为需要将文件从本地计算机复制到DockerImage的应用程序编写Dockerfile时,您应该注意使用COPY指令复制的内容。您的本地计算机上可能有可能包含机密数据或机密的文件。因此,如果这些文件被复制到Docker映像中,任何有权访问容器的人都可以从容器中获取这些文件。因此,仅复制容器中需要的文件而不是复制所有内容非常重要,如下面的说明所示,以提高Docker容器安全性。
你可以试一试。dockerignor。它可以帮助排除与模式匹配的文件和目录,并避免使用ADD或COPY将大型或敏感文件不必要地发送到图像。
例如,在以下COPY指令中,当前位置的所有文件都将复制到Docker映像中。因此,您应该始终避免“复制”。./”,并且应该在COPY指令中明确指定文件名为“COPYpackage.json./”
FROMnode:12.18.4-alpineWORKDIR/appENVPATH/app/node_modules/.bin:PATHCOPY../#-AvoidsuchkindofCOPYinstruction
5.开发过程中扫描图像Docker镜像是从Dockerfiles构建的,Dockerfiles包含使用基础镜像、安装包、启动应用程序等的说明。Dockerfile也可能包含错误硬编码的凭据。那么,如果您使用的基础镜像存在一些漏洞,并且在Dockerfile中硬编码的凭据从使用该Dockerfile构建的镜像创建的容器中泄露,该怎么办?
扫描镜像是识别Docker镜像中已知安全漏洞的过程,以便您可以在将它们推送到DockerHub或任何其他注册表之前修复它们。
您现在可以直接从DockerDesktopCLI运行Snyk漏洞扫描,因为Snyk和Docker已经合作。
例如,您可以通过提供用于创建映像的Dockerfile来获取有关Docker映像的详细报告。
dockerscan--filePATH_TO_DOCKERFILEDOCKER_IMAGE
6.使用固定标签实现不变性在Docker中,图像上有标签。Docker镜像最常见和默认的标签是“latest”。因此,如果您没有为图像分配标签,则默认情况下它将具有“最新”标签。可以发布多个具有相同标签的镜像,即Docker镜像标签不是不可变的。因此,非常重要的是——
更喜欢为您的图像使用更具体的标签,以便您每次都能获得相同的图像。更喜欢在您的私人存储库中保留图像的副本。使用Docker内容信任(DCT)将数字签名用于客户端或运行时验证特定图像标签的完整性和发布者。访问官方文档以了解更多信息。例如,让我们说,
Dev1拉取myimage:latestimag,在他/她的电脑上运行1.1版本的应用,发现应用运行流畅。稍后,Dev2拉取相同的图像myimage:latest并在他们的计算机上运行该应用程序,并发现该应用程序出现了问题。在这里,您确定它们都在运行相同版本的应用程序吗?答案是否定的,因为在Dev2拉取镜像myimage:latest之前,Dev进行了更改并推送了同名myimage:latest应用的不稳定版本1.2。现在,当他们部署镜像myimage:latest时,它将指向应用程序的不稳定版本1.2,然后这会破坏生产环境。7.LintDockerfile市场上有各种Dockerfilelinter可用于确保Dockerfile遵循Dockerfile安全最佳实践。如果生成警告,Linter可以帮助您停止构建过程;他们遍历您的Dockerfile并在Dockerfile不遵循最佳实践的情况下发出警告。您可以利用Hadolint,这是一个用于验证内联bash和lintingDockerfile的开源项目。
8.限制容器资源默认情况下,在主机上运行的Docker容器可以利用所有的RAM和CPU。在Docker容器遭到入侵的情况下,攻击者可能会尝试使用主机资源来执行恶意活动。此外,如果特定容器开始利用主机上的所有资源,则驻留在同一位置的其他容器可能会由于资源不可用而受到影响。为避免这种情况,建议对Docker容器设置资源限制,以使它们使用的资源不会超过分配给它们的资源,并有助于提供Docker容器安全性。
例如,如果宿主机有1个CPU,下面的第1条命令可以保证容器每秒最多使用50%的CPU,第2条命令可以将容器的内存使用限制为1GB。
CPU限制
dockerrun-it--cpus=".5"ubuntu/bin/bash
内存限制
dockerrun-it--memory="1g"ubuntu/bin/bash
9.不要暴露DockerDaemonSocketDocker与名为/var/run/docker.sock的UNIX域套接字通信,这是DockerAPI的主要入口点。如果任何人有权访问Docker守护程序套接字,也可以获得root访问权限。因此,允许任何用户写入/var/run/docker.sock或将套接字暴露给容器对系统的其余部分来说是一个很大的Docker容器安全风险,因为这会给它提供root权限。因此,永远不要在Docker容器内挂载/var/run/docker.sock。
例如,永远不要使用“-v/var/run/docker.sock:/var/run/docker.sock”之类的选项运行dockerrun命令,并将其视为Docker安全最佳实践之一,可以帮助您保持系统保护。
10.以非root用户身份运行容器根据sysdig.