Java 应用步伐创建安全 Docker 镜像的 5 个技巧
Docker 是容器化应用步伐最广泛使用的方法。使用 Docker Hub,可以轻松创建和提取预先创建的映像。这非常方便,因为您可以使用 Docker Hub 中的这些映像快速为 Java 应用步伐构建映像。然而,为 Java 应用步伐创建自定义 Docker 镜像的简单方法会带来很多安全题目。那么,我们如何使安全性成为 Java Docker 镜像的紧张组成部门呢?
1. 为你的 Java 应用步伐选择正确的 Docker 根本镜像
创建 Docker 镜像时,我们会根据从 Docker Hub 中提取的某个镜像来制作该镜像。这就是我们所说的根本镜像。根本镜像是您将为 Java 应用步伐构建的新镜像的根本。您选择的根本镜像至关紧张,因为它允许您利用此镜像中可用的全部内容。然而,这是有代价的。当根本镜像存在漏洞时,您将在新创建的镜像中继承此漏洞。
让我们看一下 Adoptopenjdk 提供的一组盛行的 Docker Java 根本镜像openjdk11。使用其默认标记,此镜像基于 ubuntu 发行版构建。但是,我们也可以选择特定版本的标记,例如基于 Debian、Centos 或 Alpine(请注意,alpine 不是基于 glibc,大概与举行本机 JNI 调用的应用步伐不兼容)。
https://i-blog.csdnimg.cn/img_convert/31604ac2654e491a7ab1ac468fcf6b3b.png
我们可以得出结论,从安全角度来看,选择正确的根本镜像至关紧张。您大概不需要完整操纵系统附带的全部二进制文件。最好基于最小根本镜像为您的应用步伐构建新的 Docker Java 镜像。您没有的二进制文件不会对您造成伤害。
除了安全性方面,最小化根本镜像还会淘汰新创建镜像的巨细。较小的 Docker 镜像还意味着占用空间更小,而且很大概启动时间更快。
2. 使用 JRE,而不是 JDK
创建 Docker 镜像时,我们应仅分配正常运行所需的资源。这意味着我们应该首先为生产镜像使用得当的 Java 运行时情况 (JRE),而不是完整的 Java 开发工具包 (JDK)。此外,生产镜像不应包含 Maven 或 Gradle 等构建系统。构建的产品(例如 jar 文件)就充足了。
即使您想在 Docker 容器内构建应用步伐,您也可以使用多阶段构建轻松地将构建映像与生产映像分离。
例如:
我想为我的 java-code-workshop 应用步伐创建一个 Docker Java 映像。这是一个基于 spring-boot 的应用步伐,使用 maven 构建,需要 Java 版本 8。
创建此 Docker Java 镜像的简单方法如下:
https://i-blog.csdnimg.cn/direct/7a2c3429f4264bbfa0cf56568bc03d77.png
我选择了一个包含 maven 和 openjdk8 的根本镜像,将源代码复制到镜像中,然后调用 maven 来构建和运行我的应用步伐。此示例运行正常。我的应用步伐将顺利启动和运行。但是,我刚刚创建的 Docker 镜像的巨细为 631 MB。
让我们改变这个 Dockerfile 并使用多阶段构建:
https://i-blog.csdnimg.cn/direct/866eb525eaca4ab9b33cbc6430c95e61.png
现在发生的事变是,我仍然使用 maven-openjdk8 镜像来构建我的项目。但是,这不会是输出。我基于一个明显较小的 java 8 JRE 镜像创建一个新镜像,并仅复制可执行的 spring-boot jar。现在我只需执行jar-file,就完成了!结果是一个不包含 JDK 或 maven 而仅包含 JRE 的 Docker 镜像。镜像巨细急剧减小到 132 MB。
较小的镜像不仅更容易上传和节省启动时间,而且更安全。你能想象假如攻击者出于某种缘故原由访问了包含 JDK、源代码和可用构建工具的正在运行的容器会发生什么吗?
当您必须包含访问私有存储库的秘密时,也可以使用此方法。您不希望这些秘密存在于生产映像的缓存中。您不会在生产中使用构建映像,因此在那里使用秘密是完全可以接受的。使用此技能,您可以从其他映像中挑选所需的内容,并仅使用其所需的资源创建产品 Docker 映像。
3. 不要以 root 身份运行 Docker 容器
创建 Docker 容器时,默认情况下,您将以 root 身份运行它。虽然这对于开发来说很方便,但您不希望在生产映像中出现这种情况。假设出于某种缘故原由,攻击者可以访问终端或执行代码。在这种情况下,它对该正在运行的容器具有很大的权限,并且大概通过具有不得当高访问权限的文件系统绑定挂载访问主机文件系统。
防止这种情况的最简单方法是创建一个特定用户,如下所示:
https://i-blog.csdnimg.cn/direct/75a2d27839bb4596ae1de74ed381e6fe.png
在第三行,我创建了一个新组并添加了一个用户。此用户是系统用户 (-r),没有密码和主目次。我还将其添加到新创建的组中。
接下来,我在第 6 行授予用户对应用步伐文件夹的权限。别忘了第 7 行。在这里,我设置要使用的用户。如许,新创建的受限用户就会执行最后一行的命令。
4. 在开发过程中扫描 Docker 镜像和 Java 应用步伐
从 Dockerfile 创建 Docker 镜像甚至重修镜像都大概在系统中引入新的漏洞。在开发过程中扫描 Docker 镜像应该成为工作流程的一部门,以尽早发现漏洞。
使用Snyk CLI可以轻松扫描 Docker 镜像。在当地盘算机上使用它,作为管道的一部门,或两者兼而有之。安装并验证 Snyk CLI 后,扫描镜像唯一需要做的就是
<span style="color:#c8ccce"><span style="background-color:#22343c"><code>$ snyk container test <imageName></code></span></span> 假如我想扫描adoptopenjdk图像,正如我在第一部门中提到的那样,命令将是如许的。
<span style="color:#c8ccce"><span style="background-color:#22343c"><code>$ docker pull adoptopenjdk/opendjdk11:latest
$ snyk container test adoptopenjdk/opendjdk11:latest</code></span></span> 输出:
https://i-blog.csdnimg.cn/direct/66641d5b95d84bbebd8e699b033e92c9.png
您可以测试和监控 Docker 映像。对于监控,您可以使用snyk container monitor <image>。监控会拍摄快照并监控您的映像是否随着时间的推移出现新的漏洞或修复。
当您扫描映像并拥有 Dockerfile(您创建了一个新的 Docker Java 映像)时,您应该将标记添加--Dockerfile=<dockerfile>到snyk container test和snyk container monitor。现在您可以获得更好的调停建议。例如,假如有可用的根本映像可以淘汰可用的漏洞数量,您就会知道。
例子:
<span style="color:#c8ccce"><span style="background-color:#22343c"><code>$ snyk container test myImage:mytag --Dockerfile=path/Dockerfile
$ snyk container monitor myImage:mytag --Dockerfile=path/Dockerfile</code></span></span> 扫描您的 Java 应用步伐
您正在构建的 Docker Java 镜像还包含您的应用步伐。显然,这也是一个大概的攻击点。您必须确保您的 Java 应用步伐没有安全漏洞,从一开始就做出安全的决定。想象一下,您的应用步伐包含一个允许在调用 REST 端点时执行远程代码的库。即使您的镜像的其余部门没有任何漏洞,这也大概是劫难性的。
您放入 Docker 镜像中的 Java 二进制文件的大部门大概是您导入的代码。您可以将应用步伐所具有的库和框架视为依赖项。使用 Snyk CLI 可以轻松检查依赖项。这与我们之前用于扫描镜像的 CLI 相同。在您的根文件夹中调用snyk test或snyk monitor ,您将扫描或监控您的应用步伐是否存在库中的安全漏洞。
对于您编写的代码,使用代码分析工具或 Linter(如 SonarLint、PMD 或 spotbugs)是明智之举。这些工具是用于创建更好代码的通用工具,同时也可以帮助您克制犯下明显的安全错误。
5. 重修
为 Docker 镜像构建 Java 应用步伐,以便您可以随时将其抛弃并重修。假设您注意到正在运行的容器出了题目。假如您可以简单地将其杀死并启动一个新实例,那就太好了。这意味着您必须计划无状态 Java 应用步伐,以便数据存储在容器外部。您可以想到的几件事是:
[*]不要在容器中运行数据库的数据存储。
[*]不要在容器中存储(日志)文件
[*]确保缓存自动恢复(假如实用)
假如您构建应用步伐以便可以随时抛弃它并启动新实例,那么您也可以安全地重修整个 Docker 映像。您是否知道对于20% 的易受攻击的 Docker 映像,只需重修映像即可修复一个或多个安全题目?在很多情况下,Docker 映像基于根本映像的“最新”标签。这些“最新”会随着时间而变化,并被更新的改进版本所代替。使用 apt 或 yum 等包管理器安装在容器中的关键二进制文件也是如此。当然,从安全角度来看,使用最新版本是好的,因为您将自动获取最新的安全修复步伐,但是,您需要考虑到根本映像会随着时间而变化,因此很难在特定时间快照重新创建映像。
即使您的应用步伐没有变化,也要定期重修 Docker 映像,最好使用较新或最新的根本映像版本标记。操纵系统层等底层的改进可以提高映像质量并淘汰安全漏洞。
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
页:
[1]