OpenShift 4 - DevSecOps Workshop (13) - 将镜像推送到Quay,并进行漏洞扫描

OpenShift 4.x HOL教程汇总
说明:本文已经在OpenShift 4.8环境中验证

OpenShift 4 - DevSecOps Workshop 系列视频


本节在Pipeline中增加新Task,它会将应用镜像从OpenShift推动到Quay中,并由Quay完成对镜像的安全扫描。
在这里插入图片描述

在 Quay 中创建 Repository

  1. 用浏览器打开“devsecops”项目中名为“quayecosystem-quay”的Route地址,然后用和OpenShift相同的用户登陆Quay控制台。登录后点击下图“Create New Repository”。
    在这里插入图片描述
  2. 设置名称为“tekton-tasks”的“Private”类型的Repository,然后点击“Create New Repository”按钮。
    在这里插入图片描述

手动将 Image 推送到 Quay

以下将以“user1”用户为例。

  1. 为DEV区域的项目中“tekton-tasks:latest”的ImageStream添加新的“quay1”标签。
$ oc tag tekton-tasks:latest tekton-tasks:quay1 -n ${DEV}
  1. 运行命令运行“skopeo”镜像,并进入运行的容器。
$ oc run skopeo --serviceaccount=pipeline --image=quay.io/skopeo/stable --rm -it --command -- /bin/bash
[root@skopeo /]#
  1. 在容器内部执行skopeo命令,使用Quay的Service内部地址登录Quay。在输入“user1”用户的密码后,登录认证将保存在“/tmp/auth.json”文件中。
[root@skopeo /]# skopeo login quayecosystem-quay.devsecops.svc.cluster.local:80 --username=user1 --tls-verify=false --authfile /tmp/auth.json
Login Succeeded!
  1. 在用skopeo登录OpenShift内部的Registry,登录认证还保存在“/tmp/auth.json”文件中。
[root@skopeo /]$ skopeo login image-registry.openshift-image-registry.svc.cluster.local:5000 --authfile /tmp/auth.json --tls-verify=false --username=user1 --password=$(cat /var/run/secrets/kubernetes.io/serviceaccount/token)
Login Succeeded!
  1. 可以查看“/tmp/auth.json”文件中的内容,确认有2个认证信息,其中一个是本地OpenShift内部的Image Registry,另一个是quay的。
