Harbor系列之11:制品签名

news2024/11/27 15:50:28

借助Cosign或Notaion对制品进行签名

制品签名和签名验证是关键的安全功能,它们允许你验证制品的完整性。Harbor 通过与 Cosign 或 Notation 的集成来支持内容信任。

项目管理员可以配置项目以强制执行内容信任,要求所有制品在从 Harbor 注册表中拉取之前必须进行签名。

project-sign-settings

1. 使用Cosign对制品进行签名

Harbor v2.5 集成了对 Cosign 的支持,Cosign 是 Sigstore 项目的一部分,提供了 OCI 制品的签名和验证解决方案。

Cosign 对 OCI 制品进行签名,并将生成的签名推送到 Harbor。该签名作为制品的附件存储在 Harbor 中,与签名的制品一起管理。Harbor 管理着签名制品与 Cosign 签名之间的链接,因此你可以对签名的制品应用标签保留规则和不可变规则,这些规则将同时扩展到签名制品和签名上。通过这种方式,你可以使用 Harbor 内置的功能来管理签名制品和 Cosign 签名附件。需要注意的是,Harbor 不支持对 Cosign 签名的漏洞扫描。

使用 Cosign 与 Harbor 集成的一个关键功能是能够使用 Harbor 的复制功能,将签名与其关联的签名制品一起复制。这意味着如果复制规则适用于某个签名制品,Harbor 将以同样的方式将复制规则应用于该签名制品的签名。

  • 在 Harbor 实例之间进行复制时,目标 Harbor 实例将保持签名制品及其关联签名之间的链接。你可以在目标 Harbor 界面中看到这两个制品之间的关系,就像在源注册表中一样。

  • 从 Harbor 复制到另一种目标注册表类型时,目标注册表将不会管理签名制品与其关联签名之间的链接。你将在同一存储库下看到主题清单和签名作为协调制品。

注意:只有“手动”和“定时”复制触发模式适用。目前无法进行基于事件的复制,因为存在先决条件的问题:你无法复制未签名的镜像,但你也无法在没有镜像的情况下复制签名。

1.1 安装cosign

1. 安装 Cosign

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

  • 如果你使用的是 macOS 或 Linux:
curl -sSL https://github.com/sigstore/cosign/releases/latest/download/cosign-linux-amd64 -o /usr/local/bin/cosign
chmod +x /usr/local/bin/cosign

# 验证安装
[root@e2etest ~]# cosign version
  ______   ______        _______. __    _______ .__   __.
 /      | /  __  \      /       ||  |  /  _____||  \ |  |
