更新时间:2026-01-13 GMT+08:00
分享

在CI/CD中集成镜像安全扫描

操作场景

企业主机安全的CI/CD镜像安全扫描功能介绍请参见CI/CD镜像安全扫描概述

在使用CI/CD镜像安全扫描功能时,您需要在Jenkins或CodeArts Pipeline项目中集成镜像安全扫描插件,以便在流水线构建阶段对镜像实施安全扫描。

约束与限制

CI/CD镜像安全扫描需要开通容器镜像按次收费扫描增值服务,开通后,HSS将按扫描每个镜像的次数进行收费。开通容器镜像按次收费扫描

步骤一:配置镜像安全扫描命令

  1. 登录企业主机安全控制台
  2. 在控制台左上角,单击图标,选择区域或项目。
  3. 在左侧导航栏,选择安装与配置 > 容器安装与配置,进入“容器安装与配置”页面。
  4. 选择“CI/CD接入设置”页签,单击“接入配置”,系统弹出“接入配置”对话框。

    图2 CI/CD接入设置

  5. 在对话框中,单击“新增CI/CD标识”,系统弹出新增CI/CD标识对话框。

    CI/CD标识是CI/CD插件的接入Token,用作镜像扫描身份认证。

    图3 新增CI/CD标识

  6. 填写一个标识,单击确定,新增CI/CD标识完成。

    图4 填写CI/CD标识

  7. 勾选一个标识,并单击“下一步”

    图5 勾选标识

  8. 根据界面提示,配置镜像扫描信息。

    CI/CD安全扫描分“镜像安全扫描”“IaC安全扫描”两个类别。如需扫描对应类别,打开开关配置对应参数。相关参数说明请参见表1表2

    图6 镜像扫描信息
    表1 镜像安全扫描参数说明

    参数类别

    界面参数

    说明

    对应生成命令中的参数

    扫描信息

    流水线类型

    按照您实际使用的CI/CD流水线类型选择。

    • Jenkins:Jenkins Pipeline模式。
    • CodeArts:CodeArts Pipeline模式。

    -

    扫描类型

    扫描的镜像类型。

    • 本地镜像扫描
    • 远程镜像仓扫描

    -

    CI/CD标识

    CI/CD插件的接入Token,用作镜像扫描身份认证。

    cicd_id

    所属组织(可选)

    “扫描类型”选择“远程镜像仓扫描”时,可选择输入远程镜像的所属组织名称。

    NAMESPACE

    镜像名称(可选)

    输入镜像名称。

    IMAGE_NAME

    镜像版本(可选)

    输入镜像版本信息。

    IMAGE_VERSION

    流水线是否阻断

    企业主机安全将根据您选择的方式,在镜像构建过程中处理不安全的镜像。

    • 阻断:扫描出高风险镜像时,对CI/CD流水线进行阻断。高风险镜像是指漏洞、恶意文件或基线检查的检查结果中存在风险程度为“高”的镜像。
    • 放行:扫描出镜像风险时,允许CI/CD流水线正常运行。

    is_blocking

    • 阻断流水线:is_blocking=1
    • 放行流水线:is_blocking=0

    如果您不想只阻断存在高风险镜像的流水线,而是阻断所有非安全的流水线,那么您可以设置is_blocking=non-secure。

    网络信息(仅远程镜像仓扫描需要配置)

    通信类型

    选择镜像仓的通信协议类型。

    • http
    • https

    例如:远程镜像仓是华为云容器镜像服务SWR,则选择“https”

    repository_address

    该参数是由“通信类型://镜像仓地址”组成。

    镜像仓地址

    输入镜像仓地址,可输入镜像仓“网址”或者“IP:端口”

    例如:myharbor.com

    如果远程镜像仓是华为云容器镜像服务SWR,镜像仓地址可在镜像下载指令中获取。如图7所示。

    图7 获取SWR镜像仓地址

    repository_address

    该参数是由“通信类型://镜像仓地址”组成。

    登录凭证(仅远程镜像仓扫描需要配置)

    镜像仓用户名

    输入登录用户名。

    如果远程镜像仓是华为云容器镜像服务SWR,镜像仓用户名可在Pull/Push指南 > 登录指令中获取。如图8所示。

    图8 获取SWR镜像仓用户名和密码

    login_auth

    该参数的参数值为界面参数值“镜像仓用户名”“镜像仓密码”加密后的内容

    镜像仓密码

    输入登录用户密码。

    如果远程镜像仓是华为云容器镜像服务SWR,镜像仓密码可在Pull/Push指南 > 登录指令中获取。如图8所示。

    login_auth

    该参数的参数值为界面参数值“镜像仓用户名”“镜像仓密码”加密后的内容

    高级配置(可选)

    漏洞白名单

    在CI/CD流水线构建过程中,发现镜像存在白名单内的漏洞,不阻断CI/CD流水线。

    如果业界定位为高风险的漏洞,您认为该漏洞不会对您的业务造成影响,可添加漏洞白名单。

    输入漏洞名称;多个漏洞名称以换行符分隔。

    -

    漏洞黑名单

    在CI/CD流水线构建过程中,发现镜像存在黑名单内的漏洞,则阻断CI/CD流水线。

    如果业界定位为低风险的漏洞,您认为该漏洞对您的业务会造成比较严重的影响,可添加漏洞黑名单。

    输入漏洞名称;多个漏洞名称以换行符分隔。

    -

    镜像白名单

    在CI/CD流水线构建过程中,发现该镜像存在风险,不阻断CI/CD流水线。

    输入镜像名称;多个镜像名称以换行符分隔。

    镜像名称格式:

    • 本地镜像:镜像名称:版本
    • 远程镜像:组织名称/镜像名称:版本

    -

    表2 IaC安全扫描参数说明

    界面参数

    说明

    对应生成命令中的参数

    配置方式

    IaC文件的存放方式。

    • 本地目录
    • Git仓库地址
    • HTTPS远程地址

    config_mode。

    本地目录

    当配置方式选择“本地目录”时,需要填写本地目录地址。镜像安全扫描工具会从指定地址获取yaml文件和dockerfile文件进行扫描。

    例如:example/iac/

    source

    Git仓库地址

    当配置方式选择“Git仓库地址”时,需要填写Git仓库地址。镜像安全扫描工具会克隆项目到jenkins所在机器本地,并获取项目内的yaml文件和dockerfile文件进行扫描。

    例如:https://github.com/example-username/example-repo.git

    path

    HTTPS远程地址

    当配置方式选择“HTTPS远程地址”时,需要填写HTTPS远程地址。镜像安全扫描工具会从指定地址获取yaml文件和dockerfile文件进行扫描。

    例如:https://example.com/example.yaml

    path

  9. 信息配置完成,单击“生成命令”,生成镜像安全扫描插件配置命令。
  10. 单击“复制命令”,如图9所示。

    此处以Jenkins-Pipeline为例。

    图9 复制命令

