【云原生安全篇】Cosign助力Harbor验证镜像实践

news2024/10/4 13:17:51

【云原生安全篇】Cosign助力Harbor验证镜像实践

目录

  • 1 引言
  • 2 概念
    • 2.1 什么是 Cosign?
    • 2.2 为什么选择 Cosign 和 Harbor?
  • 3 实践: Cosign对Harbor中的镜像签名
    • 3.1 环境准备
    • 3.2 安装 Cosign
    • 3.3 使用 Cosign 对镜像进行签名
      • 3.3.1 生成密钥对
      • 3.3.2 推送镜像至 Harbor
      • 3.3.3 为镜像签名
        • 3.3.3.1 系统添加Harbor的CA证书
        • 3.3.3.2 绕过Tls验证
    • 3.4 验证镜像签名
      • 3.4.1 登录Harbor查看镜像
      • 3.4.2 拉取镜像
      • 3.4.3 验证镜像签名
    • 3.5 Cosign实现离线镜像签名
      • 3.5.1 选择操作:离线存储签名和发布
        • 3.5.1.1 导出签名
        • 3.5.1.2 导入签名并验证
    • 3.6 Harbor 中配置签名策略
      • 3.6.1 尝试拉取未签名的镜像
    • 3.7 集成 Cosign 到 DevOps 流水线
  • 4 总结
  • 5 参考文献:

❤️ 摘要: 随着云原生技术的普及,容器镜像的安全性越来越受到重视。镜像验证是保护软件供应链的重要环节,它确保从镜像仓库拉取的镜像未被篡改,并且来源可信。Harbor 作为广泛使用的容器镜像仓库,通过与Cosign 集成,使镜像的签名与验证变得更加便捷和安全。本文将详细介绍如何使用 Cosign 对 Harbor 中的镜像进行签名和验证,确保容器镜像在整个 DevOps 流水线中的安全性。


💯 本文关联好文:

  • 《一文读懂Harbor以及部署实践攻略》
  • 《一文掌握Containerd配置Harbor私有仓库》
  • 《一文掌握Harbor的双向认证实践》
  • 《【云原生安全篇】Trivy助力离线Harbor漏洞扫描实践》
  • 《【云原生安全篇】一文掌握Harbor集成Trivy应用实践》

1 引言

随着云原生架构的广泛应用,镜像篡改、中间人攻击和镜像中毒等攻击变得越来越普遍,保护整个分发管道的安全至关重要,而未签名的容器镜像可能对系统构成威胁,因为它们可能在分发过程中被篡改或受到损害。通过在发布或分发期间自动验证真实性来应对这些攻击的系统可以帮助最大限度地降低安全风险。

目前镜像供应链的安全成为了 DevSecOps 实践中的关键环节, 在本篇文章中,我们将介绍 CosignHarbor 的结合使用,展示如何通过简单的步骤对镜像进行签名和验证,为企业的镜像管理流程提供有效的安全防护。

2 概念


2.1 什么是 Cosign?

Cosign 是由 Sigstore 项目推出的一个用于容器镜像签名和验证的开源工具。与传统的 GPG 等签名工具相比,Cosign 提供了更简洁的操作方式,并且支持无需依赖专门的密钥管理设施,通过“签名链”的方式为镜像签名,并允许验证这些签名的完整性,方便集成到现有的 DevOps 流水线中。

Cosign 的主要功能包括:

  • 支持多种签名密钥存储方式(如本地文件、KMS、PKI 等)。
  • 支持对容器镜像的多重签名。
  • 使用开源透明日志进行记录(Rekor)。
  • 不仅支持镜像签名,还可以签名其他OCI兼容的对象(如 Helm Charts、BOM 等)。
  • 支持使用公钥或 Keyless 模式验证签名,确保镜像未被篡改。
  • 支持多种签名格式和公钥存储选项,如 KMS(Key Management Services)、云密钥、GitHub Actions 等。

2.2 为什么选择 Cosign 和 Harbor?

CosignHarbor 结合使用具有以下优势:

  • 提升镜像安全性:Cosign 允许为每个镜像打上唯一的签名,确保拉取的镜像来源可追溯。
  • 增强自动化验证:Cosign 可以集成到 DevOps 流水线中,在镜像部署之前自动验证镜像的签名,确保未经授权的镜像无法进入生产环境。
  • 简单易用:相比传统的签名工具,Cosign 的操作简单,无需复杂的配置,且支持云端密钥服务,如 Google KMS、AWS KMS 等。
  • 支持OCI兼容的对象: 不仅支持镜像签名,还可以签名其他OCI兼容的对象(如 Helm Charts、BOM 等)。

3 实践: Cosign对Harbor中的镜像签名


3.1 环境准备

实验环境: Ubuntu22:04

