forked from NVIDIA/aicr
-
Notifications
You must be signed in to change notification settings - Fork 0
208 lines (188 loc) · 8.25 KB
/
Copy pathserver-kms-e2e.yaml
File metadata and controls
208 lines (188 loc) · 8.25 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
# Copyright (c) 2026, NVIDIA CORPORATION & AFFILIATES. All rights reserved.
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
# Server-side (aicrd) HashiCorp Vault-backed bundle attestation e2e. The
# companion of vault-kms-e2e.yaml, which exercises the same hashivault:// path
# through the aicr CLI; this one drives the aicrd HTTP SERVER's
# POST /v1/bundle?attest=true surface (#1150) with a non-interactive,
# operator-supplied KMS signing identity.
#
# It builds an ATTESTED aicrd binary (goreleaser + the cosign attest-blob hook,
# fed by generate-slsa-predicate which sets SLSA_PREDICATE + AICR_SIGNING_CONFIG),
# then delegates to the suite's run.sh. run.sh owns the full runtime lifecycle:
# it starts OpenBAO in dev mode (plain docker run, so it can reference the
# load-versions image pin — a services: container would start before that step),
# provisions an ecdsa-p256 Transit key, starts aicrd in the background with the
# signing identity, drives the sign + verify round-trip, and tears both down.
# Keeping OpenBAO + server ownership inside run.sh means the exact same script
# runs locally and in CI (no drift between an inlined workflow copy and the
# runner).
#
# Dev-mode OpenBAO serves plain HTTP with a known root token, so no TLS/mkcert
# dance is needed. The image is pinned in .settings.yaml
# (testing_tools.openbao_image) and resolved via load-versions, never :latest.
name: Server KMS E2E
on:
workflow_dispatch: {}
push:
branches:
- main
paths-ignore:
- '**.md'
- 'docs/**'
- 'LICENSE'
# Validate on PRs that touch the suite, its workflow/tooling, or the
# server-signing / verify code under test. Gated to same-repo in the job `if`
# below: fork PRs lack the OIDC token needed to attest the binary, so they
# skip rather than fail.
pull_request:
branches:
- main
paths:
- 'tests/chainsaw/signing/server-bundle-attestation-vault/**'
- '.github/workflows/server-kms-e2e.yaml'
- '.github/actions/load-versions/**'
- '.github/actions/generate-slsa-predicate/**'
- '.github/actions/setup-build-tools/**'
- '.settings.yaml'
- '.goreleaser.yaml'
# The server signing/attestation surface under test.
- 'pkg/server/**'
- 'pkg/bundler/**'
# The keyless/trust-root verification path imports pkg/trust directly.
- 'pkg/trust/**'
# `verify --key`/`--insecure-ignore-tlog` plumbing lives in pkg/cli;
# cmd/aicrd is the server entrypoint, cmd/aicr the CLI entrypoint. go.mod/
# sum cover dependency bumps (e.g. sigstore) that change the signing path.
- 'pkg/cli/**'
- 'cmd/aicrd/**'
- 'cmd/aicr/**'
- 'go.mod'
- 'go.sum'
- 'vendor/**'
# Least privilege at the workflow level; id-token is granted only to the job
# that needs it (below).
permissions:
contents: read
concurrency:
group: ${{ github.workflow }}-${{ github.ref }}
cancel-in-progress: true
env:
# Dev-mode OpenBAO: plain HTTP, fixed root token. Nothing here is a real secret.
VAULT_ADDR: http://127.0.0.1:8200
VAULT_TOKEN: root
VAULT_KMS_KEY: aicr
# The aicrd binary built here is attested by THIS workflow's identity (via
# generate-slsa-predicate workflow_file: server-kms-e2e.yaml + the goreleaser
# cosign attest-blob hook), not the release workflow (on-tag.yaml) the server
# pins by default. Retarget the certificate-identity pattern to this workflow
# so the server can verify its own binary attestation at startup. Still pinned
# to NVIDIA/aicr (enforced by verifier.ValidateIdentityPattern). run.sh
# defaults to the same value; set here explicitly for clarity.
AICR_BINARY_ATTESTATION_IDENTITY_REGEXP: '^https://github\.com/NVIDIA/aicr/\.github/workflows/server-kms-e2e\.yaml@.*'
jobs:
server-kms-e2e:
name: Server KMS E2E
runs-on: ubuntu-latest
timeout-minutes: 20
# id-token: write mints the GitHub OIDC token for Sigstore keyless signing.
# The "Build binaries" step runs goreleaser, whose cosign attest-blob hook
# uses that identity to produce the aicrd binary's SLSA provenance (fed by
# "Generate SLSA predicate"), which the server embeds as tool provenance.
permissions:
contents: read
id-token: write
# Skip on fork PRs: they get a read-only token, so `cosign attest-blob`
# (binary attestation) cannot run. push/workflow_dispatch always run.
if: >-
github.event_name != 'pull_request' ||
github.event.pull_request.head.repo.full_name == github.repository
steps:
- name: Checkout Code
uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1
with:
persist-credentials: false
- name: Load versions
id: versions
uses: ./.github/actions/load-versions
- name: Setup Go
uses: actions/setup-go@b7ad1dad31e06c5925ef5d2fc7ad053ef454303e # v7.0.0
with:
go-version: ${{ steps.versions.outputs.go }}
cache: true
- name: Install GoReleaser
uses: goreleaser/goreleaser-action@f06c13b6b1a9625abc9e6e439d9c05a8f2190e94 # v7.2.3
with:
version: ${{ steps.versions.outputs.goreleaser }}
install-only: true
- name: Install Cosign
uses: sigstore/cosign-installer@6f9f17788090df1f26f669e9d70d6ae9567deba6 # v4.1.2
with:
# Pin from .settings.yaml (>= v3.1.0) so cosign logs DSSE attestations
# to Rekor v2 as hashedrekord/PAE. The installer default (v3.0.6) writes
# the legacy dsse entry type, which sigstore-go cannot verify. See #1650.
cosign-release: ${{ steps.versions.outputs.cosign }}
- name: Generate SLSA predicate
uses: ./.github/actions/generate-slsa-predicate
with:
workflow_file: server-kms-e2e.yaml
- name: Build binaries
env:
GOFLAGS: -mod=vendor
run: |
set -euo pipefail
# Builds aicr + aicrd for the host target. With SLSA_PREDICATE +
# AICR_SIGNING_CONFIG set (by "Generate SLSA predicate"), the
# .goreleaser.yaml aicrd post-hook runs cosign attest-blob and writes
# aicrd-attestation.sigstore.json next to the binary — the server's
# own tool provenance the e2e embeds.
goreleaser build --clean --single-target --snapshot --timeout 10m
- name: Locate binaries
run: |
set -euo pipefail
AICRD_BIN=""
for pattern in dist/aicrd_linux_amd64_v1/aicrd dist/aicrd_linux_amd64/aicrd; do
if [ -x "$pattern" ]; then
AICRD_BIN="$(pwd)/$pattern"
break
fi
done
if [ -z "$AICRD_BIN" ]; then
echo "::error::Built aicrd server binary not found in dist/"
exit 1
fi
AICR_BIN=""
for pattern in dist/aicr_linux_amd64_v1/aicr dist/aicr_linux_amd64/aicr; do
if [ -x "$pattern" ]; then
AICR_BIN="$(pwd)/$pattern"
break
fi
done
if [ -z "$AICR_BIN" ]; then
echo "::error::Built aicr CLI binary not found in dist/"
exit 1
fi
echo "AICRD_BIN=${AICRD_BIN}" >> "$GITHUB_ENV"
echo "AICR_BIN=${AICR_BIN}" >> "$GITHUB_ENV"
echo "Server binary: ${AICRD_BIN}"
echo "CLI binary: ${AICR_BIN}"
ATTEST_FILE="$(dirname "$AICRD_BIN")/aicrd-attestation.sigstore.json"
if [ -f "$ATTEST_FILE" ]; then
echo "aicrd binary attestation found: $ATTEST_FILE (full mode)"
else
echo "::warning::No aicrd binary attestation found; run.sh will fall back to smoke mode"
fi
- name: Run Server KMS e2e (starts OpenBAO + aicrd, sign + verify)
run: |
set -euo pipefail
./tests/chainsaw/signing/server-bundle-attestation-vault/run.sh