极狐GitLab DevSecOps 之容器镜像安全扫描

news2025/1/11 22:52:59

容器镜像安全

现状

最近某银行遭受供应链攻击的事件传的沸沸扬扬,安全又双叒叕进入了人们的视野。安全确实是一个非常重要,但是又最容易被忽略的话题。但是现在到了一个不得不人人重视安全,人人为安全负责的时代。尤其以现在非常火爆的云原生来讲,业界已经达成共识:云原生时代已经到来,如果说容器是云原生时代的核心,那么镜像应该就是云原生时代的灵魂。镜像的安全对于应用程序安全、系统安全乃至供应链安全都有着深刻的影响。

然而,镜像的安全却是非常令人担忧的。根据 snyk 发布的 2020 年开源安全报告中指出,在 dockerhub 上常用的热门镜像几乎都存在安全漏洞,多的有上百个,少的也有数十个。具体数据如下图所示:

图片

然而,不幸的是,很多应用程序的镜像是以上述热门镜像作为基础镜像,更不幸的是,由谁来负责安全问题,却始终争论不断,这点从报告中也可得到了印证:

图片

其实,可以通过预防为主,防治结合的方式来提高镜像的安全性。“预防”主要指在构建镜像的过程中遵从一些镜像构建的正模式,诸如选择合适的基础镜像、不安装不需要的包、最小权限原则等等;“治”指的是镜像安全扫描,扫描出问题就去修复。但是最不幸的是,根据Anchore 发布的 2021 软件供应链安全报告显示,做镜像安全扫描的占比大概在50%左右。数据不容乐观

图片

镜像安全扫描

镜像安全扫描是比较容易做的,也是可以很容易就集成到 CI/CD Pipeline 里面的。常用的开源扫描工具有:trivy、anchore、clair。扫描的原理都没有太大差别:提取镜像特征 --> 和漏洞数据库(CVE、NVD等)中的数据进行比对 --> 出具漏洞报告。当然,工具的堆砌可能会带来维护成本的增加,而极狐GitLab 提供的开箱即用的镜像扫描功能只需简单配置即可使用,而且可以轻松集成到极狐GitLab CI/CD 里面。

极狐GitLab 镜像安全扫描


极狐GitLab 提供强大的 DevSecOps 能力,包括:容器镜像扫描、静态应用安全测试 (SAST)、动态应用安全扫描(DAST)、密钥检测、License合规、依赖项扫描以及模糊测试。镜像安全扫描是其中一项DevSecOps 能力,在 10.4 版本中引入。GitLab 默认是集成了上述的 trivy 和 grype。下面我们现简单的了解一下这两款工具。

trivy

trivy 是一款扫描工具,可以对容器镜像、文件系统、Git 仓库以及配置问题进行扫描。更多内容可以查看 trivy 官网。使用也是非常方便的,以 macOS 为例,先用如下命令进行安装:

$ brew install aquasecurity/trivy/trivy

查看版本来确定是否安装成功

$ trivy --version
Version: 0.19.2

接着直接用 trivy image-name 即可进行镜像扫描,还可以使用一些参数来对结果进行过滤,在这儿就不多展开赘述了。

grype

grype 也是一款对容器镜像和文件系统进行扫描的工具。更多内容可以查看grype。使用也很简单,以 macOS 为例,先用如下命令进行安装:

$ brew tap anchore/grype
$ brew install grype

查看版本来确定是否安装成功

$ grype version
Application:          grype
Version:              0.17.0
BuildDate:            2021-08-25T21:39:11Z
GitCommit:            c6529822fabd537af8a1439fc6d1179a3632bf33
GitTreeState:         clean
Platform:             darwin/amd64
GoVersion:            go1.16.7
Compiler:             gc
Supported DB Schema:  3

接着直接用 grype image-name 即可进行镜像扫描。

极狐GitLab 镜像安全扫描实践