在开始之前,需要准备以下环境:

  1. Harbor:安装并配置好的 Harbor 镜像仓库,版本:v2.10.3
  2. Docker:用于构建和推送容器镜像, 版本:27.1.2
  3. Cosign:安装 Cosign 工具,支持对镜像进行签名和验证。版本: v2.4.0

3.2 安装 Cosign

你可以通过以下命令快速安装 Cosign:

brew install cosign

或者通过 curl 命令下载并安装 Cosign:

curl -LO https://github.com/sigstore/cosign/releases/download/v2.4.0/cosign-linux-amd64
chmod +x cosign-linux-amd64
sudo mv cosign-linux-amd64 /usr/local/bin/cosign


3.3 使用 Cosign 对镜像进行签名

3.3.1 生成密钥对

首先,生成签名镜像所需的密钥对。Cosign 提供了生成密钥对的命令,运行以下命令来生成私钥和公钥:

cosign generate-key-pair

输入密钥密码,输出如下:

Enter password for private key:
Enter password for private key again:
Private key written to cosign.key
Public key written to cosign.pub

运行后,Cosign 会生成两个文件:cosign.key(私钥)和 cosign.pub(公钥)。你需要将私钥妥善保管,公钥则用于签名验证。

3.3.2 推送镜像至 Harbor

接下来,构建一个harbor.zx/hcie/curl:8.1.1镜像并将其推送到 Harbor 仓库中。以下是一个示例:

docker push harbor.zx/hcie/curl:8.1.1

3.3.3 为镜像签名

镜像推送至 Harbor 之后,可以使用 Cosign 对镜像进行签名:

cosign sign --key cosign.key harbor.zx/hcie/curl:8.1.1

此命令会读取生成的私钥,并对镜像进行签名。签名后的信息将被记录在镜像的元数据中。

在执行命令后,出现cosign签名过程无法通过harbor的tls证书校验:

root@jenkins:~/cosign# cosign sign --key cosign.key  harbor.zx/hcie/curl:8.1.1
Enter password for private key:
Error: signing [harbor.zx/hcie/harbor.zx/hcie/curl:8.1.1]: accessing image: Get "https://harbor.zx/v2/": tls: failed to verify certificate: x509: certificate signed by unknown authority
main.go:74: error during command execution: signing [harbor.zx/hcie/curl:8.1.1]: accessing image: Get "https://harbor.zx/v2/": tls: failed to verify certificate: x509: certificate signed by unknown authority


❔ 说明: 这是因为harbor镜像仓库是使用tls单向认证, 那么需要cosign验证时附带上harbor的ca证书。

解决的方式有两个:

3.3.3.1 系统添加Harbor的CA证书
  1. 因为Cosign 使用的是系统的 CA 证书信任库,因此你需要将 Harbor 的自签名证书也添加到系统的 CA 列表中。将harbor的ca.crt文件复制到系统的ca证书目录:
sudo cp /etc/docker/certs.d/harbor.zx/ca.crt /usr/local/share/ca-certificates/harbor.crt
  1. 更新和应用ca证书
sudo update-ca-certificates

输出如下:

Updating certificates in /etc/ssl/certs...
rehash: warning: skipping ca-certificates.crt,it does not contain exactly one certificate or CRL
1 added, 0 removed; done.
Running hooks in /etc/ca-certificates/update.d...
done.

再尝试cosign签名镜像

cosign sign --key cosign.key  harbor.zx/hcie/curl:8.1.1

#输入私钥加密密码
Enter password for private key:

        The sigstore service, hosted by sigstore a Series of LF Projects, LLC, is provided pursuant to the Hosted Project Tools Terms of Use, available at https://lfprojects.org/policies/hosted-project-tools-terms-of-use/.
        Note that if your submission includes personal data associated with this signed artifact, it will be part of an immutable record.
        This may include the email address associated with the account with which you authenticate your contractual Agreement.
        This information will be used for signing this artifact and will be stored in public transparency logs and cannot be removed later, and is subject to the Immutable Record notice at https://lfprojects.org/policies/hosted-project-tools-immutable-records/.

By typing 'y', you attest that (1) you are not submitting the personal data of any other person; and (2) you understand and agree to the statement and the Agreement terms at the URLs listed above.
Are you sure you would like to continue? [y/N] y
tlog entry created with index: 134950833
Pushing signature to: harbor.zx/hcie/curl

最后可以看到成功签名镜像。

3.3.3.2 绕过Tls验证

cosign也提供绕过tls证书验证的方式,但是不建议真实环境这么做,命令如下

cosign sign --key cosign.key --insecure-skip-verify=true  harbor.zx/hcie/curl:8.1.1

输出如下:

