Zum Hauptinhalt springen

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):

VariableTypMaskiert
PASSWORK_HOSTVariableNein
PASSWORK_TOKENVariableJa
PASSWORK_MASTER_KEYVariableJa
PROD_SECRETS_FOLDER_IDVariableNein
STAGING_SECRETS_FOLDER_IDVariableNein

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.