一、技术原理
CI/CD 镜像扫描无需将镜像资产同步到容器安全服务,仅需要将 CI/CD 镜像扫描插件集成到 Jenkins 或 GitHub 的项目构建任务中。当你在 Jenkins 工具或 GitHub 中构建项目时,会同时触发镜像安全扫描任务,扫描指定镜像中是否存在安全风险。扫描结果统一在仓库镜像页面中展示,便于查看和处理镜像中存在的安全风险。
二、适用场景
本功能适用于以下常见的 CI/CD 环境:
·Jenkins-Freestyle 模式
·Jenkins-Pipeline 模式
·GitHub Actions 模式
三、使用限制
CI/CD 镜像安全扫描每个镜像消耗一次扫描次数,重复扫描将重复消耗,需确保扫描次数充足。
四、配置要求
为保障扫描性能,请确保你的 CI/CD 扫描服务器满足以下最低配置要求:
| 配置项 | 最低配置 | 推荐配置 |
| CPU | 1核 | 4核 |
| 内存 | 2 GB | 8 GB |
| 硬盘 | 60 GB | 100 GB |
| 网络 | 可访问公网,能够连通腾讯云公开 CCR。 | 可访问公网,上行带宽 ≥ 10 Mbps,能够稳定连通腾讯云服务端点。 |
五、获取接入 Token
1. 登录 容器安全控制台,进入策略管理 > CI/CD接入。
2. 在 CI/CD 接入页面,单击生成接入Token。
3. 输入 CI/CD 名称,选择扫描结果存储时长,单击创建Token,系统会生成一个 64 位字符的 Token 到 CI/CD 接入列表中,后续可复制该 Token 配置到 Jenkins 或 GitHub 中。
六、集成插件
在 Jenkins 或 GitHub 中集成腾讯云 CI/CD 镜像扫描插件。
Jenkins-Freestyle 模式Jenkins-Pipeline 模式GitHub Actions 模式
七、Jenkins 版本要求
Jenkins 版本要求:1.625.3及以上版本。
八、下载插件
1. 登录容器安全控制台,进入 策略管理 > CI/CD接入。
2. 在 CI/CD 接入页面,单击右上角显示功能使用说明,单击下载 Jenkins 插件,容器安全服务的 CI/CD 镜像扫描插件会以 hpi 格式下载到本地,插件名称为cicd-scanner.hpi。
九、部署插件
1. 登录 Jenkins 工具,进入管理 Jenkins > 系统配置 > 插件。
2. 在插件页面,单击高级设置,在部署插件区域,单击选择文件,上传已下载到本地的 Jenkins 插件,单击部署。
3. 安装完成后,可在已安装插件标签页中确认插件是否成功安装。
4. 插件安装完成后,需要重启 Jenkins 服务才能生效。
5. 登录 Jenkins 工具,定位到要配置镜像安全扫描的项目,单击 Jenkins-Freestyle 模式的项目名称。
6. 在左侧导航栏,单击配置,在 Build Steps 区域,单击增加构建步骤,下拉菜单选中 CI/CD Scanner(Tencent)。在 CI/CD Scanner(Tencent) 区域配置接入 Token 和期望扫描的镜像 ID,具体参数配置请参见 配置参数,单击保存,完成 CI/CD 插件与 Jenkins 模式的集成。
1. 登录 Jenkins 工具。
2. 定位到要配置镜像安全扫描的项目,单击 Jenkins-Pipeline 模式的项目名称。
3. 在左侧导航栏,单击配置。
4. 在流水线区域,完成和 Jenkins-Freestyle 模式一样的配置,具体参数配置请参见 配置参数,以下为你提供了 Jenkinsfile 的声明式和脚本化的流水线语法样例作为参考,你可以选择一种语法样例完成配置。
·脚本式 Pipeline 样例
node { stage('Run docker') { // 单行 docker 命令 sh 'docker run –rm -v /var/run/docker.sock:/var/run/docker.sock –network=host ccr.ccs.tencentyun.com/yunjing_agent/cicdscanner:latest –token=$token –imageId=$imageId' }}
·声明式 Pipeline 样例
pipeline { agent any environment { IMAGE_ID = '$IMAGE' TOKEN = '$TOKEN' REGISTRY_URL = null REGISTRY_USERNAME = null REGISTRY_PWD = null } stages { stage('Run docker') { steps { sh 'docker run –rm -v /var/run/docker.sock:/var/run/docker.sock –network=host ccr.ccs.tencentyun.com/yunjing_agent/cicdscanner:latest –token=env.TOKEN –imageId=env.IMAGE_ID' } } }}
非 Jenkins 流水线工具均可参考 GitHub Actions 模式接入指引,此处以 GitHub Actions 模式为例。1. 登录 GitHub,单击右上角头像,在下拉菜单中选中 Repositories。2. 在 Repositories 页签下,单击你要集成 CI/CD 插件的 repository 。3. 单击 Actions 页签,在 All workflows 列表中,定位到要集成 CI/CD 插件的 workflows 流水线文件,单击其 Actor 列的···,在下拉菜单中,选择 View workflow file。4. 在 Workflow file for this run 中按照以下样例中 Scan image by cicd-scanner 步骤进行镜像扫描配置,将 ${{ secrets.CICD_TOKEN }} 替换成生成的 token,${{ env.REPO_TAG }} 替换为期望扫描的镜像,具体参数配置请参见 配置参数。name: Docker build and scan security issue by cicd-scanneron: push: branches: [main] pull_request: branches: [main]env: REPO_TAG: "your_docker_image_repo:your_docker_image_tag"jobs: build: runs-on: ubuntu-latest steps: – name: Checkout code uses: actions/checkout@v2 – name: Build the Docker image run: docker build . –file Dockerfile –tag ${{ env.REPO_TAG }} – name: Scan image by cicd-scanner run: | docker run –rm \\ -v /var/run/docker.sock:/var/run/docker.sock \\ –network=host \\ ccr.ccs.tencentyun.com/yunjing_agent/cicdscanner:latest \\ –token=${{ secrets.CICD_TOKEN }} \\ –imageId=${{ env.REPO_TAG }}
十、配置参数
在 Jenkins 或 GitHub 中配置扫描参数,请参考下表:
| 参数 | 必/选填 | 说明 | 本地镜像示例 | 仓库镜像示例 |
| Token | *必填 | 容器安全服务 CI/CD镜像扫描插件的接入Token。 | xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx | xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx |
| imageId | *必填 | 输入需要扫描的镜像 ID 或imageName:imageTag,如果是仓库镜像,也可填写完整的 URL。 | 7cc39f89fa58 或 ubuntu:21.04 | xxxx.tencentcloudcr.com/tcss/mybuild:v1 或 mybuild:v1 |
| registryUrl | 选填 | 镜像仓的 URL。 | / | xxxx.tencentcloudcr.com/tcss |
| registryUsername | 选填 | 镜像仓登录用户名。 | / | admin |
| registryPwd | 选填 | 镜像仓登录密码。 | / | password |
注意:说明:
注意:当扫描远程仓库镜像时,registryUrl、registryUsername、registryPwd 参数必填。
十一、执行扫描
集成配置完成后,你在构建项目时,会同步执行镜像安全扫描任务,扫描你项目的镜像是否存在安全风险。
十二、查看结果
1. 登录容器安全控制台,进入策略管理 > CI/CD接入。
2. 在 CI/CD 接入列表中,针对你关注的 Token,单击查看镜像风险,即可跳转到仓库镜像页面查看指定Token的镜像扫描结果。
3. 在仓库镜像页面中,可取消实例名称(此处指CI/CD名称)的搜索过滤,查看所有 CI/CD 的镜像扫描结果。
4. 定位到存在安全风险的镜像,单击详情,进入镜像详情页面,查看该镜像中存在的安全漏洞、木马病毒、风险信息。