8. Seguridad y auditoría¶
8.1. Roles y permisos¶
Agregar a SaleInvoice.Meta:
permissions = [
("emitir_ecf", "Puede firmar y enviar e-CF a DGII"),
("anular_ecf", "Puede anular e-CF y emitir nota de crédito E33"),
("ver_bitacora", "Puede leer ECFEnvioDGII completa"),
]
En vistas:
@permission_required("accounting.emitir_ecf", raise_exception=True)
def invoice_send_ecf(request, pk): ...
@permission_required("accounting.anular_ecf", raise_exception=True)
def invoice_anular(request, pk): ...
8.2. Bitácoras de auditoría¶
Modelos:
- AccountingAuditLog (cambios en SaleInvoice/InvoicePayment)
- ECFEnvioDGII con triggers SQL de inmutabilidad (migración 0028)
- ECFTrackingLog (cada consulta TrackID)
- AccessLog (logins/logouts/failed)
Buena práctica: jamás permitir DELETE sobre ECFEnvioDGII.
8.3. Almacenamiento seguro de credenciales¶
chmod 600 /opt/tienda/.env
chmod 400 /opt/tienda/secrets/*.p12
chown root:tienda /opt/tienda/secrets
chmod 750 /opt/tienda/secrets
Backup cifrado del .p12: