CreaRack-SL

StoredCredential · Modelo core

Entidadactiveverificado 2026-04-21#core#model#security#credentials#fernet

StoredCredential · Modelo core

Propósito

StoredCredential es el almacén central de credenciales de red cifradas. Permite guardar y reutilizar credenciales SNMP v2c, SNMP v3, SSH y HTTP entre distintas apps (monitoring, signage, network) sin exponer valores en claro. Introducido en v1.0.47 según comentario de bloque en core/models.py.

Contrato

Campos:

CampoTipoNotas
organizationFK(Organization)Aislamiento SaaS por tenant
nameCharField(200)Único por organización (unique_together)
credential_typeCharField, choicessnmp_v2, snmp_v3, ssh, multi
encrypted_dataJSONFieldBlob JSON con valores cifrados + claros mezclados
created_byFK(User, null)Auditoría
created_at / updated_atDateTimeFieldAuto-gestionados

Secciones — atributo de clase _SECTION_KEYS:

SecciónClaves
snmp_v2community
snmp_v3snmp_v3_username, auth_protocol, auth_key, priv_protocol, priv_key
sshssh_username, ssh_password, enable_password
httphttp_username, http_password

Los valores sensibles (community, auth_key, ssh_password, etc.) se almacenan cifrados; los no-sensibles (nombres de usuario, protocolos) se guardan en claro dentro del mismo JSONField.

Métodos públicos:

  • get_section(section_name) — devuelve dict con valores en claro para una sección. Internamente delega a CredentialManager.safe_decrypt.

Dependencias entrantes

ArchivoUso
core/credential_api.pyAPI Ninja con CRUD completo (list, create, update, delete, decrypt); único punto de escritura/lectura REST
monitoring/api/signage/deploy.pyItera StoredCredential.objects.filter(organization=org) buscando sección HTTP en deploys
signage/services/deployment.pyImporta CredentialManager para descifrar credenciales en control de displays
signage/services/display_control/controller.pyImporta CredentialManager para reboot de players

Dependencias salientes

  • core/security/credential_manager.py — clase CredentialManager con métodos:
    • _get_cipher() — deriva clave Fernet desde settings.SECRET_KEY (SHA-256 + base64 URL-safe). Lanza RuntimeError si falta.
    • encrypt_credential(plaintext) / decrypt_credential(ciphertext) — cifrado individual, con fallback a DEV_KEY para migración.
    • encrypt_dict(d) / decrypt_dict(d, keys) — batch.
    • safe_decrypt(value, field_name) — sin excepciones, devuelve None en fallo.
    • is_encrypted(value) — detecta tokens Fernet por prefijo gAAAAA.
    • mask_credential(plaintext) — enmascarado para UI.

Ejemplos

# 1. SAVE: cifrar y persistir (core/credential_api.py)
encrypted = CredentialManager.encrypt_dict({
    "ssh_password": "s3cr3t",
    "ssh_username": "admin",
})
cred = StoredCredential.objects.create(
    organization=org,
    name="Switch-Core",
    credential_type="multi",
    encrypted_data=encrypted,
    created_by=request.user,
)

# 2. FETCH + DECRYPT: obtener sección en claro
cred = StoredCredential.objects.get(name="Switch-Core", organization=org)
ssh_data = cred.get_section("ssh")
# → {"username": "admin", "password": "s3cr3t", "enable_password": ""}
  • entity--core--model--organization — cada credencial pertenece a un único tenant.
  • concept--security--fernet-encryption — algoritmo de cifrado simétrico.
  • concept--network--auto-provision — flujo que consume credenciales SSH/SNMP.

Véase también

  • [[entity—core—model—organization]]
  • [[concept—security—fernet-encryption]]
  • [[concept—network—auto-provision]]