Enter password for private key:
WARNING: Image reference harbor.zx/hcie/curl:8.1.1 uses a tag, not a digest, to identify the image to sign.
    This can lead you to sign a different image than the intended one. Please use a
    digest (example.com/ubuntu@sha256:abc123...) rather than tag
    (example.com/ubuntu:latest) for the input to cosign. The ability to refer to
    images by tag will be removed in a future release.


        The sigstore service, hosted by sigstore a Series of LF Projects, LLC, is provided pursuant to the Hosted Project Tools Terms of Use, available at https://lfprojects.org/policies/hosted-project-tools-terms-of-use/.
        Note that if your submission includes personal data associated with this signed artifact, it will be part of an immutable record.
        This may include the email address associated with the account with which you authenticate your contractual Agreement.
        This information will be used for signing this artifact and will be stored in public transparency logs and cannot be removed later, and is subject to the Immutable Record notice at https://lfprojects.org/policies/hosted-project-tools-immutable-records/.

By typing 'y', you attest that (1) you are not submitting the personal data of any other person; and (2) you understand and agree to the statement and the Agreement terms at the URLs listed above.
Are you sure you would like to continue? [y/N] y
tlog entry created with index: 134954220
Pushing signature to: harbor.zx/hcie/curl

同样也能完成镜像签名。


3.4 验证镜像签名

完成签名后,你可以通过 Cosign 验证镜像签名的合法性。

3.4.1 登录Harbor查看镜像

登录到Harbor的管理页面,点击“项目”→选择“hcie”项目→选择“curl”镜像:

可以看到“已签名”已经打✅。

可以点击“①”看到cosign签名的附件:

点击“②”,可以复制摘要, 或者删除cosign签名的附件;

3.4.2 拉取镜像

首先,从 Harbor 仓库中拉取你签名的镜像:

docker pull harbor.zx/hcie/curl:8.1.1

3.4.3 验证镜像签名

使用以下命令验证镜像的签名是否有效:(验证镜像签名需要依赖网络环境:rekor.sigstore.dev)

cosign verify --key cosign.pub harbor.zx/hcie/curl:8.1.1

如果网络问题,可能出现:

Error: getting Rekor public keys: updating local metadata and targets: error updating to TUF remote mirror: tuf: failed to download 10.root.json: Get "https://tuf-repo-cdn.sigstore.dev/10.root.json": dial tcp: lookup tuf-repo-cdn.sigstore.dev on 127.0.0.53:53: server misbehaving
main.go:74: error during command execution: getting Rekor public keys: updating local metadata and targets: error updating to TUF remote mirror: tuf: failed to download 10.root.json: Get "https://tuf-repo-cdn.sigstore.dev/10.root.json": dial tcp: lookup tuf-repo-cdn.sigstore.dev on 127.0.0.53:53: server misbehaving

如果签名有效,Cosign 会输出相关的签名信息,确认镜像没有被篡改且来自可信来源。输出如下:

Verification for harbor.zx/hcie/curl:8.1.1 --
The following checks were performed on each of these signatures:
  - The cosign claims were validated
  - Existence of the claims in the transparency log was verified offline
  - The signatures were verified against the specified public key