极狐GitLab 的镜像安全扫描是通过极狐GitLab 容器镜像分析器(container-scanning analyzer)来实现的,分析器使用的镜像有多个,这个取决于环境变量 CS_ANALYZER_IMAGE 的值,可用的选项有:

registry.gitlab.com/security-products/container-scanning:4
registry.gitlab.com/security-products/container-scanning/grype:4
registry.gitlab.com/security-products/container-scanning/trivy:4

可以用上面的任意一个镜像来构建分析器,从而完成镜像安全扫描。分析器可以单独使用,也可以和极狐GitLab CI/CD 做集成。先来看如何单独使用极狐GitLab 容器镜像分析器来做镜像安全扫描。

单独使用极狐GitLab 镜像扫描工具

使用如下命令即可单独使用极狐GitLab 容器镜像分析器来扫描容器镜像:

$ docker run -i --rm -e DOCKER_IMAGE=alpine registry.gitlab.com/security-products/container-scanning/trivy:4

参数含义:

  • DOCKER_IMAGE:指定需要扫描的镜像,比如 alpine

  • registry.gitlab.com/security-products/container-scanning/trivy:4 :极狐GitLab 镜像分析器所使用的镜像

可以看到如下结果:

[INFO] [2021-10-22 03:05:10 +0000] []  ▶  Remediation is disabled; /home/gitlab/Dockerfile cannot be found. Have you set `GIT_STRATEGY` and
`DOCKERFILE_PATH`?
See https://docs.gitlab.com/ee/user/application_security/container_scanning/#solutions-for-vulnerabilities-auto-remediation

[INFO] [2021-10-22 03:05:10 +0000] []  ▶  Scanning container from registry alpine for vulnerabilities with severity level UNKNOWN or higher, with gcs 4.3.17 and Trivy Version: 0.19.2, advisories updated at 2021-10-21

[INFO] [2021-10-22 03:05:17 +0000] []  ▶  2021-10-22T03:05:17.677Z  INFO  Detected OS: alpine
2021-10-22T03:05:17.677Z  INFO  Detecting Alpine vulnerabilities...

可以看到极狐GitLab 容器扫描工具的版本:gcs 4.3.17,使用的 trivy 版本是:0.19.2。扫描的结果和前面的 trivy 、grype 是一样的。对于 alpine:latest 没有扫出来安全漏洞。再试一个有漏洞的镜像(alpine:3.10),再看看结果是如何展示的:

$ docker run -i --rm -e DOCKER_IMAGE=alpine:3.10 registry.gitlab.com/security-products/container-scanning/trivy:4
[INFO] [2021-10-22 03:12:20 +0000] []  ▶  Remediation is disabled; /home/gitlab/Dockerfile cannot be found. Have you set `GIT_STRATEGY` and
`DOCKERFILE_PATH`?
See https://docs.gitlab.com/ee/user/application_security/container_scanning/#solutions-for-vulnerabilities-auto-remediation

[INFO] [2021-10-22 03:12:20 +0000] []  ▶  Scanning container from registry alpine:3.10 for vulnerabilities with severity level UNKNOWN or higher, with gcs 4.3.17 and Trivy Version: 0.19.2, advisories updated at 2021-10-21

[INFO] [2021-10-22 03:12:35 +0000] []  ▶  2021-10-22T03:12:35.545Z  INFO  Detected OS: alpine
2021-10-22T03:12:35.545Z  INFO  Detecting Alpine vulnerabilities...
2021-10-22T03:12:35.545Z  WARN  This OS version is no longer supported by the distribution: alpine 3.10.9
2021-10-22T03:12:35.545Z  WARN  The vulnerability detection may be insufficient because security updates are not provided