[root@skopeo /]# cat  /tmp/auth.json
{
        "auths": {
                "image-registry.openshift-image-registry.svc.cluster.local:5000": {
                        "auth": "dXNlcjE6ZXlKaGJHY2lPaUpTVXpJMU5pSXNJbXRwWkNJNklpMTJNR3RFYkZadWFXdG5hMFUyVm5VMlMzSmphR0V6Ym5KTE4ycHVjV0pUYW1wV1lraHBlRXR4YkhjaWZRLmV5SmhkV1FpT2xzaWFIUjBjSE02THk5cmRXSmxjbTVsZEdWekxtUmxabUYxYkhRdWMzWmpJbDBzSW1WNGNDSTZNVFkyTWpnMU5EQTROaXdpYVdGMElqb3hOak14TXpFNE1EZzJMQ0pwYzNNaU9pSm9kSFJ3Y3pvdkwydDFZbVZ5Ym1WMFpYTXVaR1ZtWVhWc2RDNXpkbU1pTENKcmRXSmxjbTVsZEdWekxtbHZJanA3SW01aGJXVnpjR0ZqWlNJNkluVnpaWEl4TFdOcFkyUWlMQ0p3YjJRaU9uc2libUZ0WlNJNkluTnJiM0JsYnlJc0luVnBaQ0k2SWpGalltUmhOR05qTFdZME16Z3ROR0kxWVMwNU1qTXlMVEl6WVdJMU1ERTVORFF5WmlKOUxDSnpaWEoyYVdObFlXTmpiM1Z1ZENJNmV5SnVZVzFsSWpvaWNHbHdaV3hwYm1VaUxDSjFhV1FpT2lKaFptVmhPRGt3TmkwNFlUSTNMVFE1TmpNdFlqY3dZUzA1Wm1abU5qRmtOekZoTURBaWZTd2lkMkZ5Ym1GbWRHVnlJam94TmpNeE16SXhOamt6ZlN3aWJtSm1Jam94TmpNeE16RTRNRGcyTENKemRXSWlPaUp6ZVhOMFpXMDZjMlZ5ZG1salpXRmpZMjkxYm5RNmRYTmxjakV0WTJsalpEcHdhWEJsYkdsdVpTSjkuYllUZ284VmZ5MHoxMm9nR0duMXRfci1JaV85WEMtV3ZhNnNxN19OYUJRcVVPM2Q4U2c2Ql9TblBDczl1cHNrS1ptX25IWk41Zkp4UEx1ejFac1VUUl93MkdDN19oS2xCRHBOTDgxLVJjamlnV3U5NF9GMzc5NzZ1X2NFYkFFeTFHOUtQTjlWQ2RfT096NVRoMVUyWFhUeXN3Y3d3NjlfQ0l5cmlRdUNURkF0azBLQlU2NlloZlUxdkNKenF0Q1VrSTBtOG1lTUF2dzkxTjVnSmVsSGQzLXZPdTdRMThuTm5vMjY4OVpoeFRBV29YYnM3UDFMU1NwcER5ZXpaLXJXWlhMSnFXWnJHNE5fUDhLajVQZGw5TEhkSFRIZjlfOTdBc2dRZ191aUpYRDB3YlNtVVVVNFZQWnBYbl9ZMkI1QU1SQVh6NWpVNGt2bmV1NThfMFR4TWVLdmt4U2Z5c3dMOWUtRVBCUEc4MEpmX1EwZm1HTEc3OVJ6d1VqcnlaWkRXTHVZYzVVazZFaXhpZHlSYmplWk1aLW8xZUZDVERpTExud2JNRVJoQlhsUUhSUWlwWGlhUVpjRlVjTzN5NGNwWW5IWlFnZF9yWHVJemJnSTZnWFpTdEFxYTBsbVI3cS05UXZvNUZVUU81UmhEYkVFSG5mNm83V19MV193cXBLTTlzZ0pLWlFiaDIxZTlycU9XV1NOaFNXaVcwdmJBZHBGM0hPbHkyS1ZqdkFmYlFzVlpLUFo5TklwR2lXMjhvVXFUWVQxblpLOG51cElTU2lKdEZzVlduMVEteXROMHdEZnd4ZDN1eVBMelIzcC1iUjZjZC11cGE3YmdfTGd6dWo5RW5sQTY5d1VSQUVERUdtVGdxb2w3ZzJmWlIyeWFuOXNjcjdjbk9aOGFFYmM="
                },
                "quayecosystem-quay.devsecops.svc.cluster.local:80": {
                        "auth": "dXNlcjE6b3BlbnNoaWZ0"
                }
        }
}
  1. 用 skopeo 将OpenShift内部的“tekton-tasks:latest”镜像复制到Quay中并命名为“tekton-tasks:quay1”,然后退出容器。
[root@skopeo /]# skopeo copy docker://image-registry.openshift-image-registry.svc.cluster.local:5000/user1-dev/tekton-tasks:latest docker://quayecosystem-quay.devsecops.svc.cluster.local:80/user1/tekton-tasks:quay1 --src-tls-verify=false --dest-tls-verify=false --authfile /tmp/auth.json
Getting image source signatures
Copying blob c9281c141a1b done
Copying blob d85d992616b8 done
Copying blob 31114e120ca0 done
Copying blob 3daa086d507c done
Copying config 99a9242b82 done
Writing manifest to image destination
Storing signatures
 
[root@skopeo /]# exit
  1. 在Quay控制台中确认已经有了“tekton-tasks:quay1”镜像。注意:开始“SECURITY SCAN”的状态为“Queued”,完成后是“Passed”状态。
    在这里插入图片描述
    在这里插入图片描述
  2. 点击上图中“SECURITY SCAN”一列的链接,页面会进入下图,可查看扫描该镜像发现的漏洞。
    在这里插入图片描述

新建 Task 将 Image 推送到 Quay

  1. 根据Route获得Quay的访问地址,并设置访问密码。