[{"critical":{"identity":{"docker-reference":"harbor.zx/hcie/curl"},"image":{"docker-manifest-digest":"sha256:5df2709c7c473c8e63d645e36fc4fe12e6a732d8c60841aaa5e5a73acf8a12f3"},"type":"cosign container image signature"},"optional":{"Bundle":{"SignedEntryTimestamp":"MEYCIQDEwyZKwgly4Hh8xWch5lGXvA1Mw5GPa9OZIJ9SAwX+swIhALicbdUkOUJbIcJ9WoIkGrSHz4fYesoEvRDsb2Cl7aiZ","Payload":{"body":"eyJhcGlWZXJzaW9uIjoiMC4wLjEiLCJraW5kIjoiaGFzaGVkcmVrb3JkIiwic3BlYyI6eyJkYXRhIjp7Imhhc2giOnsiYWxnb3JpdGhtIjoic2hhMjU2IiwidmFsdWUiOiJjNjg4MjIzNTUzZDg3MTVkYWRlNmU4MDhlYWU4ZGQzNDFmMzIxODY2Y2Y0OTJiMTdlYTE3Y2QzZGEyM2E0YWE1In19LCJzaWduYXR1cmUiOnsiY29udGVudCI6Ik1FVUNJUURiZU5vWkNuUEJ4YU9GbXYvV0xYSjRTalFJdG1DME5MT1AzTjF4alExK3RnSWdkQTIzUmpTUjZ3NERXOC9oSFJYUzJnZmdqaVdTcDBLMFg0MFR5OFVtSzE0PSIsInB1YmxpY0tleSI6eyJjb250ZW50IjoiTFMwdExTMUNSVWRKVGlCUVZVSk1TVU1nUzBWWkxTMHRMUzBLVFVacmQwVjNXVWhMYjFwSmVtb3dRMEZSV1VsTGIxcEplbW93UkVGUlkwUlJaMEZGYWtsTWNrUlBSVTVSYVdaQllXazJWbTFEWWtOM01VRkVSRWd6T1FwTlRsaEZjbFZ5TURsS1QyRndiMlY0TmxoU0swOWhTazFtWlZkalJVSXhXRGgyYTNWUVltMDVRa2M0Ymt4dFYxVXdZWGwyZURGd2F5dFJQVDBLTFMwdExTMUZUa1FnVUZWQ1RFbERJRXRGV1MwdExTMHRDZz09In19fX0=","integratedTime":1727529906,"logIndex":134950833,"logID":"c0d23d6ad406973f9559f3ba2d1ca01f84147d8ffc5b8445c224f98b9591801d"}}}},{"critical":{"identity":{"docker-reference":"harbor.zx/hcie/curl"},"image":{"docker-manifest-digest":"sha256:5df2709c7c473c8e63d645e36fc4fe12e6a732d8c60841aaa5e5a73acf8a12f3"},"type":"cosign container image signature"},"optional":{"Bundle":{"SignedEntryTimestamp":"MEUCID3dvTzK2mNadn9zV86Qb3wB9E62xvlbgxfrBCC4zt04AiEAjXmg4URN5dS6YMHY5/zq43BcycP+j40RmJgxRdhaaNA=","Payload":{"body":"eyJhcGlWZXJzaW9uIjoiMC4wLjEiLCJraW5kIjoiaGFzaGVkcmVrb3JkIiwic3BlYyI6eyJkYXRhIjp7Imhhc2giOnsiYWxnb3JpdGhtIjoic2hhMjU2IiwidmFsdWUiOiJjNjg4MjIzNTUzZDg3MTVkYWRlNmU4MDhlYWU4ZGQzNDFmMzIxODY2Y2Y0OTJiMTdlYTE3Y2QzZGEyM2E0YWE1In19LCJzaWduYXR1cmUiOnsiY29udGVudCI6Ik1FVUNJSHNuVVV0RWZnczZEeWIxajB1UHNFdVdUbFJUanAyNDB3VE0rVDh5MnF0aEFpRUF1UFJUbGQzZXp6bFlHcVhEZUlRWkcyL0FSdE1qcFVncHBXSHM1Qm1qcFVBPSIsInB1YmxpY0tleSI6eyJjb250ZW50IjoiTFMwdExTMUNSVWRKVGlCUVZVSk1TVU1nUzBWWkxTMHRMUzBLVFVacmQwVjNXVWhMYjFwSmVtb3dRMEZSV1VsTGIxcEplbW93UkVGUlkwUlJaMEZGYWtsTWNrUlBSVTVSYVdaQllXazJWbTFEWWtOM01VRkVSRWd6T1FwTlRsaEZjbFZ5TURsS1QyRndiMlY0TmxoU0swOWhTazFtWlZkalJVSXhXRGgyYTNWUVltMDVRa2M0Ymt4dFYxVXdZWGwyZURGd2F5dFJQVDBLTFMwdExTMUZUa1FnVUZWQ1RFbERJRXRGV1MwdExTMHRDZz09In19fX0=","integratedTime":1727530670,"logIndex":134953908,"logID":"c0d23d6ad406973f9559f3ba2d1ca01f84147d8ffc5b8445c224f98b9591801d"}}}},{"critical":{"identity":{"docker-reference":"harbor.zx/hcie/curl"},"image":{"docker-manifest-digest":"sha256:5df2709c7c473c8e63d645e36fc4fe12e6a732d8c60841aaa5e5a73acf8a12f3"},"type":"cosign container image signature"},"optional":{"Bundle":{"SignedEntryTimestamp":"MEQCIDmu+O2Rb/39jG/WSkY31/ufr0wNLOBQohHRj1ZXmYxtAiAFhZ5D0XNuYNMXUAqWxgJAqFJgVhseHFfZgjugHa5OEQ==","Payload":{"body":"eyJhcGlWZXJzaW9uIjoiMC4wLjEiLCJraW5kIjoiaGFzaGVkcmVrb3JkIiwic3BlYyI6eyJkYXRhIjp7Imhhc2giOnsiYWxnb3JpdGhtIjoic2hhMjU2IiwidmFsdWUiOiJjNjg4MjIzNTUzZDg3MTVkYWRlNmU4MDhlYWU4ZGQzNDFmMzIxODY2Y2Y0OTJiMTdlYTE3Y2QzZGEyM2E0YWE1In19LCJzaWduYXR1cmUiOnsiY29udGVudCI6Ik1FWUNJUURHaWQwSzVVc1E2VXhNbWRpU3FreWgyT0t2WWoyRHZ2dWtXQURDVTdzZXJnSWhBUG4xQjkwdEh6MGJCSlZEc3VPZ1JOL0gxVVpjaDBOTnEwOFZueEdvK09pMiIsInB1YmxpY0tleSI6eyJjb250ZW50IjoiTFMwdExTMUNSVWRKVGlCUVZVSk1TVU1nUzBWWkxTMHRMUzBLVFVacmQwVjNXVWhMYjFwSmVtb3dRMEZSV1VsTGIxcEplbW93UkVGUlkwUlJaMEZGYWtsTWNrUlBSVTVSYVdaQllXazJWbTFEWWtOM01VRkVSRWd6T1FwTlRsaEZjbFZ5TURsS1QyRndiMlY0TmxoU0swOWhTazFtWlZkalJVSXhXRGgyYTNWUVltMDVRa2M0Ymt4dFYxVXdZWGwyZURGd2F5dFJQVDBLTFMwdExTMUZUa1FnVUZWQ1RFbERJRXRGV1MwdExTMHRDZz09In19fX0=","integratedTime":1727530978,"logIndex":134954220,"logID":"c0d23d6ad406973f9559f3ba2d1ca01f84147d8ffc5b8445c224f98b9591801d"}}}}]

