D/ DJANGO CON CRITERIO

UNIDAD 8 · AZURE Y DJANGO: CONFIGURACIÓN Y DESPLIEGUE

Endurecer Django detrás de un proxy

HTTPS, HSTS, cookies, CSRF, cabeceras y secretos con comprobación efectiva.

Ilustración: Controles entre navegador y aplicación
Controles entre navegador y aplicación

CAPÍTULO 9 · El mismo proyecto llega a Azure

Django tiene que entender lo que ocurrió delante de él

El navegador puede establecer una conexión HTTPS con la plataforma mientras el proceso Django recibe una comunicación interna bajo otras condiciones. Si la aplicación interpreta únicamente ese último tramo, puede tomar decisiones equivocadas sobre redirecciones o cookies. La seguridad necesita una relación clara entre el proxy y el código.

Examinamos qué información transmite el proxy y cuándo podemos confiar en ella. Los hosts y orígenes permitidos siguen siendo explícitos, y la cabecera que indica el protocolo no debe convertirse en una afirmación controlada libremente por el cliente. El contrato de infraestructura completa lo que una opción en settings puede expresar.

Con el recorrido comprendido ya podemos leer production.py con más criterio. Cada ajuste deja de ser una línea aislada: responde a cómo llegan las solicitudes y cómo deben salir las respuestas. La siguiente lección reúne esos valores y explica las condiciones necesarias para que las protecciones actúen como esperamos.

Leer esta parte dentro del relato completo →

DEL RELATO A LA PRÁCTICA

Vamos a desarrollar esta decisión con su mapa, explicación, código y ejercicio.

MIRA · CONECTA · COMPRENDE

Controles entre navegador y aplicación

Controles entre navegador y aplicación1. Cliente: Usa HTTPS; 2. Proxy confiable: Controla cabeceras de transporte; 3. Settings: Hosts, secretos y seguridad; 4. Verificación: Prueba configuración efectiva01ClienteUsa HTTPS02Proxy confiableControla cabeceras de transporte03SettingsHosts, secretos y seguridad04VerificaciónPrueba configuración efectiva

Las flechas resumen el recorrido conceptual. Los controles y dependencias se detallan debajo.

Selecciona una pieza para destacar su responsabilidad.

Leer la explicación del mapa
  1. Cliente. Usa HTTPS
  2. Proxy confiable. Controla cabeceras de transporte
  3. Settings. Hosts, secretos y seguridad
  4. Verificación. Prueba configuración efectiva
Descargar gráfico SVG ↓

¿Para qué sirve?

Configuraciones copiadas sin conocer el proxy pueden provocar bucles HTTPS o confiar en cabeceras fabricadas. La seguridad exige verificar el entorno real.

El concepto, explicado

DEBUG=False, SECRET_KEY fuera del código y ALLOWED_HOSTS explícito son controles de base. Una variable de entorno mejora separación, pero necesita protección del almacén, acceso y rotación.

SECURE_PROXY_SSL_HEADER solo es seguro si el proxy confiable elimina o controla la cabecera que recibe del cliente. Verifica ese contrato antes de usarlo.

HSTS compromete al navegador a usar HTTPS. Empieza con una duración corta mientras validas; includeSubDomains exige que todos funcionen por HTTPS. Preload requiere cumplir y solicitar requisitos del programa, no solo activar un booleano.

Cookies Secure, HttpOnly y SameSite tienen funciones diferentes. HttpOnly no impide todo XSS; CSRF, CSP y control de contenido se complementan. Las opciones de sesión se enseñan para apps que las usan; esta academia no añade login.

SECURE_PROXY_SSL_HEADER solo es seguro cuando el proxy confiable elimina o sobrescribe el header y no existe acceso directo no controlado. SESSION_COOKIE_SECURE y CSRF_COOKIE_SECURE requieren HTTPS; no se copian sin más al desarrollo HTTP.

No existe un middleware que resuelva toda la ciberseguridad. Combina escape de templates, validación de entrada, CSRF, autorización de API, límites, secretos, dependencia revisada, logs sin credenciales y pruebas. X_FRAME_OPTIONS=DENY bloquea incluso iframes propios: usa excepción SAMEORIGIN únicamente donde esté justificada.

