Patrones de integración de CI/CD
El patrón estándar para la integración de Passwork con CI/CD:
Ejecutor de la canalización → passwork-cli exec → script de despliegue/compilación con los secretos en ENV
Solo tres credenciales de Passwork residen en el propio almacenamiento de secretos de la plataforma de CI/CD: PASSWORK_HOST, PASSWORK_TOKEN y PASSWORK_MASTER_KEY. Todo lo demás —contraseñas de bases de datos, claves de API, credenciales de la nube— reside en Passwork y se inyecta en tiempo de ejecución.
Principios de diseño
Una cuenta de servicio por tipo de canalización
Una canalización de despliegue de producción y una de despliegue de staging deben utilizar cuentas de servicio diferentes con acceso a sus respectivos entornos. Esto limita el radio de impacto si se filtra un token.
Solo lectura como nivel de acceso predeterminado
Conceda Solo lectura a todas las cuentas de servicio, a menos que la canalización rote credenciales explícitamente, en cuyo caso se necesita Leer y editar.
Nunca muestre los secretos con echo
Las plataformas de CI/CD capturan stdout y stderr en los registros de tareas. Nunca ejecute echo $SECRET ni printenv | grep SECRET en los pasos de la canalización. Utilice los secretos únicamente como argumentos de los comandos.
Utilice el ID de carpeta, no los ID de elemento
Estructure su bóveda de modo que una canalización pueda utilizar --folder-id para obtener todos sus secretos desde un único lugar. Codificar valores individuales de --password-id solo se justifica cuando necesita una única credencial específica.
GitLab CI
Configuración
En Configuración → CI/CD → Variables, añada (todas configuradas como Protegidas y Enmascaradas cuando proceda):
| Variable | Tipo | Enmascarada |
|---|---|---|
PASSWORK_HOST | Variable | No |
PASSWORK_TOKEN | Variable | Sí |
PASSWORK_MASTER_KEY | Variable | Sí |
PROD_SECRETS_FOLDER_ID | Variable | No |
STAGING_SECRETS_FOLDER_ID | Variable | No |
Canalización básica
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
Canalización multientorno
.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
Configuración
En Settings → Secrets and variables → Actions:
- Secrets (cifrados):
PASSWORK_HOST,PASSWORK_TOKEN,PASSWORK_MASTER_KEY - Variables (en texto plano):
PROD_SECRETS_FOLDER_ID,STAGING_SECRETS_FOLDER_ID
Flujo de trabajo básico
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
Flujo de trabajo multientorno
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
Configure PASSWORK_HOST, PASSWORK_TOKEN, PASSWORK_MASTER_KEY y los ID de carpeta en Repository settings → Pipelines → Repository variables (marque los tokens como Secured).
Kubernetes
Patrón de contenedor init
Un contenedor init obtiene los secretos antes de que se inicie la aplicación principal y los escribe en un volumen compartido en memoria. El contenedor principal lee de ese volumen.
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
El Secret de Kubernetes passwork-credentials contiene únicamente los tokens de arranque (bootstrap) de Passwork.
Patrón sidecar para actualización periódica
Cuando los secretos rotan con frecuencia, un contenedor sidecar actualiza el archivo .env sin reiniciar el pod:
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
Rastro de auditoría
Cada acceso a un secreto por parte de una cuenta de servicio se registra en el historial de acciones de Passwork con la identidad de la cuenta de servicio. Esto le proporciona un rastro de auditoría completo y centralizado:
- Qué canalización obtuvo qué credenciales y cuándo
- Qué script de rotación actualizó qué elemento
- Cualquier acceso fuera de los patrones esperados (candidatos a alerta)
Vaya a Configuración → Registro de actividad y filtre por el nombre de usuario de la cuenta de servicio para revisar su actividad.
Para consultar la referencia completa de integración de CI/CD, consulte Integraciones de CI/CD e infraestructura.