使用Gitlab CI / CD验证图像

大家好,在“ AWS,Azure和Gitlab上的CI / CD”课程开始前夕,我们准备了一些有趣的材料的翻译。




在本文中,我们将讨论如何使用Sysdig Secure在Gitlab CI / CD平台上检查容器映像

不符合Sysdig Secure中定义的安全策略的容器映像将不会发布到容器注册表中,并且将停止管道。



带有Gitlab CI / CD的漏洞查找器


Gitlab CI / CD是内置在Gitlab软件开发和协作平台中的开源持续集成和交付服务器

在为存储库配置Gitlab CI / CD之后,每次开发人员提交到存储库的跟踪分支时,管道脚本都会自动运行。

这样的管道可以用来使许多过程自动化。例如,对于QA测试,创建软件分发工件(例如Docker映像或Linux软件包),或者就本文中要讨论的内容而言-验证配置,搜索漏洞并验证合规性。

在Gitlab CI / CD管道上检查图像:向左移动安全性


与IT中的其他地方一样,您越早在容器中发现漏洞,就可以更快,更轻松地修复漏洞而不会造成任何后果。出于以下几个原因,将漏洞检查

嵌入到管道程序集中是一个好习惯:

  • 现有的漏洞将永远不会产生。
  • «secure-by-default», , , .
  • , . , - .

Sysdig安全提供一个全功能的工具集来检查图像的容器与许多其他集装箱安全检查功能,如检测时间威胁沿着性能剖析基于机器学习和开箱,被迫的可扩展的威胁检测模板Kubernetes的PSP,应对事故专业知识遵守让我们看一下Sysdig安全映像验证服务如何与Gitlab一起使用。

Gitlab的安全性检查要求


要完成以下步骤,您将需要:


使用Sysdig Secure配置Gitlab CI / CD管道进行图像检查


我们将在实践中看到如何将这两个平台集成在一起。通过本指南,您将在几分钟内学习如何使用Sysdig Secure Image扫描。

配置访问凭证


Gitlab CI / CD管道将需要访问凭据才能与Sysdig Secure后端进行通信。为了正确执行所有操作,请从Sysdig UI Settings> User profile复制访问令牌

然后为您的Gitlab项目设置一个新的全局变量:

  1. 在您的项目中,转到“设置”>“ CI / CD”,然后选择“ 变量”
  2. 创建一个新变量,SYSDIG_SECURE_TOKEN然后在value字段中添加Sysdig Secure API密钥
  3. 单击“ 屏蔽”按钮,这样您的API令牌就不会打印在管道日志中。

Gitlab管道定义


首先,我们需要一个Docker文件,该文件定义了您将收集的映像。您可以将所需的任何Docker文件上传到您的项目,或仅使用以下示例:

FROM debian:stretch
RUN apt update && apt install python-pip python-numpy openssh-server -y && rm -rf /var/lib/apt
RUN pip install flask
COPY app.py /app.py
EXPOSE 5000 22
ENTRYPOINT ["python", "./app.py"]

然后,您需要.gitlab-ci.yml在项目的根目录中创建一个新文件该文件将描述环境组装的所有必要步骤(阶段)。他将确定所有必要的阶段。

我们的流程包括3个阶段:

  • 组装容器图片;
  • 扫描图像中是否存在漏洞或违反政策;
  • 将映像移动到目标存储库。

variables:
  CI_REGISTRY_IMAGE: "sysdiglabs/dummy-vuln-app"
  SCAN_IMAGE_NAME: "sysdiglabs/secure_inline_scan:latest"
  SYSDIG_SECURE_ENDPOINT: "https://secure.sysdig.com"

docker-build-master:
  image: docker:latest
  stage: build
  services:
    - docker:dind
  before_script:
    - docker login -u "$CI_REGISTRY_USER" -p "$CI_REGISTRY_PASSWORD" "$CI_REGISTRY"
  script:
    - docker build --pull -t "$CI_REGISTRY_IMAGE" .
    - docker run --rm -v /var/run/docker.sock:/var/run/docker.sock "$SCAN_IMAGE_NAME" /bin/inline_scan analyze -s "$SYSDIG_SECURE_ENDPOINT" -k "$SYSDIG_SECURE_TOKEN" "$CI_REGISTRY_IMAGE"
    - docker push "$CI_REGISTRY_IMAGE"
  only:
    - master

建立容器图片


图像的集合发生于docker build --pull -t "$CI_REGISTRY_NAME"它从Docker文件中获取指令并生成一个新的本地映像,将在下一步中对其进行检查。

扫描漏洞


下一步是检查容器。在这里,我们将检查映像中的漏洞并检查配置,并将结果存储在Sysdig后端。

Sysdig本地扫描的优点之一是您不会失去对映像的控制权,因为不需要将映像移至另一个注册表或从外部暴露出来即可执行扫描。它发生在流道内部,并且仅将结果发送到Sysdig Secure。

docker run --rm -v /var/run/docker.sock:/var/run/docker.sock "$SCAN_IMAGE_NAME" /bin/inline_scan analyze -s "$SYSDIG_SECURE_ENDPOINT" -k "$SYSDIG_SECURE_TOKEN" "$CI_REGISTRY_IMAGE"

此时,如果映像满足策略中指定的任何停止条件(例如,严重漏洞),则Sysdig Secure将返回错误代码。停止管道将防止将易受攻击的映像传输到容器注册表。





在Sysdig Secure中,我们可以查看其他信息并了解为什么安全检查无法完成:



如您在屏幕截图中所见,容器将端口22保持打开状态,该端口位于禁止端口列表中,并且在Python库中还包含一些严重漏洞。

将图像移到目标存储库


成功检查漏洞后,管道将进行docker push,并将映像发布到容器注册表。如果您未指定任何凭据或远程存储,则Gitlab将使用default

结论


使用Sysdig Secure图像扫描,您可以在Gitlab CI / CD管道中检查图像,而无需将它们从基础结构发送到公共或中间注册表,也可以检查配置并防止漏洞泄漏到生产环境中。

查找已知漏洞并检查配置是否符合安全建议,包括Dockerfile指令,基本映像中安装的软件包或第三方库的黑白列表,例如Java中的JAR / WAR文件或语言软件包管理器(例如Java的npm), pip适用于Python,gem适用于Ruby。

发生故障时,您可以快速将其报告给容器作者,以快速解决问题并创建默认安全的容器安全策略。要尝试Sysdig Secure,您可以要求今天演示

就这样。此处了解有关该课程的更多信息

All Articles