From 590cf0a27aab37c48b412b2facf4ff51aeeceebc Mon Sep 17 00:00:00 2001 From: Ognir Date: Tue, 6 Jan 2026 12:00:09 +0100 Subject: [PATCH] security: protect fritzbox with ipAllowList and enable traefik access logs --- traefik/docker-compose.yml | 31 ++++++++++++++------------ traefik/dynamic/external_services.yml | 15 ------------- traefik/dynamic/fritz-box.yml | 32 +++++++++++++++++++++++++++ 3 files changed, 49 insertions(+), 29 deletions(-) delete mode 100755 traefik/dynamic/external_services.yml create mode 100755 traefik/dynamic/fritz-box.yml diff --git a/traefik/docker-compose.yml b/traefik/docker-compose.yml index eb9dc87..645fd86 100755 --- a/traefik/docker-compose.yml +++ b/traefik/docker-compose.yml @@ -1,9 +1,8 @@ # ============================================================================== # OGNIRNAS - INFRAESTRUCTURA CORE: TRAEFIK V3 & DOCKER-SOCKET-PROXY # ============================================================================== -# Última revisión: 2026-01-06 +# Última revisión: 2026-01-06 (Fase: Auditoría y Seguridad Activa) # Propietario: Ognir (UID 1032 / GID 100) -# Objetivo: Reverse Proxy con autenticación reforzada y aislamiento del socket. # ============================================================================== version: "3.9" @@ -11,7 +10,7 @@ version: "3.9" services: # ---------------------------------------------------------------------------- # SERVICE: traefik-socket-proxy - # Capa de seguridad que evita el acceso directo de Traefik al socket de Docker. + # Cortafuegos para el socket de Docker. Aísla a Traefik del motor del NAS. # ---------------------------------------------------------------------------- traefik-socket-proxy: image: tecnativa/docker-socket-proxy:latest @@ -30,50 +29,54 @@ services: # ---------------------------------------------------------------------------- # SERVICE: traefik (v3.0) - # Orquestador principal. Gestiona TLS y Dashboard seguro. + # Reverse Proxy con TLS, Dashboard seguro y registro de actividad (Logs). # ---------------------------------------------------------------------------- traefik: image: traefik:v3.0 container_name: traefik restart: always - user: "1032:100" # Ejecución bajo el usuario Ognir para permisos de archivos + user: "1032:100" depends_on: traefik-socket-proxy: condition: service_started networks: proxy-macvlan-net: - ipv4_address: 192.168.178.25 # IP estática en red local + ipv4_address: 192.168.178.25 # IP fija en red local (Fritz!Box) services-internal-net: {} volumes: - /volume1/docker/configs/traefik:/etc/traefik:ro - /volume1/docker/data/traefik:/letsencrypt - - /volume1/docker/data/traefik/logs:/var/log/traefik + - /volume1/docker/data/traefik/logs:/var/log/traefik # Persistencia de logs labels: - "traefik.enable=true" - "traefik.docker.network=services-internal-net" - # --- CONFIGURACIÓN DEL ROUTER (DASHBOARD) --- + # --- ROUTER DASHBOARD --- - "traefik.http.routers.traefik-dash.rule=Host(`traefik.ognir-server.synology.me`)" - "traefik.http.routers.traefik-dash.entrypoints=websecure" - "traefik.http.routers.traefik-dash.tls=true" - "traefik.http.routers.traefik-dash.tls.certresolver=letsencrypt" - - # --- SERVICIO INTERNO (API V3) --- - "traefik.http.routers.traefik-dash.service=api@internal" - # --- MIDDLEWARES (ORDEN PRIORITARIO: LOGIN > SEGURIDAD) --- - # Colocamos auth-dashboard primero para asegurar que el prompt salte antes - # de aplicar las cabeceras de seguridad que podrían bloquearlo en caché. + # --- MIDDLEWARES (SEGURIDAD REFORZADA) --- + # Primero Auth (Login) y luego Headers de seguridad. - "traefik.http.routers.traefik-dash.middlewares=auth-dashboard@file,security-headers@file" command: - "--configFile=/etc/traefik/traefik.yml" + # --- CONFIGURACIÓN DEL VIGILANTE (ACCESS LOGS) --- + # Activa el registro de cada petición que llega desde internet. + - "--accesslog=true" + # Ruta interna (mapeada al volumen data/traefik/logs) + - "--accesslog.filepath=/var/log/traefik/access.log" + # Buffering para no castigar el disco/SSD del NAS constantemente + - "--accesslog.bufferingsize=100" # ------------------------------------------------------------------------------ -# REDES EXTERNAS PRE-EXISTENTES +# REDES EXTERNAS # ------------------------------------------------------------------------------ networks: proxy-macvlan-net: diff --git a/traefik/dynamic/external_services.yml b/traefik/dynamic/external_services.yml deleted file mode 100755 index 3d0dd98..0000000 --- a/traefik/dynamic/external_services.yml +++ /dev/null @@ -1,15 +0,0 @@ -http: - routers: - router-fritz: - rule: "Host(`fritz.ognir-server.synology.me`)" - entryPoints: - - "websecure" - service: "fritz-service" - tls: - certResolver: "letsencrypt" - - services: - fritz-service: - loadBalancer: - servers: - - url: "http://192.168.178.1" diff --git a/traefik/dynamic/fritz-box.yml b/traefik/dynamic/fritz-box.yml new file mode 100755 index 0000000..010b5be --- /dev/null +++ b/traefik/dynamic/fritz-box.yml @@ -0,0 +1,32 @@ +# ################################################################# # +# MIDDLEWARE DE WHITELIST - ACCESO RESTRINGIDO OGNIRNAS # +# ################################################################# # +# Este middleware ya está definido en tu configuración global, # +# pero lo vinculamos aquí para proteger el acceso al Router. # + +http: + routers: + # Definición del Router para Fritz!Box + # Aplica TLS con LetsEncrypt y restringe por IP + router-fritz: + rule: "Host(`fritz.ognir-server.synology.me`)" + entryPoints: + - "websecure" + middlewares: + - "muro-seguro" + service: "fritz-service" + tls: + certResolver: "letsencrypt" + + services: + # Redirección al hardware físico del Router + fritz-service: + loadBalancer: + servers: + - url: "http://192.168.178.1" + +# ################################################################# # +# NOTA DE MANTENIMIENTO: # +# Si necesitas acceso externo temporal, comenta la línea de # +# 'middlewares' y reinicia Traefik. # +# ################################################################# #