Seguridad de Autenticación de OmniEPDG
OmniEPDG implementa múltiples capas de seguridad de autenticación para proteger contra ataques de fuerza bruta, relleno de credenciales y acceso no autorizado desde regiones restringidas.
Tabla de Contenidos
- Descripción General
- Limitación de Tasa de Autenticación
- Bloqueo de Países por GeoIP
- Flujo de Seguridad
- Métricas
- Resolución de Problemas
Descripción General
OmniEPDG realiza verificaciones de seguridad al inicio del intercambio IKE_AUTH, antes de operaciones criptográficas costosas:
- Verificación de GeoIP (opcional) - Verifica que la IP de origen sea de un país permitido
- Verificación de Límite de Tasa - Asegura que la IP/IMSI no haya excedido los umbrales de fallo
- Autenticación EAP-AKA - La autenticación estándar 3GPP procede si las verificaciones son exitosas
Limitación de Tasa de Autenticación
La limitación de tasa protege contra ataques de fuerza bruta al rastrear intentos de autenticación fallidos por IP de origen y por IMSI. Cuando se superan los umbrales, se bloquean temporalmente los intentos adicionales.
Cómo Funciona
El limitador de tasa utiliza un algoritmo de ventana deslizante:
- Cada intento fallido se registra con una marca de tiempo
- Los intentos más antiguos que la ventana configurada se expiran automáticamente
- Cuando los fallos en la ventana superan el umbral, se bloquea la fuente
- Los bloqueos expiran después del período de enfriamiento configurado
Doble Rastreo
Se aplican simultáneamente dos límites independientes:
| Tipo de Rastreo | Propósito | Umbral por Defecto | Bloqueo por Defecto |
|---|---|---|---|
| Por IP | Captura escáneres de puertos y ataques distribuidos desde fuentes únicas | 10 fallos / minuto | 5 minutos |
| Por IMSI | Captura ataques dirigidos a suscriptores específicos | 5 fallos / minuto | 10 minutos |
Ambas verificaciones deben pasar para que un intento de autenticación proceda. Si se supera cualquiera de los umbrales, se rechaza el intento.
Configuración
config :omniepdg,
# Limitación de tasa por IP
auth_rate_limit_per_ip: 10, # Máximo de fallos antes de bloquear
auth_rate_limit_ip_window_ms: 60_000, # Tamaño de la ventana (1 minuto)
auth_rate_limit_ip_block_ms: 300_000, # Duración del bloqueo (5 minutos)
# Limitación de tasa por IMSI
auth_rate_limit_per_imsi: 5, # Máximo de fallos antes de bloquear
auth_rate_limit_imsi_window_ms: 60_000, # Tamaño de la ventana (1 minuto)
auth_rate_limit_imsi_block_ms: 600_000 # Duración del bloqueo (10 minutos)
Parámetros por IP
| Parámetro | Tipo | Requerido | Por Defecto | Descripción |
|---|---|---|---|---|
auth_rate_limit_per_ip | Entero | No | 10 | Máximo de intentos de autenticación fallidos permitidos desde una sola dirección IP dentro del período de ventana antes de bloquear. |
auth_rate_limit_ip_window_ms | Entero | No | 60000 | Tamaño de la ventana deslizante en milisegundos para contar fallos de IP. Los fallos más antiguos que esto no se cuentan. |
auth_rate_limit_ip_block_ms | Entero | No | 300000 | Duración en milisegundos para bloquear una IP después de superar el umbral. El valor por defecto es 5 minutos. |
Parámetros por IMSI
| Parámetro | Tipo | Requerido | Por Defecto | Descripción |
|---|---|---|---|---|
auth_rate_limit_per_imsi | Entero | No | 5 | Máximo de intentos de autenticación fallidos permitidos para un solo IMSI dentro del período de ventana antes de bloquear. Menor que por IP para capturar ataques dirigidos. |
auth_rate_limit_imsi_window_ms | Entero | No | 60000 | Tamaño de la ventana deslizante en milisegundos para contar fallos de IMSI. |
auth_rate_limit_imsi_block_ms | Entero | No | 600000 | Duración en milisegundos para bloquear un IMSI después de superar el umbral. El valor por defecto es 10 minutos (más largo que los bloqueos por IP para proteger a suscriptores específicos). |
Comportamiento en Caso de Éxito
Cuando la autenticación tiene éxito, el limitador de tasa borra todo el historial de fallos para ese par IP/IMSI. Esto permite a los usuarios legítimos que experimentaron fallos transitorios (por ejemplo, problemas de red) recuperarse sin ser penalizados permanentemente.
Ejemplos de Configuración
Entorno de Alta Seguridad
Límites estrictos para entornos con baja tolerancia a intentos fallidos:
config :omniepdg,
auth_rate_limit_per_ip: 5,
auth_rate_limit_ip_window_ms: 120_000, # Ventana de 2 minutos
auth_rate_limit_ip_block_ms: 900_000, # Bloqueo de 15 minutos
auth_rate_limit_per_imsi: 3,
auth_rate_limit_imsi_window_ms: 120_000,
auth_rate_limit_imsi_block_ms: 1_800_000 # Bloqueo de 30 minutos
Cómo funciona: Solo se permiten 5 fallos por IP o 3 fallos por IMSI dentro de una ventana de 2 minutos. Los bloqueos duran de 15 a 30 minutos respectivamente.
Caso de uso: Implementaciones empresariales, bases de suscriptores de alto valor o redes bajo ataque activo.
Entorno Relajado
Límites más permisivos para desarrollo o pruebas:
config :omniepdg,
auth_rate_limit_per_ip: 50,
auth_rate_limit_ip_window_ms: 60_000,
auth_rate_limit_ip_block_ms: 60_000, # Bloqueo de 1 minuto
auth_rate_limit_per_imsi: 20,
auth_rate_limit_imsi_window_ms: 60_000,
auth_rate_limit_imsi_block_ms: 120_000 # Bloqueo de 2 minutos
Cómo funciona: Umbrales más altos y bloqueos más cortos permiten mayor flexibilidad en las pruebas.
Caso de uso: Entornos de desarrollo, pruebas de integración.
Bloqueo de Países por GeoIP
El bloqueo por GeoIP restringe el acceso a llamadas WiFi según la ubicación geográfica de la dirección IP de conexión. Esto es útil para operadores que necesitan limitar el servicio a países específicos por razones regulatorias o comerciales.
Descripción General
Base de datos de geolocalización IP
OmniEPDG utiliza la base de datos DB-IP IP-to-City Lite (CC BY 4.0 — ver
priv/geoip/ATTRIBUTION.md). No está comprometida en git (~125 MB); en su lugar, se descarga en el tiempo de construcción — mix release ejecuta la tarea geoip.fetch como un paso de lanzamiento, por lo que cada paquete envía una base de datos actual. (Los desarrolladores/pruebas la obtienen bajo demanda a través del alias mix test.) Debido a esto:
- Cada sesión está anotada automáticamente con país, ciudad y coordenadas aproximadas — mostradas en la interfaz web ("Columna de Ubicación") y en la respuesta de
/api/sessions:country_code,country_name,continent_code,geo_city,geo_latitude,geo_longitude. geoip_enabledsolo controla si las conexiones son bloqueadas por país. La anotación ocurre independientemente de esta bandera.
Uso de su propia base de datos (opcional). Establezca geoip_database_path a un MaxMind GeoLite2 (https://www.maxmind.com/en/geolite2/signup) u otra DB-IP/MaxMind MMDB. Si el archivo configurado falta, se utiliza la base de datos empaquetada (descargada).
Nota: El EULA de MaxMind GeoLite2 no permite redistribuirlo dentro de un producto, por lo que se utiliza DB-IP Lite (CC BY 4.0) en su lugar.
Para actualizar la base de datos manualmente (DB-IP publica mensualmente):
mix geoip.fetch
Configuración
config :omniepdg,
# Bloquear conexiones por país (la anotación de geolocalización siempre está activa)
geoip_enabled: true,
# Opcional: sobrescribir la base de datos empaquetada con su propia MMDB (País o Ciudad)
# geoip_database_path: "/etc/omniepdg/GeoLite2-Country.mmdb",
# Modo de control de acceso
geoip_mode: :whitelist,
# Lista de países (códigos ISO 3166-1 alpha-2)
geoip_countries: ["AU", "NZ"],
# Manejar IPs desconocidas
geoip_allow_unknown: false,
# Comportamiento cuando la base de datos no está disponible
geoip_fail_open: true
Parámetros
| Parámetro | Tipo | Requerido | Por Defecto | Descripción |
|---|---|---|---|---|
geoip_enabled | Booleano | No | false | Habilitar o deshabilitar el control de acceso basado en GeoIP control (bloqueo). Cuando false, todas las IPs están permitidas — pero las sesiones aún están geo-anotadas. |
geoip_database_path | Cadena | No | base de datos empaquetada dbip-country-lite.mmdb | Ruta a una base de datos en formato MMDB (País o Ciudad). Vuelve a la base de datos DB-IP empaquetada si no se establece o falta. |
geoip_mode | Átomo | No | :whitelist | Modo de control de acceso: :whitelist (solo permitir países listados) o :blacklist (bloquear países listados, permitir otros). |
geoip_countries | Lista | No | [] | Lista de códigos de países ISO 3166-1 alpha-2. La interpretación depende de geoip_mode. |
geoip_allow_unknown | Booleano | No | Ver abajo | Permitir conexiones desde IPs que no pueden ser geolocalizadas (IPs privadas, rangos desconocidos). El valor por defecto es false para el modo de lista blanca, true para el modo de lista negra. |
geoip_fail_open | Booleano | No | true | Comportamiento cuando la base de datos GeoIP no se carga. Cuando true, permite todas las conexiones (fallo abierto). Cuando false, bloquea todas las conexiones (fallo cerrado). |
Modos de Control de Acceso
Modo de Lista Blanca (Recomendado para Llamadas WiFi)
Solo permite conexiones desde países especificados. Todos los demás países son bloqueados.
config :omniepdg,
geoip_enabled: true,
geoip_mode: :whitelist,
geoip_countries: ["AU", "NZ", "FJ"] # Australia, Nueva Zelanda, Fiyi
Cómo funciona: Solo los UE que se conectan desde direcciones IP australianas, neozelandesas o fijianas pueden autenticarse. Todos los demás países son rechazados.
Caso de uso: Operadores que desean restringir las llamadas WiFi a sus áreas de servicio licenciadas.
Modo de Lista Negra
Bloquear conexiones desde países especificados. Todos los demás países están permitidos.
config :omniepdg,
geoip_enabled: true,
geoip_mode: :blacklist,
geoip_countries: ["CN", "RU", "KP", "IR"] # China, Rusia, Corea del Norte, Irán
Cómo funciona: Los UE que se conectan desde los países listados son rechazados. Todos los demás países pueden autenticarse.
Caso de uso: Bloquear regiones de alto riesgo mientras se permite el roaming global.
Manejo de Países Desconocidos
Algunas direcciones IP no pueden ser geolocalizadas:
- Rangos de IP privadas (10.x.x.x, 192.168.x.x, etc.)
- Bloques de IP recién asignados que aún no están en la base de datos
- Nodos de salida de Tor y algunas VPN
El parámetro geoip_allow_unknown controla el comportamiento:
| Modo | geoip_allow_unknown Por Defecto | Comportamiento |
|---|---|---|
| Lista Blanca | false | Desconocido = no en lista blanca = bloqueado |
| Lista Negra | true | Desconocido = no en lista negra = permitido |
Para anular el valor por defecto:
config :omniepdg,
geoip_mode: :whitelist,
geoip_allow_unknown: true # Permitir IPs desconocidas incluso en modo de lista blanca
Actualizaciones de Base de Datos
MaxMind actualiza la base de datos GeoLite2 semanalmente. Para actualizar:
- Descargue el nuevo archivo
GeoLite2-Country.mmdb - Reemplace el archivo existente en la ruta configurada
- La base de datos se recarga automáticamente en la próxima búsqueda (no se requiere reinicio)
Códigos de País Comunes
| Código | País | Código | País |
|---|---|---|---|
| AU | Australia | US | Estados Unidos |
| NZ | Nueva Zelanda | GB | Reino Unido |
| CA | Canadá | DE | Alemania |
| FR | Francia | JP | Japón |
| SG | Singapur | HK | Hong Kong |
| IN | India | CN | China |
Lista completa: ISO 3166-1 alpha-2
Flujo de Seguridad
El flujo completo de seguridad de autenticación:
Métricas
Métricas de Limitación de Tasa
Métrica: epdg_auth_rate_limited_count
Tipo: Contador
Descripción: Número de intentos de autenticación bloqueados por limitación de tasa
Etiquetas:
type- Razón del bloqueo:ip(umbral de IP superado) oimsi(umbral de IMSI superado)
Consultas de ejemplo:
# Intentos limitados por tasa por minuto
rate(epdg_auth_rate_limited_count[1m])
# Limitados por tipo
sum by (type) (rate(epdg_auth_rate_limited_count[5m]))
# Alerta: Alta actividad de limitación de tasa
rate(epdg_auth_rate_limited_count[5m]) > 10
Métricas de GeoIP
Métrica: epdg_auth_geoip_blocked_count
Tipo: Contador
Descripción: Número de intentos de autenticación bloqueados por GeoIP
Etiquetas:
country- Código de país ISO 3166-1 alpha-2, oUNKNOWNpara IPs no resolubles
Consultas de ejemplo:
# Bloqueos de GeoIP por minuto
rate(epdg_auth_geoip_blocked_count[1m])
# Principales países bloqueados
topk(10, sum by (country) (epdg_auth_geoip_blocked_count))
# Alerta: País inusual intentando acceso
increase(epdg_auth_geoip_blocked_count{country="XX"}[1h]) > 100
Resolución de Problemas
Problemas de Limitación de Tasa
Usuarios Legítimos Siendo Bloqueados
Síntomas: Los usuarios informan que no pueden conectarse después de intentos fallidos
Causas posibles:
- El usuario ingresó credenciales incorrectas múltiples veces
- Problemas de red causaron tiempos de espera de autenticación contados como fallos
- Umbrales configurados demasiado bajos para el entorno
Resolución:
- Verifique las métricas para la IP/IMSI afectada
- Considere aumentar los umbrales si los falsos positivos son comunes
- Después de solucionar la causa raíz, el bloqueo expirará automáticamente
Alta Tasa de Intentos Bloqueados
Síntomas: epdg_auth_rate_limited_count aumentando rápidamente
Causas posibles:
- Ataque de fuerza bruta en progreso
- UE mal configurado fallando repetidamente la autenticación
- Ataque de relleno de credenciales
Resolución:
- Revise las IPs de origen en los registros para detectar patrones
- Considere implementar reglas de firewall a nivel de IP para atacantes persistentes
- Verifique la conectividad HSS si los usuarios legítimos están afectados
Problemas de GeoIP
Todas las Conexiones Siendo Bloqueadas
Síntomas: Ningún UE puede conectarse después de habilitar GeoIP
Causas posibles:
- Archivo de base de datos no encontrado o corrupto
- Códigos de país incorrectos en la configuración
geoip_allow_unknown: falsebloqueando IPs privadas en entorno de laboratorio
Resolución:
- Verifique que el archivo de base de datos exista en la ruta configurada
- Verifique que los códigos de país sean correctos (mayúsculas, 2 letras)
- Para laboratorio/desarrollo, establezca
geoip_allow_unknown: true - Verifique los registros para advertencias relacionadas con GeoIP
Base de Datos GeoIP No Cargando
Síntomas: Advertencia en los registros: "Base de datos GeoIP no encontrada"
Causas posibles:
- Ruta del archivo incorrecta
- Permisos de archivo impiden la lectura
- El archivo no es un formato MMDB válido
Resolución:
- Verifique que el archivo exista:
ls -la /etc/omniepdg/GeoLite2-Country.mmdb - Verifique permisos:
chmod 644 /etc/omniepdg/GeoLite2-Country.mmdb - Verifique la integridad del archivo descargando una copia nueva de MaxMind
Bloqueos de Países Inesperados
Síntomas: Usuarios de países permitidos siendo bloqueados
Causas posibles:
- VPN/proxy haciendo que la IP parezca de un país diferente
- Base de datos GeoIP desactualizada
- Salida de red corporativa en una ubicación inesperada
Resolución:
- Actualice la base de datos GeoIP a la última versión
- Verifique la IP de salida real del usuario frente al país esperado
- Considere agregar países adicionales si los usuarios navegan a través de redes corporativas