3.5 Cosign实现离线镜像签名

目前Cosign更建议的是使用镜像摘要作为tag来识别镜像,如下:

harbor.zx/hcie/curl@sha256:5df2709c7c473c8e63d645e36fc4fe12e6a732d8c60841aaa5e5a73acf8a12f3

签名镜像,命令如下:

cosign sign --key cosign.key harbor.zx/hcie/curl@sha256:<digest>

验证镜像,命令如下:

cosign verify --key cosign.pub --payload curl.sig harbor.zx/hcie/curl@sha256:<digest>

输出如下:

Verification for harbor.zx/hcie/curl@sha256:5df2709c7c473c8e63d645e36fc4fe12e6a732d8c60841aaa5e5a73acf8a12f3 --
The following checks were performed on each of these signatures:
  - The cosign claims were validated
  - Existence of the claims in the transparency log was verified offline
  - The signatures were verified against the specified public key

[{"critical":{"identity":{"docker-reference":"harbor.zx/hcie/curl"},"image":{"docker-manifest-digest":"sha256:5df2709c7c473c8e63d645e36fc4fe12e6a732d8c60841aaa5e5a73acf8a12f3"},"type":"cosign container image signature"},"optional":{"Bundle":{"SignedEntryTimestamp":"MEYCIQD6prj50wo4K2jG7d543/8GiA8qKil98eztYB8oqn4RwAIhAKJ/KnKN/qvT12joC1Zok1WDTWn34+GBbHbB4U5Jd99s","Payload":{"body":"eyJhcGlWZXJzaW9uIjoiMC4wLjEiLCJraW5kIjoiaGFzaGVkcmVrb3JkIiwic3BlYyI6eyJkYXRhIjp7Imhhc2giOnsiYWxnb3JpdGhtIjoic2hhMjU2IiwidmFsdWUiOiJjNjg4MjIzNTUzZDg3MTVkYWRlNmU4MDhlYWU4ZGQzNDFmMzIxODY2Y2Y0OTJiMTdlYTE3Y2QzZGEyM2E0YWE1In19LCJzaWduYXR1cmUiOnsiY29udGVudCI6Ik1FVUNJUURMcHEzZk0yczlHK3VYNndLTklDdUhHU2dwc3pkYnJVVE1TN3EwQnRoVEFRSWdVbjM3Y1FXZ09FYlpzaWhKNkE0MnFXdWJHTW1jYjdxcE1lc3Y0azl1ZWRFPSIsInB1YmxpY0tleSI6eyJjb250ZW50IjoiTFMwdExTMUNSVWRKVGlCUVZVSk1TVU1nUzBWWkxTMHRMUzBLVFVacmQwVjNXVWhMYjFwSmVtb3dRMEZSV1VsTGIxcEplbW93UkVGUlkwUlJaMEZGYWtsTWNrUlBSVTVSYVdaQllXazJWbTFEWWtOM01VRkVSRWd6T1FwTlRsaEZjbFZ5TURsS1QyRndiMlY0TmxoU0swOWhTazFtWlZkalJVSXhXRGgyYTNWUVltMDVRa2M0Ymt4dFYxVXdZWGwyZURGd2F5dFJQVDBLTFMwdExTMUZUa1FnVUZWQ1RFbERJRXRGV1MwdExTMHRDZz09In19fX0=","integratedTime":1727533515,"logIndex":134956425,"logID":"c0d23d6ad406973f9559f3ba2d1ca01f84147d8ffc5b8445c224f98b9591801d"}}}},{"critical":{"identity":{"docker-reference":"harbor.zx/hcie/curl"},"image":{"docker-manifest-digest":"sha256:5df2709c7c473c8e63d645e36fc4fe12e6a732d8c60841aaa5e5a73acf8a12f3"},"type":"cosign container image signature"},"optional":{"Bundle":{"SignedEntryTimestamp":"MEUCIHhdCw5Y9nAh/Y5XGxGPxNJ1bZ7B1pvQpQiqgAOzpsIXAiEAuOXodDmzzbQ6R6BJuO/Xf0AEq1gAVQS/9v7dO0Uiqt0=","Payload":{"body":"eyJhcGlWZXJzaW9uIjoiMC4wLjEiLCJraW5kIjoiaGFzaGVkcmVrb3JkIiwic3BlYyI6eyJkYXRhIjp7Imhhc2giOnsiYWxnb3JpdGhtIjoic2hhMjU2IiwidmFsdWUiOiJjNjg4MjIzNTUzZDg3MTVkYWRlNmU4MDhlYWU4ZGQzNDFmMzIxODY2Y2Y0OTJiMTdlYTE3Y2QzZGEyM2E0YWE1In19LCJzaWduYXR1cmUiOnsiY29udGVudCI6Ik1FVUNJRnZKcXVDcmF3eTdUWXBiV1ZwQ2JVNHVaRm8zZkx5Y1NpOW5ham5Sb2JqaEFpRUEyUkdQTVoxNnRZS29sU3Q3c203R3MycGxobnJXbmJtaEF2YUpuWnl6RUVNPSIsInB1YmxpY0tleSI6eyJjb250ZW50IjoiTFMwdExTMUNSVWRKVGlCUVZVSk1TVU1nUzBWWkxTMHRMUzBLVFVacmQwVjNXVWhMYjFwSmVtb3dRMEZSV1VsTGIxcEplbW93UkVGUlkwUlJaMEZGYWtsTWNrUlBSVTVSYVdaQllXazJWbTFEWWtOM01VRkVSRWd6T1FwTlRsaEZjbFZ5TURsS1QyRndiMlY0TmxoU0swOWhTazFtWlZkalJVSXhXRGgyYTNWUVltMDVRa2M0Ymt4dFYxVXdZWGwyZURGd2F5dFJQVDBLTFMwdExTMUZUa1FnVUZWQ1RFbERJRXRGV1MwdExTMHRDZz09In19fX0=","integratedTime":1727533621,"logIndex":134956507,"logID":"c0d23d6ad406973f9559f3ba2d1ca01f84147d8ffc5b8445c224f98b9591801d"}}}}]

