使用 Snyk 在 Docker 映像中查找漏洞的最简单方法

Snyk:一款强大的漏洞分析工具

Snyk 是一款专为分析基础设施配置文件代码中的安全漏洞而设计的编辑器,它能检测容器和应用程序包中潜藏的风险。

虽然 Snyk 最初以云平台服务为主,但现在它已扩展到提供多样化的产品组合。

Snyk Open Source 通过编辑器的 CLI 与 Git 流程紧密集成。启动后,它会自动扫描并识别漏洞,根据其敏感程度进行分类,并自动修复已知的安全缺陷。此功能可无缝融入拉取请求流程,从而确保提交到代码仓库的代码安全性。

另一方面,Snyk 基础设施即代码 (IaC) 分析工具可识别 JSON 和 YAML Kubernetes 配置文件中的漏洞,并提供修复方案。其规则引擎允许管理员根据预设参数,配置 Git 存储库中检测到的漏洞的敏感度。

Snyk Container 允许用户在创建 Docker 镜像以及在相关注册表中使用它们的过程中,对其进行全面测试。该程序可集成到 CLI、SCM、CI 工具、容器注册表和 Kubernetes 等多种环境中。

今天,我们将深入探讨如何利用内置于 Docker 的 Snyk Container 来检测漏洞。

Docker 文件示例

使用 Snyk 检测漏洞的第一步是准备一个 Docker 镜像。在本例中,我们将使用以下镜像:

FROM python:3.4-alpine
ADD . /code
WORKDIR /code
RUN pip install -r requirements.txt
EXPOSE 8000
CMD ["python", "app.py"]

首先,我们需要使用以下命令在本地构建镜像:

docker build -t 0xyz0/python-app .

现在,我们有了要分析的镜像。

通过 Docker 客户端扫描镜像

Snyk 服务与 Docker 的集成使得扫描过程非常简单。要开始扫描,只需执行以下命令:

docker scan 0***0/python-app

该命令会启动分析,并根据发现的漏洞,返回详细的输出报告,其中包含最终摘要:

如您所见,报告不仅显示了发现的漏洞数量,还详细列出了漏洞的具体信息、严重程度,并提出了关于应使用的基础镜像的建议。

您还可以参考 Snyk 漏洞数据库 获取更多信息。

在本例中,Snyk 为我提供了多个选项,我将选择第一个选项修改我的 Dockerfile:

FROM python:3.7.11-slim
ADD . /code
WORKDIR /code
RUN pip install -r requirements.txt
EXPOSE 8000
CMD ["python", "app.py"]

如果我重建镜像并再次扫描:

docker build -t 0***0/python-app . && docker scan 0***0/python-app

您会看到输出报告中显示的漏洞数量明显减少,这表明当前正在使用更安全的基础镜像:

如果在扫描命令中包含生成镜像的 Dockerfile,您还可以获得更详细的报告:

docker scan -f Dockerfile 0***0/python-app

甚至可以从分析中排除基础镜像,以便专注于您自身引入的问题:

docker scan -f Dockerfile --exclude-base 0***0/python-app

该服务还可以与 Docker Hub 存储库集成:

但是,此功能需要付费订阅。不过,您可以利用免费计划在本地启动它(该计划对扫描次数有明确限制),同时可以检测您开发的或想要检查安全性的第三方镜像。

将 Snyk 与 Github Actions 结合使用

首先,创建一个存储库并在其中创建一个文件夹:

.github / worflows /

接下来,在 Github 中使用 Snyk Container 需要创建一个新镜像或使用在 Docker Hub 中创建的镜像。要使用 Snyk,您需要创建一个名为 `SNYK_TOKEN` 的密钥。要获取令牌,您需要在 Snyk 上创建一个帐户。在通用设置中,您可以找到 API 令牌并快速生成它。

有了令牌,您可以在 Github 上创建密钥并在 Action 中使用它。现在,您需要传递在 Docker Hub 中创建的存储库名称,以及要发送的消息。 您可以访问步骤的输出作为消息中的变量。

with:
args: 'A new commit has been pushed. Please verify github action:
| worflow $ {{fromJson (steps.repo.outputs.result) .html_url}} / actions
| Exec: $ {{steps.prep.outputs.created}}
| Version: $ {{steps.prep.outputs.version}} '

如何运行整个工作流程?只需提交到 Master 分支。Github Action 将自动检测 `.github/workflows/` 目录下的文件。

结语

随着容器技术的日益普及,安全漏洞事件也越来越频繁,其中大部分是由于容器部署时的配置错误造成的。Snyk 提供了一个高效且直接的工具,可以帮助我们避免配置错误,并检测 Docker 镜像中最常见的漏洞,从而提高容器应用的安全性。