Saltar a contenido

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:

gpg --symmetric --cipher-algo AES256 --output ccpsd_130768021.p12.gpg ccpsd_130768021.p12