3.5.1 选择操作:离线存储签名和发布

Cosign 通常将签名信息附加到容器镜像的 OCI 元数据中,但你也可以选择导出签名并单独管理签名文件。例如,在某些环境中,你可能希望将签名与镜像分开存储,以便在不同时间或环境中进行分发。

3.5.1.1 导出签名

使用 --output-signature 参数可以将签名导出为文件:

cosign sign --key cosign.key --output-signature curl.sig harbor.zx/hcie/curl@sha256:<digest>

3.5.1.2 导入签名并验证

在另一台机器或环境中,你可以通过以下命令导入并验证签名:

cosign verify --key cosign.pub  --payload curl.sig harbor.zx/hcie/curl@sha256:<digest>


3.6 Harbor 中配置签名策略

在 Harbor 中可以配置策略(policy),要求镜像在部署或使用前必须通过签名验证,确保从可信的源获取容器镜像。Harbor 在V2.5版本中默认支持 Cosign 组件,允许配置策略来强制镜像签名的存在和验证。

在Harbor的管理页面,进入项目的配置管理。

在部署安全,勾选“Cosign”;

最后保存确认。

3.6.1 尝试拉取未签名的镜像

选择一个未签名的镜像,如Nginx:1.26.1

先删除本地镜像

root@jenkins:~/cosign# docker rmi harbor.zx/hcie/nginx:1.26.1
Untagged: harbor.zx/hcie/nginx:1.26.1
Untagged: harbor.zx/hcie/nginx@sha256:03bc8cca389b961e1f446706e83c1e565fd4426b0658a5478ad69aa737dc1570

重新拉取镜像

root@jenkins:~/cosign# docker pull !$
docker pull harbor.zx/hcie/nginx:1.26.1
Error response from daemon: unknown: The image is not signed by cosign.

可以看到策略生效,客户端无法拉取未签名的镜像,这可以从源头保证镜像的合规性。

3.7 集成 Cosign 到 DevOps 流水线

