StoredCredential · Modelo core
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:
| Campo | Tipo | Notas |
|---|---|---|
organization | FK(Organization) | Aislamiento SaaS por tenant |
name | CharField(200) | Único por organización (unique_together) |
credential_type | CharField, choices | snmp_v2, snmp_v3, ssh, multi |
encrypted_data | JSONField | Blob JSON con valores cifrados + claros mezclados |
created_by | FK(User, null) | Auditoría |
created_at / updated_at | DateTimeField | Auto-gestionados |
Secciones — atributo de clase _SECTION_KEYS:
| Sección | Claves |
|---|---|
snmp_v2 | community |
snmp_v3 | snmp_v3_username, auth_protocol, auth_key, priv_protocol, priv_key |
ssh | ssh_username, ssh_password, enable_password |
http | http_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 aCredentialManager.safe_decrypt.
Dependencias entrantes
| Archivo | Uso |
|---|---|
core/credential_api.py | API Ninja con CRUD completo (list, create, update, delete, decrypt); único punto de escritura/lectura REST |
monitoring/api/signage/deploy.py | Itera StoredCredential.objects.filter(organization=org) buscando sección HTTP en deploys |
signage/services/deployment.py | Importa CredentialManager para descifrar credenciales en control de displays |
signage/services/display_control/controller.py | Importa CredentialManager para reboot de players |
Dependencias salientes
core/security/credential_manager.py— claseCredentialManagercon métodos:_get_cipher()— deriva clave Fernet desdesettings.SECRET_KEY(SHA-256 + base64 URL-safe). LanzaRuntimeErrorsi falta.encrypt_credential(plaintext)/decrypt_credential(ciphertext)— cifrado individual, con fallback aDEV_KEYpara migración.encrypt_dict(d)/decrypt_dict(d, keys)— batch.safe_decrypt(value, field_name)— sin excepciones, devuelveNoneen fallo.is_encrypted(value)— detecta tokens Fernet por prefijogAAAAA.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": ""}
Related
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]]