rotation
path: secret-management/rotation.mdx title: Prácticas de rotación de secretos slug: /secret-management/rotation pagination_next: secret-management/integrations pagination_prev: secret-management/python-sdk sidebar_position: 5 description: >- Esquemas prácticos de rotación de secretos en infraestructura con actualizaciones a los sistemas de destino y Passwork mediante CLI y Python SDK. keywords:
- Passwork
- secret rotation
- passwork-cli
- Python
- automation
Por qué rotar secretos
La rotación regular de secretos ayuda a mitigar riesgos:
| Riesgo | Cómo ayuda la rotación |
|---|---|
| Filtración de contraseña | Una contraseña comprometida se invalida rápidamente |
| Tokens de larga duración | Tiempos de vida más cortos reducen la ventana de ataque |
| Amenazas internas | Los exempleados pierden acceso después de la rotación |
| Requisitos de cumplimiento | Estándares como PCI DSS y SOC 2 exigen cambios regulares de contraseña |
Flujo de trabajo de rotación
┌─────────────────────────────────────────────────────────────┐
│ 1. Generate 2. Target system 3. Passwork │
│ new password (update) (save) │
│ │
│ openssl rand ──► ALTER ROLE ... ──────► passwork-cli update│
└─────────────────────────────────────────────────────────────┘
Importante: orden de las operaciones
Primero actualice la contraseña en el sistema de destino (base de datos, servicio), luego guárdela en Passwork. De lo contrario, tendrá una discrepancia: Passwork contiene la nueva contraseña mientras el sistema aún utiliza la antigua.
Rotación mediante CLI
PostgreSQL
#!/bin/bash
set -e
ITEM_ID="<item-id>"
DB_USER="order_service"
# 1. Generate new password
NEW_PASS=$(openssl rand -base64 32)
# 2. Apply to PostgreSQL
psql -h pg.prod.internal -U postgres -d postgres -c \
"ALTER ROLE ${DB_USER} WITH PASSWORD '${NEW_PASS}';"
# 3. Store in Passwork
passwork-cli update --password-id "${ITEM_ID}" --password "${NEW_PASS}"
echo "Password rotated for ${DB_USER}"
MySQL
#!/bin/bash
set -e
ITEM_ID="<item-id>"
DB_USER="inventory_svc"
NEW_PASS=$(openssl rand -base64 32)
mysql -h mysql.prod.internal -u root -p"${MYSQL_ROOT_PASSWORD}" -e \
"ALTER USER '${DB_USER}'@'%' IDENTIFIED BY '${NEW_PASS}';"
passwork-cli update --password-id "${ITEM_ID}" --password "${NEW_PASS}"
echo "Password rotated for ${DB_USER}"
Clave de API
#!/bin/bash
set -e
ITEM_ID="<item-id>"
# 1. Request a new key from the external service
NEW_KEY=$(curl -s -X POST https://api.service.com/keys/rotate \
-H "Authorization: Bearer ${OLD_KEY}" | jq -r '.new_key')
# 2. Store in Passwork
passwork-cli update --password-id "${ITEM_ID}" --password "${NEW_KEY}"
echo "API key rotated"
Rotación mediante Python SDK
Ejemplo completo con manejo de errores:
#!/usr/bin/env python3
"""PostgreSQL password rotation script."""
import os
import secrets
import sys
import psycopg2
from passwork import Client
def rotate_password(item_id: str, db_user: str) -> bool:
"""
Rotate the password for a PostgreSQL user.
Returns:
True on success, False on failure.
"""
client = Client(
url=os.environ["PASSWORK_HOST"],
token=os.environ["PASSWORK_TOKEN"],
)
# Fetch admin credentials from Passwork
admin_item = client.get_password(
item_id=os.environ["PG_ADMIN_ITEM_ID"]
)
# Create new password
new_password = secrets.token_urlsafe(32)
try:
# Connect to PostgreSQL
conn = psycopg2.connect(
host=admin_item.fields["PG_HOST"],
dbname="postgres",
user=admin_item.login,
password=admin_item.password,
)
conn.autocommit = True
# Apply new password
with conn.cursor() as cur:
cur.execute(
"ALTER ROLE %s WITH PASSWORD %s",
(db_user, new_password)
)
conn.close()
# Persist to Passwork
item = client.get_password(item_id=item_id)
item.password = new_password
client.update_password(item)
print(f"Password rotated for {db_user}")
return True
except psycopg2.Error as e:
print(f"Database error: {e}", file=sys.stderr)
return False
except Exception as e:
print(f"Error: {e}", file=sys.stderr)
return False
if __name__ == "__main__":
success = rotate_password(
item_id=os.environ["TARGET_ITEM_ID"],
db_user=os.environ["PG_USER"],
)
sys.exit(0 if success else 1)
Programación de la rotación
Tarea cron
# /etc/cron.d/passwork-rotation
# Rotate DB passwords every Sunday at 3:00 AM
0 3 * * 0 passwork /opt/scripts/rotate-db-passwords.sh >> /var/log/rotation.log 2>&1
Recomendaciones
Frecuencia de rotación
| Tipo de secreto | Frecuencia sugerida |
|---|---|
| Contraseñas de BD de producción | 30–90 días |
| Claves de API de servicios externos | 90 días o según la política del proveedor |
| Tokens de servicio | 7–30 días |
| Claves SSH | 6–12 meses |