+------------+-------------------------+--------------+-----------------+------------------------------------------------------------------------+
|   STATUS   |      CVE SEVERITY       | PACKAGE NAME | PACKAGE VERSION |                            CVE DESCRIPTION                             |
+------------+-------------------------+--------------+-----------------+------------------------------------------------------------------------+
| Unapproved | Critical CVE-2021-36159 |  apk-tools   |    2.10.6-r0    | libfetch before 2021-07-26, as used in apk-tools, xbps, and other prod |
|            |                         |              |                 | ucts, mishandles numeric strings for the FTP and HTTP protocols. The F |
|            |                         |              |                 | TP passive mode implementation allows an out-of-bounds read because st |
|            |                         |              |                 | rtol is used to parse the relevant numbers into address bytes. It does |
|            |                         |              |                 |  not check if the line ends prematurely. If it does, the for-loop cond |
|            |                         |              |                 |        ition checks for the '\0' terminator one byte too late.         |
+------------+-------------------------+--------------+-----------------+------------------------------------------------------------------------+

可以看到扫描结果会展示漏洞的严重等级(SEVERITY)、漏洞的详细内容(DESCRIPTION)。

和极狐GitLab CI 集成使用

可以很容易的在极狐GitLab CI 中集成镜像扫描:

variables:
  CS_ANALYZER_IMAGE: registry.gitlab.com/security-products/container-scanning/trivy:4

services:
  - docker:20.10.7-dind

stages:          
  - test

container_scanning:
  image: "$CS_ANALYZER_IMAGE"
  stage: test
  variables:
    GIT_STRATEGY: fetch
    DOCKER_IMAGE: alpine:3.10
  allow_failure: true
  artifacts:
    reports:
      container_scanning: gl-container-scanning-report.json
    paths: [gl-container-scanning-report.json]
  dependencies: []
  script:
    - gtcs scan

极狐GitLab CI 语法解释:

  • CS_ANALYZER_IMAGE:指定极狐GitLab 镜像分析器所使用的镜像

  • DOCKER_IMAGE:指定所要扫描的镜像,本例为 alpine:3.10

  • allow_failure:允许 job 失败,同时不阻塞后续的 CI 流程

  • artifacts:可以将构建结果,诸如此次的扫描结果存储在极狐GitLab 的 artifacts 中,方便用户下载查看

  • gtcs scan:极狐GitLab 容器镜像分析器的镜像扫描命令

可以在 Pipeline 的构建中看到如下构建日志:

图片

扫描结果和单独使用极狐GitLab 镜像分析器时的结果是一样的。

当然也可以很方便的下载镜像扫描报告:

图片

下载完毕之后,可以解析查看结果:

