feat(forge): point the credential lane at the built OpenBao objects
MASON-WP-0003-T02 delivered the token on 2026-08-27, and three of its details differ from the chart's placeholders: KV v2 puts `data/` in the read path, the field is `FORGE_READ_TOKEN` rather than `token`, and the address matches every existing ClusterSecretStore (`http://openbao.openbao.svc:8200`, mount `platform`, auth mount `kubernetes`). The projected token's audience is now optional and defaults to empty. A token carrying an audience the auth role does not bind is rejected at TokenReview, and the role's audience binding is not readable without a privileged session — the four existing external-secrets roles use the API server audience, so that is the default that can be verified to work. Setting `openbao` here narrows the token to OpenBao alone and is worth doing once the role binds it. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> Assistant: claude-code Assistant-Model: opus Assistant-Process: 2583210@bnt-lap001 Assistant-Session: f2bff2d5-e9b2-4338-92ca-10282a927006
This commit is contained in:
parent
550a523435
commit
11f689d86d
4 changed files with 32 additions and 7 deletions
|
|
@ -317,6 +317,6 @@
|
||||||
| task | STATE-WP-0083-T07 | done | — | workplans/STATE-WP-0083-forge-derived-projection-reset.md |
|
| task | STATE-WP-0083-T07 | done | — | workplans/STATE-WP-0083-forge-derived-projection-reset.md |
|
||||||
| task | STATE-WP-0083-T08 | done | — | workplans/STATE-WP-0083-forge-derived-projection-reset.md |
|
| task | STATE-WP-0083-T08 | done | — | workplans/STATE-WP-0083-forge-derived-projection-reset.md |
|
||||||
| task | STATE-WP-0084-T01 | done | — | workplans/STATE-WP-0084-forge-read-for-private-repositories.md |
|
| task | STATE-WP-0084-T01 | done | — | workplans/STATE-WP-0084-forge-read-for-private-repositories.md |
|
||||||
| task | STATE-WP-0084-T02 | wait | — | workplans/STATE-WP-0084-forge-read-for-private-repositories.md |
|
| task | STATE-WP-0084-T02 | progress | — | workplans/STATE-WP-0084-forge-read-for-private-repositories.md |
|
||||||
| task | STATE-WP-0084-T03 | wait | — | workplans/STATE-WP-0084-forge-read-for-private-repositories.md |
|
| task | STATE-WP-0084-T03 | progress | — | workplans/STATE-WP-0084-forge-read-for-private-repositories.md |
|
||||||
| task | STATE-WP-0084-T04 | wait | — | workplans/STATE-WP-0084-forge-read-for-private-repositories.md |
|
| task | STATE-WP-0084-T04 | wait | — | workplans/STATE-WP-0084-forge-read-for-private-repositories.md |
|
||||||
|
|
|
||||||
|
|
@ -52,7 +52,9 @@ spec:
|
||||||
sources:
|
sources:
|
||||||
- serviceAccountToken:
|
- serviceAccountToken:
|
||||||
path: token
|
path: token
|
||||||
audience: {{ .Values.forgeRead.openbao.audience | quote }}
|
{{- with .Values.forgeRead.openbao.audience }}
|
||||||
|
audience: {{ . | quote }}
|
||||||
|
{{- end }}
|
||||||
expirationSeconds: {{ .Values.forgeRead.openbao.expirationSeconds }}
|
expirationSeconds: {{ .Values.forgeRead.openbao.expirationSeconds }}
|
||||||
{{- end }}
|
{{- end }}
|
||||||
{{- end }}
|
{{- end }}
|
||||||
|
|
@ -111,6 +113,8 @@ spec:
|
||||||
value: {{ .Values.forgeRead.openbao.addr | quote }}
|
value: {{ .Values.forgeRead.openbao.addr | quote }}
|
||||||
- name: OPENBAO_K8S_ROLE
|
- name: OPENBAO_K8S_ROLE
|
||||||
value: {{ .Values.forgeRead.openbao.role | quote }}
|
value: {{ .Values.forgeRead.openbao.role | quote }}
|
||||||
|
- name: OPENBAO_K8S_AUTH_MOUNT
|
||||||
|
value: {{ .Values.forgeRead.openbao.authMount | quote }}
|
||||||
- name: OPENBAO_K8S_TOKEN_PATH
|
- name: OPENBAO_K8S_TOKEN_PATH
|
||||||
value: /var/run/secrets/openbao/token
|
value: /var/run/secrets/openbao/token
|
||||||
- name: FORGE_READ_SECRET_PATH
|
- name: FORGE_READ_SECRET_PATH
|
||||||
|
|
|
||||||
|
|
@ -51,12 +51,27 @@ secret:
|
||||||
forgeRead:
|
forgeRead:
|
||||||
enabled: false
|
enabled: false
|
||||||
openbao:
|
openbao:
|
||||||
addr: ""
|
# Matches every existing ClusterSecretStore on this cluster.
|
||||||
|
addr: http://openbao.openbao.svc:8200
|
||||||
|
authMount: kubernetes
|
||||||
role: state-hub-forge-derivation
|
role: state-hub-forge-derivation
|
||||||
audience: openbao
|
# KV v2: the read path carries the `data/` infix, mount `platform`.
|
||||||
|
secretPath: platform/data/workloads/state-hub/forge-derivation
|
||||||
|
secretKey: FORGE_READ_TOKEN
|
||||||
|
# Audience for the projected ServiceAccount token.
|
||||||
|
#
|
||||||
|
# Empty renders no audience, giving the token the API server's audience —
|
||||||
|
# what the four existing external-secrets roles use, and what an OpenBao
|
||||||
|
# Kubernetes auth role with no bound audience will accept. A token with an
|
||||||
|
# audience the role does not bind is rejected at TokenReview, so this must
|
||||||
|
# not be set to "openbao" until the role binds that audience.
|
||||||
|
#
|
||||||
|
# Worth revisiting: with no audience, a copy of this token is a credential
|
||||||
|
# for the cluster API. Binding `openbao` on the role and setting it here
|
||||||
|
# narrows it to OpenBao alone. Either way the token is short-lived and
|
||||||
|
# kubelet-rotated, which the legacy auto-mounted token is not.
|
||||||
|
audience: ""
|
||||||
expirationSeconds: 3600
|
expirationSeconds: 3600
|
||||||
secretPath: ""
|
|
||||||
secretKey: token
|
|
||||||
|
|
||||||
resources:
|
resources:
|
||||||
requests:
|
requests:
|
||||||
|
|
|
||||||
|
|
@ -50,3 +50,9 @@ sweep:
|
||||||
hostname: 239.62.205.92.host.secureserver.net
|
hostname: 239.62.205.92.host.secureserver.net
|
||||||
hostPath: /home/tegwick
|
hostPath: /home/tegwick
|
||||||
sshHostPath: /home/tegwick/.ssh
|
sshHostPath: /home/tegwick/.ssh
|
||||||
|
|
||||||
|
# Forge read credential (STATE-WP-0084-T02). Coordinates only — the token lives
|
||||||
|
# in OpenBao at platform/workloads/state-hub/forge-derivation and reaches the
|
||||||
|
# pod through Kubernetes auth, never through this file or a Secret.
|
||||||
|
forgeRead:
|
||||||
|
enabled: true
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue