Saltar al contenido principal

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

VariableTipoEnmascarada
PASSWORK_HOSTVariableNo
PASSWORK_TOKENVariable
PASSWORK_MASTER_KEYVariable
PROD_SECRETS_FOLDER_IDVariableNo
STAGING_SECRETS_FOLDER_IDVariableNo

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.