{
  "version": "14.0.3",
  "vulnerabilities": [
    {
      "id": "0aa27b90612e559bb5accde4025d57ecc1932885",
      "category": "container_scanning",
      "message": "CVE-2021-36159 in apk-tools-2.10.6-r0",
      "description": "libfetch before 2021-07-26, as used in apk-tools, xbps, and other products, mishandles numeric strings for the FTP and HTTP protocols. The FTP passive mode implementation allows an out-of-bounds read because strtol is used to parse the relevant numbers into address bytes. It does not check if the line ends prematurely. If it does, the for-loop condition checks for the '\\0' terminator one byte too late.",
      "cve": "CVE-2021-36159",
      "severity": "Critical",
      "confidence": "Unknown",
      "solution": "Upgrade apk-tools to 2.10.7-r0",
      "scanner": {
        "id": "trivy",
        "name": "trivy"
      },
      "location": {
        "dependency": {
          "package": {
            "name": "apk-tools"
          },
          "version": "2.10.6-r0"
        },
        "operating_system": "alpine 3.10.9",
        "image": "registry.gitlab.cn/majinghe/go-demo:3.0.0"
      },
      "identifiers": [
        {
          "type": "cve",
          "name": "CVE-2021-36159",
          "value": "CVE-2021-36159",
          "url": "https://github.com/freebsd/freebsd-src/commits/main/lib/libfetch"
        }
      ],
      "links": [
        {
          "url": "https://github.com/freebsd/freebsd-src/commits/main/lib/libfetch"
        },
        {
          "url": "https://gitlab.alpinelinux.org/alpine/apk-tools/-/issues/10749"
        },
        {
          "url": "https://lists.apache.org/thread.html/r61db8e7dcb56dc000a5387a88f7a473bacec5ee01b9ff3f55308aacc@%3Cdev.kafka.apache.org%3E"
        },
        {
          "url": "https://lists.apache.org/thread.html/r61db8e7dcb56dc000a5387a88f7a473bacec5ee01b9ff3f55308aacc@%3Cusers.kafka.apache.org%3E"
        },
        {
          "url": "https://lists.apache.org/thread.html/rbf4ce74b0d1fa9810dec50ba3ace0caeea677af7c27a97111c06ccb7@%3Cdev.kafka.apache.org%3E"
        },
        {
          "url": "https://lists.apache.org/thread.html/rbf4ce74b0d1fa9810dec50ba3ace0caeea677af7c27a97111c06ccb7@%3Cusers.kafka.apache.org%3E"
        }
      ]
    }
  ],
  "remediations": [
    {
      "fixes": [
        {
          "cve": "CVE-2021-36159",
          "id": "0aa27b90612e559bb5accde4025d57ecc1932885"
        }
      ],
      "summary": "Upgrade apk-tools to 2.10.7-r0",
      "diff": "ZGlmZiAtLWdpdCBhL0RvY2tlcmZpbGUgYi9Eb2NrZXJmaWxlCmluZGV4IGU3ZDI5ZWMuLjI4ODNiNzcgMTAwNjQ0Ci0tLSBhL0RvY2tlcmZpbGUKKysrIGIvRG9ja2VyZmlsZQpAQCAtOCw2ICs4LDcgQEAgUlVOIGdvIGJ1aWxkIGRldm9wcy5nbwogCiAjIEZST00gYWxwaW5lOmxhdGVzdAogRlJPTSBhbHBpbmU6My4xMAorUlVOIGFwayAtLW5vLWNhY2hlIHVwZGF0ZSAmJiBhcGsgLS1uby1jYWNoZSBhZGQgYXBrLXRvb2xzPTIuMTAuNy1yMAogCiBXT1JLRElSIC91c3Ivc3JjL2FwcC8="
    }
  ],
  "scan": {
    "scanner": {
      "id": "trivy",
      "name": "Trivy",
      "url": "https://github.com/aquasecurity/trivy/",
      "vendor": {
        "name": "GitLab"
      },
      "version": "0.19.2"
    },
    "analyzer": {
      "id": "gcs",
      "name": "GitLab Container Scanning",
      "vendor": {
        "name": "GitLab"
      },
      "version": "4.3.17"
    },
    "type": "container_scanning",
    "start_time": "2021-10-22T06:38:27",
    "end_time": "2021-10-22T06:38:29",
    "status": "success"
  }
}

和极狐GitLab 镜像仓库的集成

极狐GitLab 不仅提供开箱即用的 DevSecOps 功能。也提供开箱即用的镜像仓库功能,关于镜像仓库的使用可以查看公众号文章极狐GitLab 镜像仓库的使用技巧。可以直接在极狐 GitLab CI 中使用极狐GitLab 镜像仓库和镜像扫描功能,只需要简单的配置即可,.gitlab-ci.yml 的内容如下:

variables:
  CS_ANALYZER_IMAGE: registry.gitlab.com/security-products/container-scanning/trivy:4
  KUBECONFIG: /tmp/.kube/config

services:
  - docker:20.10.7-dind

stages:          
  - build
  - test
  - deploy

build:
  image: docker:latest
  stage: build
  services:
    - docker:20.10.7-dind
  script:
    - docker login -u "$CI_REGISTRY_USER" -p "$CI_REGISTRY_PASSWORD" $CI_REGISTRY
    - docker build -t $CI_REGISTRY_IMAGE:3.0.0 .
    - docker push $CI_REGISTRY_IMAGE:3.0.0

