CI/CD-Integrationsmuster
Das Standardmuster für die Passwork-CI/CD-Integration:
Pipeline runner → passwork-cli exec → deploy/build script with secrets in ENV
Nur drei Passwork-Anmeldedaten liegen im eigenen Secret-Speicher der CI/CD-Plattform: PASSWORK_HOST, PASSWORK_TOKEN und PASSWORK_MASTER_KEY. Alles andere — Datenbankpasswörter, API-Schlüssel, Cloud-Anmeldedaten — liegt in Passwork und wird zur Laufzeit eingeschleust.
Gestaltungsprinzipien
Ein Service-Account pro Pipeline-Typ
Eine Produktions-Deploy-Pipeline und eine Staging-Deploy-Pipeline sollten unterschiedliche Service-Accounts mit Zugriff auf die jeweiligen Umgebungen verwenden. Dies begrenzt den Schadensradius, falls ein Token geleakt wird.
Nur Lesen als Standard-Zugangslevel
Gewähren Sie allen Service-Accounts Nur Lesen, es sei denn, die Pipeline rotiert explizit Anmeldedaten — in diesem Fall wird Lesen und Bearbeiten benötigt.
Secrets niemals ausgeben
CI/CD-Plattformen erfassen stdout und stderr in den Job-Logs. Verwenden Sie in Pipeline-Schritten niemals echo $SECRET oder printenv | grep SECRET. Nutzen Sie Secrets nur als Argumente für Befehle.
Ordner-ID statt Element-IDs verwenden
Strukturieren Sie Ihren Tresor so, dass eine Pipeline --folder-id verwenden kann, um alle ihre Secrets von einem Ort zu erhalten. Das Hardcoding einzelner --password-id-Werte ist nur gerechtfertigt, wenn Sie ein einzelnes bestimmtes Anmeldedatum benötigen.
GitLab CI
Einrichtung
Fügen Sie unter Settings → CI/CD → Variables Folgendes hinzu (alle auf Protected und, wo zutreffend, Masked gesetzt):
| Variable | Typ | Maskiert |
|---|---|---|
PASSWORK_HOST | Variable | Nein |
PASSWORK_TOKEN | Variable | Ja |
PASSWORK_MASTER_KEY | Variable | Ja |
PROD_SECRETS_FOLDER_ID | Variable | Nein |
STAGING_SECRETS_FOLDER_ID | Variable | Nein |
Grundlegende Pipeline
stages:
- deploy
deploy_production:
stage: deploy
image: passwork/passwork-cli:latest
variables:
PASSWORK_HOST: $PASSWORK_HOST
PASSWORK_TOKEN: $PASSWORK_TOKEN
PASSWORK_MASTER_KEY: $PASSWORK_MASTER_KEY
script:
- passwork-cli exec --folder-id "$PROD_SECRETS_FOLDER_ID" ./deploy.sh
environment:
name: production
when: manual
only:
- main
Pipeline für mehrere Umgebungen
.deploy_template: &deploy_template
image: passwork/passwork-cli:latest
variables:
PASSWORK_HOST: $PASSWORK_HOST
PASSWORK_TOKEN: $PASSWORK_TOKEN
PASSWORK_MASTER_KEY: $PASSWORK_MASTER_KEY
script:
- passwork-cli exec --folder-id "$SECRETS_FOLDER_ID" ./deploy.sh
deploy_staging:
<<: *deploy_template
stage: deploy
variables:
SECRETS_FOLDER_ID: $STAGING_SECRETS_FOLDER_ID
environment:
name: staging
only:
- develop
deploy_production:
<<: *deploy_template
stage: deploy
variables:
SECRETS_FOLDER_ID: $PROD_SECRETS_FOLDER_ID
environment:
name: production
when: manual
only:
- main
GitHub Actions
Einrichtung
Unter Settings → Secrets and variables → Actions:
- Secrets (verschlüsselt):
PASSWORK_HOST,PASSWORK_TOKEN,PASSWORK_MASTER_KEY - Variables (im Klartext):
PROD_SECRETS_FOLDER_ID,STAGING_SECRETS_FOLDER_ID
Grundlegender Workflow
name: Deploy
on:
push:
branches: [main]
jobs:
deploy:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- name: Deploy with secrets from Passwork
run: |
docker run --rm \
-e PASSWORK_HOST="${{ secrets.PASSWORK_HOST }}" \
-e PASSWORK_TOKEN="${{ secrets.PASSWORK_TOKEN }}" \
-e PASSWORK_MASTER_KEY="${{ secrets.PASSWORK_MASTER_KEY }}" \
-v ${{ github.workspace }}:/app \
-w /app \
passwork/passwork-cli:latest \
exec --folder-id "${{ vars.PROD_SECRETS_FOLDER_ID }}" ./deploy.sh
Workflow für mehrere Umgebungen
jobs:
deploy:
runs-on: ubuntu-latest
environment: ${{ github.ref == 'refs/heads/main' && 'production' || 'staging' }}
steps:
- uses: actions/checkout@v4
- name: Deploy
run: |
docker run --rm \
-e PASSWORK_HOST="${{ secrets.PASSWORK_HOST }}" \
-e PASSWORK_TOKEN="${{ secrets.PASSWORK_TOKEN }}" \
-e PASSWORK_MASTER_KEY="${{ secrets.PASSWORK_MASTER_KEY }}" \
-v ${{ github.workspace }}:/app \
-w /app \
passwork/passwork-cli:latest \
exec --folder-id "${{ vars.SECRETS_FOLDER_ID }}" ./deploy.sh
Bitbucket Pipelines
image: passwork/passwork-cli:latest
pipelines:
branches:
main:
- step:
name: Deploy to production
deployment: production
script:
- passwork-cli exec --folder-id "$PROD_SECRETS_FOLDER_ID" ./deploy.sh
Konfigurieren Sie PASSWORK_HOST, PASSWORK_TOKEN, PASSWORK_MASTER_KEY und die Ordner-IDs unter Repository settings → Pipelines → Repository variables (markieren Sie die Tokens als Secured).
Kubernetes
Init-Container-Muster
Ein Init-Container ruft die Secrets ab, bevor die Hauptanwendung startet, und schreibt sie in ein gemeinsames In-Memory-Volume. Der Hauptcontainer liest aus diesem Volume.
apiVersion: v1
kind: Pod
metadata:
name: order-service
spec:
initContainers:
- name: fetch-secrets
image: passwork/passwork-cli:latest
env:
- name: PASSWORK_HOST
valueFrom:
secretKeyRef:
name: passwork-credentials
key: host
- name: PASSWORK_TOKEN
valueFrom:
secretKeyRef:
name: passwork-credentials
key: token
- name: PASSWORK_MASTER_KEY
valueFrom:
secretKeyRef:
name: passwork-credentials
key: master-key
command:
- sh
- -c
- passwork-cli exec --folder-id "$SECRETS_FOLDER_ID" env > /secrets/.env
volumeMounts:
- name: secrets-volume
mountPath: /secrets
containers:
- name: app
image: order-service:latest
command:
- sh
- -c
- |
set -a && source /secrets/.env && set +a
exec ./app
volumeMounts:
- name: secrets-volume
mountPath: /secrets
readOnly: true
volumes:
- name: secrets-volume
emptyDir:
medium: Memory # in-memory only — not written to disk
Das Kubernetes Secret passwork-credentials enthält nur die Passwork-Bootstrap-Tokens.
Sidecar-Muster für periodische Aktualisierung
Wenn Secrets häufig rotiert werden, aktualisiert ein Sidecar-Container die .env-Datei, ohne den Pod neu zu starten:
containers:
- name: app
image: order-service:latest
# app reloads /secrets/.env when it detects a change (via inotify or polling)
- name: secrets-sync
image: passwork/passwork-cli:latest
env:
- name: PASSWORK_HOST
valueFrom:
secretKeyRef:
name: passwork-credentials
key: host
- name: PASSWORK_TOKEN
valueFrom:
secretKeyRef:
name: passwork-credentials
key: token
- name: PASSWORK_MASTER_KEY
valueFrom:
secretKeyRef:
name: passwork-credentials
key: master-key
command:
- sh
- -c
- |
while true; do
passwork-cli exec --folder-id "$SECRETS_FOLDER_ID" env > /secrets/.env.new
mv /secrets/.env.new /secrets/.env
sleep 300
done
volumeMounts:
- name: secrets-volume
mountPath: /secrets
Audit-Trail
Jeder Secret-Zugriff durch einen Service-Account wird in Passworks Aktionshistorie unter der Identität des Service-Accounts erfasst. Dies liefert Ihnen einen vollständigen, zentralisierten Audit-Trail:
- Welche Pipeline welche Anmeldedaten wann abgerufen hat
- Welches Rotationsskript welches Element aktualisiert hat
- Jeder Zugriff außerhalb der erwarteten Muster (potenzielle Alarmauslöser)
Navigieren Sie zu Settings → Activity log und filtern Sie nach dem Benutzernamen des Service-Accounts, um dessen Aktivität zu überprüfen.
Die vollständige Referenz zur CI/CD-Integration finden Sie unter CI/CD- und Infrastruktur-Integrationen.