security: protect fritzbox with ipAllowList and enable traefik access logs
This commit is contained in:
@@ -1,9 +1,8 @@
|
|||||||
# ==============================================================================
|
# ==============================================================================
|
||||||
# OGNIRNAS - INFRAESTRUCTURA CORE: TRAEFIK V3 & DOCKER-SOCKET-PROXY
|
# 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)
|
# Propietario: Ognir (UID 1032 / GID 100)
|
||||||
# Objetivo: Reverse Proxy con autenticación reforzada y aislamiento del socket.
|
|
||||||
# ==============================================================================
|
# ==============================================================================
|
||||||
|
|
||||||
version: "3.9"
|
version: "3.9"
|
||||||
@@ -11,7 +10,7 @@ version: "3.9"
|
|||||||
services:
|
services:
|
||||||
# ----------------------------------------------------------------------------
|
# ----------------------------------------------------------------------------
|
||||||
# SERVICE: traefik-socket-proxy
|
# 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:
|
traefik-socket-proxy:
|
||||||
image: tecnativa/docker-socket-proxy:latest
|
image: tecnativa/docker-socket-proxy:latest
|
||||||
@@ -30,50 +29,54 @@ services:
|
|||||||
|
|
||||||
# ----------------------------------------------------------------------------
|
# ----------------------------------------------------------------------------
|
||||||
# SERVICE: traefik (v3.0)
|
# SERVICE: traefik (v3.0)
|
||||||
# Orquestador principal. Gestiona TLS y Dashboard seguro.
|
# Reverse Proxy con TLS, Dashboard seguro y registro de actividad (Logs).
|
||||||
# ----------------------------------------------------------------------------
|
# ----------------------------------------------------------------------------
|
||||||
traefik:
|
traefik:
|
||||||
image: traefik:v3.0
|
image: traefik:v3.0
|
||||||
container_name: traefik
|
container_name: traefik
|
||||||
restart: always
|
restart: always
|
||||||
user: "1032:100" # Ejecución bajo el usuario Ognir para permisos de archivos
|
user: "1032:100"
|
||||||
depends_on:
|
depends_on:
|
||||||
traefik-socket-proxy:
|
traefik-socket-proxy:
|
||||||
condition: service_started
|
condition: service_started
|
||||||
|
|
||||||
networks:
|
networks:
|
||||||
proxy-macvlan-net:
|
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: {}
|
services-internal-net: {}
|
||||||
|
|
||||||
volumes:
|
volumes:
|
||||||
- /volume1/docker/configs/traefik:/etc/traefik:ro
|
- /volume1/docker/configs/traefik:/etc/traefik:ro
|
||||||
- /volume1/docker/data/traefik:/letsencrypt
|
- /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:
|
labels:
|
||||||
- "traefik.enable=true"
|
- "traefik.enable=true"
|
||||||
- "traefik.docker.network=services-internal-net"
|
- "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.rule=Host(`traefik.ognir-server.synology.me`)"
|
||||||
- "traefik.http.routers.traefik-dash.entrypoints=websecure"
|
- "traefik.http.routers.traefik-dash.entrypoints=websecure"
|
||||||
- "traefik.http.routers.traefik-dash.tls=true"
|
- "traefik.http.routers.traefik-dash.tls=true"
|
||||||
- "traefik.http.routers.traefik-dash.tls.certresolver=letsencrypt"
|
- "traefik.http.routers.traefik-dash.tls.certresolver=letsencrypt"
|
||||||
|
|
||||||
# --- SERVICIO INTERNO (API V3) ---
|
|
||||||
- "traefik.http.routers.traefik-dash.service=api@internal"
|
- "traefik.http.routers.traefik-dash.service=api@internal"
|
||||||
|
|
||||||
# --- MIDDLEWARES (ORDEN PRIORITARIO: LOGIN > SEGURIDAD) ---
|
# --- MIDDLEWARES (SEGURIDAD REFORZADA) ---
|
||||||
# Colocamos auth-dashboard primero para asegurar que el prompt salte antes
|
# Primero Auth (Login) y luego Headers de seguridad.
|
||||||
# de aplicar las cabeceras de seguridad que podrían bloquearlo en caché.
|
|
||||||
- "traefik.http.routers.traefik-dash.middlewares=auth-dashboard@file,security-headers@file"
|
- "traefik.http.routers.traefik-dash.middlewares=auth-dashboard@file,security-headers@file"
|
||||||
|
|
||||||
command:
|
command:
|
||||||
- "--configFile=/etc/traefik/traefik.yml"
|
- "--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:
|
networks:
|
||||||
proxy-macvlan-net:
|
proxy-macvlan-net:
|
||||||
|
|||||||
@@ -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"
|
|
||||||
32
traefik/dynamic/fritz-box.yml
Executable file
32
traefik/dynamic/fritz-box.yml
Executable file
@@ -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. #
|
||||||
|
# ################################################################# #
|
||||||
Reference in New Issue
Block a user