container_scanning:
  image: "$CS_ANALYZER_IMAGE"
  stage: test
  variables:
    GIT_STRATEGY: fetch
    DOCKER_USER: "$CI_REGISTRY_USER"
    DOCKER_PASSWORD: "$CI_REGISTRY_PASSWORD"
    DOCKER_IMAGE: $CI_REGISTRY_IMAGE:3.0.0
  allow_failure: false
  artifacts:
    reports:
      container_scanning: gl-container-scanning-report.json
    paths: [gl-container-scanning-report.json]
  dependencies: []
  script:
    - gtcs scan

deploy:
  stage: deploy
  image:
    name: bitnami/kubectl:latest
    entrypoint: [""]
  script:
     - mkdir -p /tmp/.kube
     - echo $kube_config | base64 -d > $KUBECONFIG
     - kubectl -n gitlab-k8s-demo apply -f deployment.yaml

可以在构建结果中看到 Pipeline 流水线如下

图片

以及在构建日志中看到镜像扫描日志:

图片

可以看到,可以用极狐GitLab 一体化 DevOps 平台来完成源码管理、镜像构建、镜像扫描以及应用程序的部署。只需要简单配置即可。

结束语


安全是一个必须要重视的话题,现在讲的 DevOps 其实就等同于 DevSecOps,真正的 DevOps 是必须要融入安全的,人人为安全负责、处处有安全意识,才能构建起软件供应链安全的护城河。

而极狐GitLab 开箱即用的 DevSecOps 功能是能够为软件开发生命周期的不同阶段提供安全保障能力。从而来保证软件供应链的安全。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1319341.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Mybatis概述和快速入门

文章目录 Mybatis概述Mybatis概念JDBC 缺点Mybatis 优化 Mybatis快速入门 Mybatis概述 Mybatis概念 (1)Mybatis是一个半ORM(对象关系映射)框架,它内部封装了JDBC,开发时只需要关注SQL语句本身&#xff0c…

电脑上怎么录屏?教你3种方法,轻松搞定!

在数字时代,电脑录屏已经成为各行各业的普遍需求,无论是制作教学视频、记录操作步骤,还是制作工作报告。可是很多人不知道电脑上怎么录屏,本文将详细介绍电脑上三种常见的录屏方法,通过这些工具,您可以轻松…

houdini 神经网络

实现个神经网络的3D可视化,美爆了!-腾讯云开发者社区-腾讯云 https://vimeo.com/stefsietz GitHub - julrog/nn_vis: A project for processing neural networks and rendering to gain insights on the architecture and parameters of a model throu…

Linux驱动(中断、异步通知):红外对射,并在Qt StatusBus使用指示灯进行显示

本文工作: 1、Linux驱动与应用程序编写:使用了设备树、中断、异步通知知识点,实现了红外对射状态的异步信息提醒。 2、QT程序编写:自定义了一个“文本指示灯”类,并放置在QMainWidget的StatusBus中。 3、C与C混合编程与…

详细教程 - 从零开发 Vue 鸿蒙harmonyOS应用 第五节 (基于uni-app封装鸿蒙接口请求库)

随着鸿蒙系统的兴起,越来越多的app会采用鸿蒙开发。而鸿蒙开发必不可少的就是调用各种接口服务。为了简化接口的调用流程,我们通常会做一层封装。今天就来讲解一下,如何用uni-app封装鸿蒙的接口请求库。 一、新建项目 首先我们要新建一个鸿蒙项目啦!当然选择第一个…

音频ncm格式转mp3格式

做个笔记,ncm格式转mp3格式 参考:传送门 import os import json import base64 import struct import logging import binascii from glob import glob from tqdm.auto import tqdm from textwrap import dedent from Crypto.Cipher import AES from mu…

批量移除dom上注册的事件

目录 一、问题 二、解决方法 三、总结 一、问题 1.在window上注册了事件,想要批量移除注册的事件,发现移除不了(也不知道什么时候会被自动移除__) 二、解决方法 1.添加事件时增加同一个AbortController生成的 signal标识。使用AbortCon…

物流实时数仓:数仓搭建(DWD)二

