OpenBao
Secret-Store und PKI der DEXPRO-Plattform: Einordnung, Nutzung für Anwender, Betrieb für Betreuer.
- Schnelleinstieg
- Historie und Gültigkeit
- Aufbau und Erreichbarkeit
- Secrets (KV)
- Anmeldung
- Pipeline per GitLab-JWT anmelden
- VMs per AppRole anmelden
- Menschen-Login
- Admin-, Break-glass- und Root-Token
- PKI
- Betrieb
Schnelleinstieg
Schnelleinstieg
Zielgruppe: Anwender und Betreuer · Stand: 06.11.2026
OpenBao ist bei DEXPRO der zentrale Ort für Secrets (z. B. Zugänge und Passwörter) und die Zertifizierungsstelle der Plattform. Pipelines melden sich per GitLab-JWT an, VMs per AppRole und Menschen künftig per Entra-Login. Gespeicherte Zugangsdaten braucht dafür niemand.
OpenBao läuft bisher nur im Lab (Lab-PoC). Den aktuellen Stand und die offenen Punkte findest du unter Gültiger Stand und Verlauf.
Als Anwender möchte ich …
Folgt mit DEV. Bis dahin hilft dir zur Orientierung:
- … verstehen, wo mein Secret hingehört → Pfadschema und Teamtrennung
- … wissen, wie ich OpenBao erreiche → Erreichbarkeit
Als Betreuer möchte ich …
- … den aktuellen Stand und die offenen Punkte sehen → Gültiger Stand und Verlauf
- … ein Secret anlegen → Secret anlegen
- … eine alte Version zurückholen oder ein Secret löschen → Secret-Versionen und Löschen
- … eine Pipeline an OpenBao anbinden → Pipeline per GitLab-JWT anmelden
- … eine VM Zertifikate holen lassen → VMs per AppRole anmelden
- … wissen, wie Menschen sich anmelden → Menschen-Login
- … Admin- und Reserve-Token pflegen → Admin-, Break-glass- und Root-Token
- … die CA-Struktur verstehen → Offline-Root-CA und Intermediates
- … Consul-Zertifikate aus OpenBao nachvollziehen → Consul-Zertifikate aus OpenBao
- … den Cluster und das Seal verstehen → Cluster, Storage und Seal
- … einen Snapshot ziehen oder zurückspielen → Snapshot und Restore
- … OpenBao-Konfiguration ändern → Konfiguration als Code
- … das Listener-Zertifikat prüfen → Listener-Zertifikat
Weiterführend
Historie und Gültigkeit
Gültiger Stand und Verlauf
Zielgruppe: Anwender und Betreuer · Stand: 06.11.2026
OpenBao ist der Secret-Store und die zentrale Zertifizierungsstelle (CA) der DEXPRO-Plattform. Diese Seite zeigt, was heute gilt, was noch offen ist und wie es dazu kam. Details findest du auf den Seiten der einzelnen Kapitel.
OpenBao läuft bisher nur im Lab (Lab-PoC). Eine DEV- und eine Produktionsumgebung sind geplant, aber noch nicht aufgebaut.
Gültiger Stand
- Entscheidung (29.10.2026): OpenBao wird zentrale CA und Secret-Store der Plattform. Das Lab läuft als Cluster aus drei Knoten mit Raft-Storage und Static-Key-Seal.
- Entscheidung (29.10.2026): Die Root-CA ist offline. Sie liegt nie auf einer VM, nie im Terraform-State und nie in OpenBao. In OpenBao liegen nur Intermediate-CAs, je Zweck ein eigener PKI-Mount (z. B. für Consul).
- Entscheidung (30.10.2026): Secrets liegen in einem KV-v2-Mount je Abteilung (
cci/,cpi/,cpcs/,cpds/) nach dem Schema<abt>/<team>/<stage>/…für Team-Secrets und<abt>/shared/<stage>/…für Secrets der ganzen Abteilung. Secrets von Nomad-Jobs liegen unter<abt>/<team>/<stage>/nomad/<job>/…. Die Stage-Segmente heißen wie die Branches (pre-development,development,staging,production). - Entscheidung (02.11.2026): Ausnahme für die Abteilung CCI (Cloud Core Infrastructure): CCI ist ein Team und gliedert sich nach Standort und Projekt:
cci/shared/<stage>/…(abteilungsweit),cci/<standort>/<stage>/shared/…(je Standort, z. B.bremen1) undcci/<standort>/<stage>/<projekt>/…(nur dieses Projekt schreibt). Die anderen Abteilungen bleiben teambasiert. - Konzept (30.10.2026): Stage und Team ergeben sich bei Pipelines aus dem GitLab-JWT (Branch bzw. GitLab-Gruppe), bei Menschen aus ihrer Entra-Gruppe. Production-Secrets gibt es nur für geschützte Branches.
- Regel (30.10.2026): Ein Team liest den eigenen Teampfad und
shared/seiner Abteilung. Inshared/schreiben nur Menschen der Abteilung. Ausnahme CCI (02.11.2026): CCI-Pipelines dürfen auch in beideshared-Ebenen schreiben. Endgültig löschen (destroy) dürfen nur Menschen. Je Secret bleiben drei Versionen erhalten. - Entscheidung (30.10.2026): Pipelines melden sich per GitLab-JWT an, VMs per AppRole mit an die Host-IP gebundener Secret-ID. Menschen nutzen im Lab ein Admin-Token, in DEV später OIDC mit Entra ID.
- Entscheidung (30.10.2026): Pipeline-Tokens leben kurz (15 Minuten, höchstens 1 Stunde). Rechte entstehen nur über JWT-Rolle und Policy.
- Regel (06.11.2026): Secrets entstehen nur auf zwei Wegen: Menschen legen sie nach dem OIDC-Login in der Oberfläche an, Pipelines schreiben sie mit ihrem GitLab-JWT. Bis OIDC mit DEV kommt, entstehen Secrets im Lab nur über Pipelines.
- Regel (30.10.2026): OpenBao ist nur intern erreichbar und nie über den Edge. Ohne Token sind nur die öffentlichen CA-Daten abrufbar (CA-Zertifikat, Kette, Sperrliste).
- Regel (30.10.2026): Der Stack, der OpenBao selbst baut, bezieht seine Zugänge aus Bitwarden und nie aus OpenBao. Sonst ließe sich OpenBao nach einem Ausfall nicht wieder aufbauen. Das gilt auch für jeden späteren Produktions-, Restore- oder Bootstrap-Stack.
- Entscheidung (30.10.2026): Es wird kein externes Nomad-Secrets-Plugin eingesetzt. Pipelines sprechen Nomad über dessen eigene JWT-Anmeldung an, ohne Umweg über OpenBao.
- Entscheidung (30.10.2026): Bitwarden-Inhalte ziehen schrittweise nach OpenBao um, in dieser Reihenfolge: Provider-Zugänge, von Modulen erzeugte Secrets, Ablösung von ssl-service, SSH-CA.
- Fakt (02.11.2026): Die Provider-Zugänge der Lab-Stacks (Proxmox, PowerDNS, NetBox, CheckMK, hosttech) liegen in OpenBao. Eine Lab-Pipeline hat sie per GitLab-JWT gelesen, fremde Stages bleiben gesperrt. Die Originale bleiben vorerst in Bitwarden.
- Entscheidung (02.11.2026): Von Modulen erzeugte Secrets (z. B. Datenbank-Accounts) ziehen in zwei Stufen um. Zuerst bekommt jedes Modul einen Schalter mit Bitwarden als Default. Danach folgt je Modul eine neue Version, die nur noch OpenBao kennt.
- Fakt (02.11.2026): Die Lab-Consul-Server wurden mit Zertifikaten aus OpenBao neu aufgebaut (siehe Kapitel PKI).
Offen
- Offen: Aufbau von OpenBao in DEV und Produktion, inklusive Seal-Verfahren und automatischer Snapshots außerhalb der Knoten
- Offen: Anmeldung für Menschen per OIDC mit Entra ID (DEV)
- Offen: Von Modulen erzeugte Secrets in OpenBao ablegen (Plan steht, Start nach dem Pilot mit dem Lab-Edge-Stack)
- Offen: Lab-Zugänge in die Standort-Ebene umziehen (
cci/bremen1/<stage>/shared/…), anschließend die bisherige Sammelrolle ablösen - Offen: ssl-service durch die OpenBao-PKI ersetzen
- Offen: SSH-User- und Host-CA über OpenBao (später)
- Offen: Abschluss des Consul-Neubaus: Die ACL-Einrichtung hängt noch an der abgebauten Lab-Nomad-Anmeldung
- Offen: Erneuerung des Listener-Zertifikats absichern (Reload-Test und Überwachung, aktuelles Zertifikat gilt bis 04.12.2026)
- Offen: Consul-Connect-CA und Nomad-TLS über OpenBao
- Offen: Konfiguration als Code: Mounts, Policies und Rollen aus einer Team-Liste per Terraform erzeugen
Verlauf
- Regel (06.11.2026): Secrets nur per OIDC-Login in der Oberfläche oder per GitLab-JWT in der Pipeline anlegen.
- Fakt (02.11.2026): Lab-Consul-Server über die OpenBao-PKI neu aufgebaut.
- Entscheidung (02.11.2026): CCI-Gliederung nach Standort und Projekt (siehe Gültiger Stand). Überholt: Team-Segment für CCI, z. B.
bremen1als Team. - Entscheidung (02.11.2026): Umzug der Modul-Secrets zweistufig per Schalter.
- Fakt (02.11.2026): Provider-Zugänge der Lab-Stacks aus OpenBao abgeschlossen und im Testlauf nachgewiesen.
- Fakt (30.10.2026): Die Firewall von den GitLab-Runnern zu OpenBao (Port 8200) ist offen. Der Pipeline-Login per GitLab-JWT ist nachgewiesen. Davor erreichten die Runner OpenBao nicht.
- Entscheidung (30.10.2026): Kurswechsel bei der Consul-Pipeline: Sie meldet sich per GitLab-JWT an statt mit einem langlebigen Bootstrap-Token. Überholt: Bootstrap-Token als CI-Variable.
- Entscheidung (30.10.2026): Endfassung des Pfadschemas (siehe Gültiger Stand). Überholt: ein gemeinsamer Mount
kv/mit Stageslab/dev/stg/prd, Stage vor dem Team im Pfad sowie Stage aus Projektpfad oder Metadaten. - Fakt (30.10.2026): Root-Token im Lab widerrufen. Seitdem gibt es ein Admin-Token und ein Reserve-Token (Break-glass).
- Entscheidung (30.10.2026): OpenBao-Knoten bekommen im VM-Modul eine eigene Rolle und werden nicht in Consul registriert. Überholt: Umweg über Ansible-Tags.
- Fakt (29./30.10.2026): Lab-Cluster aufgebaut und initialisiert. HA-Test, Snapshot/Restore und Negativtest gegen den Edge sind bestanden.
- Entscheidung (29.10.2026): Lab-MVP von OpenBao als zentrale CA für den Lab-Nomad gestartet. Löst eine ältere OpenBao-Planung ab.
Weiterführend
Aufbau und Erreichbarkeit
Cluster, Storage und Seal
Zielgruppe: Betreuer · Stand: 06.11.2026
Das Lab-OpenBao läuft als Cluster aus drei Knoten mit eingebautem Raft-Storage. Es entsiegelt sich nach einem Neustart selbst (Static-Key-Seal). Diese Seite beschreibt Aufbau, Code-Ablage und Seal.
Lab-PoC: Für DEV und Produktion sind Seal-Verfahren und Backup-Konzept noch offen.
Cluster
- Drei VMs
ob-001-bre1-01..03.dexpro.partsmit je 2 CPU und 4 GB RAM, Storage per Raft. - Cluster-Adresse
openbao-lab-bre1.dexpro.parts:8200, ein DNS-Name mit A-Records auf alle drei Knoten. - Das Listener-Zertifikat ist das Wildcard-Zertifikat
*.dexpro.parts(siehe Listener-Zertifikat). - Die Knoten finden sich über ihre DNS-Namen, nie über
*.service.consul. - Die Knoten sind nicht in Consul registriert, weil Consul seine Zertifikate aus OpenBao bekommt. Monitoring läuft über CheckMK.
- Ein Knoten darf ausfallen, ohne dass Lesen und Ausstellen stoppen. Das ist im Lab getestet.
Code
| Repository | Inhalt |
|---|---|
cloud-core-infrastructure/ansible/roles/openbao |
Ansible-Rolle (Installation, Konfiguration, Zertifikats-Reload) |
cloud-core-infrastructure/terraform-modules/proxmox/openbao |
Terraform-Modul für die Knoten |
cloud-core-infrastructure/bremen1/openbao-servers |
Stack des Lab-Clusters, nur pre-development |
Im VM-Modul haben die Knoten eine eigene Rolle (vault) und keinen Consul-Agent.
Der Stack openbao-servers bezieht seine Zugänge (Proxmox, DNS, NetBox, CheckMK, Seal-Key) aus Bitwarden und nie aus OpenBao. Sonst ließe sich OpenBao nach einem Ausfall nicht wieder aufbauen. Das gilt für jeden späteren Produktions-, Restore- oder Bootstrap-Stack genauso.
Seal
- Static-Key-Seal: Ein Schlüssel auf jedem Knoten unter
/etc/openbao/seal/(nur root/openbao lesbar, außerhalb der Raft-Daten). Nach einem Neustart entsiegelt sich der Knoten damit selbst. - Recovery-Keys: fünf Anteile, drei davon genügen. Gesichert in Bitwarden.
Raft-Daten und Seal-Schlüssel liegen gemeinsam im täglichen Proxmox-Backup. Wer Zugriff auf dieses Backup hat (nur Proxmox-Admins), hat beides. Raft-Snapshots selbst enthalten den Schlüssel nicht.
Weiterführend
Erreichbarkeit
Zielgruppe: Anwender und Betreuer · Stand: 06.11.2026
OpenBao ist nur im internen Netz erreichbar und nie über den Edge. Wer OpenBao nutzen will, braucht deshalb einen direkten Netzweg zu Port 8200.
Regeln
- Erreichbar ist nur der interne Listener auf Port 8200, über
openbao-lab-bre1.dexpro.parts:8200. - Port 8201 nutzen nur die Knoten untereinander. Er wird nie freigegeben.
- Der Edge leitet nichts zu OpenBao. Das ist im Lab per Negativtest belegt.
- Ohne Token liefert OpenBao nur die öffentlichen CA-Daten (CA-Zertifikat, Kette, Sperrliste).
OpenBao nie über den Edge veröffentlichen, auch nicht vorübergehend. Oberflächen für Menschen laufen über den Edge, interne Dienste und OpenBao nie.
Zugriff für Pipelines
GitLab-Runner brauchen eine Firewall-Freigabe zu den Knoten auf Port 8200, und nur auf diesem Port. Die Freigabe richtet das Netzteam ein. Für die bestehenden Runner ist sie offen.
Prüfen vom Runner aus:
curl -s -o /dev/null -w '%{http_code}\n' https://openbao-lab-bre1.dexpro.parts:8200/v1/sys/health
200 (aktiver Knoten) oder 429 (Standby-Knoten) bedeutet: erreichbar.
Umgekehrt ruft OpenBao die Signaturschlüssel von GitLab (JWKS) ab, um die JWTs der Pipelines zu prüfen. Dieser Weg ist von allen Knoten aus offen.
Weiterführend
Secrets (KV)
Pfadschema und Teamtrennung
Zielgruppe: Anwender und Betreuer · Stand: 06.11.2026
In OpenBao liegen Secrets in KV-Speichern (KV-v2-Mounts). Diese Seite erklärt, wo ein Secret hingehört und wer es lesen und schreiben darf. Wer die Regeln kennt, findet Secrets wieder und legt sie gleich an der richtigen Stelle ab.
Gilt bisher nur im Lab (Lab-PoC). Für DEV und Produktion ist dasselbe Schema vorgesehen.
Ein Mount je Abteilung
Jede Abteilung hat einen eigenen Mount:
| Mount | Abteilung |
|---|---|
cci/ |
Cloud Core Infrastructure (CCI) |
cpi/ |
Container Platform Infrastructure (CPI) |
cpcs/ |
Container Platform Core Services (CPCS) |
cpds/ |
Container Platform DEXPRO Services (CPDS) |
Pfade
Standardschema für alle Abteilungen außer CCI:
| Pfad | Wofür |
|---|---|
<abt>/<team>/<stage>/… |
Secrets eines Teams |
<abt>/shared/<stage>/… |
Secrets der ganzen Abteilung (shared ist als Teamname reserviert) |
<abt>/<team>/<stage>/nomad/<job>/… |
Secrets eines Nomad-Jobs |
CCI ist ein Team und gliedert sich deshalb nach Standort und Projekt:
| Pfad | Wofür |
|---|---|
cci/shared/<stage>/… |
für die ganze Abteilung, z. B. zentrale DNS- oder IPAM-Zugänge |
cci/<standort>/<stage>/shared/… |
für alle Projekte eines Standorts, z. B. bremen1 |
cci/<standort>/<stage>/<projekt>/… |
nur für dieses Projekt |
<stage> ist immer der Branch-Name: pre-development, development, staging oder production. Das Lab nutzt pre-development.
Woher Stage und Team kommen
- Pipelines: Die Stage ergibt sich aus dem Branch, auf dem die Pipeline läuft, das Team aus der GitLab-Gruppe des Projekts. Beides steckt im GitLab-JWT. An
productionkommen nur Pipelines auf geschützten Branches. - Menschen: Das Team ergibt sich aus der Entra-Gruppe (in DEV, siehe Kapitel Anmeldung).
- Nomad-Jobs: Die Stage hängt am Nomad-Cluster, der Job am Job-Namen.
Metadaten an einem Secret (custom_metadata) sind nur eine Beschriftung. Sie schützen nichts. Zugriff regeln allein Pfad und Policy.
Wer darf was
| Lesen | Schreiben | Endgültig löschen | |
|---|---|---|---|
| Team-Pipeline | eigener Teampfad und shared/ der Abteilung |
eigener Teampfad (production nur von geschützten Branches) |
nein (nur Soft-Delete) |
| Mensch im Team | eigener Teampfad und shared/ |
eigener Teampfad und shared/ |
ja |
| Nomad-Job | nur …/nomad/<job>/ |
nein (Anlegen und Rotieren macht die Team-Pipeline) | nein |
| Globale OpenBao-Admins | alle KV-Mounts | alle KV-Mounts | ja |
Ausnahme CCI: Hier dürfen auch Pipelines in beide shared-Ebenen schreiben (Soft-Delete ja, endgültig löschen nein). Ein Projekt schreibt nur in seinen eigenen Projektpfad.
Die globalen Admins sind eine eigene Entra-Gruppe. Sie dürfen Secrets verwalten, aber OpenBao nicht konfigurieren (keine Policies, Anmeldeverfahren oder Mounts). Die Konfiguration entsteht als Code.
Wer Policies oder Anmeldeverfahren schreiben darf, kann sich selbst jedes Recht geben. Diese Rechte gibt es deshalb nur für die Konfiguration als Code und das Admin-Token, nie für Teams.
Weiterführend
Secret anlegen
Zielgruppe: Betreuer · Stand: 06.11.2026
Secrets entstehen auf genau zwei Wegen: Menschen legen sie nach dem Login per OIDC in der OpenBao-Oberfläche an, Pipelines schreiben sie mit ihrem GitLab-JWT. Andere Wege wie Admin-Token oder lokale Skripte sind nicht vorgesehen. Eine Anleitung für Anwender folgt, sobald es OpenBao in DEV gibt.
Lab-PoC: Der OIDC-Login (Entra ID) kommt erst mit DEV. Bis dahin entstehen Secrets im Lab nur über Pipelines.
Voraussetzungen
- Du kennst Abteilung, Team bzw. Standort und Projekt sowie die Stage (siehe Pfadschema und Teamtrennung).
- Oberfläche: Du bist Mitglied der Entra-Gruppe deines Teams und im internen Netz. OpenBao ist nie über den Edge erreichbar.
- Pipeline: Das Projekt nutzt die CI-Component
ci-components/deployment. Für das Projekt gibt es eine JWT-Rolle, die an Projekt, Branch und geschützten Branch gebunden ist.
Vorgehen: Oberfläche (OIDC)
- OpenBao-Oberfläche öffnen und als Methode OIDC wählen, dann mit dem DEXPRO-Konto anmelden.
- Den Mount deiner Abteilung öffnen, z. B.
cpds/. - Create secret wählen und als Pfad den Pfad ohne Mount eintragen, z. B.
<team>/<stage>/<name>. - Schlüssel und Werte eintragen und speichern.
Vorgehen: Pipeline (GitLab-JWT)
- Die CI-Component meldet die Pipeline per GitLab-JWT an OpenBao an und stellt das Token als
BAO_TOKENbereit. Module und Jobs melden sich nicht selbst an. - Terraform schreibt das Secret mit dem Vault-Provider (Ressource
vault_kv_secret_v2) in den eigenen Pfad, z. B. ein vonrandom_passworderzeugtes Passwort. - Die Pipeline darf nur in ihren eigenen Pfad schreiben (bei CCI auch in die
shared-Ebenen),productionnur von geschützten Branches.
Prüfen
In der Oberfläche zeigt das Secret unter Version History die neue Version mit Zeitstempel. In der Pipeline zeigt der Terraform-Plan bzw. das Apply die Ressource, aber nie den Wert.
Erscheint die neue Version mit dem erwarteten Zeitpunkt, ist das Secret angelegt.
Stolperfallen
Die Stage im Pfad muss exakt der Branch-Name sein (pre-development, nicht lab oder dev). Sonst findet die Pipeline das Secret nicht.
- Speichern in der Oberfläche legt eine neue Version an, die alle Felder ersetzt. Felder, die fehlen, sind in der neuen Version weg.
- Werte, die Terraform schreibt, stehen wie heute im Terraform-State.
- Für CCI gilt die Gliederung nach Standort und Projekt, nicht nach Team.
Weiterführend
Secret-Versionen und Löschen
Zielgruppe: Betreuer · Stand: 06.11.2026
OpenBao hebt je Secret mehrere Versionen auf, und Löschen geht in zwei Stufen. Hier steht, wie du eine alte Version zurückholst und wann ein Secret wirklich weg ist. Menschen arbeiten dafür nach dem OIDC-Login in der Oberfläche, Pipelines über Terraform.
Regeln
- Je Secret bleiben die letzten drei Versionen erhalten. Ältere werden automatisch entfernt.
- Versionen laufen nicht nach Zeit ab.
- Soft-Delete markiert eine Version als gelöscht. Sie lässt sich wiederherstellen. Pipelines und Menschen dürfen das.
- Endgültig löschen (Destroy, Metadaten löschen) dürfen nur Menschen.
Vorgehen (Oberfläche)
- Nach dem OIDC-Login das Secret öffnen und Version History wählen.
- Ältere Version zurückholen: die Version öffnen und daraus eine neue Version erstellen. Der alte Inhalt wird damit zur aktuellen Version.
- Soft-Delete / Wiederherstellen: bei der Version „Delete“ bzw. „Undelete“ wählen.
Endgültig und nicht umkehrbar: „Destroy“ löscht die Daten einer Version, das Löschen der Metadaten entfernt das Secret mit allen Versionen. Vorher prüfen, dass keine Pipeline und kein Dienst das Secret noch nutzt.
Pipelines
Pipelines dürfen laut Policy nur soft-löschen. Endgültig löschen kann nur ein Mensch in der Oberfläche.
Prüfen
In Version History sind soft-gelöschte Versionen als gelöscht markiert, zerstörte als „destroyed“.
Stolperfallen
- Eine aus einer alten Version erstellte Version zählt als neue Version. Bei drei aufbewahrten Versionen fällt dadurch die älteste heraus.
- Im Lab gibt es keine automatischen Snapshots. Was endgültig gelöscht ist, ist weg.
- Was ein Terraform-Abbau genau löscht (nur die aktuelle Version oder mehr), ist noch nicht nachgewiesen. Vor dem ersten Abbau eines Stacks mit Secrets prüfen.
Weiterführend
Anmeldung
Pipeline per GitLab-JWT anmelden
Zielgruppe: Betreuer · Stand: 06.11.2026
Pipelines melden sich mit ihrem GitLab-JWT bei OpenBao an. Sie brauchen dafür kein gespeichertes Token. Den Login übernimmt die CI-Component ci-components/deployment. Das Deployment-Repo setzt nur zwei Inputs. Eine Anleitung für Anwender folgt mit DEV.
Lab-PoC: Bisher gibt es nur das Lab-OpenBao. Die JWT-Rollen legen Betreuer an.
Voraussetzungen
- Das Repo nutzt die CI-Component
cloud-core-infrastructure/ci-components/deployment. - In OpenBao gibt es eine JWT-Rolle für das Projekt. Sie ist an Projekt, Branch und geschützten Branch gebunden.
- Der Branch ist geschützt. Alle vier Stage-Branches sollten es ohnehin sein.
- Der Runner erreicht OpenBao direkt auf Port 8200.
Vorgehen
-
Inputs im
includesetzen:include: - component: $CI_SERVER_FQDN/cloud-core-infrastructure/ci-components/deployment/terraform@<version> inputs: openbao-jwt-role: <rolle> openbao-addr: https://openbao-lab-bre1.dexpro.parts:8200<version>: Version bzw. SHA der Component, auf die das Repo pinnt<rolle>: JWT-Rolle des Projekts in OpenBao
-
Im Terraform-Code den Vault-Provider ohne Zugangsdaten konfigurieren. Er liest Adresse und Token aus der Umgebung:
provider "vault" {} -
Pipeline auf dem Stage-Branch starten.
Was dann passiert: Die Jobs plan, deploy und destroy holen sich vor tofu das JWT, prüfen die Erreichbarkeit von OpenBao und tauschen das JWT gegen ein kurzlebiges Token (15 Minuten, höchstens 1 Stunde). Es steht nur in der Shell des Jobs als BAO_TOKEN/BAO_ADDR und VAULT_TOKEN/VAULT_ADDR bereit und wird nie ausgegeben.
Prüfen
Der Job meldet den erfolgreichen Login, und plan liest die erwarteten Secrets. Ein Zugriff auf fremde Pfade oder eine andere Stage endet mit 403.
Stolperfallen
- MR-Pipelines und ungeschützte Branches melden sich nie an. OpenBao lehnt den Login ab. Mit gesetzter Rolle entfällt
planin MR-Pipelines. openbao-addrhat bewusst keinen Default. Ist die Rolle gesetzt und die Adresse leer, bricht der Job ab.- Die Adresse ist zugleich die Audience des JWT. Sie muss exakt so lauten wie in der Rolle hinterlegt.
- Module und Jobs melden sich nie selbst an. Sie lesen nur das bereitgestellte Token.
- Ist der Runner nicht freigeschaltet (Firewall auf Port 8200), scheitert schon die Erreichbarkeitsprüfung.
Weiterführend
- README der CI-Component, Abschnitt „OpenBao-Login“
- Pfadschema und Teamtrennung
- OpenBao: JWT/OIDC-Anmeldung
VMs per AppRole anmelden
Zielgruppe: Betreuer · Stand: 06.11.2026
VMs, die selbst Zertifikate oder Secrets aus OpenBao holen (heute die Lab-Consul-Server), melden sich per AppRole an. Ihre Secret-ID gilt nur von der IP-Adresse des jeweiligen Hosts aus.
Lab-PoC: Bisher nutzen nur die Lab-Consul-Server diesen Weg.
Wie es funktioniert
- Je Dienst gibt es eine AppRole, z. B. eine für alle Consul-Server.
- Für jeden Host erzeugt der Terraform-Lauf eine eigene Secret-ID. Sie ist an die Host-IP gebunden und entsteht im selben Lauf, nachdem die IP feststeht und bevor Ansible läuft.
- Die Secret-ID landet nie im Terraform-State. Sie geht über eine temporäre Datei des Runners direkt auf den Host.
- Auf dem Host liegt sie dauerhaft (nur root lesbar), damit sich der
bao agentnach einem Neustart wieder anmelden kann. Bei Consul ist das/etc/consul.d/openbao/secret-id. - Der
bao agentholt damit die Zertifikate und lädt den Dienst bei Erneuerung neu.
Vorgehen
Die Anmeldung richten Modul und Rolle ein, es gibt keine Handarbeit. Für einen neuen Dienst:
- Im Modul die AppRole-Anbindung nach dem Muster des Consul-Moduls übernehmen.
- Die AppRole und ihre Policies als Konfiguration in OpenBao anlegen.
- Deploy über die Pipeline. Die Pipeline braucht dafür eine JWT-Rolle, die Secret-IDs erzeugen darf.
Prüfen
Die Rolle bricht im Preflight ab, wenn die Secret-ID-Datei fehlt. Läuft sie durch und hat der bao agent die Zertifikate geschrieben, funktioniert die Anmeldung.
Stolperfallen
Die IP-Bindung prüft die Adresse, die OpenBao sieht. Hinter NAT (z. B. WSL) ist das eine andere als die Host-IP, und der Login scheitert.
- Bei einem Neuaufbau mit neuer IP braucht der Host eine neue Secret-ID. Die Pipeline erzeugt sie im selben Lauf.
Weiterführend
Menschen-Login
Zielgruppe: Betreuer · Stand: 06.11.2026
Menschen melden sich in DEV künftig per OIDC mit ihrem DEXPRO-Konto (Entra ID) an. Im Lab gibt es das noch nicht. Dort administrieren Betreuer OpenBao mit dem Lab-Admin-Token.
DEV und Produktion (geplant)
- Login in der OpenBao-Oberfläche über OIDC mit dem DEXPRO-Konto.
- Das Team ergibt sich aus der Entra-Gruppe. Danach richten sich die Rechte (siehe Pfadschema und Teamtrennung).
- Auf diesem Weg legen Menschen Secrets an.
Lab (heute)
Lab-PoC: Es gibt kein OIDC. Die Administration läuft über ein Admin-Token. Secrets entstehen im Lab nur über Pipelines.
- Das Admin-Token ist für die Konfiguration gedacht, nicht für den Alltag.
- Es wird nur bei Bedarf eingesetzt und nie gespeichert oder ausgegeben.
Weiterführend
Admin-, Break-glass- und Root-Token
Zielgruppe: Betreuer · Stand: 06.11.2026
Ohne Root-Token braucht OpenBao zwei Notfall-Zugänge: ein Admin-Token für die Administration und ein Reserve-Token (Break-glass) für den Fall, dass das Admin-Token verloren geht. Diese Seite erklärt, wozu die beiden da sind und was bei ihrer Pflege wichtig ist.
Ohne gültiges Admin- oder Reserve-Token gibt es nach dem Widerruf des Root-Tokens keinen normalen Rückweg mehr. Im schlimmsten Fall muss OpenBao neu aufgebaut werden. Beide Token müssen deshalb immer gültig sein.
Die drei Token
| Token | Zweck | Rechte |
|---|---|---|
| Root-Token | nur bei der Erstinstallation | alles; im Lab nach der Einrichtung widerrufen |
| Admin-Token | Administration und Konfiguration | Administration, ohne Zugriff auf Raw-Daten und ohne Versiegeln |
| Reserve-Token (Break-glass) | Notfall: neues Root-Token erzeugen | nur das Erzeugen eines Root-Tokens und die Pflege des eigenen Tokens |
Admin- und Reserve-Token sind periodische Token ohne Elterntoken mit 90 Tagen Periode. Sie laufen nur dann nicht ab, wenn sie rechtzeitig erneuert werden.
Pflege
- Beide Token spätestens alle 90 Tage erneuern, empfohlen alle 60 Tage. Eine Prüfung warnt unter 30 Tagen Restlaufzeit.
- Token nur bei Bedarf und nur verdeckt einsetzen, nie in Dateien, Logs oder Tickets schreiben.
Stolperfallen
Die Obergrenze für Token-Laufzeiten am Token-Mount (max_lease_ttl) kappt die Periode still. Mit dem Standardwert läuft ein „90-Tage“-Token nach etwa 32 Tagen ab. Die Obergrenze ist deshalb auf 90 Tage angehoben. Nebenwirkung: Auch andere Token aus diesem Mount dürfen bis 90 Tage laufen.
- Auch das Erzeugen eines neuen Root-Tokens braucht ein Token mit passendem Recht, also das Reserve-Token. Fehlt es, bleibt nur ein Notweg über eine Listener-Option auf einem Knoten. Dieser Weg ist nur im Lab erprobt und darf nur kurz und mit Freigabe genutzt werden.
Weiterführend
PKI
Offline-Root-CA und Intermediates
Zielgruppe: Betreuer · Stand: 06.11.2026
OpenBao ist die zentrale Zertifizierungsstelle (CA) der Plattform. Die Root-CA bleibt offline. In OpenBao arbeiten nur Intermediate-CAs, und zwar eine je Zweck. Diese Seite erklärt den Aufbau und warum er so gewählt ist.
Lab-PoC: Bisher gibt es die Root-CA des Labs und ein Intermediate für Consul.
Aufbau
| Ebene | Wo | Laufzeit | Eigenschaften |
|---|---|---|---|
| Root-CA | offline, nie auf einer VM, nie im Terraform-State, nie in OpenBao | 10 Jahre | ECDSA P-384, darf nur eine Ebene Intermediates signieren |
| Intermediate je Zweck | eigener PKI-Mount in OpenBao, z. B. pki-consul |
3–5 Jahre | Schlüssel verlässt OpenBao nie, Namen per Name Constraints begrenzt |
| Zertifikate (Leaf) | auf den Hosts | kurz, z. B. Consul 30 Tage | werden automatisch erneuert |
Geplante weitere Intermediates: Nomad-TLS und Consul-Connect.
Wie ein Intermediate entsteht
- OpenBao erzeugt im neuen PKI-Mount Schlüssel und CSR. Der Schlüssel bleibt in OpenBao.
- Die Root-CA signiert die CSR offline auf einem abgeschotteten Rechner, in einem Speicher, der beim Ausschalten verschwindet.
- Das signierte Zertifikat wird in OpenBao importiert.
- Rollen im Mount legen fest, welche Namen und IPs Zertifikate bekommen dürfen.
Der Root-Schlüssel ist verschlüsselt in Bitwarden gesichert und wird nur zum Signieren kurz geladen.
Öffentliche CA-Daten
CA-Zertifikat, Kette und Sperrliste eines Mounts sind ohne Token abrufbar, z. B. für Clients, die der CA vertrauen sollen:
curl -s https://openbao-lab-bre1.dexpro.parts:8200/v1/pki-consul/ca_chain
Stolperfallen
IP-Adressen in Rollen begrenzt nur das Feld allowed_ip_sans_cidr. Ein Feld allowed_ip_sans wird still ignoriert, und allow_ip_sans=true allein erlaubt beliebige IPs. Nach jeder Rollenänderung mit einer unerlaubten IP gegenprüfen (Erwartung: HTTP 400).
- Läuft ein Intermediate ab, sind alle Zertifikate darunter wertlos. Die Restlaufzeit braucht deshalb eine Überwachung.
- Leaf-Zertifikate sollen alarmieren, wenn sie weniger als 14 Tage gelten.
Weiterführend
Consul-Zertifikate aus OpenBao
Zielgruppe: Betreuer · Stand: 06.11.2026
Die Lab-Consul-Server holen ihre TLS-Zertifikate aus OpenBao und erneuern sie selbst. Die Consul-Clients bekommen ihre Zertifikate von den Servern. Diese Seite beschreibt den Ablauf. Das spätere Consul-Buch verlinkt hierher.
Lab-PoC: Die Lab-Consul-Server sind auf diesem Weg neu aufgebaut. Die ACL-Einrichtung ist noch nicht abgeschlossen, weil sie an der abgebauten Lab-Nomad-Anmeldung hängt.
Ablauf
- Das Terraform-Modul
proxmox/consullegt je Server eine an die Host-IP gebundene AppRole-Secret-ID an (siehe VMs per AppRole anmelden). - Die Ansible-Rolle
consulinstalliertbaound richtet denbao agentein. - Der Agent holt aus dem Mount
pki-consulZertifikat und Schlüssel (Server-Zertifikat fürserver.<dc>.consulund den FQDN des Hosts, Laufzeit 90 Tage) und lädt Consul bei jeder Erneuerung neu. - Clients holen ihre Zertifikate per
auto_encryptvom Server und brauchen nur die CA-Kette. Die Kette liest das Modul ohne Token aus OpenBao. - Gossip-Key und ACL-Bootstrap-Token spiegelt das Modul zusätzlich nach OpenBao (KV-Mount
consul/). Im Lab bleibt Bitwarden dafür führend, in DEV soll OpenBao allein die Quelle sein.
Versionen
- Modul
proxmox/consul: Linie 0.3 nur mit dem OpenBao-Weg, ab 0.3.1. Version 0.3.0 nicht verwenden, sie enthält noch den alten Stand. Die Linie 0.2 bleibt für den Bestand. - Die Pipeline des Stacks braucht
BAO_TOKENper GitLab-JWT (siehe Pipeline per GitLab-JWT anmelden) sowiecurlundjqim Runner-Image.
Prüfen
Der bao agent schreibt nach jedem Rendern eine Statusdatei unter /etc/consul.d/openbao/. Consul antwortet auf Port 8501 mit einem Zertifikat aus pki-consul.
Stolperfallen
Für Zertifikat, Schlüssel und CA nur eine template-Stanza mit pkiCert verwenden. Drei Stanzas stellen drei verschiedene Zertifikate aus, und Schlüssel und Zertifikat passen nicht zusammen.
.CAChaingibt es im Template nicht.ca.pemist das Intermediate, den Root-Anteil bringt das Modul-Bundle zu den Clients.- Lokale Verbindungen laufen über
127.0.0.1, nie überlocalhost. Das Zertifikat enthält keinenlocalhost-Namen. - Connect-CA über OpenBao ist noch offen. Ob der Vault-Provider von Consul mit OpenBao funktioniert, ist nicht belegt.
Weiterführend
Betrieb
Snapshot und Restore
Zielgruppe: Betreuer · Stand: 06.11.2026
Ein Raft-Snapshot sichert alle Daten von OpenBao: Secrets, Konfiguration und PKI. Im Lab ist belegt, dass sich ein Snapshot in eine leere Instanz zurückspielen lässt.
Lab-PoC: Im Lab gibt es keine automatischen Snapshots, nur das tägliche Proxmox-Backup der VMs. Für Produktion sind automatische Snapshots außerhalb der Knoten Pflicht.
Voraussetzungen
- Admin-Token (siehe Admin-, Break-glass- und Root-Token).
- Für den Restore: der Seal-Schlüssel der Zielinstanz. Er steckt nicht im Snapshot.
Vorgehen
-
Snapshot erstellen:
bao operator raft snapshot save <datei> -
Snapshot sicher ablegen. Er enthält alle Secrets, verschlüsselt mit dem Seal.
-
Restore in eine Instanz:
bao operator raft snapshot restore <datei><datei>: Pfad zur Snapshot-Datei
Ein Restore überschreibt alle Daten der Zielinstanz. Vorher von der Zielinstanz selbst einen Snapshot ziehen.
Prüfen
Nach dem Restore zeigt bao operator raft list-peers alle Knoten, und ein bekanntes Secret ist mit der erwarteten Version lesbar.
Stolperfallen
- Der Seal-Schlüssel darf nur kurz und nur im Arbeitsspeicher als Datei vorliegen (z. B. unter
/dev/shm) und wird danach gelöscht. - Ohne passenden Seal-Schlüssel lässt sich ein Snapshot nicht nutzen.
Weiterführend
Konfiguration als Code
Zielgruppe: Betreuer · Stand: 06.11.2026
Die Konfiguration von OpenBao (Mounts, Policies, Anmeldeverfahren und Rollen) entsteht als Code, nicht von Hand in der Oberfläche. Heute erledigen das Skripte, später Terraform aus einer Teamliste.
Was konfiguriert wird
- KV-Mounts je Abteilung und ihre Aufbewahrung (drei Versionen)
- PKI-Mounts und ihre Rollen
- Policies je Team bzw. Projekt
- JWT-Rollen für Pipelines, AppRoles für VMs, später OIDC für Menschen
Regeln
- Trockenlauf ist der Default. Änderungen werden erst nach Freigabe angewendet.
- Jede Änderung wird vorher in einer Wegwerf-Instanz ohne Netz getestet.
- Token kommen nur zur Laufzeit dazu und werden nie gespeichert oder ausgegeben.
- Teams bekommen nie Rechte auf Policies oder Anmeldeverfahren (siehe Pfadschema und Teamtrennung).
Zielbild
Eine Teamliste ist die einzige Quelle. Aus ihr erzeugt Terraform mit dem Vault-Provider Policies, JWT-Rollen, Entra-Gruppenzuordnungen und später auch Nomad-Bindungen. Die Namen leiten sich nach einem festen Muster ab, z. B. Policy <abt>-<team> und JWT-Rolle <abt>-<team>-ci. Für CCI gilt das Muster je Standort und Projekt.
Die Skripte und die spätere Terraform-Konfiguration kommen in ein Repository. Diese Seite verlinkt sie, sobald sie dort liegen.
Weiterführend
Listener-Zertifikat
Zielgruppe: Betreuer · Stand: 06.11.2026
Der Listener von OpenBao nutzt das Wildcard-Zertifikat *.dexpro.parts. Jeder Knoten holt es selbst und lädt OpenBao neu, sobald ein neues Zertifikat da ist. Der Reload ist allerdings noch nie im Ernstfall gelaufen.
Das aktuelle Zertifikat gilt bis 04.12.2026. Bis dahin müssen Reload-Test und Überwachung erledigt sein.
Wie es funktioniert
- Das Modul bindet
certmanagerein. Jeder Knoten holt das Zertifikat vom SSL-Service nach/var/certmanager/certs/. - Ein Timer prüft täglich um 03:00 Uhr. Gilt das Zertifikat weniger als 7 Tage, wird es ersetzt.
- Eine systemd-Path-Unit (
openbao-cert-reload.path) bemerkt die Änderung und lädt OpenBao neu (systemctl reload openbao).
Prüfen
echo | openssl s_client -connect openbao-lab-bre1.dexpro.parts:8200 2>/dev/null | openssl x509 -noout -enddate
Das Ablaufdatum muss auf allen drei Knoten gleich sein und nach dem Erneuern weiter in der Zukunft liegen.
Stolperfallen
- Der Weg „Zertifikat ersetzt → Path-Unit → Reload → neues Zertifikat am Listener“ ist nicht getestet. Offen ist, ob die Path-Unit Schreiben und Umbenennen gleichermaßen erkennt und ob OpenBao das Listener-Zertifikat beim Reload neu lädt.
- Es gibt noch keine Überwachung der Restlaufzeit. Vorgesehen: Warnung bei 21 Tagen, kritisch bei 7 Tagen, je Knoten.
- Die Erneuerung setzt voraus, dass der SSL-Service rechtzeitig ein neues Zertifikat bereithält.
- Das Wildcard deckt nur eine Ebene ab. Namen wie
openbao.lab.bre1.dexpro.partspassen nicht.