
# 在CI/CD中集成镜像安全扫描
#### 操作场景
企业主机安全的CI/CD镜像安全扫描功能介绍请参见[CI/CD镜像安全扫描概述](https://support.huaweicloud.com/usermanual-hss2.0/hss_01_0701.html)。
在使用CI/CD镜像安全扫描功能时，您需要在Jenkins或CodeArts Pipeline项目中集成镜像安全扫描插件，以便在流水线构建阶段对镜像实施安全扫描。
#### 约束与限制
CI/CD镜像安全扫描**需要** **开通容器镜像按次收费扫描增值服务** ，开通后，HSS将按扫描每个镜像的次数进行收费。[开通容器镜像按次收费扫描](https://support.huaweicloud.com/usermanual-hss2.0/hss_01_0716.html)。
#### 操作流程
图1操作流程   
![](https://support.huaweicloud.com/usermanual-hss2.0/zh-cn_image_0000002513872567.png "点击放大")
1. [步骤一：配置镜像安全扫描命令]
2. [步骤二：在CI/CD流水线中集成镜像安全扫描命令]
 
 #### 步骤一：配置镜像安全扫描命令
1. [登录企业主机安全控制台](https://console.huaweicloud.com/hss/?locale=zh-cn)。
2. 在控制台左上角，单击![](https://support.huaweicloud.com/usermanual-hss2.0/zh-cn_image_0000002384023862.png)图标，选择区域或项目。
3. 在左侧导航栏，选择"安装与配置 \> 容器安装与配置"，进入"容器安装与配置"页面。
4. 选择"CI/CD接入设置"页签，单击"接入配置"，系统弹出"接入配置"对话框。 
   图2CI/CD接入设置   
   ![](https://support.huaweicloud.com/usermanual-hss2.0/zh-cn_image_0000002513752097.png "点击放大")
   
   
5. 在对话框中，单击"新增CI/CD标识"，系统弹出新增CI/CD标识对话框。 
   CI/CD标识是CI/CD插件的接入Token，用作镜像扫描身份认证。
   图3新增CI/CD标识   
   ![](https://support.huaweicloud.com/usermanual-hss2.0/zh-cn_image_0000002481872214.png "点击放大")
   
   
6. 填写一个标识，单击"确定"，新增CI/CD标识完成。 
   图4填写CI/CD标识   
   ![](https://support.huaweicloud.com/usermanual-hss2.0/zh-cn_image_0000002481712248.png "点击放大")
   
   
7. 勾选一个标识，并单击"下一步"。 
   图5勾选标识   
   ![](https://support.huaweicloud.com/usermanual-hss2.0/zh-cn_image_0000002513752099.png "点击放大")
   
   
8. 根据界面提示，配置镜像扫描信息。
   
   CI/CD安全扫描分"镜像安全扫描"和"IaC安全扫描"两个类别。如需扫描对应类别，打开![](https://support.huaweicloud.com/usermanual-hss2.0/zh-cn_image_0000002481872216.png)开关配置对应参数。相关参数说明请参见[表1]和[表2]。
   图6镜像扫描信息   
   ![](https://support.huaweicloud.com/usermanual-hss2.0/zh-cn_image_0000002481712250.png "点击放大")
    表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镜像仓地址 ![](https://support.huaweicloud.com/usermanual-hss2.0/zh-cn_image_0000002481923788.png "点击放大") | repository_address 该参数是由"通信类型://镜像仓地址"组成。                                                                                                                                                                                                                                         |
   | 登录凭证（仅远程镜像仓扫描需要配置） | 镜像仓用户名   | 输入登录用户名。 如果远程镜像仓是华为云容器镜像服务SWR，镜像仓用户名可在"Pull/Push指南 \> 登录指令"中获取。如[图8]所示。 图8获取SWR镜像仓用户名和密码 ![](https://support.huaweicloud.com/usermanual-hss2.0/zh-cn_image_0000002481928352.png "点击放大")                                                        | login_auth 该参数的参数值为界面参数值"镜像仓用户名"和"镜像仓密码"加密后的内容                                                                                                                                                                                                                                      |
   | 登录凭证（仅远程镜像仓扫描需要配置） | 镜像仓密码    | 输入登录用户密码。 如果远程镜像仓是华为云容器镜像服务SWR，镜像仓密码可在"Pull/Push指南 \> 登录指令"中获取。如[图8]所示。                                                                                                                                                                                                                                                     | login_auth 该参数的参数值为界面参数值"镜像仓用户名"和"镜像仓密码"加密后的内容                                                                                                                                                                                                                                       |
   | 高级配置（可选）           | 漏洞白名单    | 在CI/CD流水线构建过程中，发现镜像存在白名单内的漏洞，不阻断CI/CD流水线。 如果业界定位为高风险的漏洞，您认为该漏洞不会对您的业务造成影响，可添加漏洞白名单。 输入漏洞名称；多个漏洞名称以换行符分隔。                                                                                                                                                                                                                   | -                                                                                                                                                                                                                                                                                                               |
   | 高级配置（可选）           | 漏洞黑名单    | 在CI/CD流水线构建过程中，发现镜像存在黑名单内的漏洞，则阻断CI/CD流水线。 如果业界定位为低风险的漏洞，您认为该漏洞对您的业务会造成比较严重的影响，可添加漏洞黑名单。 输入漏洞名称；多个漏洞名称以换行符分隔。                                                                                                                                                                                                               | -                                                                                                                                                                                                                                                                                                               |
   | 高级配置（可选）           | 镜像白名单    | 在CI/CD流水线构建过程中，发现该镜像存在风险，不阻断CI/CD流水线。 输入镜像名称；多个镜像名称以换行符分隔。 镜像名称格式： - 本地镜像：镜像名称:版本  - 远程镜像：组织名称/镜像名称:版本                                  | -                                                                                                                                                                                                                                                                                                               |
      
    表2IaC安全扫描参数说明 
   | 界面参数      | 说明                                                                                                                                                                                                                                                                                        | 对应生成命令中的参数   |
   |:---|:---|:---|
   | 配置方式      | 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复制命令   
    ![](https://support.huaweicloud.com/usermanual-hss2.0/zh-cn_image_0000002481712258.png "点击放大")
    
    
 
 #### 步骤二：在CI/CD流水线中集成镜像安全扫描命令
请根据您使用的流水线类型按以下指导集成扫描命令。
- [在Jenkins Pipeline中集成]
  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插入镜像安全扫描命令   
        ![](https://support.huaweicloud.com/usermanual-hss2.0/zh-cn_image_0000002481723028.png "点击放大") 
     
     
     - **远程镜像仓**
       1. 在"Pipeline"区域，将[10]复制的命令中的"environment"段代码插入Pipeline脚本中"agent any"之后。
       
       2. 将[10]复制的命令中的"stage('image-scan')"段代码插入到Pipeline脚本中Test和Push阶段之间。
        
      
     
     
  
  5. 单击"Apply"，应用脚本。 
     后续您构建该目标项目时，会同步执行镜像安全扫描任务，扫描项目中的镜像安全。
     您可以通过"Blue Ocean"查看项目构建任务，项目构建任务中增加的"image-scan"步骤即镜像安全扫描步骤，镜像安全扫描步骤执行完成后，您可以在企业主机安全控制台查看扫描结果，具体操作请参见[查看并处理CI/CD镜像扫描结果](https://support.huaweicloud.com/usermanual-hss2.0/hss_01_0718.html)。
     如果您在执行[8]时选择阻断流水线，则镜像安全扫描插件将阻断存在高风险镜像的流水线运行，如[图11]所示。
     图11项目构建阻断   
     ![](https://support.huaweicloud.com/usermanual-hss2.0/zh-cn_image_0000002513882855.png "点击放大")
     
     
   
- [在CodeArts Pipeline中集成]
  1. 新建CodeArts资源池。
     
     具体操作请参见[新建CodeArts资源池](https://support.huaweicloud.com/usermanual-devcloud/devcloud_01_0016.html)。
     - 资源池名称：建议设置为"HSS"。
     
     - 资源池类型：必须选择"LINUX"。
     
     
     
     
  
  2. 在CodeArts资源池中新建代理。 
     具体操作请参见[在CodeArts资源池中新建代理](https://support.huaweicloud.com/usermanual-devcloud/devcloud_01_0017.html)。
     - 代理名称：建议设置为"Agent-imagescan"。
     
     - 安装代理的主机：建议选择ECS的Linux主机。
     
     
     
     
  
  3. 代理新建完成后，单击顶部导航"首页"，进入CodeArts首页。
  
  4. 单击目标项目名称，进入项目详情页面。
  
  5. 在左侧导航栏，单击"持续交付 \> 流水线"，进入流水线列表。
  
  6. 在目标流水线的"操作"列，单击"![](https://support.huaweicloud.com/usermanual-hss2.0/zh-cn_image_0000002513837103.png) \> 编辑"，进入流水线任务编排页面。
  
  7. 在Build和Push任务阶段间，单击![](https://support.huaweicloud.com/usermanual-hss2.0/zh-cn_image_0000002513841401.png)新建一个阶段。
  
  8. 单击"新建任务 \> 从空任务新建"，进入新建任务页面。
  
  9. 添加"执行Shell"步骤。 
     图12添加执行Shell   
     ![](https://support.huaweicloud.com/usermanual-hss2.0/zh-cn_image_0000002513962003.png "点击放大")
     
     
  
  10. 单击"任务配置"，进入任务配置页面，配置资源池。 
      - 资源池类型：自定义资源池
      
      - 自定义资源池：选择[1]创建的资源池，示例为"HSS"。
      
      
      图13配置资源池   
      ![](https://support.huaweicloud.com/usermanual-hss2.0/zh-cn_image_0000002513959633.png "点击放大")
      
      
  
  11. 返回"执行Shell"页面，根据需要扫描的镜像类型，插入镜像安全扫描命令。 
      以下样例供参考，您可以根据实际场景灵活配置。
      - **本地镜像**
        1. 在"命令"区域，粘贴[10]复制的命令。
        
        2. （可选）如果执行[8]时，未配置"镜像名称"和"镜像版本"参数，请在"高级设置"区域添加"IMAGE_NAME"和"IMAGE_VERSION"两个变量。
           变量值为您此流水线代码生成的镜像名称和镜像版本。
           图14环境变量   
           ![](https://support.huaweicloud.com/usermanual-hss2.0/zh-cn_image_0000002481803696.png "点击放大") 
         
      
      
      
      - **远程镜像仓**
        1. 在"命令"区域，粘贴[10]复制的命令。
        
        2. （可选）如果执行[8]时，未配置"所属组织"、"镜像名称"和"镜像版本"参数，请在"高级设置"区域添加"NAMESPACE"、"IMAGE_NAME"和"IMAGE_VERSION"三个变量。
           图15环境变量   
           ![](https://support.huaweicloud.com/usermanual-hss2.0/zh-cn_image_0000002482655324.png "点击放大") 
         
       
      
      
  
  12. 单击"确定"，保存任务配置。
  
  13. 在流水线右上角，单击"保存"，保存流水线配置。 
      后续您构建该目标项目时，会同步执行镜像安全扫描任务，扫描项目中的镜像安全。
      您可以通过流水线构建历史，查看流水线中"执行Shell"步骤（即镜像安全扫描）的执行情况，镜像安全扫描完成后，您可以在企业主机安全控制台查看扫描结果，具体操作请参见[查看并处理CI/CD镜像扫描结果](https://support.huaweicloud.com/usermanual-hss2.0/hss_01_0718.html)。
      如果您在执行[8]时选择阻断流水线，则镜像安全扫描插件将阻断存在高风险镜像的流水线运行。
      
      
   
#### 相关操作
- [查看并处理CI/CD镜像扫描结果](https://support.huaweicloud.com/usermanual-hss2.0/hss_01_0718.html)
- [查看CI/CD的IaC风险扫描结果](https://support.huaweicloud.com/usermanual-hss2.0/hss_01_0749.html#hss_01_0749__section347765621611)
- [编辑黑白名单](https://support.huaweicloud.com/usermanual-hss2.0/hss_01_0704.html)
 