步骤二:在CI/CD流水线中集成镜像安全扫描命令

请根据您使用的流水线类型按以下指导集成扫描命令。

  1. 登录Jenkins工具。
  2. 在总览页面,单击目标Jenkins-Pipeline模式的项目名称,进入项目详情页面。

    此处示例项目名称为“mypipeline”

  3. 在左侧导航栏,单击“Configure”,进入配置页面。
  4. 根据需要扫描的镜像类型,插入镜像安全扫描相关的命令。

    以下样例供参考,您可以根据实际场景灵活配置。
    • 本地镜像
    1. “Pipeline”区域,将10复制的命令中的“environment”段代码插入Pipeline脚本中“agent any”之后。
    2. 10复制的命令中的“stage('image-scan')”段代码插入到Pipeline脚本中Build和Push阶段之间。
      图10 插入镜像安全扫描命令
    • 远程镜像仓
      1. “Pipeline”区域,将10复制的命令中的“environment”段代码插入Pipeline脚本中“agent any”之后。
      2. 10复制的命令中的“stage('image-scan')”段代码插入到Pipeline脚本中Test和Push阶段之间。

  5. 单击“Apply”,应用脚本。

    后续您构建该目标项目时,会同步执行镜像安全扫描任务,扫描项目中的镜像安全。

    您可以通过“Blue Ocean”查看项目构建任务,项目构建任务中增加的“image-scan”步骤即镜像安全扫描步骤,镜像安全扫描步骤执行完成后,您可以在企业主机安全控制台查看扫描结果,具体操作请参见查看并处理CI/CD镜像扫描结果

    如果您在执行8时选择阻断流水线,则镜像安全扫描插件将阻断存在高风险镜像的流水线运行,如图11所示。

    图11 项目构建阻断

  1. 新建CodeArts资源池。

    具体操作请参见新建CodeArts资源池

    • 资源池名称:建议设置为“HSS”。
    • 资源池类型:必须选择“LINUX”

  2. 在CodeArts资源池中新建代理。

    具体操作请参见在CodeArts资源池中新建代理

    • 代理名称:建议设置为“Agent-imagescan”。
    • 安装代理的主机:建议选择ECS的Linux主机。

  3. 代理新建完成后,单击顶部导航“首页”,进入CodeArts首页。
  4. 单击目标项目名称,进入项目详情页面。
  5. 在左侧导航栏,单击持续交付 > 流水线,进入流水线列表。
  6. 在目标流水线的“操作”列,单击 > 编辑,进入流水线任务编排页面。
  7. 在Build和Push任务阶段间,单击新建一个阶段。
  8. 单击新建任务 > 从空任务新建,进入新建任务页面。
  9. 添加“执行Shell”步骤。

    图12 添加执行Shell

  10. 单击“任务配置”,进入任务配置页面,配置资源池。

    • 资源池类型:自定义资源池
    • 自定义资源池:选择1创建的资源池,示例为“HSS”。
    图13 配置资源池

  11. 返回“执行Shell”页面,根据需要扫描的镜像类型,插入镜像安全扫描命令。

    以下样例供参考,您可以根据实际场景灵活配置。
    • 本地镜像
      1. “命令”区域,粘贴10复制的命令。
      2. (可选)如果执行8时,未配置“镜像名称”“镜像版本”参数,请在“高级设置”区域添加“IMAGE_NAME”“IMAGE_VERSION”两个变量。
        变量值为您此流水线代码生成的镜像名称和镜像版本。
        图14 环境变量
    • 远程镜像仓
      1. “命令”区域,粘贴10复制的命令。
      2. (可选)如果执行8时,未配置“所属组织”“镜像名称”“镜像版本”参数,请在“高级设置”区域添加“NAMESPACE”“IMAGE_NAME”“IMAGE_VERSION”三个变量。
        图15 环境变量

  12. 单击“确定”,保存任务配置。
  13. 在流水线右上角,单击“保存”,保存流水线配置。

    后续您构建该目标项目时,会同步执行镜像安全扫描任务,扫描项目中的镜像安全。

    您可以通过流水线构建历史,查看流水线中“执行Shell”步骤(即镜像安全扫描)的执行情况,镜像安全扫描完成后,您可以在企业主机安全控制台查看扫描结果,具体操作请参见查看并处理CI/CD镜像扫描结果

    如果您在执行8时选择阻断流水线,则镜像安全扫描插件将阻断存在高风险镜像的流水线运行。

相关文档