为了在企业的 CI/CD 流水线中实现自动化的镜像签名与验证,Cosign 可以轻松集成到 Jenkins、GitLab CI 等工具中。以下是一个简单的集成流程示例:

  1. 构建容器镜像:在 CI/CD 流程中构建容器镜像。
  2. 签名镜像:在推送镜像到 Harbor 之后,使用 Cosign 对镜像进行签名。
  3. 验证签名:在部署镜像到生产环境之前,自动化地验证镜像的签名,确保其来源可信。

💯 这种自动化流程可以大大提高镜像的安全性和可信性,确保只有经过签名验证的镜像才能被部署到生产环境中。后续也会出相关的文章进行说明。


4 总结

通过将 Cosign 与 Harbor 结合,企业可以构建一个安全的容器镜像签名和验证机制,有效防止镜像被篡改或使用不可信的镜像。希望通过本文的介绍,您能够更好地理解Cosign 如何通过提供更可靠的方法来确保容器映像的真实性和完整性,和如何在 Harbor 中使用 Cosign 进行镜像签名和验证,并将其应用到实际的开发和运维过程中,提升整体的镜像安全管理能力。


5 参考文献

[1]Cosign 官方文档

[2]Harbor 官方文档

[3]Sigstore 项目


本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2188073.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

用Sklearn和Statsmodels来做linear_regression和Logistic_regression注意事项

用Sklearn和Statsmodels来做linear_regression和Logistic_regression注意事项&#xff0c;区别。主要在于 intercept 项&#xff0c;和 regularization。 X np.array([-1, 0, 1]) # 自变量 Y np.array([-2, 0, 5]) # 因变量一、Linear regression 的截距项 又叫 intercep…

Web安全 - 构建全面的业务安全保护防御体系

文章目录 业务安全概述业务安全 vs. 基础安全业务安全的防护业务安全的防护策略1. 用户资源对抗的技术实现与优化2. IP资源对抗的技术实现与优化3. 设备资源对抗的技术实现与优化4. 操作资源对抗的技术实现与优化实际应用场景中的策略 典型场景业务场景 1&#xff1a;新用户注册…

Vue中使用ECharts实现热力图的详细教程

在数据可视化领域&#xff0c;热力图是一种非常直观的表现形式&#xff0c;它通过颜色深浅来展示数据分布情况。在Vue项目中&#xff0c;我们可以使用ECharts这一强大的图表库来实现热力图。下面我将详细介绍如何在Vue中使用ECharts实现热力图。效果如下图&#xff1a; 一、准备…

关于abaqus里一些问题的记录

在进行布种时&#xff0c;会遇到最大偏离因子和最小尺寸因子&#xff0c;在帮助文档里&#xff0c;是这么解释 要控制曲率对种子设定的影响&#xff0c;请为 Maximum deviation factor &#xff08;最大偏差因子&#xff09; 输入一个值。偏差因子是衡量单元边缘与原始几何图形…

爬虫prc技术----小红书爬取解决xs

知识星球&#xff1a;知识星球 | 深度连接铁杆粉丝&#xff0c;运营高品质社群&#xff0c;知识变现的工具知识星球是创作者连接铁杆粉丝&#xff0c;实现知识变现的工具。任何从事创作或艺术的人&#xff0c;例如艺术家、工匠、教师、学术研究、科普等&#xff0c;只要能获得一…

lambda表达式底层实现:反编译LambdaMetafactory + 转储dump + 运行过程 + 反汇编 + 动态指令invokedynamic

一、结论先行 lambda 底层实现机制 1.lambda 表达式的本质&#xff1a;函数式接口的匿名子类的匿名对象 2.lambda表达式是语法糖 语法糖&#xff1a;编码时是lambda简洁的表达式&#xff0c;在字节码期&#xff0c;语法糖会被转换为实际复杂的实现方式&#xff0c;含义不变&am…

低空无人机飞手四类超视距无人机技术详解

低空无人机飞手中的四类超视距无人机技术详解&#xff0c;主要涉及无人机的性能特点、技术要求、培训内容以及应用场景等方面。以下是对这些方面的详细阐述&#xff1a; 一、四类无人机&#xff08;中型无人机&#xff09;性能特点 四类无人机&#xff0c;现已更名为中型无人…

OpenCAEPoro优化(2)

前言&#xff1a; 首先有一点要注意&#xff1a; 修改代码时&#xff0c;要注意命名空间的冲突问题&#xff08;主要是头文件中&#xff09; 作者了解了相关这个项目的一些背景介绍&#xff1b;得到的主要信息是&#xff1a;这种大型程序一般都是优化的比较完善了&#xff0…

【Vue3实战】:用导航守卫拦截未保存的编辑,提升用户体验

前言 在Vue3应用中&#xff0c;用户可能会在一个页面上进行数据编辑&#xff0c;如填写表单或修改表格中的数据。当用户在未保存更改的情况下尝试离开当前页面时&#xff0c;我们希望能够弹出提示框&#xff0c;告知用户有未保存的更改&#xff0c;并询问是否确定离开。 一、使…