Continúa con “Seguridad en production.py” para aplicar y comprobar HTTPS, confianza del proxy, cookies Secure y HSTS.

La lección siguiente muestra la política exacta de production.py y desglosa sus ajustes uno por uno. Esa política usa HSTS de un año con subdominios y preload; requiere HTTPS correcto en todo el alcance y una frontera de proxy confiable.

Control, alcance y comprobación

ControlQué aportaQué comprobar
DEBUG=FalseReduce exposición de información internaUna excepción no publica el traceback
Sesión HttpOnly y SecureLimita acceso JS y envío por HTTPCookies y flujo real bajo HTTPS
CSRF y SameSiteReduce solicitudes cruzadas no autorizadasPOST con y sin token
Autorización en backendControla operaciones y recursosUsuario sin capacidad recibe denegación
Escape de templatesReduce inyección de markup no confiableNo marcar entradas como safe
Cabeceras de proxyPermite reconocer HTTPS tras proxy confiableNo aceptar cabeceras suplantadas
HSTS gradualRecuerda la exigencia de HTTPSTodo el alcance funciona antes de ampliar
SCA y revisión de secretosDetecta dependencias y exposición conocidasTriaje, actualización y cierre verificable

Implementación paso a paso

  1. Ejecuta check --deploy sobre settings productivos y revisa configuración heredada.
  2. Verifica TLS externo y cómo Django detecta request.is_secure detrás del proxy.
  3. Valida hosts, secretos, logging sin datos sensibles y almacenamiento persistente.
  4. Prueba redirecciones y cabeceras, después aumenta HSTS de forma gradual.
  5. En una app con sesiones configura cookies y verifica CSRF en escrituras.
  6. Añade CSP según scripts/estilos reales y supervisa reportes antes de endurecer.

Ejemplo en SensorHub

# Fragmento para completar en settings productivos.
import os
DEBUG = False
SECRET_KEY = os.environ["SECRET_KEY"]
ALLOWED_HOSTS = os.environ["ALLOWED_HOSTS"].split(",")
SECURE_SSL_REDIRECT = True
SECURE_HSTS_SECONDS = 31536000
SECURE_HSTS_INCLUDE_SUBDOMAINS = True
SECURE_HSTS_PRELOAD = True
SECURE_CONTENT_TYPE_NOSNIFF = True
SECURE_REFERRER_POLICY = "same-origin"
X_FRAME_OPTIONS = "DENY"
# SOLO con un proxy que controla la cabecera entrante:
SECURE_PROXY_SSL_HEADER = ("HTTP_X_FORWARDED_PROTO", "https")
SESSION_COOKIE_HTTPONLY = True
SESSION_COOKIE_SAMESITE = "Lax"
SESSION_COOKIE_SECURE = True
CSRF_COOKIE_SECURE = True
CSRF_COOKIE_SAMESITE = "Lax"
CSRF_TRUSTED_ORIGINS = ["https://sensorhub.example"]
# Si activas CSRF_COOKIE_HTTPONLY, toma el token del DOM renderizado.
# El timeout de sesión se decide según el riesgo y tipo de aplicación.

Cómo leer el ejemplo

  • La falta de SECRET_KEY falla al inicio, no genera una clave productiva por defecto.
  • El fragmento no equivale a una revisión completa de seguridad.
  • No se activa preload ni subdominios sin evaluar consecuencias.

Error habitual

Usar HSTS de un año con todos los subdominios desde el primer ensayo o confiar en X-Forwarded-Proto sin límite de confianza.

05 / PRACTICAR

Tu turno

Tras activar redirección HTTPS detrás del proxy aparece un bucle. Diseña el diagnóstico.

Ver solución orientativa

Comprueba esquema externo y request.is_secure. Verifica cabecera emitida y sanitizada por el proxy; ajusta configuración de confianza solo cuando ese contrato esté probado.

Cómo sabes que funciona

  • check --deploy se ejecuta con settings correctos.
  • No hay bucles ni hosts comodín injustificados.
  • Secretos y cookies no se filtran en logs.

Para profundizar

Documentación oficial para comprobar configuración, permisos y condiciones vigentes. Revisión del tema: 2026-10-11.

CONTINUAR LA EXPERIENCIA

El siguiente paso del recorrido:

Seguridad en production.py: HTTPS, proxy y HSTS →Continuar en modo relato