当前位置:   article > 正文

使用 Cosign 来对极狐GitLab 镜像进行签名_镜像签名

镜像签名

目录

关于 Cosign

Cosign 的安装

使用 Cosgin 对极狐GitLab 镜像进行签名

将镜像签名集成到极狐GitLab CI/CD 中


镜像签名能够防止镜像被篡改,是一种保护镜像安全的手段。

关于 Cosign

cosign 是 sigstore 项目的一部分,也是一个开源项目,主要用来对 OCI 镜像进行签名和验证,从而让签名成为一种无形的基础设施。cosign 目前支持以下几种签名方式:

  • 硬件和 KMS 签名
  • 使用自己的 PKI
  • 免费的 OIDC PKI
  • 内置的二进制透明和时间戳服务

Cosign 的安装

cosign 的安装有多种形式,可以根据不同的 OS 来进行安装,以 Ubuntu 20.04 为例,执行如下命令即可完成 cosign 的安装:

  1. $ wget "https://github.com/sigstore/cosign/releases/download/v1.6.0/cosign_1.6.0_amd64.deb"
  2. $ dpkg -i cosign_1.6.0_amd64.deb
  3. Selecting previously unselected package cosign.
  4. (Reading database ... 136644 files and directories currently installed.)
  5. Preparing to unpack cosign_1.6.0_amd64.deb ...
  6. Unpacking cosign (1.6.0) ...
  7. Setting up cosign (1.6.0) ...
  8. $ mv /usr/local/bin/cosign-linux-amd64 /usr/local/bin/cosign

version 命令查看是否安装成功:

  1. $ cosign version
  2. ____ ___ ____ ___ ____ _ _
  3. / ___| / _ \ / ___| |_ _| / ___| | \ | |
  4. | | | | | | \___ \ | | | | _ | \| |
  5. | |___ | |_| | ___) | | | | |_| | | |\ |
  6. \____| \___/ |____/ |___| \____| |_| \_|
  7. cosign
  8. GitVersion: v1.6.0
  9. GitCommit: 4b2c3c0c8ee97f31b9dac3859b40e0a48b8648ee
  10. GitTreeState: clean
  11. BuildDate: '2022-03-03T17:59:06Z'
  12. GoVersion: go1.17.7
  13. Compiler: gc
  14. Platform: linux/amd64

可以看到 cosign 已经安装成功。

使用 Cosgin 对极狐GitLab 镜像进行签名

用 cosgin 对极狐GitLab 镜像进行签名大体分三个步骤:

  • 生成 keypair
  • 用 cosign.key 对需要签名的镜像进行签名
  • 用 cosign.pub 对签名进行验证

所以先用如下命令生成 cosign keypair,在这个过程中需要手动输入 cosign password,如果将 cosign password 以环境变量(COSIGN_PASSWORD)的形式注入,则无需手动输入 cosign password:

  1. $ export COSIGN_PASSWORD=cosign_password
  2. $ cosign generate-key-pair
  3. Private key written to cosign.key
  4. Public key written to cosign.pub

在当前目录下可以看到 keypair

  1. $ ls -ltr
  2. total 8
  3. -rw-r--r-- 1 root root 178 May 31 22:32 cosign.pub
  4. -rw------- 1 root root 649 May 31 22:32 cosign.key

可以分别查看两者的内容:

  1. $ cat cosign.pub
  2. -----BEGIN PUBLIC KEY-----
  3. MFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEqgrSWr79vqEYM/fLXYDwwFSnKwWJ
  4. ffRvaaY5i4pl9JJvcMw2TDJB4jo5dXTeAAWeR3mp4wg28pXfsgl8JN3AZg==
  5. -----END PUBLIC KEY-----
  6. $ cat cosign.key
  7. -----BEGIN ENCRYPTED COSIGN PRIVATE KEY-----
  8. eyJrZGYiOnsibmFtZSI6InNjcnlwdCIsInBhcmFtcyI6eyJOIjozMjc2OCwiciI6
  9. OCwicCI6MX0sInNhbHQiOiJ3dmtocDZuVHlZUmZVYkQxWTgxZlA1YU81Y1B6bGp4
  10. QWhSNTh6eUdTTTdVPSJ9LCJjaXBoZXIiOnsibmFtZSI6Im5hY2wvc2VjcmV0Ym94
  11. Iiwibm9uY2UiOiJ1YUU5NmUrY2d5NHhZR1ZZU3FMek8zeGhieERyYlRKRCJ9LCJj
  12. aXBoZXJ0ZXh0IjoiSzFYWGdVdGdQbTFzNEpPcExGc2VMcTY3aUMrUTRkUWhoR1ZU
  13. R0ZYMG4wVVprczVDeXh4VElNRkpteDczMjlCVzBQZVBmU1NaZFBMaXRGR1V3b0RD
  14. SXdTOW1yc3dyUnVEaWpybmhjYUQvNGQyaDQzOGIzS1o4Umx2TzFXMld5LzN4TWNR
  15. NGlUUnBISSs2YnFkcE9LaWF6SWMwMHlLeVZBZlVrS1hJbXhqeWFoZ2ZBbnRrVUZ1
  16. ZnI4TVpiWkdhM2xBRHo1WE9ubktpS2FlTlE9PSJ9
  17. -----END ENCRYPTED COSIGN PRIVATE KEY-----

接下来就可以对极狐GitLab的镜像进行签名了,在上一篇文章用 Tekton 来构建镜像并推送到极狐GitLab 私有仓库,已经使用 Tekton 构建了一个镜像并推送到了极狐GitLab镜像仓库,镜像名称为 registry.jihulab.com/keyboard-man/tekton-image:v0.0.1。接着就用 cosgin 命令对此镜像进行签名:

  1. $ cosign sign --key cosign.key registry.jihulab.com/keyboard-man/tekton-image:v0.0.1
  2. Pushing signature to: registry.jihulab.com/keyboard-man/tekton-image