系列文章目录 物流实时数仓:采集通道搭建 物流实时数仓:数仓搭建 物流实时数仓:数仓搭建(DIM) 物流实时数仓:数仓搭建(DWD)一 物流实时数仓:数仓搭建(DWD&am…

【赠书第11期】Unity 3D游戏开发

文章目录 前言 1 Unity 3D简介 2 Unity 3D基本概念 2.1 场景(Scene) 2.2 游戏对象(Game Object) 2.3 组件(Component) 2.4 资源(Asset) 3 Unity 3D重要组件 3.1 物理引擎 …

基于SSM的图书馆预约座位系统的设计与实现(部署+源码+LW)

项目描述 临近学期结束,还是毕业设计,你还在做java程序网络编程,期末作业,老师的作业要求觉得大了吗?不知道毕业设计该怎么办?网页功能的数量是否太多?没有合适的类型或系统?等等。今天给大家介绍一篇基于SSM的图书馆预约座位…

如何使用JavaScript 将数据网格绑定到 GraphQL 服务

前言 作为一名前端开发人员,GraphQL对于我们来说是令人难以置信的好用。它可以用来简化数据访问,这让我们的工作变得更加容易。 什么是 GraphQL?它是一个抽象层,位于任意数量的数据源之上,并为您提供一个简单的 API …

【深度学习】注意力机制(三)

本文介绍一些注意力机制的实现,包括EMHSA/SA/SGE/AFT/Outlook Attention。 【深度学习】注意力机制(一) 【深度学习】注意力机制(二) 【深度学习】注意力机制(四) 【深度学习】注意力机制&a…

PCB设计规则中的经验公式_笔记

PCB设计规则中的经验公式 规则1 - 临界长度规则2 - 信号带宽与上升时间规则3- 时钟信号带宽规则4-信号传输速度规则5- 集肤 (效应) 深度规则6 - 50Ω传输线电容规则7 - 50Ω传输线电感规则8 - 回流路径电感规则9 - 地弹噪声规则10- 串行传输比特率与信号带宽规则11- PCB走线直流…

HR人才测评,招聘企业中高层管理的岗位胜任力测评方案

不管是哪一个企业,中高层管理都是企业的核心层,在对这部分人才进行测评方案制定的时候,则要更加细致谨慎一些,避免出现人才录用失误的情况。 中高层管理人员是公司的支柱,需要具备的素质主要偏向于管理能力、综合素质…

CyclicBarrier学习一

一、定义 CyclicBarrier 字面意思回环栅栏(循环屏障),通过它可以实现让一组线程等待至某个状态(屏障点)之后再全部同时执行。叫做回环是因为当所有等待线程都被释放以后,CyclicBarrier可以被重用。 CyclicB…

vue写了这么久了您是否知道:为什么data属性是一个函数而不是一个对象?

一、实例和组件定义data的区别 vue实例的时候定义data属性既可以是一个对象,也可以是一个函数 const app new Vue({el:"#app",// 对象格式data:{foo:"foo"},// 函数格式data(){return {foo:"foo"}} })组件中定义data属性&#xff…

信号与线性系统翻转课堂笔记4——连续LTI系统的微分方程模型与求解

信号与线性系统翻转课堂笔记4——连续LTI系统的微分方程模型与求解 The Flipped Classroom4 of Signals and Linear Systems 对应教材:《信号与线性系统分析(第五版)》高等教育出版社,吴大正著 一、要点 (1&#x…

Zotero攻略

给大家分享一下我对于Zotero的使用。 1、下载链接 Zotero | Your personal research assistant 进入后直接下载即可 2、一些好用的插件 (1)Zotero Connector 下载地址:Zotero | Connectors 超级好用!不用一篇一篇下PDF了&am…

geemap学习笔记028:Landsat8计算时间序列NDVI并导出

前言 本节则是以Landsat8影像数据为例,进行NDVI时间序列计算,并将得到的时间序列NDVI进行展示并导出。 1 导入库并显示地图 import ee import geemap import datetime import pandas as pd import os ee.Initialize()2 定义时间范围 # 定义日期范围 …