CreaRack-SL

Rotación de claves (seguridad)

Definición

Rotación de claves es el proceso de reemplazar una clave criptográfica activa por una nueva, retirando la anterior del uso futuro. En sistemas críticos, es una práctica de higiene de seguridad obligatoria para mitigar:

  • Exposición accidental: Si la clave quedó registrada en logs, transcripts, backups o se filtró
  • Envejecimiento: Claves generadas sin mecanismos automáticos pueden comprometerse con el tiempo
  • Cumplimiento: Políticas de seguridad a menudo exigen rotación periódica

Patrón genérico

  1. Generación: Nueva clave creada mediante RNG seguro (fuera del sistema si es posible)
  2. Instalación: Nueva clave se activa; anterior se marca como “en rotación”
  3. Migración: Todos los datos cifrados con la antigua se re-cifran con la nueva
  4. Transición: Durante migración, el sistema intenta descifrar con ambas (nueva + antigua)
  5. Limpieza: Antigua se borra completamente tras verificar migración exitosa

Ventaja cero-downtime

Si la migración usa una cadena de descifrado que intenta múltiples claves en orden:

try_decrypt(plaintext, [nueva, antigua, legacy, rescue])

Entonces:

  • Nuevas escrituras usan la clave nueva (rápido, primer intento)
  • Lecturas de datos antiguos todavía funcionan (fallback a antigua)
  • No hay interrupciones de servicio

Antipatrones

  • Sin mechanism de fallback: Cambiar la clave activa sin soporte de descifrado con la anterior → todas las credenciales viejas quedan ilegibles
  • Rotación sin test: No validar que todo ciphertext antiguo se migró correctamente
  • Clave antigua no borrada: Mantener claves antiguas indefinidamente aumenta la superficie de ataque
  • Rotación manual sin automación: Propenso a olvidos, inconsistencias o downtime

En CreaRack Pro

Implementado en [[feature—security—credential-key-rotation]] para credenciales de acceso a sistemas externos (Credential model).

Mecanismo específico:

  • Variable CREDENTIAL_ENCRYPTION_KEY_OLD almacena la clave anterior
  • CredentialManager._decryption_chain() intenta descifrar en orden: activa → OLD → SECRET_KEY → DEV_KEY
  • Comando manage.py reencrypt_credentials migra los ciphertexts
  • Tras migración, CREDENTIAL_ENCRYPTION_KEY_OLD se limpia

Véase también

  • [[feature—security—credential-key-rotation]]
  • [[entity—core—config—credential-encryption-key-old]]
  • [[entity—core—service—credential-manager]]
  • [[concept—security—credential-encryption]]