Manual init and unseal — loop script (Approach 1)
Test cases(26 of 50)
Complete the OpenBao prerequisites before running these tests. Go to prerequisites
Seal migration — Shamir to Transit auto-unseal
Seal migration — Shamir to AWS KMS auto-unseal
Requires AWS KMS, IAM permissions, and credentials. Independent of transit auto-unseal (UNSEAL-002).
Enable and Use KV v2 Secrets Engine
KV v2 Metadata and Custom Metadata
KV Secret Rotation Pattern with CAS
Configure PKI Engine as Internal CA
Auto-Rotate TLS Certificates with cert-manager
Cross-Sign External CA with OpenBao PKI
Dynamic PostgreSQL Credentials
Deploy a lab PostgreSQL instance in namespace db-tests, configure the database secrets engine to generate short-lived credentials, and verify readonly vs readwrite access. Uses in-cluster DNS (postgresql.db-tests.svc.cluster.local) from OpenBao pods.
Prerequisites checklist
Confirm these before running steps:
- TC-OPENBAO-OCP-001Enable TLS end-to-end on OpenBao (OpenShift)
- Cluster can pull
postgres:16-alpine(or adjust the image in the Commands / YAML tab)
1Deploy lab PostgreSQL (full manifest in the Commands / YAML tab) or use an existing one:
→ This will create: Namespace db-tests, Secret for credentials, ConfigMap for initial configuration, a Service and a Deployment.
2Wait for the deployment to be available
oc wait --for=condition=Available deployment/postgresql -n db-tests --timeout=180s→ Deployment Available
3Enable the database secrets engine
bao secrets enable database→ Success! Enabled the database secrets engine at: database/
4Configure the PostgreSQL connection (in-cluster, no TLS for lab)
bao write database/config/postgresql plugin_name=postgresql-database-plugin allowed_roles=readonly,readwrite connection_url='postgresql://{{username}}:{{password}}@postgresql.db-tests.svc.cluster.local:5432/myapp?sslmode=disable' username=bao_admin password=adminP@ss→ Success! Data written to: database/config/postgresql
Verify in the UI

5Create a readonly role with 1-hour TTL
bao write database/roles/readonly db_name=postgresql creation_statements="CREATE ROLE \"{{name}}\" WITH LOGIN PASSWORD '{{password}}' VALID UNTIL '{{expiration}}'; GRANT SELECT ON ALL TABLES IN SCHEMA public TO \"{{name}}\";" revocation_statements="REVOKE ALL PRIVILEGES ON ALL TABLES IN SCHEMA public FROM \"{{name}}\"; DROP ROLE IF EXISTS \"{{name}}\";" default_ttl=1h max_ttl=24h→ Success! Data written to: database/roles/readonly
Verify in the UI

6Create a readwrite role with 4-hour TTL
bao write database/roles/readwrite db_name=postgresql creation_statements="CREATE ROLE \"{{name}}\" WITH LOGIN PASSWORD '{{password}}' VALID UNTIL '{{expiration}}'; GRANT ALL PRIVILEGES ON ALL TABLES IN SCHEMA public TO \"{{name}}\";" default_ttl=4h max_ttl=24h→ Success! Data written to: database/roles/readwrite
7Request dynamic credentials
bao read database/creds/readonly→ Returns unique
username and password with lease duration8Test the dynamic credentials via oc exec into the PostgreSQL pod (see the Commands / YAML tab):
→
SELECT current_user shows the dynamic role; SELECT * FROM demo succeeds→
INSERT INTO demo ... fails with permission denied for readonly creds9Rotate the root credentials stored in OpenBao
bao write -f database/rotate-root/postgresql→ Root password rotated in PostgreSQL and updated in OpenBao config
Dynamic MySQL/MariaDB Credentials
Kubernetes Auth Method
OIDC Authentication with Keycloak/DEX
Raft Cluster Operations
Raft Snapshot and Restore
Full OpenBao Backup Strategy
Disaster Recovery Restore
TLS Certificates for OpenShift Routes via PKI
Dynamic PostgreSQL Credentials for Applications
Multi-Tenant Secret Isolation
Encryption as a Service - Transit Encryption for Application Data
External Secrets Operator with OpenBao
CSI Secrets Store Driver with OpenBao
OpenBao Agent Sidecar Injector
Sealed Secrets Migration to OpenBao