【案例】平面云

教程案例视频&#xff1a;Unity Shader Graph - 云教程 开发平台&#xff1a;Unity 2022 开发工具&#xff1a;Unity ShaderGraph   一、效果展示 二、ShaderGraph 路线图 三、案例分析 核心思路&#xff1a;使用 Noise&#xff08;噪声&#xff09;模拟云层状态   3.1 说明…

打造高效灵活的数字企业——The Open Group 2024生态系统架构·可持续发展年度大会重磅来袭

随着数字经济的高速发展&#xff0c;企业数字化转型已成为时代的必然趋势。如何在这场变革中抢占先机&#xff0c;实现业务增长与降本增效&#xff0c;成为众多企业关注的焦点。为此&#xff0c;The Open Group 2024生态系统架构可持续发展年度大会将于明年盛大开启&#xff0c…

Studying-多线程学习Part1-线程库的基本使用、线程函数中的数据未定义错误、互斥量解决多线程数据共享问题

来源&#xff1a;多线程编程 线程库的基本使用 两个概念&#xff1a; 进程是运行中的程序线程是进程中的进程 串行运行&#xff1a;一次只能取得一个任务并执行这一个任务 并行运行&#xff1a;可以同时通过多进程/多线程的方式取得多个任务&#xff0c;并以多进程或多线程…

Leetcode: 0011-0020题速览

Leetcode: 0011-0020题速览 本文材料来自于LeetCode solutions in any programming language | 多种编程语言实现 LeetCode、《剑指 Offer&#xff08;第 2 版&#xff09;》、《程序员面试金典&#xff08;第 6 版&#xff09;》题解 遵从开源协议为知识共享 版权归属-相同方式…

Java在用增强for循环遍历集合时删除元素,抛出java.util.ConcurrentModificationException异常

文章目录 0. 前言1. 问题产生的背景2. Java中增强for循环的底层原理3. 为什么增强for循环不支持在遍历集合时删除元素3.1 问题排查3.2 modCount 变量的来源3.3 expectedModCount 变量的来源3.4 导致modCount变量和expectedModCount不相等的原因3.5 为什么用迭代器遍历元素时删除…

学籍管理平台|在线学籍管理平台系统|基于Springboot+VUE的在线学籍管理平台系统设计与实现(源码+数据库+文档)

在线学籍管理平台系统 目录 基于SpringbootVUE的在线学籍管理平台系统设计与实现 一、前言 二、系统功能设计 三、系统实现 四、数据库设计 1、实体ER图 五、核心代码 六、论文参考 七、最新计算机毕设选题推荐 八、源码获取&#xff1a; 博主介绍&#xff1a;✌️大…

Leetcode: 0021-0030题速览

Leetcode: 0021-0030题速览 本文材料来自于LeetCode solutions in any programming language | 多种编程语言实现 LeetCode、《剑指 Offer&#xff08;第 2 版&#xff09;》、《程序员面试金典&#xff08;第 6 版&#xff09;》题解 遵从开源协议为知识共享 版权归属-相同方式…

如此的“宠物医保”靠谱吗?

今天是世界动物日&#xff0c;本“人民体验官”推广人民日报官方微博文化产品《带着笑意的眼睛&#xff0c;能看见最美的风景》。 截图&#xff1a;来源“人民体验官”推广平台 人民微博说&#xff0c;带着笑意的眼睛&#xff0c;能看见最美的风景。生活中多一点微笑&#xff…

buuctf 部分misc题

rar 这个不多说了直接暴力破解&#xff0c;提示说的已经很清楚了&#xff0c;四位数密码&#xff1b; qr 这个就是一个二维码&#xff0c;用qr扫一下就出来了&#xff1b; 镜子里面的世界 用stegslove&#xff0c;打开dataextract进行调整 调整之后就可以得到flag了 ning…

ipv6之ospf配置

topo图 路由器均使用ipv6的地址 AR1使用默认路由到达ISP&#xff0c;在ospf上使用路由下发功能&#xff0c;把ISP的静态路由下发给内部网络 ISP使用7条静态路由&#xff0c;到达内部网络 AR1、AR2、AR3、AR4之间使用ospfv3进行通信 但是我配了下面的代码无法通信&#xff0…

driver,sequencer,sequence之间的握手关系_2024年10月3日

driver &#xff1a;根据接口协议将事务转换为一组信号级切换的组件。 sequencer &#xff1a;将事务&#xff08;sequence items&#xff09;从 sequence 发送到 driver&#xff0c;并将 driver 的响应反馈给 sequence 的组件。会对同时尝试访问 driver 以激励设计接口的多个 …