如何检查 Docker 镜像是否存在漏洞
定期检查管道中的何检漏洞非常重要 。要执行的查D存漏步骤之一是对 Docker 映像执行漏洞扫描。在此博客中 ,像否您将了解如何执行漏洞扫描、何检如何修复漏洞以及如何将其添加到您的查D存漏 Jenkins 管道中 。

在 几年前的何检一篇博客中 ,描述了如何扫描 Docker 镜像中的查D存漏漏洞。后续博客展示了如何将扫描添加到 Jenkins 管道。像否 但是何检,源码库 不再支持以前博客中使用的查D存漏Anchore Engine 。Anchore也提供了 grype的像否替代解决方案 。在此博客中,何检您将更深入地了解 grype 、查D存漏它的像否工作原理 、如何解决问题以及如何将其添加到您的 Jenkins 管道中 。
但首先,为什么要检查漏洞?您必须及时了解最新的安全修复程序 。许多安全漏洞是 公开的因此很容易被利用。云计算因此,必须尽快修复安全漏洞 ,以最大限度地减少攻击面。但是如何跟上这个呢 ?您主要专注于业务,不想全职从事修复安全漏洞的工作 。这就是为什么自动扫描您的应用程序和 Docker 镜像很重要。Grype 可以帮助扫描您的 Docker 镜像。Grype 将检查操作系统漏洞以及特定语言包(如 Java jar 文件)的漏洞并报告它们。这样 ,您就有了一个很棒的香港云服务器工具 ,可以为您自动执行安全检查 。请注意 ,grype 不仅限于扫描 Docker 图像 。它还可以扫描文件和目录 ,因此可用于扫描您的源代码。
在此博客中,您将创建一个包含 Spring Boot 应用程序的易受攻击的 Docker 映像 。您将安装并使用 grype 以扫描图像并修复漏洞。最后 ,您将学习如何将扫描添加到您的 Jenkins 管道中。
本博客中使用的模板下载资源可以在 GitHub 上找到 。
2.先决条件此博客所需的先决条件是:
基本的Linux知识;基本的 Docker 知识;基本的 Java 和 Spring Boot 知识 。3.易受攻击的应用程序导航到Spring Initializr并选择 Maven 构建、Java 17、Spring Boot 2.7.6 和 Spring Web 依赖项。这不会是一个非常脆弱的应用程序,因为 Spring 已经确保您使用最新的 Spring Boot 版本。服务器租用因此,将Spring Boot版本改为2.7.0。可以使用以下命令构建 Spring Boot 应用程序,该命令将为您创建 jar 文件:
复制$ mvn clean verify1.您将扫描一个 Docker 镜像,因此需要创建一个 Dockerfile。您将使用一个非常基本的 Dockerfile ,它只包含创建图像所需的最少指令。如果您想创建生产就绪的 Docker 映像,请阅读文章Docker 最佳实践和Spring Boot Docker 最佳实践 。
复制FROM eclipse-temurin:17.0.1_12-jre-alpineWORKDIR /opt/appARG JAR_FILECOPY target/${ JAR_FILE} app.jar1.2.3.4.ENTRYPOINT ["java", "-jar", "app.jar"]在撰写本文时 ,Java 17 的最新 eclipse-temurin基础映像是版本 17.0.5_8 。免费模板同样,使用旧版本以使其易受攻击 。
dockerfile-maven-plugin为了构建 Docker 镜像 ,将使用 Spotify的一个分支。因此,将以下片段添加到pom文件中。
复制<plugin><groupId>com.xenoamess.docker</groupId><artifactId>dockerfile-maven-plugin</artifactId><version>1.4.25</version><configuration><repository>mydeveloperplanet/mygrypeplanet</repository><tag>${ project.version}</tag><buildArgs><JAR_FILE>${ project.build.finalName}.jar</JAR_FILE></buildArgs></configuration></plugin>1.2.3.4.5.6.7.8.9.10.11.12.使用此插件的好处是您可以轻松地重用配置。可以通过单个 Maven 命令创建 Docker 映像。
可以通过调用以下命令来构建 Docker 映像:
复制$ mvn dockerfile:build1.您现在已经准备好开始使用 grype。
4、安装可以通过执行以下脚本来安装 grype :
复制$ curl -sSfL https://raw.githubusercontent.com/anchore/grype/main/install.sh | sh -s -- -b /usr/local/bin1.通过执行以下命令验证安装 :
复制$ grype versionApplication: grypeVersion: 0.54.0Syft Version: v0.63.0BuildDate: 2022-12-13T15:02:51ZGitCommit: 93499eec7e3ce2704755e9f51457181b06b519c5GitDescription: v0.54.0Platform: linux/amd64GoVersion: go1.18.8Compiler: gcSupported DB Schema: 51.2.3.4.5.6.7.8.9.10.11. 5.扫描镜像扫描 Docker 镜像是通过调用grype后跟 来完成的docker: ,表明你想扫描来自 Docker 守护进程的镜像 ,镜像和标签:
复制$ grype docker:mydeveloperplanet/mygrypeplanet:0.0.1-SNAPSHOTApplication: grypeVersion: 0.54.0Syft Version: v0.63.0Vulnerability DB [updated]
Loaded imageParsed imageCataloged packages [50 packages]
Scanned image [42 vulnerabilities]
NAME INSTALLED FIXED-IN TYPE VULNERABILITY SEVERITYbusybox 1.34.1-r3 1.34.1-r5 apk CVE-2022-28391 Highjackson-databind 2.13.3 java-archive CVE-2022-42003 Highjackson-databind 2.13.3 java-archive CVE-2022-42004 Highjackson-databind 2.13.3 2.13.4 java-archive GHSA-rgv9-q543-rqg4 Highjackson-databind 2.13.3 2.13.4.1 java-archive GHSA-jjjh-jjxp-wpff Highjava 17.0.1+12 binary CVE-2022-21248 Lowjava 17.0.1+12 binary CVE-2022-21277 Mediumjava 17.0.1+12 binary CVE-2022-21282 Mediumjava 17.0.1+12 binary CVE-2022-21283 Mediumjava 17.0.1+12 binary CVE-2022-21291 Mediumjava 17.0.1+12 binary CVE-2022-21293 Mediumjava 17.0.1+12 binary CVE-2022-21294 Mediumjava 17.0.1+12 binary CVE-2022-21296 Mediumjava 17.0.1+12 binary CVE-2022-21299 Mediumjava 17.0.1+12 binary CVE-2022-21305 Mediumjava 17.0.1+12 binary CVE-2022-21340 Mediumjava 17.0.1+12 binary CVE-2022-21341 Mediumjava 17.0.1+12 binary CVE-2022-21360 Mediumjava 17.0.1+12 binary CVE-2022-21365 Mediumjava 17.0.1+12 binary CVE-2022-21366 Mediumlibcrypto1.1 1.1.1l-r7 apk CVE-2021-4160 Mediumlibcrypto1.1 1.1.1l-r7 1.1.1n-r0 apk CVE-2022-0778 Highlibcrypto1.1 1.1.1l-r7 1.1.1q-r0 apk CVE-2022-2097 Mediumlibretls 3.3.4-r2 3.3.4-r3 apk CVE-2022-0778 Highlibssl1.1 1.1.1l-r7 apk CVE-2021-4160 Mediumlibssl1.1 1.1.1l-r7 1.1.1n-r0 apk CVE-2022-0778 Highlibssl1.1 1.1.1l-r7 1.1.1q-r0 apk CVE-2022-2097 Mediumsnakeyaml 1.30 java-archive GHSA-mjmj-j48q-9wg2 Highsnakeyaml 1.30 1.31 java-archive GHSA-3mc7-4q67-w48m Highsnakeyaml 1.30 1.31 java-archive GHSA-98wm-3w3q-mw94 Mediumsnakeyaml 1.30 1.31 java-archive GHSA-c4r9-r8fh-9vj2 Mediumsnakeyaml 1.30 1.31 java-archive GHSA-hhhw-99gj-p3c3 Mediumsnakeyaml 1.30 1.32 java-archive GHSA-9w3m-gqgf-c4p9 Mediumsnakeyaml 1.30 1.32 java-archive GHSA-w37g-rhq8-7m4j Mediumspring-core 5.3.20 java-archive CVE-2016-1000027 Criticalssl_client 1.34.1-r3 1.34.1-r5 apk CVE-2022-28391 Highzlib 1.2.11-r3 1.2.12-r0 apk CVE-2018-25032 Highzlib 1.2.11-r3 1.2.12-r2 apk CVE-2022-37434 Critical1.2.3.4.5.6.7.8.9.10.11.12.13.14.15.16.17.18.19.20.21.22.23.24.25.26.27.28.29.30.31.32.33.34.35.36.37.38.39.40.41.42.43.44.45.46.47.48.这个输出告诉你什么 ?
NAME:易受攻击包的名称;INSTALLED