Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 2 additions & 0 deletions .github/workflows/release-rpm.yml
Original file line number Diff line number Diff line change
Expand Up @@ -47,7 +47,7 @@

- name: Extract version info and export rpm_name
id: extract-version
run: |

Check warning on line 50 in .github/workflows/release-rpm.yml

View workflow job for this annotation

GitHub Actions / Workflow Files

[actionlint] reported by reviewdog 🐶 shellcheck reported issue in this script: SC2086:info:6:60: Double quote to prevent globbing and word splitting [shellcheck] Raw Output: i:.github/workflows/release-rpm.yml:50:9: shellcheck reported issue in this script: SC2086:info:6:60: Double quote to prevent globbing and word splitting [shellcheck]

Check warning on line 50 in .github/workflows/release-rpm.yml

View workflow job for this annotation

GitHub Actions / Workflow Files

[actionlint] reported by reviewdog 🐶 shellcheck reported issue in this script: SC2086:info:5:58: Double quote to prevent globbing and word splitting [shellcheck] Raw Output: i:.github/workflows/release-rpm.yml:50:9: shellcheck reported issue in this script: SC2086:info:5:58: Double quote to prevent globbing and word splitting [shellcheck]
VERSION=$(grep -m1 '^Version:' rpm/trustee.spec | awk '{print $2}')
RELEASE=$(grep -m1 '^%define alinux_release' rpm/trustee.spec | awk '{print $3}')
echo "VERSION=$VERSION"
Expand Down Expand Up @@ -88,7 +88,7 @@
path: ./

- name: Create buildspec from template
run: |

Check warning on line 91 in .github/workflows/release-rpm.yml

View workflow job for this annotation

GitHub Actions / Workflow Files

[actionlint] reported by reviewdog 🐶 shellcheck reported issue in this script: SC2086:info:20:25: Double quote to prevent globbing and word splitting [shellcheck] Raw Output: i:.github/workflows/release-rpm.yml:91:9: shellcheck reported issue in this script: SC2086:info:20:25: Double quote to prevent globbing and word splitting [shellcheck]

Check warning on line 91 in .github/workflows/release-rpm.yml

View workflow job for this annotation

GitHub Actions / Workflow Files

[actionlint] reported by reviewdog 🐶 shellcheck reported issue in this script: SC2086:info:20:14: Double quote to prevent globbing and word splitting [shellcheck] Raw Output: i:.github/workflows/release-rpm.yml:91:9: shellcheck reported issue in this script: SC2086:info:20:14: Double quote to prevent globbing and word splitting [shellcheck]

Check warning on line 91 in .github/workflows/release-rpm.yml

View workflow job for this annotation

GitHub Actions / Workflow Files

[actionlint] reported by reviewdog 🐶 shellcheck reported issue in this script: SC2086:info:13:26: Double quote to prevent globbing and word splitting [shellcheck] Raw Output: i:.github/workflows/release-rpm.yml:91:9: shellcheck reported issue in this script: SC2086:info:13:26: Double quote to prevent globbing and word splitting [shellcheck]

Check warning on line 91 in .github/workflows/release-rpm.yml

View workflow job for this annotation

GitHub Actions / Workflow Files

[actionlint] reported by reviewdog 🐶 shellcheck reported issue in this script: SC2086:info:13:15: Double quote to prevent globbing and word splitting [shellcheck] Raw Output: i:.github/workflows/release-rpm.yml:91:9: shellcheck reported issue in this script: SC2086:info:13:15: Double quote to prevent globbing and word splitting [shellcheck]

Check warning on line 91 in .github/workflows/release-rpm.yml

View workflow job for this annotation

GitHub Actions / Workflow Files

