Added openbao secrets management and phaseout of bitnami for CloudNative PG
This commit is contained in:
1
.gitignore
vendored
1
.gitignore
vendored
@@ -2,6 +2,7 @@
|
|||||||
helm/*.yaml
|
helm/*.yaml
|
||||||
!helm/*.sops.yaml
|
!helm/*.sops.yaml
|
||||||
!helm/*.yaml.template
|
!helm/*.yaml.template
|
||||||
|
!helm/openbao-values.yaml
|
||||||
# Kubernetes manifests (no secrets) are safe to commit
|
# Kubernetes manifests (no secrets) are safe to commit
|
||||||
!helm/*-cluster.yaml
|
!helm/*-cluster.yaml
|
||||||
!helm/*-networkpolicies.yaml
|
!helm/*-networkpolicies.yaml
|
||||||
|
|||||||
66
AGENTS.md
Normal file
66
AGENTS.md
Normal file
@@ -0,0 +1,66 @@
|
|||||||
|
# railiance-platform — Codex Instructions
|
||||||
|
|
||||||
|
**OAS Stack Level:** S3 Platform Services
|
||||||
|
**Scope:** Shared services supporting cluster workloads — PostgreSQL HA,
|
||||||
|
object storage, secret management, identity, message brokers, caches.
|
||||||
|
|
||||||
|
**Pre-condition:** `railiance-cluster` must be converged (k3s running,
|
||||||
|
Helm available) before deploying anything from this repo.
|
||||||
|
|
||||||
|
## Custodian State Hub Integration
|
||||||
|
|
||||||
|
Domain: **railiance** — topic ID: `ca369340-a64e-442e-98f1-a4fa7dc74a38`
|
||||||
|
State Hub: http://127.0.0.1:8000
|
||||||
|
|
||||||
|
### Session Protocol
|
||||||
|
|
||||||
|
**Step 1 — Orient**
|
||||||
|
```
|
||||||
|
get_domain_summary("railiance")
|
||||||
|
```
|
||||||
|
|
||||||
|
**Step 2 — Scan workplans**
|
||||||
|
```
|
||||||
|
ls workplans/ # read all active workplans; note todo/in_progress tasks
|
||||||
|
```
|
||||||
|
|
||||||
|
**Step 3 — Present brief**
|
||||||
|
1. Active workstreams for railiance with `[repo:railiance-platform]` tasks
|
||||||
|
2. Pending tasks from local workplans
|
||||||
|
3. Goal guidance from summary (needs_workplan / alignment_warnings)
|
||||||
|
4. Suggested next action
|
||||||
|
|
||||||
|
**During work:** use `record_decision()`, `add_progress_event()`, `resolve_decision()`.
|
||||||
|
|
||||||
|
**Session close:** `add_progress_event()` with topic_id and workstream_id.
|
||||||
|
|
||||||
|
> Design boundary: hub is read model. Bootstrap tools (create_workstream,
|
||||||
|
> create_task) are First Session Protocol only. Work originates as files
|
||||||
|
> per ADR-001.
|
||||||
|
|
||||||
|
### Repo Boundary Rule (ADR-003)
|
||||||
|
|
||||||
|
This repo owns **S3 Platform Services only**. Do not manage:
|
||||||
|
- OS-level concerns → `railiance-infra` (S1)
|
||||||
|
- Kubernetes runtime concerns → `railiance-cluster` (S2)
|
||||||
|
- CI/CD or developer tooling → `railiance-enablement` (S4)
|
||||||
|
- Application deployments → `railiance-apps` (S5)
|
||||||
|
|
||||||
|
Reference: `railiance-infra/docs/adr/ADR-003-railiance-5repo-stack-architecture.md`
|
||||||
|
|
||||||
|
### Workplan Convention (ADR-001)
|
||||||
|
|
||||||
|
File location: `workplans/RAIL-PL-WP-NNNN-<slug>.md`
|
||||||
|
Prefix: `RAIL-PL`
|
||||||
|
|
||||||
|
### SBOM
|
||||||
|
|
||||||
|
After updating dependencies:
|
||||||
|
```bash
|
||||||
|
cd ~/the-custodian/state-hub
|
||||||
|
make ingest-sbom REPO=railiance-platform SCAN=1 REPO_PATH=/home/worsch/railiance-platform
|
||||||
|
```
|
||||||
|
|
||||||
|
### Quick Reference
|
||||||
|
|
||||||
|
`~/the-custodian/state-hub/mcp_server/TOOLS.md`
|
||||||
33
Makefile
33
Makefile
@@ -8,6 +8,10 @@ NAMESPACE := platform
|
|||||||
|
|
||||||
PG_CHART_VERSION ?= 16.2.2
|
PG_CHART_VERSION ?= 16.2.2
|
||||||
VALKEY_CHART_VERSION ?= 2.x
|
VALKEY_CHART_VERSION ?= 2.x
|
||||||
|
OPENBAO_CHART_VERSION ?= 0.28.2
|
||||||
|
OPENBAO_NAMESPACE ?= openbao
|
||||||
|
OPENBAO_RELEASE ?= openbao
|
||||||
|
OPENBAO_VALUES ?= helm/openbao-values.yaml
|
||||||
|
|
||||||
##@ CloudNative PG (cnpg) — primary database operator
|
##@ CloudNative PG (cnpg) — primary database operator
|
||||||
|
|
||||||
@@ -60,6 +64,33 @@ valkey-deploy: ## Deploy / upgrade Valkey (Redis-compatible) to platform namespa
|
|||||||
valkey-status: ## Check Valkey pod status
|
valkey-status: ## Check Valkey pod status
|
||||||
$(KUBECTL) get pods -n $(NAMESPACE) -l app.kubernetes.io/name=valkey
|
$(KUBECTL) get pods -n $(NAMESPACE) -l app.kubernetes.io/name=valkey
|
||||||
|
|
||||||
|
##@ OpenBao (secrets)
|
||||||
|
|
||||||
|
openbao-repo: ## Add / update the official OpenBao Helm repository
|
||||||
|
$(HELM) repo add openbao https://openbao.github.io/openbao-helm --force-update
|
||||||
|
$(HELM) repo update openbao
|
||||||
|
|
||||||
|
openbao-dry-run: openbao-repo ## Render the OpenBao Helm release without applying it
|
||||||
|
$(HELM) upgrade --install $(OPENBAO_RELEASE) openbao/openbao \
|
||||||
|
--version $(OPENBAO_CHART_VERSION) \
|
||||||
|
--namespace $(OPENBAO_NAMESPACE) \
|
||||||
|
--create-namespace \
|
||||||
|
-f $(OPENBAO_VALUES) \
|
||||||
|
--dry-run
|
||||||
|
|
||||||
|
openbao-deploy: openbao-repo ## Deploy / upgrade OpenBao to the openbao namespace
|
||||||
|
$(KUBECTL) create namespace $(OPENBAO_NAMESPACE) --dry-run=client -o yaml | $(KUBECTL) apply -f -
|
||||||
|
$(HELM) upgrade --install $(OPENBAO_RELEASE) openbao/openbao \
|
||||||
|
--version $(OPENBAO_CHART_VERSION) \
|
||||||
|
--namespace $(OPENBAO_NAMESPACE) \
|
||||||
|
-f $(OPENBAO_VALUES) \
|
||||||
|
--wait --timeout 5m
|
||||||
|
|
||||||
|
openbao-status: ## Show OpenBao pods, services, PVCs, and seal/init status
|
||||||
|
$(KUBECTL) get pods,svc,pvc -n $(OPENBAO_NAMESPACE) \
|
||||||
|
-l app.kubernetes.io/instance=$(OPENBAO_RELEASE) -o wide
|
||||||
|
-$(KUBECTL) exec -n $(OPENBAO_NAMESPACE) $(OPENBAO_RELEASE)-0 -- bao status
|
||||||
|
|
||||||
##@ Backup
|
##@ Backup
|
||||||
|
|
||||||
backup: ## Backup platform services (PostgreSQL logical dump) — age-encrypted to Nextcloud
|
backup: ## Backup platform services (PostgreSQL logical dump) — age-encrypted to Nextcloud
|
||||||
@@ -72,4 +103,4 @@ help: ## Show this help
|
|||||||
/^[a-zA-Z_-]+:.*?##/ { printf " \033[36m%-22s\033[0m %s\n", $$1, $$2 } \
|
/^[a-zA-Z_-]+:.*?##/ { printf " \033[36m%-22s\033[0m %s\n", $$1, $$2 } \
|
||||||
/^##@/ { printf "\n\033[1m%s\033[0m\n", substr($$0, 5) }' $(MAKEFILE_LIST)
|
/^##@/ { printf "\n\033[1m%s\033[0m\n", substr($$0, 5) }' $(MAKEFILE_LIST)
|
||||||
|
|
||||||
.PHONY: db-deploy db-status db-shell db-logs pg-deploy pg-status pg-pgpool-check valkey-deploy valkey-status backup help
|
.PHONY: db-deploy db-status db-shell db-logs pg-deploy pg-status pg-pgpool-check valkey-deploy valkey-status openbao-repo openbao-dry-run openbao-deploy openbao-status backup help
|
||||||
|
|||||||
12
SCOPE.md
12
SCOPE.md
@@ -22,7 +22,8 @@ Railiance is structured as five independent repos per OAS Stack layer. This repo
|
|||||||
|
|
||||||
- PostgreSQL via CloudNative PG operator (cnpg) — operator deployed, `databases` namespace active
|
- PostgreSQL via CloudNative PG operator (cnpg) — operator deployed, `databases` namespace active
|
||||||
- Valkey / Redis-compatible cache as a standalone Helm release (to be extracted from S2)
|
- Valkey / Redis-compatible cache as a standalone Helm release (to be extracted from S2)
|
||||||
- Secret management infrastructure
|
- Secret management infrastructure (OpenBao as the platform service,
|
||||||
|
SOPS/age for Git-at-rest bootstrap material)
|
||||||
- Identity services integration point (with net-kingdom)
|
- Identity services integration point (with net-kingdom)
|
||||||
- Message brokers (RabbitMQ, similar)
|
- Message brokers (RabbitMQ, similar)
|
||||||
- Object storage (MinIO / S3-compatible)
|
- Object storage (MinIO / S3-compatible)
|
||||||
@@ -111,10 +112,17 @@ description: S3-compatible object storage service (MinIO) for artifact storage,
|
|||||||
keywords: [minio, s3, object-storage, storage, artifacts, backup]
|
keywords: [minio, s3, object-storage, storage, artifacts, backup]
|
||||||
```
|
```
|
||||||
|
|
||||||
|
```capability
|
||||||
|
type: security
|
||||||
|
title: OpenBao platform secrets service
|
||||||
|
description: Canonical S3 secrets service for runtime secrets, dynamic credentials, audit, and future workload integrations. SOPS/age remains the bootstrap mechanism for Git-at-rest secrets.
|
||||||
|
keywords: [openbao, secrets, vault-compatible, secret-management, dynamic-credentials, audit, kubernetes-auth]
|
||||||
|
```
|
||||||
|
|
||||||
---
|
---
|
||||||
|
|
||||||
## Getting Oriented
|
## Getting Oriented
|
||||||
|
|
||||||
- Start with: `CLAUDE.md` (session protocol, boundary rules)
|
- Start with: `CLAUDE.md` (session protocol, boundary rules)
|
||||||
- Key files / directories: `workplans/RAIL-PL-WP-0001-platform-baseline.md`, `helm/` (platform Helm charts), `Makefile`
|
- Key files / directories: `workplans/RAIL-PL-WP-0001-platform-baseline.md`, `workplans/RAIL-PL-WP-0002-openbao-platform-secrets-service.md`, `helm/` (platform Helm charts), `docs/openbao.md`, `Makefile`
|
||||||
- Pre-conditions: railiance-cluster (S2) converged with k3s running; cluster backup verified before migration steps (`sudo make backup` in railiance-cluster)
|
- Pre-conditions: railiance-cluster (S2) converged with k3s running; cluster backup verified before migration steps (`sudo make backup` in railiance-cluster)
|
||||||
|
|||||||
207
docs/openbao.md
Normal file
207
docs/openbao.md
Normal file
@@ -0,0 +1,207 @@
|
|||||||
|
# OpenBao - Platform Secrets Service
|
||||||
|
|
||||||
|
**Chart:** `openbao/openbao`
|
||||||
|
**Chart version:** `0.28.2`
|
||||||
|
**App version:** `v2.5.3`
|
||||||
|
**Namespace:** `openbao`
|
||||||
|
**Managed by:** `railiance-platform` (S3)
|
||||||
|
**Workplan:** `RAIL-PL-WP-0002`
|
||||||
|
**Initial target:** Railiance01 (`92.205.62.239`)
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Architecture
|
||||||
|
|
||||||
|
```
|
||||||
|
S5 workloads / operators
|
||||||
|
-> openbao.openbao.svc.cluster.local:8200
|
||||||
|
-> openbao-0
|
||||||
|
-> integrated Raft storage on local-path PVC
|
||||||
|
-> audit storage PVC mounted at /openbao/audit
|
||||||
|
```
|
||||||
|
|
||||||
|
- OpenBao is the canonical Railiance S3 secrets service.
|
||||||
|
- SOPS/age remains the Git-at-rest bootstrap mechanism.
|
||||||
|
- The first Railiance01 deployment is single-replica Raft, not true HA.
|
||||||
|
- Public ingress is disabled. Operators use `kubectl exec` or port-forwarding.
|
||||||
|
- TLS is disabled inside the pod listener for this internal-only bootstrap. Add
|
||||||
|
cert-manager-backed internal TLS before exposing OpenBao beyond cluster-local
|
||||||
|
traffic.
|
||||||
|
|
||||||
|
## Deployment
|
||||||
|
|
||||||
|
The official OpenBao project recommends the Helm chart for Kubernetes
|
||||||
|
deployments and warns to run Helm with `--dry-run` before install or upgrade.
|
||||||
|
|
||||||
|
From a host with kubeconfig access:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
make openbao-dry-run
|
||||||
|
make openbao-deploy
|
||||||
|
make openbao-status
|
||||||
|
```
|
||||||
|
|
||||||
|
On Railiance01 directly:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
cd ~/railiance-platform
|
||||||
|
sudo env KUBECONFIG=/etc/rancher/k3s/k3s.yaml make openbao-dry-run
|
||||||
|
sudo env KUBECONFIG=/etc/rancher/k3s/k3s.yaml make openbao-deploy
|
||||||
|
sudo env KUBECONFIG=/etc/rancher/k3s/k3s.yaml make openbao-status
|
||||||
|
```
|
||||||
|
|
||||||
|
If the repo is not present on Railiance01 yet, copy only the non-secret values
|
||||||
|
file and run Helm directly:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
scp helm/openbao-values.yaml tegwick@92.205.62.239:/tmp/openbao-values.yaml
|
||||||
|
ssh tegwick@92.205.62.239 \
|
||||||
|
'sudo env KUBECONFIG=/etc/rancher/k3s/k3s.yaml helm upgrade --install openbao openbao/openbao \
|
||||||
|
--version 0.28.2 \
|
||||||
|
--namespace openbao \
|
||||||
|
--create-namespace \
|
||||||
|
-f /tmp/openbao-values.yaml \
|
||||||
|
--dry-run'
|
||||||
|
```
|
||||||
|
|
||||||
|
Repeat without `--dry-run` to deploy.
|
||||||
|
|
||||||
|
## Verification
|
||||||
|
|
||||||
|
```bash
|
||||||
|
kubectl get pods,svc,pvc -n openbao -o wide
|
||||||
|
kubectl exec -n openbao openbao-0 -- bao status
|
||||||
|
```
|
||||||
|
|
||||||
|
Expected immediately after install:
|
||||||
|
|
||||||
|
- `openbao-0` is Running.
|
||||||
|
- `openbao`, `openbao-active`, `openbao-internal`, and `openbao-ui` services
|
||||||
|
exist as cluster-internal services.
|
||||||
|
- data and audit PVCs are Bound.
|
||||||
|
- `bao status` reports `Initialized: false` and `Sealed: true`.
|
||||||
|
|
||||||
|
That state is intentional until the bootstrap ceremony is completed.
|
||||||
|
|
||||||
|
## Bootstrap Ceremony
|
||||||
|
|
||||||
|
Do not initialize OpenBao in a casual shell session. Initialization emits the
|
||||||
|
unseal keys and initial root token. Treat this as a break-glass event.
|
||||||
|
|
||||||
|
Recommended ceremony:
|
||||||
|
|
||||||
|
1. Confirm the Railiance01 backup posture first.
|
||||||
|
2. Prepare three human escrow recipients for unseal shares.
|
||||||
|
3. Run initialization once:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
kubectl exec -n openbao openbao-0 -- \
|
||||||
|
bao operator init -key-shares=3 -key-threshold=2
|
||||||
|
```
|
||||||
|
|
||||||
|
4. Give each unseal share to its escrow owner through an out-of-band channel.
|
||||||
|
5. Unseal with two shares:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
kubectl exec -n openbao openbao-0 -- bao operator unseal
|
||||||
|
```
|
||||||
|
|
||||||
|
6. Log in with the initial root token only long enough to create durable admin
|
||||||
|
auth, enable audit, and prepare policies.
|
||||||
|
7. Revoke or tightly escrow the initial root token.
|
||||||
|
|
||||||
|
## Initial Configuration After Unseal
|
||||||
|
|
||||||
|
Enable file audit:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
kubectl exec -n openbao openbao-0 -- \
|
||||||
|
bao audit enable file file_path=/openbao/audit/openbao-audit.log
|
||||||
|
```
|
||||||
|
|
||||||
|
Enable the first KV v2 mount:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
kubectl exec -n openbao openbao-0 -- \
|
||||||
|
bao secrets enable -path=platform kv-v2
|
||||||
|
```
|
||||||
|
|
||||||
|
Kubernetes auth, database dynamic credentials, PKI, CSI, and External Secrets
|
||||||
|
integration are follow-up tasks in `RAIL-PL-WP-0002`. Do not migrate live
|
||||||
|
application secrets until those policies and restore drills are documented.
|
||||||
|
|
||||||
|
## Artifact-Store Object Storage Handoff
|
||||||
|
|
||||||
|
`artifact-store` is the consumer-facing artifact preservation service for
|
||||||
|
generated outputs, evidence packages, reports, logs, snapshots, exports, and
|
||||||
|
release artifacts. It already has an S3-compatible backend with `env:NAME` and
|
||||||
|
`file:/mounted/path` credential references, plus an
|
||||||
|
`artifactstore storage verify --backend s3` smoke path.
|
||||||
|
|
||||||
|
Railiance should avoid building a parallel object-storage client or credential
|
||||||
|
vending flow in OpenBao. The ownership split is:
|
||||||
|
|
||||||
|
- `railiance-platform` / OpenBao owns bootstrap secret custody, policy, audit,
|
||||||
|
break-glass access, and workload secret delivery.
|
||||||
|
- `artifact-store` owns artifact package manifests, the S3 backend, storage
|
||||||
|
verification, and whether temporary credentials require backend refresh
|
||||||
|
support or a sidecar/controller.
|
||||||
|
- `net-kingdom` owns the identity issuer and role-claim model if object storage
|
||||||
|
adopts STS with `AssumeRoleWithWebIdentity`.
|
||||||
|
|
||||||
|
Initial static-credential bridge, before STS is proven:
|
||||||
|
|
||||||
|
1. Create a scoped object-store access key limited to the artifact-store bucket
|
||||||
|
and prefix. Do not use object-store root credentials.
|
||||||
|
2. Store the key pair in OpenBao under a platform-owned path such as
|
||||||
|
`platform/object-storage/artifact-store`.
|
||||||
|
3. Deliver the values to the artifact-store pod through CSI or External Secrets
|
||||||
|
as mounted files.
|
||||||
|
4. Configure artifact-store with file references:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
export ARTIFACTSTORE_S3_ACCESS_KEY_REF=file:/run/secrets/artifactstore/s3-access-key
|
||||||
|
export ARTIFACTSTORE_S3_SECRET_KEY_REF=file:/run/secrets/artifactstore/s3-secret-key
|
||||||
|
```
|
||||||
|
|
||||||
|
5. Verify from artifact-store:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
artifactstore storage verify --backend s3
|
||||||
|
```
|
||||||
|
|
||||||
|
STS credential vending remains linked to
|
||||||
|
`ARTIFACT-STORE-WP-0007 - MinIO Compatibility, MaxIO Fork Assessment, And STS
|
||||||
|
Credential Vending`. If that workstream chooses MinIO-compatible
|
||||||
|
`AssumeRoleWithWebIdentity`, OpenBao should not become the identity provider by
|
||||||
|
default. Use the NetKingdom OIDC issuer for workload/user identity, map object
|
||||||
|
storage roles and policies there, and keep OpenBao responsible for bootstrap,
|
||||||
|
break-glass, audit, and delivery of any controller configuration.
|
||||||
|
|
||||||
|
Current artifact-store configuration exposes access key and secret key refs,
|
||||||
|
but no session-token ref. `ARTIFACT-STORE-WP-0007-T004` must either add
|
||||||
|
temporary-session-token support to the S3 backend or choose a sidecar/secret
|
||||||
|
controller pattern that keeps refreshed credentials available through the
|
||||||
|
existing env/file reference contract.
|
||||||
|
|
||||||
|
## Upgrade And Rollback
|
||||||
|
|
||||||
|
1. Read the OpenBao chart release notes.
|
||||||
|
2. Update `OPENBAO_CHART_VERSION` in `Makefile`.
|
||||||
|
3. Run `make openbao-dry-run`.
|
||||||
|
4. Confirm current backup and audit log posture.
|
||||||
|
5. Run `make openbao-deploy`.
|
||||||
|
6. Run `make openbao-status`.
|
||||||
|
|
||||||
|
For rollback, run `helm rollback openbao <REVISION> -n openbao` on Railiance01
|
||||||
|
and re-check `bao status`.
|
||||||
|
|
||||||
|
## Scaling To Three Nodes
|
||||||
|
|
||||||
|
When Railiance02 and Railiance03 join:
|
||||||
|
|
||||||
|
1. Move storage from `local-path` to distributed storage.
|
||||||
|
2. Set `server.affinity` back to anti-affinity.
|
||||||
|
3. Set `server.ha.replicas: 3`.
|
||||||
|
4. Re-enable a PodDisruptionBudget.
|
||||||
|
5. Run an unseal, failover, backup, and restore drill before migrating secrets.
|
||||||
123
helm/openbao-values.yaml
Normal file
123
helm/openbao-values.yaml
Normal file
@@ -0,0 +1,123 @@
|
|||||||
|
# Railiance S3 OpenBao platform secrets service.
|
||||||
|
#
|
||||||
|
# This file intentionally contains no secret material. OpenBao initialization
|
||||||
|
# creates unseal keys and the initial root token; handle those outside Git
|
||||||
|
# during the bootstrap ceremony documented in docs/openbao.md.
|
||||||
|
|
||||||
|
global:
|
||||||
|
namespace: openbao
|
||||||
|
tlsDisable: true
|
||||||
|
|
||||||
|
injector:
|
||||||
|
enabled: false
|
||||||
|
|
||||||
|
server:
|
||||||
|
enabled: true
|
||||||
|
logLevel: info
|
||||||
|
logFormat: json
|
||||||
|
|
||||||
|
image:
|
||||||
|
registry: quay.io
|
||||||
|
repository: openbao/openbao
|
||||||
|
pullPolicy: IfNotPresent
|
||||||
|
|
||||||
|
resources:
|
||||||
|
requests:
|
||||||
|
cpu: 100m
|
||||||
|
memory: 256Mi
|
||||||
|
limits:
|
||||||
|
cpu: 500m
|
||||||
|
memory: 512Mi
|
||||||
|
|
||||||
|
ingress:
|
||||||
|
enabled: false
|
||||||
|
|
||||||
|
authDelegator:
|
||||||
|
enabled: true
|
||||||
|
|
||||||
|
# Single-node Railiance01 bootstrap. Remove this override and scale
|
||||||
|
# server.ha.replicas when Railiance02/03 join with distributed storage.
|
||||||
|
affinity: ""
|
||||||
|
|
||||||
|
readinessProbe:
|
||||||
|
enabled: true
|
||||||
|
path: /v1/sys/health?standbyok=true&sealedcode=204&uninitcode=204
|
||||||
|
port: 8200
|
||||||
|
|
||||||
|
livenessProbe:
|
||||||
|
enabled: true
|
||||||
|
path: /v1/sys/health?standbyok=true&sealedcode=204&uninitcode=204
|
||||||
|
port: 8200
|
||||||
|
initialDelaySeconds: 60
|
||||||
|
|
||||||
|
networkPolicy:
|
||||||
|
enabled: true
|
||||||
|
ingress:
|
||||||
|
- from:
|
||||||
|
- namespaceSelector: {}
|
||||||
|
ports:
|
||||||
|
- port: 8200
|
||||||
|
protocol: TCP
|
||||||
|
- port: 8201
|
||||||
|
protocol: TCP
|
||||||
|
|
||||||
|
dataStorage:
|
||||||
|
enabled: true
|
||||||
|
size: 5Gi
|
||||||
|
storageClass: local-path
|
||||||
|
accessMode: ReadWriteOnce
|
||||||
|
|
||||||
|
auditStorage:
|
||||||
|
enabled: true
|
||||||
|
size: 2Gi
|
||||||
|
storageClass: local-path
|
||||||
|
accessMode: ReadWriteOnce
|
||||||
|
|
||||||
|
standalone:
|
||||||
|
enabled: false
|
||||||
|
|
||||||
|
ha:
|
||||||
|
enabled: true
|
||||||
|
replicas: 1
|
||||||
|
disruptionBudget:
|
||||||
|
enabled: false
|
||||||
|
raft:
|
||||||
|
enabled: true
|
||||||
|
setNodeId: true
|
||||||
|
config: |
|
||||||
|
ui = true
|
||||||
|
|
||||||
|
listener "tcp" {
|
||||||
|
tls_disable = 1
|
||||||
|
address = "[::]:8200"
|
||||||
|
cluster_address = "[::]:8201"
|
||||||
|
|
||||||
|
telemetry {
|
||||||
|
unauthenticated_metrics_access = "true"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
storage "raft" {
|
||||||
|
path = "/openbao/data"
|
||||||
|
}
|
||||||
|
|
||||||
|
service_registration "kubernetes" {}
|
||||||
|
|
||||||
|
telemetry {
|
||||||
|
prometheus_retention_time = "30s"
|
||||||
|
disable_hostname = true
|
||||||
|
}
|
||||||
|
|
||||||
|
serviceAccount:
|
||||||
|
create: true
|
||||||
|
name: openbao
|
||||||
|
serviceDiscovery:
|
||||||
|
enabled: true
|
||||||
|
|
||||||
|
ui:
|
||||||
|
enabled: true
|
||||||
|
serviceType: ClusterIP
|
||||||
|
activeOpenbaoPodOnly: false
|
||||||
|
|
||||||
|
csi:
|
||||||
|
enabled: false
|
||||||
@@ -4,7 +4,7 @@ type: workplan
|
|||||||
title: "OpenBao Platform Secrets Service"
|
title: "OpenBao Platform Secrets Service"
|
||||||
domain: railiance
|
domain: railiance
|
||||||
repo: railiance-platform
|
repo: railiance-platform
|
||||||
status: proposed
|
status: active
|
||||||
owner: codex
|
owner: codex
|
||||||
topic_slug: railiance
|
topic_slug: railiance
|
||||||
planning_priority: high
|
planning_priority: high
|
||||||
@@ -74,7 +74,7 @@ Out of scope:
|
|||||||
|
|
||||||
```task
|
```task
|
||||||
id: RAIL-PL-WP-0002-T01
|
id: RAIL-PL-WP-0002-T01
|
||||||
status: todo
|
status: done
|
||||||
priority: high
|
priority: high
|
||||||
state_hub_task_id: "e997ffe0-6b61-4242-b585-f271e9b75e99"
|
state_hub_task_id: "e997ffe0-6b61-4242-b585-f271e9b75e99"
|
||||||
```
|
```
|
||||||
@@ -84,11 +84,16 @@ ops-warden, Railiance, and application runbooks. Decide whether
|
|||||||
Railiance standardizes on OpenBao, keeps Vault-compatible abstraction
|
Railiance standardizes on OpenBao, keeps Vault-compatible abstraction
|
||||||
language, or supports both for a transition period.
|
language, or supports both for a transition period.
|
||||||
|
|
||||||
|
**2026-05-17:** Decision recorded in State Hub:
|
||||||
|
`a0df816c-3749-4418-9c8b-28eb428be953`. Railiance S3 standardizes on
|
||||||
|
OpenBao as the runtime platform secrets service. SOPS/age remains the
|
||||||
|
Git-at-rest bootstrap mechanism.
|
||||||
|
|
||||||
### T02 - Kubernetes Deployment Design
|
### T02 - Kubernetes Deployment Design
|
||||||
|
|
||||||
```task
|
```task
|
||||||
id: RAIL-PL-WP-0002-T02
|
id: RAIL-PL-WP-0002-T02
|
||||||
status: todo
|
status: done
|
||||||
priority: high
|
priority: high
|
||||||
state_hub_task_id: "fb6ac85d-e77f-400d-8342-70a0ec6e82ef"
|
state_hub_task_id: "fb6ac85d-e77f-400d-8342-70a0ec6e82ef"
|
||||||
```
|
```
|
||||||
@@ -98,11 +103,18 @@ backend, HA posture, ingress/internal service exposure, TLS, resource
|
|||||||
limits, PodDisruptionBudget, NetworkPolicies, and upgrade/rollback
|
limits, PodDisruptionBudget, NetworkPolicies, and upgrade/rollback
|
||||||
strategy.
|
strategy.
|
||||||
|
|
||||||
|
**2026-05-17:** Implemented `helm/openbao-values.yaml`, Make targets, and
|
||||||
|
`docs/openbao.md`. Deployed chart `openbao/openbao` `0.28.2` (app
|
||||||
|
`v2.5.3`) to Railiance01 namespace `openbao` as internal-only,
|
||||||
|
single-replica Raft with data/audit PVCs. Public ingress remains disabled;
|
||||||
|
OpenBao is intentionally uninitialized and sealed until the bootstrap
|
||||||
|
ceremony.
|
||||||
|
|
||||||
### T03 - Bootstrap, Unseal, And Break-Glass Procedure
|
### T03 - Bootstrap, Unseal, And Break-Glass Procedure
|
||||||
|
|
||||||
```task
|
```task
|
||||||
id: RAIL-PL-WP-0002-T03
|
id: RAIL-PL-WP-0002-T03
|
||||||
status: todo
|
status: in_progress
|
||||||
priority: high
|
priority: high
|
||||||
state_hub_task_id: "509ccfd4-1775-4be4-b8e4-8d5bcf17f91e"
|
state_hub_task_id: "509ccfd4-1775-4be4-b8e4-8d5bcf17f91e"
|
||||||
```
|
```
|
||||||
@@ -112,6 +124,10 @@ emergency access, backup escrow, and recovery drill. Ensure the design
|
|||||||
does not introduce an unmanaged "secret zero" worse than the current
|
does not introduce an unmanaged "secret zero" worse than the current
|
||||||
SOPS/age bootstrap.
|
SOPS/age bootstrap.
|
||||||
|
|
||||||
|
**2026-05-17:** Initial ceremony documented in `docs/openbao.md`. Still
|
||||||
|
needs human escrow assignment, root-token retirement details, and a
|
||||||
|
restore/recovery drill before live secrets move into OpenBao.
|
||||||
|
|
||||||
### T04 - Auth Methods And Workload Integration
|
### T04 - Auth Methods And Workload Integration
|
||||||
|
|
||||||
```task
|
```task
|
||||||
@@ -130,7 +146,7 @@ Operator, or sidecars/controllers.
|
|||||||
|
|
||||||
```task
|
```task
|
||||||
id: RAIL-PL-WP-0002-T05
|
id: RAIL-PL-WP-0002-T05
|
||||||
status: todo
|
status: in_progress
|
||||||
priority: medium
|
priority: medium
|
||||||
state_hub_task_id: "0d717bdd-76bc-41b4-b633-ba07214b4095"
|
state_hub_task_id: "0d717bdd-76bc-41b4-b633-ba07214b4095"
|
||||||
```
|
```
|
||||||
@@ -141,6 +157,16 @@ PostgreSQL, Kubernetes token generation where appropriate, PKI/SSH
|
|||||||
future paths, and an assessment of object-storage credential vending
|
future paths, and an assessment of object-storage credential vending
|
||||||
integration with NK-WP-0007.
|
integration with NK-WP-0007.
|
||||||
|
|
||||||
|
**2026-05-17:** Object-storage credential vending assessment started and
|
||||||
|
documented in `docs/openbao.md`. Existing `artifact-store` capabilities cover
|
||||||
|
artifact package preservation, an S3-compatible backend, env/file secret refs,
|
||||||
|
and `artifactstore storage verify --backend s3`. Railiance S3 should use
|
||||||
|
OpenBao for bootstrap custody, policy, audit, break-glass, and workload secret
|
||||||
|
delivery, while `artifact-store` owns S3 backend behavior and
|
||||||
|
`ARTIFACT-STORE-WP-0007` owns MinIO/fork compatibility plus temporary
|
||||||
|
credential refresh decisions. NetKingdom remains the default owner for OIDC
|
||||||
|
identity if object storage adopts `AssumeRoleWithWebIdentity`.
|
||||||
|
|
||||||
### T06 - Backup, Audit, Monitoring, And Verification
|
### T06 - Backup, Audit, Monitoring, And Verification
|
||||||
|
|
||||||
```task
|
```task
|
||||||
@@ -158,7 +184,7 @@ developer/operator verification script for the deployed service.
|
|||||||
|
|
||||||
```task
|
```task
|
||||||
id: RAIL-PL-WP-0002-T07
|
id: RAIL-PL-WP-0002-T07
|
||||||
status: todo
|
status: in_progress
|
||||||
priority: medium
|
priority: medium
|
||||||
state_hub_task_id: "89149b60-562b-4a5b-978d-0f9136ffa114"
|
state_hub_task_id: "89149b60-562b-4a5b-978d-0f9136ffa114"
|
||||||
```
|
```
|
||||||
@@ -168,6 +194,21 @@ artifact-store, and S5 applications where documentation or integration
|
|||||||
must move from HashiCorp Vault-specific assumptions to OpenBao-first
|
must move from HashiCorp Vault-specific assumptions to OpenBao-first
|
||||||
or Vault-compatible abstraction language.
|
or Vault-compatible abstraction language.
|
||||||
|
|
||||||
|
**2026-05-17:** Started cross-repo transition by updating
|
||||||
|
`net-kingdom/docs/platform-identity-security-architecture.md` and
|
||||||
|
`net-kingdom/SCOPE.md` so NetKingdom treats OpenBao as the runtime
|
||||||
|
platform secrets authority while SOPS/age remains bootstrap/Git-at-rest
|
||||||
|
protection. Still needs ops-warden, ops-bridge, artifact-store, S5 app,
|
||||||
|
and stale HashiCorp Vault wording follow-ups.
|
||||||
|
|
||||||
|
**2026-05-17:** Linked the artifact-store transition to
|
||||||
|
`ARTIFACT-STORE-WP-0007 - MinIO Compatibility, MaxIO Fork Assessment, And STS
|
||||||
|
Credential Vending` instead of creating duplicate S3 backend work in
|
||||||
|
`railiance-platform`. The OpenBao side of the handoff is now documented in
|
||||||
|
`docs/openbao.md`; remaining artifact-store work belongs in
|
||||||
|
`ARTIFACT-STORE-WP-0007-T004` and follow-up routing in
|
||||||
|
`ARTIFACT-STORE-WP-0007-T005`.
|
||||||
|
|
||||||
## Acceptance Criteria
|
## Acceptance Criteria
|
||||||
|
|
||||||
- Railiance has an explicit decision on OpenBao versus HashiCorp Vault
|
- Railiance has an explicit decision on OpenBao versus HashiCorp Vault
|
||||||
|
|||||||
@@ -10,7 +10,7 @@ topic_slug: railiance
|
|||||||
state_hub_workstream_id: "e4ec133c-7cb9-43c6-95f0-50d6591f13d7"
|
state_hub_workstream_id: "e4ec133c-7cb9-43c6-95f0-50d6591f13d7"
|
||||||
superseded_by: RAIL-HO-WP-0004
|
superseded_by: RAIL-HO-WP-0004
|
||||||
created: "2026-03-11"
|
created: "2026-03-11"
|
||||||
updated: "2026-03-26"
|
updated: "2026-05-17"
|
||||||
---
|
---
|
||||||
|
|
||||||
# S3 Platform Services Baseline
|
# S3 Platform Services Baseline
|
||||||
@@ -59,7 +59,7 @@ depend on.
|
|||||||
```task
|
```task
|
||||||
id: RAIL-PL-WP-0001-T01
|
id: RAIL-PL-WP-0001-T01
|
||||||
state_hub_task_id: f5af95bf-3d2d-458a-b695-666d4dc2dc99
|
state_hub_task_id: f5af95bf-3d2d-458a-b695-666d4dc2dc99
|
||||||
status: todo
|
status: cancelled
|
||||||
priority: high
|
priority: high
|
||||||
```
|
```
|
||||||
|
|
||||||
@@ -111,7 +111,7 @@ Running in the `platform` namespace; `make smoke` still passes.
|
|||||||
```task
|
```task
|
||||||
id: RAIL-PL-WP-0001-T02
|
id: RAIL-PL-WP-0001-T02
|
||||||
state_hub_task_id: c1073011-935a-4c1a-9a9f-dc4db1fc3e88
|
state_hub_task_id: c1073011-935a-4c1a-9a9f-dc4db1fc3e88
|
||||||
status: todo
|
status: cancelled
|
||||||
priority: high
|
priority: high
|
||||||
```
|
```
|
||||||
|
|
||||||
@@ -149,7 +149,7 @@ all data intact.
|
|||||||
```task
|
```task
|
||||||
id: RAIL-PL-WP-0001-T03
|
id: RAIL-PL-WP-0001-T03
|
||||||
state_hub_task_id: a820cd02-0f30-4488-abf1-897120f1fbc1
|
state_hub_task_id: a820cd02-0f30-4488-abf1-897120f1fbc1
|
||||||
status: todo
|
status: cancelled
|
||||||
priority: medium
|
priority: medium
|
||||||
```
|
```
|
||||||
|
|
||||||
@@ -188,7 +188,7 @@ still operational; tombstone in place.
|
|||||||
```task
|
```task
|
||||||
id: RAIL-PL-WP-0001-T04
|
id: RAIL-PL-WP-0001-T04
|
||||||
state_hub_task_id: 8df4774c-5251-4c85-be57-61b903be82ee
|
state_hub_task_id: 8df4774c-5251-4c85-be57-61b903be82ee
|
||||||
status: todo
|
status: cancelled
|
||||||
priority: high
|
priority: high
|
||||||
```
|
```
|
||||||
|
|
||||||
@@ -212,7 +212,7 @@ remains available within the recovery window.
|
|||||||
```task
|
```task
|
||||||
id: RAIL-PL-WP-0001-T05
|
id: RAIL-PL-WP-0001-T05
|
||||||
state_hub_task_id: 231f6f8a-97a0-4aa0-8318-8e4361af67a3
|
state_hub_task_id: 231f6f8a-97a0-4aa0-8318-8e4361af67a3
|
||||||
status: todo
|
status: cancelled
|
||||||
priority: medium
|
priority: medium
|
||||||
```
|
```
|
||||||
|
|
||||||
@@ -254,7 +254,7 @@ railiance-cluster backup still covers etcd/kubeconfig; no duplication.
|
|||||||
```task
|
```task
|
||||||
id: RAIL-PL-WP-0001-T06
|
id: RAIL-PL-WP-0001-T06
|
||||||
state_hub_task_id: 20899c81-2b24-4d70-ad02-f6a1383b6811
|
state_hub_task_id: 20899c81-2b24-4d70-ad02-f6a1383b6811
|
||||||
status: todo
|
status: cancelled
|
||||||
priority: low
|
priority: low
|
||||||
```
|
```
|
||||||
|
|
||||||
Reference in New Issue
Block a user