|  ,----'|  |  |  |    |   (----`|  | |  |  __  |   \|  |
|  |     |  |  |  |     \   \    |  | |  | |_ | |  . `  |
|  `----.|  `--'  | .----)   |   |  | |  |__| | |  |\   |
 \______| \______/  |_______/    |__|  \______| |__| \__|
cosign: A tool for Container Signing, Verification and Storage in an OCI registry.

GitVersion:    v2.3.0
GitCommit:     deed3631520ddeb6cc7d81ace205a97342c8daab
GitTreeState:  clean
BuildDate:     2024-07-22T17:19:10Z
GoVersion:     go1.22.5
Compiler:      gc
Platform:      linux/amd64
  • 如果你使用的是 Windows:

你可以从 GitHub Releases 页面下载相应的可执行文件并将其添加到 PATH。

2. 生成密钥对

Cosign 使用密钥对进行签名和验证。你可以通过以下命令生成一对密钥:

cosign generate-key-pair

生成的 cosign.key 是私钥,cosign.pub 是公钥。确保安全存储这些密钥,特别是私钥。

1.2 签名、上传和查看 Cosign 签名

1. 对镜像进行签名

使用 cosign sign 命令对镜像进行签名,并将 Cosign 签名上传到你的 Harbor 实例中。

在以下示例中,将 /<image/path>: 替换为你的 Harbor 实例和镜像的路径。

cosign sign --key cosign.key <harbor-instance>/<image/path>:<image-tag>

在输入你的 cosign 私钥密码后,cosign 会对镜像进行签名,并将生成的签名上传到你的 Harbor 实例中。你可以在 Harbor 界面中查看签名制品的所有签名。

示例如下:

[root@e2etest cosign]# cosign sign --key cosign.key 10.210.10.210/db/mysql@sha256:4b6c4935195233bc10b617df3cc725a9ddd5a7f10351a7bf573bea0b5ded7649
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: 118772948
Pushing signature to: 10.210.10.210/db/mysql
2. 验证签名

在拉取或使用镜像之前,可以验证签名以确保镜像的完整性和来源:

cosign verify --key cosign.pub <harbor-instance>/<image/path>:<image-tag>

如果签名有效,Cosign 将输出验证结果。

3. 在harbor上查看制品签名

cosign对镜像进行签名后,签名同时被推送到harbor仓库。此时harbor-项目-镜像仓库中,artifacts的状态会变成已签名:

artifact-signed
签名作为制品的附件存在。

所有与签名制品关联的签名将在签名制品被删除时一起删除。

需要注意的是,Harbor 的垃圾回收不会单独删除任何签名。在 Harbor 中,Cosign 签名被视为与其他 OCI 制品相同的对待方式,但从垃圾回收器的角度来看,它无法看到附件制品,比如 Cosign 签名。例如,如果你配置了对未打标签的制品进行垃圾回收,Harbor 的垃圾回收器不会删除任何没有标签的签名。如果签名制品没有标签,并且符合配置的垃圾回收规则,它和任何关联的签名将会被删除。

Harbor 不支持使用 cosign clean 来删除签名,因为 Harbor 选择不实现 cosign clean 所使用的标签删除功能。有关实现要求的更多信息,请参阅 OCI 分发规范。

2. 使用Notation对制品进行签名(分发规范 v1.1 模式)

Notation 是一个基于标准的工具和库,用于签名和验证 OCI 制品。它生成签名并将其与 OCI 制品关联,以确保供应链的完整性。

2.1 安装Notation命令行

安装最新版本的notation命令行,参考官方指导:https://notaryproject.dev/docs/user-guides/installation/cli/

二进制下载链接:https://github.com/notaryproject/notation/releases,下面以x86平台下linux系统安装为例:

# 设置notation版本
export NOTATION_VERSION=1.1.1

# 下载二进制文件
https://github.com/notaryproject/notation/releases/download/v1.1.1/notation_1.1.1_linux_amd64.tar.gz
curl -LO https://github.com/notaryproject/notation/releases/download/v$NOTATION_VERSION/notation_$NOTATION_VERSION\_linux_amd64.tar.gz
curl -LO https://github.com/notaryproject/notation/releases/download/v$NOTATION_VERSION/notation_$NOTATION_VERSION\_checksums.txt
shasum --check notation_$NOTATION_VERSION\_checksums.txt

# 解压文件
tar xvzf <ARCHIVE_FILE> -C /usr/bin/ notation

# 验证安装
[root@e2etest ~]# notation version
Notation - a tool to sign and verify artifacts.

Version:     1.1.1
Go version:  go1.22.4
Git commit:  3dafd534fe069f2c0ce6127eb33d2e3e476723c3

2.2 生成测试密钥和自签名证书

使用 notation cert generate-test 命令生成用于签名制品的测试 RSA 密钥,以及用于验证制品的自签名 X.509 测试证书。请注意,自签名证书应仅用于测试或开发目的。在生产环境中,你应使用 CA 签发的证书。

notation cert generate-test --default "wabbit-networks.io"

key和证书生成到如下路径:

[root@e2etest notation]# notation cert generate-test --default "test.com"
generating RSA Key with 2048 bits
generated certificate expiring on 2024-08-06T17:02:32Z
wrote key: /root/.config/notation/localkeys/test.com.key
wrote certificate: /root/.config/notation/localkeys/test.com.crt
Successfully added test.com.crt to named store test.com of type ca
test.com: added to the key list
test.com: mark as default signing key

2.3 Harbor 注册表认证

要与 Harbor 注册表进行认证,请设置以下环境变量:

export NOTATION_USERNAME="YOUR_REGISTRY_USERNAME"
export NOTATION_PASSWORD="YOUR_REGISTRY_PASSWORD"
export NOTATION_USERNAME="admin"
export NOTATION_PASSWORD="Harbor12345"

2.4 签名 Harbor 中的现有镜像

假设你已配置 HTTPS 访问并将镜像推送到 Harbor,你可以使用 notation sign 命令对镜像进行签名。

notation sign <harbor-domain>/<image-reference>

默认情况下notaion只支持https类型的harbor仓库制品签名,如果是http类型的harbor,需要添加--insecure-registry

[root@e2etest notation]# notation sign 10.210.10.210/language/python:alpine3.20 --insecure-registry
Warning: Always sign the artifact using digest(@sha256:...) rather than a tag(:alpine3.20) because tags are mutable and a tag reference can point to a different artifact than the one signed.
Successfully signed 10.210.10.210/language/python@sha256:f3f9127f09f687456f484145165fe745834ba222e1ac43cca14fcfda0e88c174

一旦镜像成功签名,签名状态将更新为绿色勾选标记,并且相应的签名已被推送到注册表。

2.5 创建信任策略以验证镜像

要验证容器镜像,请配置信任策略以指定签署制品的受信任身份和使用的签名验证级别。有关详细信息,请参阅信任策略规范。

创建一个包含以下信任策略的 JSON 文件,例如:

cat <<EOF > ./trustpolicy.json
{
    "version": "1.0",
    "trustPolicies": [
        {
            "name": "wabbit-networks-images",
            "registryScopes": [ "*" ],
            "signatureVerification": {
                "level" : "strict"
            },
            "trustStores": [ "ca:test.com" ],
            "trustedIdentities": [
                "*"
            ]
        }
    ]
}
EOF

使用notation policy import导入上面JSON文件创建的信任策略配置,例如:

notation policy import ./trustpolicy.json

2.6 验证镜像

使用 notation verify 验证与容器镜像关联的签名。

notation verify <harbor-domain>/<image-reference>

你还可以检查签名摘要,并检查签名及其证书信息,以确保镜像是由受信任的身份生成的。

notation inspect $IMAGE

有关更多信息,请参阅 Notation 文档。
镜像

使用 notation verify 验证与容器镜像关联的签名。

notation verify <harbor-domain>/<image-reference>

你还可以检查签名摘要,并检查签名及其证书信息,以确保镜像是由受信任的身份生成的。

notation inspect $IMAGE

有关更多信息,请参阅 Notation 文档。

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

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

相关文章

Vue3 中如何使用 Monaco

本文将介绍如何在 Vue3 使用 Monaco。 创建 vue3 项目 通过以下命令创建项目&#xff0c;根据提示一步一步创建即可。 npm create vuelatest除了 Typescript 其他全默认即可。 安装项目依赖 Monaco 开源项目很多&#xff0c;这个项目更新很活跃&#xff0c;用法和 react …

一、安装go环境以及编译输出HelloWorld

目前的热门技术方向从分布式微服务开始转向云原生而云原生方向需要掌握GO语言&#xff0c;基于此决定利用平时的时间来完成GO语言的学习。 安装&#xff08;基于mac m1&#xff09; &#xff08;翻看了网上很多的资料&#xff0c;发现很多人记录的有很多问题&#xff0c;一个…

SuccBI+低代码文档中心 — 低代码应用(SuperPage)(上)(重点)

SuperPage介绍 SuperPage是SuccAP提供的一种可视化设计制作任意的、业务化的和个性化的页面或对话框的功能。 使用SuperPage制作个性化页面或对话框相比于传统编码方式具有如下优势&#xff1a; 低成本、高效率零编码、易维护可扩展、高复用美观易用、不损失业务体验 新建Su…

PMP新考纲下,考前冲刺指南

01新考纲变化 【1】题型变化 旧考纲&#xff1a;考试题目为200道单选题&#xff0c;敏捷题型占比不足10% 新考纲&#xff1a;考试题目为180道题&#xff1b;题型将包括单选题和多选题&#xff0c;多选题将说明需选择几个正确选项&#xff1b;敏捷项目管理比重增加。 【2】内…

免费【2024】springboot 分类信息服务平台移动端的设计与实现

博主介绍&#xff1a;✌CSDN新星计划导师、Java领域优质创作者、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和学生毕业项目实战,高校老师/讲师/同行前辈交流✌ 技术范围&#xff1a;SpringBoot、Vue、SSM、HTML、Jsp、PHP、Nodejs、Python、爬虫、数据可视化…

Ubuntu 24.04服务器或桌面上安装Notepad++

Notepad 默认仅适用于 Windows&#xff0c;但我们可以使用 Wine 或 Snap 在 Ubuntu 24.04 Noble 上安装它&#xff0c;在本教程中&#xff0c;我们讨论了在 Ubuntu Linux 上安装 NotePad plus-plus 的过程。 任何编写代码的人都已经知道这个应用程序。它提供语法突出显示等功能…

如何判断IP地址属于住宅IP还是机房IP

在数字化时代,IP地址作为互联网通信的基础标识&#xff0c;扮演着重要的角色。无论是网络管理、数据分析还是安全监控&#xff0c;正确识别IP地址的类型——尤其是区分是住宅IP还是机房IP&#xff0c;对于确保网络安全、优化网络性能以及合法合规运营具有重要意义。IPIDEA代理I…

【从零开始一步步学习VSOA开发】同步RPC客户端

同步RPC客户端 概念 前面的测试例程都是以异步 RPC 的模式运行的&#xff0c;客户端调用 RPC 请求后无需等待服务端应答即可返回&#xff0c;后面通过回回调方式获取返回结果。 同步 RPC 即客户端在发送完毕请求后&#xff0c;函数进入阻塞模式一直等待&#xff0c;直到接受到…

Ubuntu22.04安装Docker教程

简介 ​ Docker 是一个开源的平台&#xff0c;旨在简化应用开发、交付和运行的过程。通过使用容器技术&#xff0c;Docker 能够让开发人员将应用及其依赖环境一同打包&#xff0c;从而实现快速部署、一致的开发环境和优秀的可移植性。 系统版本 ​ 本文以Ubuntu 22.04.4 LTS…

显示图像的RGB三通道图像

引 言 视觉任务处理的图片常用类型有RGB图、grayscale灰度图、binary二值图、PNG图等图像形式。图像打开和格式转换需要使用PIL库。本文主要讲解PIL库图像格式转换以及如何提取RGB每个通道的图片。 文章目录 一、图像格式转换1.1 RGB格式图像1.2 grayscale灰度图1.3 二值图像1.…

新租赁准则下使用权资产和租赁负债会计处理(案例:无免租期、除租金外无其他支出)

文章目录 一、概述二、使用权资产和租赁负债相关会计处理 一、概述 2018年底财政部会计准则委员会发布了修订后的《企业会计准则第21号——租赁》&#xff0c;财政部规定&#xff1a; 在境内外同时上市的企业以及在境外上市并采用国际财务报告准则或企业会计准则编制财务报表的…

通过数组中元素或者key将数组拆分归类成新的二维数组

处理前的数组: 处理后的数组: 你希望根据 riqi 字段将这个数组拆分成多个二维数组,每个二维数组包含相同日期的项。在ThinkPHP中,你可以使用PHP的数组操作来实现这一拆分操作。以下是如何按照 riqi 字段拆分成新的二维数组的示例代码: $splitArrays = [];foreach ($list…

《网络安全自学教程》- MySQL文件权限的安全问题和解决方案

《网络安全自学教程》 在实际生产环境中,应按照软件安全设计的「最小特权原则」设置MySQL的文件权限。 MySQL文件权限 1、数据库配置文件2、数据存储文件3、历史操作文件MySQL「安装目录」的属主和属组需要设置成mysql用户;MySQL的「历史操作文件」、「历史命令文件」、「数据…

JVM的面试考点

JVM内存划分 1.堆,整个内存区域中,内存最大的区域,放的都是new出来的对象,new类名这一部分存放在堆中, 而这个scanner是一个临时变量,这个scanner的地址存放在栈上,scanner里面存放的值是new类名这个对象的首地址 2.栈,分为JVM虚拟机栈(Java代码),和本地方法栈(C),这个栈包含了…

Python爬虫入门实战(详细步骤)

1. 技术选型 爬虫这个功能&#xff0c;我个人理解是什么语言都能写的&#xff0c;只要能正常发送 HTTP 请求&#xff0c;将响应回来的静态页面模版 HTML 上把我们所需要的数据提取出来就可以了&#xff0c;原理很简单&#xff0c;这个东西当然可以手动去统计收集&#xff0c;但…

Spring的监听机制详解

Spring的监听机制详解 讲在前面 对Spring框架&#xff0c;大家都已不陌生&#xff0c;它给我们提供了很多功能&#xff0c;包括IoC、AOP、事务管理等。其中&#xff0c;Spring的事件监听机制是一项非常重要的功能&#xff0c;它允许开发人员定义和处理自定义事件&#xff0c;并…

深入研究scRNA-seq基础模型

基础模型在大量未标记的数据集上进行预训练&#xff0c;然后在特定任务上进行微调&#xff0c;最近基础模型在生物学应用中取得了成功。该文探讨了最近的scRNA-seq基础模型&#xff0c;scBERT和scGPT。专注于细胞类型注释的微调任务&#xff0c;主要探索了与简单基线&#xff0…

OpenCV教程04:结合pillow在图片上显示中文文字

1.如果添加的内容是纯英文文字&#xff0c;直接使用cv2.putText 函数操作即可。但它不支持自定义字体文件&#xff0c;仅限于这些内置的字体样式。如果你需要更复杂的字体支持&#xff0c;可能需要使用其他库&#xff0c;如 Python Imaging Library (PIL) 或 Pillow。可用的字体…

判断用户是否在pwa环境中打开运行?(已安装的 PWA 与未安装的 PWA 网站之间有什么区别?)以及pwa安装成功/失败的回调

前言&#xff1a; &#x1f449;vue3tsvite项目中使用vite-plugin-pwa搭建 PWA 项目&#xff0c;以及如何处理pwa安装图标的显示隐藏 &#x1f449;pwa在iframe下能否显示&#xff0c;以及在iframe下相关问题解析 如何判断用户是否在pwa环境中运行? 根据pwa配置的display-mo…

下载qwen2-72b报错

下载大模型或者是国外的大文件&#xff0c;最好配置git的代理&#xff0c;报错如下&#xff1a;https://modelscope.cn/models/qwen/Qwen2-72B 增加以下配置解决 git config --global http.sslVerify “false” git config --global advice.detachedHead false