[actionlint] reported by reviewdog 🐶 shellcheck reported issue in this script: SC2016:info:11:10: Expressions don't expand in single quotes, use double quotes for that [shellcheck] Raw Output: i:.github/workflows/release-rpm.yml:91:9: shellcheck reported issue in this script: SC2016:info:11:10: Expressions don't expand in single quotes, use double quotes for that [shellcheck]
GITHUB_RELEASE="${{ env.TAG_NAME }}"
VERSION=$(grep -m1 '^Version:' rpm/trustee.spec | awk '{print $2}')
RELEASE=$(grep -m1 '^%define alinux_release' rpm/trustee.spec | awk '{print $3}')
Expand Down Expand Up @@ -153,11 +153,13 @@
contents: write
id-token: write
uses: 1570005763/GuanFu/.github/workflows/release.yml@v1
secrets: inherit
with:
input_artifact: build-input-${{ matrix.os_flavor.id }}
output_artifact: build-output-${{ matrix.os_flavor.id }}
release_slsa_provenance: true
provenance_name: "${{ matrix.os_flavor.id == 'alinux3' && needs.create-build-artifacts.outputs.rpm_name_al8 || needs.create-build-artifacts.outputs.rpm_name_an23 }}.intoto.jsonl"
rv_release_manifest_name: "${{ matrix.os_flavor.id == 'alinux3' && needs.create-build-artifacts.outputs.rpm_name_al8 || needs.create-build-artifacts.outputs.rpm_name_an23 }}.rv-release-manifest.bundle.json"
rpm_detail_provenance: true
upload_provenance_to_rekor: true
release_tag_name: ${{ github.event.release.tag_name || inputs.tag_name }}
Expand Down
30 changes: 16 additions & 14 deletions docs/challenge_ra.md
Original file line number Diff line number Diff line change
Expand Up @@ -43,11 +43,21 @@ attestation-challenge-client set-reference-value --provenance-type <slsa|sample>
attestation-challenge-client set-reference-value-list --rv-list <rv-list.json>
```

### SLSA 模式 (rekor透明日志)
### RV release manifest 模式(推荐)

```bash
attestation-challenge-client set-reference-value-list --rv-list /path/to/rv-list.json
```

- 逻辑:读取 JSON 文件(顶层字段 `rv_list`,格式与 Gateway/KBS 的 `POST .../set_reference_value_list` 请求体一致),调用内置 RVPS 的 `set_reference_value_list`:从 `provenance_source` 获取 release manifest bundle,解析 `measurements` 并校验 bundle 内 Rekor entry 的 payload hash 后写入参考值。
- `provenance_info.type` 使用 `rv-release-manifest`。每项的 `id` 是要导入的 measurement 名称,可完全自定义,只要与 release manifest `measurements` 中的键一致。
- 每项可选 `rv_name`:若指定则作为 RVPS 中的参考值名称;省略时新格式默认使用 `id`。

### SLSA 模式(历史兼容)

#### 方式一(经典模式)

这种方式只支持rekor v1
这种方式只支持 Rekor v1,不再作为新设计推荐路径。

```bash
attestation-challenge-client set-reference-value \
Expand All @@ -56,19 +66,11 @@ attestation-challenge-client set-reference-value \
--artifact-name <artifact_name> \
[--rekor-url https://rekor.sigstore.dev]
```
- 逻辑:对 `artifact-name` 做 sha256 作为索引,访问rekor透明日志查询相应条目,过滤并提取 SLSA provenance (包含度量参考值),组装为 RVPS 能识别的 message 后注册。
- `--rekor-url` 可选,默认 `https://rekor.sigstore.dev`。

#### 方式二(批量模式)

这种方式能够支持rekor v2

```bash
attestation-challenge-client set-reference-value-list --rv-list /path/to/rv-list.json
```
- 逻辑:对 `artifact-name` 做 sha256 作为索引,访问 Rekor 透明日志查询相应条目,过滤并提取 SLSA provenance,组装为 RVPS 能识别的 message 后注册。

#### 方式二(批量兼容模式)

- 逻辑:读取 JSON 文件(顶层字段 `rv_list`,格式与 Gateway/KBS 的 `POST .../set_reference_value_list` 请求体一致),调用内置 RVPS 的 `set_reference_value_list`:按每项的 `id`+`version` 及其 `provenance_info.rekor_url` 从 Rekor 拉取 SLSA,解析 digest 后写入参考值。
- 每项可选 `rv_name`:若指定则作为 RVPS 中的参考值名称;省略时默认 `measurement.<type>.<id>`(与网关 API 行为一致)。
当 `provenance_info.type` 仍为 `slsa-intoto-statements` 时,`set-reference-value-list` 会沿用历史 SLSA 解析逻辑。


### Sample 模式
Expand Down
72 changes: 34 additions & 38 deletions docs/rekor.md
Original file line number Diff line number Diff line change
Expand Up @@ -2,10 +2,10 @@

## 1. 概述

Trustee 已经具备比较完整的 **Rekor 透明日志参考值能力**
Trustee 已经具备基于 **RV release manifest + Rekor DSSE** 的透明日志参考值能力

- 支持从 Rekor 检索 SLSA provenance
- 支持解析 in-toto Statement / DSSE payload,提取制品 digest。
- 支持解析 `application/vnd.trustee.rv.release+json` DSSE payload,提取 `measurements`
- 支持校验本地 release manifest payload hash 与 Rekor DSSE entry 的 `payloadHash`/v2 digest 一致
- 支持把提取出的参考值注册到 RVPS,供后续远程证明校验。

---
Expand All @@ -18,12 +18,12 @@ Trustee 已经具备比较完整的 **Rekor 透明日志参考值能力**:
flowchart LR
subgraph Producer["发布侧 / 供应链"]
A["构建系统 / CI"]
B["SLSA Provenance"]
B["RV Release Manifest DSSE"]
A --> B
end

R["Rekor 透明日志"]
B -->|"rekor-cli upload (intoto)"| R
B -->|"POST dsse log entry"| R

subgraph Trustee["Trustee 侧"]
D["Trustee Gateway API"]
Expand All @@ -33,22 +33,22 @@ flowchart LR
E --> F
end

R -->|"查询 provenance"| E
R -->|"校验 payload hash / inclusion proof"| E
CI["Trustee Owner"] -->|"POST /api/rvps/set_reference_value_list"| D
```

### 2.2 关键角色

- **Rekor**:透明日志服务,存储可查询的 in-toto/SLSA 条目。
- **Rekor**:透明日志服务,存储 RV release manifest DSSE 条目。
- **Trustee Gateway**:对外 API 入口,可触发 RVPS 批量设置参考值。
- **RVPS**:负责 Rekor 查询(批量场景)、SLSA 解析、digest 提取与参考值落库
- **RVPS**:负责 release manifest 解析、digest 提取、Rekor entry 一致性校验与参考值落库
- **Attestation Service / KBS**:在证明决策中消费 RVPS 参考值。

---

## 3. 透明日志接入设计

### 3.1 Rekor 检索策略
### 3.1 Release Manifest 消费策略

```mermaid
sequenceDiagram
Expand All @@ -57,33 +57,27 @@ sequenceDiagram
participant RC as RekorClient
participant RK as Rekor

U->>RV: 提交 rv_list(id,version,type,rekor_url)
RV->>RC: 为每个条目发起 Rekor 查询
RC->>RC: 计算 sha256 索引
RC->>RK: POST /api/v1/index/retrieve
RK-->>RC: 返回 entry UUID 列表
RC->>RK: POST /api/v1/log/entries/retrieve
RK-->>RC: 返回 entries
RC->>RC: 解析 attestation.data / body.DSSE
RC->>RC: 过滤 predicateType=slsa
RC->>RV: 传入 SLSA payload
RV->>RV: 提取 subject digest 并写入参考值
U->>RV: 提交 rv_list(id=<measurement-name>, provenance_source)
RV->>RV: 拉取 release manifest bundle
RV->>RV: 解码 DSSE payload
RV->>RV: 校验 payload hash 与 Rekor entry 一致
RV->>RV: 提取 measurements[id] 并写入参考值
```

### 3.2 解析与落库规则

- 同时兼容两种条目路径:
- `attestation.data`(base64 JSON)
- `body` 中 `intoto` DSSE payload(base64)
- 仅接受 `predicateType` 包含 `slsa` 的 statement
- 从 `subject/subjects` 抽取 digest,过滤 `artifact-index-hash` 等索引项
- 新格式使用 `provenance_info.type = "rv-release-manifest"`。
- release manifest 必须包含 `schemaVersion=1` 与非空 `measurements`。
- measurement 名称允许完全自定义;`rv_list[].id` 只需与 release manifest `measurements` 中的键一致。
- measurement 的 `algorithm` 支持 `sha256` 或 `sha384`,`value` 必须是对应算法的小写 hex digest
- 从 `measurements[id]` 抽取 digest 并写入 RVPS;默认参考值名就是 `id`,也可通过 `rv_name` 覆盖
- 参考值支持去重与合并更新,避免重复覆盖。
- 默认设置过期时间(当前实现约 12 个月)。
- `set_reference_value_list` 的 `rv_list` 项支持可选 `rv_name`:若设置则以其为 RVPS 参考值名称,否则仍为 `measurement.<type>.<id>`
- `set_reference_value_list` 的 `rv_list` 项支持可选 `rv_name`:若设置则以其为 RVPS 参考值名称。

### 3.3 可选的强化校验

RVPS 的 SLSA extractor 支持配置外部 `slsa-verifier`(通过环境变量)进行更严格校验(如 Rekor URL、builder identity、OIDC issuer)。
历史 SLSA 兼容路径中的 extractor 仍支持配置外部 `slsa-verifier`(通过环境变量)进行更严格校验(如 Rekor URL、builder identity、OIDC issuer);RV release manifest 新路径的核心校验是 DSSE payload hash 与 Rekor entry 一致

---

Expand All @@ -100,7 +94,7 @@ cat << EOF > rvps-set-list.json
"version": "artifact-version",
"type": "model",
"provenance_info": {
"type": "slsa-intoto-statements",
"type": "rv-release-manifest",
"rekor_url": "https://log2025-1.rekor.sigstore.dev",
"rekor_api_version": 2
},
Expand All @@ -125,13 +119,14 @@ curl -k -X POST http://<gateway-host>:<port>/api/rvps/set_reference_value_list \
- `provenance_source.protocol`:当前支持 `oci`
- `provenance_source.uri`:OCI 地址,格式 `oci://<registry>/<repo>:<tag>` 或 `oci://<registry>/<repo>@sha256:<digest>`
- `provenance_source.artifact`:`bundle` 或 `provenance`,默认建议 `bundle`
- 当请求中未提供 `provenance_source` 字段时,仍走现有 Rekor v1 索引查询兼容路径
- 新格式需要通过 `provenance_source` 提供完整 release manifest bundle/DSSE/payload;RVPS 会用 bundle 内 Rekor entry 校验 payload hash。
- 旧的 `slsa-intoto-statements` 兼容路径仍可用于历史数据,但不再作为新设计推荐路径。

### 4.2 发布侧:生成并上传 Rekor

```bash
cd trustee/tools/slsa
./slsa-generator \
./rv-release-tool \
--artifact-type binary \
--artifact /path/to/artifact \
--artifact-id app-binary \
Expand All @@ -144,19 +139,20 @@ cd trustee/tools/slsa
--provenance-store-artifact bundle
```

该脚本会生成 statement + DSSE,并在 `bundle` 模式输出统一的 provenance metadata 结构:
该脚本会生成 JCS 规范化 release payload + DSSE,并在 `bundle` 模式输出统一 metadata 结构:

- `sourceBundle`:来源 bundle(与 Sigstore bundle 结构对齐)
- `dsseEnvelope`:便于直接消费的 DSSE;
- `rekorEntryV2`:可选(v2 上传成功时带上
- `releasePayload`:JCS 规范化后的 release manifest
- `dsseEnvelope`:`application/vnd.trustee.rv.release+json` DSSE;
- `rekorEntryV1`/`rekorEntryV2`:可选上传成功时带上。

同时支持:

- 上传到 Rekor v1(`rekor-cli upload --type intoto`);
- 上传到 Rekor v1(`kind=dsse`);
- 上传到 Rekor v2(`/api/v2/log/entries`,`dsseRequestV002`);
- 把 provenance 元数据上传到指定存储地址(首期支持 OCI)。
- 把 release manifest metadata 上传到指定存储地址(首期支持 OCI)。

> 说明:CI 发布到 GitHub Release 的 `*.provenance-metadata.json` 与 `slsa-generator` 的 `provenance.trustee-bundle.json` 已统一为同一 schema(`sourceBundle + dsseEnvelope + rekorEntryV2`)。
> 说明:CI 发布到 GitHub Release 的 `*.release-manifest.bundle.json` 与 `rv-release-tool` 的 `release-manifest.trustee-bundle.json` 已统一为同一 schema(`releasePayload + dsseEnvelope + rekorEntryV1/rekorEntryV2`)。
> CI release workflow 仍会保留原有 `*.intoto.jsonl` SLSA provenance 作为 Release 资产;新增的 RV release manifest bundle 是额外资产。Rekor 上传对象改为 RV release manifest DSSE,不再上传 SLSA provenance。

### 4.3 审计侧:使用脚本验证参考值与 Rekor v2 一致性

Expand All @@ -180,7 +176,7 @@ cd trustee/tools/slsa

脚本会在终端输出完整审计过程,并给出 PASS/FAIL 结果,覆盖:

1. 参考值与 statement 中 `subject(name=id).digest.sha256` 一致;
1. 参考值与 release manifest 中 `measurements[id]` 的 `algorithm/value` 一致;
2. DSSE payload 摘要与 Rekor v2 `canonicalizedBody.spec.dsseV002` 一致;
3. 校验 proof checkpoint 与 latest checkpoint 的签名(基于 Sigstore trusted root);
4. 通过 `logIndex + tile` 验证 entry 确实存在于透明日志;
Expand Down
2 changes: 1 addition & 1 deletion rpm/trustee.spec
Original file line number Diff line number Diff line change
Expand Up @@ -159,7 +159,7 @@ fi
- feat: add set-reference-value-list CLI and optional rv_name for RVPS by @jialez0S

* Thu Feb 26 2026 Jiale Zhang <xinjian.zjl@alibaba-inc.com> -1.8.2-1
- Impl slsa-generator script for eas artifacts
- Impl rv-release-tool script for eas artifacts
- feat(rvps/gateway): add set_reference_value_list API

* Tue Feb 3 2026 Jiale Zhang <xinjian.zjl@alibaba-inc.com> -1.8.1-1
Expand Down
Loading
Loading