$ export QUAY_URL=$(oc get route quayecosystem-quay -n devsecops -ojsonpath={.spec.host})
$ export PASSWORD=openshift
  1. 执行命令创建“send-to-quay”任务。
$ oc apply -f - << EOF
apiVersion: tekton.dev/v1beta1
kind: Task
metadata:
  name: send-to-quay
  namespace: ${CICD}
spec:
  params:
  - description: Source (project/image:tagName) and image:rev to push, e.g. user2-dev/tekton-tasks:latest
    name: source_image
    type: string
  - description: The target (user/repo:tagName) where to push in quay, e.g. user2/tekton-tasks:quay1
    name: target_image
    type: string
  steps:
  - name: skopeo-copy
    args:
      - copy 
      - docker://image-registry.openshift-image-registry.svc.cluster.local:5000/\$(params.source_image)
      - docker://${QUAY_URL}/\$(params.target_image)
      - --src-tls-verify=false 
      - --dest-tls-verify=false
      - --dest-creds=${USER}:${PASSWORD}
    command:
      - /usr/bin/skopeo
    image: quay.io/skopeo/stable
EOF
  1. 运行命令测试“send-to-quay”任务。
$ tkn task start send-to-quay -n ${CICD} --showlog \
	--param source_image=${DEV}/tekton-tasks:latest \
	--param target_image=${USER}/tekton-tasks:quay2
TaskRun started: send-to-quay-run-hv6dh
Waiting for logs to be available...
[skopeo-copy] Getting image source signatures
[skopeo-copy] Copying blob sha256:31114e120ca0c7dc51e01721c5a689a614edb6c86de11301d503c72be1540c79
[skopeo-copy] Copying blob sha256:13866cf99dafb40c73cf9003f9d9e38b1d978b07437075ab87a12f3ca3e3c8fa
[skopeo-copy] Copying blob sha256:3daa086d507c054341d9980d84f236e721560ce925004630866944a0f621328e
[skopeo-copy] Copying blob sha256:c9281c141a1bfec06e291d2ad29bfdedfd10a99d583fc0f48d3c26723ebe0761
[skopeo-copy] Copying config sha256:3df1608adc47dd3e6cd42d16e57f2bc09cd9d662b6036b0a99e7d4bef1ad793d
[skopeo-copy] Writing manifest to image destination
[skopeo-copy] Storing signatures
  1. 在Quay控制台中确认Tag为“quay2”的镜像已经在其中了。
    在这里插入图片描述

将向 Quay 推送 Image 的任务加入 Pipeline

  1. 执行命令向“tasks-dev-pipeline”管道追加刚刚创建的“send-to-quay”任务,实现向Quay推送镜像。
$ TASKS="$(oc get pipelines tasks-dev-pipeline -n ${CICD} -o yaml | yq r - 'spec.tasks' | yq p - 'spec.tasks')"
$ oc patch pipelines tasks-dev-pipeline -n ${CICD} --type=merge -p "$(cat << EOF
$TASKS
    - name: container-vulnerability-scan
      taskRef:
        kind: Task
        name: send-to-quay
      params:
          - name: source_image
            value: ${DEV}/tekton-tasks:\$(tasks.git-rev.results.gitsha)
          - name: target_image
            value: ${USER}/tekton-tasks:\$(tasks.git-rev.results.gitsha)
      runAfter:
          - create-image
EOF
)"

或在OpenShift控制台中向“tasks-dev-pipeline”管道增加“send-to-quay”任务并配置任务属性。
在这里插入图片描述
2. 执行命令测试更新后的“tasks-dev-pipeline”管道。可以在OpenShift控制台中查看该Pipeline管道对应的“tasks-dev-pipeline-xxxxx”日志。

$ tkn pipeline start tasks-dev-pipeline -n ${CICD} --showlog \
	--resource pipeline-source=tasks-source-code \
	--workspace name=local-maven-repo,claimName=maven-repo-pvc

在这里插入图片描述
3. 最后确认在Quay中已经有了最新从Pipeline推送的应用镜像(镜像的TAG是获取到的gitsha),并且Quay也完成了对新镜像的安全漏洞扫描。
在这里插入图片描述


版权声明:本文为weixin_43902588原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。