这是再次查看镜像仓库,可以发现镜像仓库里面多了一些签名信息:

再用 cosign 对签名镜像进行验证:

  1. $ cosign verify --key cosign.pub registry.jihulab.com/keyboard-man/tekton-image:v0.0.1 | jq .
  2. Verification for registry.jihulab.com/keyboard-man/tekton-image:v0.0.1 --
  3. The following checks were performed on each of these signatures:
  4. - The cosign claims were validated
  5. - The signatures were verified against the specified public key
  6. [
  7. {
  8. "critical": {
  9. "identity": {
  10. "docker-reference": "registry.jihulab.com/keyboard-man/tekton-image"
  11. },
  12. "image": {
  13. "docker-manifest-digest": "sha256:8abb07ae291032e90df63c7e35f8a30a2b1ae152c566984d55d4d0024f70490c"
  14. },
  15. "type": "cosign container image signature"
  16. },
  17. "optional": null
  18. }
  19. ]

可以看到镜像通过了签名验证。

如果将代码进行修改之后,再次构建镜像时,使用同样的 tag(v0.0.1) 推送至镜像仓库,则在签名验证时会提示错误:

  1. $ cosign verify --key cosign.pub registry.jihulab.com/keyboard-man/tekton-image:v0.0.1
  2. Error: no matching signatures:
  3. main.go:46: error during command execution: no matching signatures:

这也反映了镜像签名的重要性:能够防止镜像被篡改

将镜像签名集成到极狐GitLab CI/CD 中

可以很容易的将上述镜像签名流程嵌入到极狐GitLab CI/CD 中,cosign 的 keypair 以及 COSIGN_PASSWORD 都是以变量的形式来存储的:

如下代码即可完成镜像签名和验证:

  1. stages:
  2. - singature
  3. - verfication
  4. image-singature:
  5. stage: singature
  6. tags:
  7. - cosign
  8. image:
  9. name: dllhb/cosign:1.0.0
  10. entrypoint: [""]
  11. before_script:
  12. - mkdir ~/.docker
  13. - cat "$DOCKER_CRED_FILE" > ~/.docker/config.json
  14. - cat "$COSIGN_KEY" > /tmp/cosign.key
  15. - export COSIGN_PASSWORD="$COSIGN_PASSWORD"
  16. script:
  17. - cosign sign --key /tmp/cosign.key $CI_REGISTRY_IMAGE:v0.0.2
  18. image-verfication:
  19. stage: verfication
  20. tags:
  21. - cosign
  22. image:
  23. name: dllhb/cosign:1.0.0
  24. entrypoint: [""]
  25. before_script:
  26. - cat "$COSIGN_PUB" > /tmp/cosign.pub
  27. - cat /tmp/cosign.pub
  28. - export COSIGN_PASSWORD="$COSIGN_PASSWORD"
  29. - echo $COSIGN_PASSWORD
  30. script:
  31. - cosign verify --key /tmp/cosign.pub $CI_REGISTRY_IMAGE:v0.0.2

如果将镜像构建、镜像扫描再集成进来,则可以构建容器镜像的双重安全防护体系,代码如下:

  1. include:
  2. - template: Security/Container-Scanning.gitlab-ci.yml
  3. stages:
  4. - build
  5. - scan
  6. - singature
  7. - verfication
  8. build:
  9. stage: build
  10. image:
  11. name: docker:20.10.7-dind
  12. tags:
  13. - cosign
  14. script:
  15. - docker login -u $CI_REGISTRY_USER -p $CI_REGISTRY_PASSWORD $CI_REGISTRY
  16. - docker build -t $CI_REGISTRY_IMAGE:v0.0.2 .
  17. - docker push $CI_REGISTRY_IMAGE:v0.0.2
  18. container_scanning:
  19. stage: scan
  20. variables:
  21. DOCKER_IMAGE: $CI_REGISTRY_IMAGE:v0.0.2
  22. allow_failure: false
  23. artifacts:
  24. reports:
  25. container_scanning: gl-container-scanning-report.json
  26. paths: [gl-container-scanning-report.json]
  27. image-singature:
  28. stage: singature
  29. services:
  30. - docker:20.10.7-dind
  31. tags:
  32. - cosign
  33. image:
  34. name: dllhb/cosign:1.0.0
  35. entrypoint: [""]
  36. before_script:
  37. - mkdir ~/.docker
  38. - cat "$DOCKER_CRED_FILE" > ~/.docker/config.json
  39. - cat "$COSIGN_KEY" > /tmp/cosign.key
  40. - export COSIGN_PASSWORD="$COSIGN_PASSWORD"
  41. script:
  42. - cosign sign --key /tmp/cosign.key $CI_REGISTRY_IMAGE:v0.0.2
  43. image-verfication:
  44. stage: verfication
  45. tags:
  46. - cosign
  47. image:
  48. name: dllhb/cosign:1.0.0
  49. entrypoint: [""]
  50. before_script:
  51. - cat "$COSIGN_PUB" > /tmp/cosign.pub
  52. - cat /tmp/cosign.pub
  53. - export COSIGN_PASSWORD="$COSIGN_PASSWORD"
  54. - echo $COSIGN_PASSWORD
  55. script:
  56. - cosign verify --key /tmp/cosign.pub $CI_REGISTRY_IMAGE:v0.0.2

Pipeline 的构建结果如下:

上述流程就是用 cosign 来对极狐GitLab 镜像进行签名和验证的实践流程。

声明:本文内容由网友自发贡献,转载请注明出处:【wpsshop博客】
推荐阅读
  

闽ICP备14008679号