Portal Cautivo UAM Iztapalapa
Portal Cautivo UAM Iztapalapa
Portal Cautivo UAM Iztapalapa
PROYECTO DE INVESTIGACIÓN
NOMBRE DE LA EMPRESA:
P R E S E N T A N:
I
Resumen
Este trabajo tuvo como objetivo implementar un método de autenticación que restrinja el acceso
a usuarios no autorizados en la red inalámbrica de la UAM Iztapalapa, permitiendo fortalecer y mejorar
el desempeño de la intranet. Pero no es solo necesario ofrecer dicho servicio para toda la comunidad
institucional, si no poder gestionarlo de una manera sencilla y eficiente todos los dispositivos, usuarios
y permisos de quien se conecta a la red.
Este proyecto realiza una búsqueda de soluciones para ambas necesidades; por un lado, creando
un acceso gratuito a Internet y con el que cualquier estudiante y administrativo, sin necesidad de tener
nociones sobre informática, puede verse beneficiada del servicio. Por otro lado, facilitando que su
gestión sea accesible y manejable por cualquier usuario mediante el uso de las tecnologías actuales
y en cualquier situación.
Todo esto se soluciona aplicando ingeniería tanto en diseño, estructura y programación, las
herramientas utilizadas en este ámbito son tecnologías de desarrollo web, así como gestores de base
de datos y uso de protocolos de autenticación. Todo puede ser montado en cualquier sistema servidor
y operar correctamente con las configuraciones necesarias.
Con esto se busca replicar y alcanzar a más universidades que adopten este esquema de redes
internet abiertas a sus estudiantes, docentes o invitados, sin el riesgo de exponer la integridad de la
red. Solucionado por autenticaciones de distintos tipos, ya sea la más común, Usuario y Contraseña,
Usuario y MAC de dispositivo o Autenticación booleana por registro.
Existen muchos servicios que ofrecen estos resultados de manera prediseñada o con
autenticaciones ya definidas. Lo que diferencia este proyecto de esos servicios es que se ocupa el
protocolo RADIUS puro, lo que nos permite adecuarlo a las necesidades que requiera la institución es
este caso específico y así mismo, crear una relación solida punto a punto sin depender de terceros,
con los servicios internos de la institución. Este método de autenticación de credenciales se puede
ocupar tanto en redes locales como inalámbricas, con esto podemos controlar es tu totalidad que
dispositivos queremos que se conecten a nuestra red, que nombre tiene el dispositivo y en es pesifico
quien es el usuario conectado.
II
Abstract
Con esto se busca replicar y alcanzar a más universidades que adopten este esquema de redes
internet abiertas a sus estudiantes, docentes o invitados, sin el riesgo de exponer la integridad de la red.
Solucionado por autenticaciones de distintos tipos, ya sea la más común, Usuario y Contraseña, Usuario y
MAC de dispositivo o Autenticación booleana por registro.
Existen muchos servicios que ofrecen estos resultados de manera prediseñada o con autenticaciones
ya definidas. Lo que diferencia este proyecto de esos servicios es que se ocupa el protocolo RADIUS puro,
lo que nos permite adecuarlo a las necesidades que requiera la institución es este caso específico y así
mismo, crear una relación solida punto a punto sin depender de terceros, con los servicios internos de la
institución.
Este método de autenticación de credenciales se puede ocupar tanto en redes locales como
inalámbricas, con esto podemos controlar es tu totalidad que dispositivos queremos que se conecten a
nuestra red, que nombre tiene el dispositivo y en es pesifico quien es el usuario conectado.
Este proyecto realiza una búsqueda de soluciones para ambas necesidades; por un lado, creando un
acceso gratuito a Internet y con el que cualquier estudiante y administrativo, sin necesidad de tener
nociones sobre informática, puede verse beneficiada del servicio. Por otro lado, facilitando que su gestión
sea accesible y manejable por cualquier usuario mediante el uso de las tecnologías actuales y en cualquier
situación.
Este trabajo tuvo como objetivo implementar un método de autenticación que restrinja el acceso a
usuarios no autorizados en la red inalámbrica de la UAM Iztapalapa, permitiendo fortalecer y mejorar el
desempeño de la intranet.
Pero no es solo necesario ofrecer dicho servicio para toda la comunidad institucional, si no poder
gestionarlo de una manera sencilla y eficiente todos los dispositivos, usuarios y permisos de quien se
conecta a la red.
III
Contenido
Agradecimientos ....................................................................................................................................I
Resumen ..............................................................................................................................................II
Abstract................................................................................................................................................III
Contenido ........................................................................................................................................... IV
1. Introducción ......................................................................................................................................1
2. Generalidades...................................................................................................................................2
IV
3.4.1 Manejador de base de datos (Database Management System – DBMS) ..............................24
4. Desarrollo........................................................................................................................................27
5.2 Depuración del servidor CentOS con el Extreme Wireless Controller ..........................................48
6. Conclusiones ..................................................................................................................................51
Referencias...........................................................................................................................................52
Anexos ................................................................................................................................................53
net-auth.php ....................................................................................................................................55
Login.php ........................................................................................................................................62
ffecp-config.php ..............................................................................................................................70
Crypt_aws_s4 .................................................................................................................................71
V
Common_utilies.php ...........................................................................................................................86
register.php .........................................................................................................................................94
code_register.php ...............................................................................................................................96
conexion.php.......................................................................................................................................99
Estilos.css .........................................................................................................................................100
VI
Lista de Figuras
Figura 2. 1 Ubicación de la Universidad Autónoma Metropolitana Unidad Iztapalapa .................................4
Figura 2. 2 Estructura organizacional de la UAM .........................................................................................6
Figura 3. 1 Estructura de una VPN .............................................................................................................15
Figura 3. 2 Protocolo 802.1x ......................................................................................................................19
Figura 3. 3 Estructura del funcionamiento de un DBMS .............................................................................25
Figura 4. 1 Flujo de portal cautivo externo .................................................................................................27
Figura 4. 2 Diseño de login.........................................................................................................................28
Figura 4. 3 Diseño de registro de login .......................................................................................................29
Figura 4. 4 Actualización del sistema CentOS 7 ........................................................................................30
Figura 4. 5 Instalación de la tools a ocupar ................................................................................................31
Figura 4. 6 Validación del servicio ..............................................................................................................31
Figura 4. 7 Creación y modificación de privilegios sobre la base radius ....................................................38
Figura 4. 8 Configuración de los archivos internos de FreeRADIUS ..........................................................40
Figura 4. 9 Estructura de carpetas del portal cautivo externo ....................................................................41
Figura 4. 10 Vista previa del portal cautivo externo ....................................................................................42
Figura 4. 11 Vista previa del registro de usuarios ......................................................................................42
Figura 4. 12 Configuración para enlazar el RADIUS con la Controller .......................................................43
Figura 4. 13 Se configura la controller para el uso de un EPC ...................................................................43
Figura 4. 14 Redireccionamiento con el Portal cautivo...............................................................................44
Figura 4. 15 Configuración del AP que irradiara la señal Wi-Fi ..................................................................45
Figura 4. 16 Creación de Roles ..................................................................................................................45
Figura 5. 1 Instalación del protocolo FreeRADIUS .....................................................................................46
Figura 5. 2 Confirmando el funcionamiento del RADIUS con systemclt status freeradius ..........................47
Figura 5. 3 Configurando archivos, modificando y reconociendo la estructura interna del RADIUS ..........47
Figura 5. 4 Probando validación de usuarios de forma local ......................................................................48
Figura 5. 5 Modo depurador del RADIUS ...................................................................................................49
Figura 5. 6 Portal cautivo interno de la Controller ......................................................................................49
Figura 5. 7 Validación de la configuración RADIUS ...................................................................................50
Figura 5. 8 Validación de la configuración con la controller ........................................................................50
VII
Lista de Acrónimos
PC Personal Computer
VIII
QoS Quality of service
EW Extreme Wireless
IR Transmisión Infrarroja
IX
Capítulo I
1. Introducción
Actualmente el uso de las redes ha aumentado tanto en instituciones educativas como en empresas
privadas o gubernamentales. Dependiendo de la infraestructura que se use se deben de tomar medidas
que permitan tener un control de acceso a los recursos de forma eficiente.
Este documento está compuesto por los siguientes capítulos. Capítulo Il, se realiza la descripción
del proyecto, identificando cuales son las necesidades de la unidad Iztapalapa UAM. Capítulo lll, se
desarrolla el marco teórico de la investigación, dando una referencia teórica sobre el funcionamiento de
las redes, la seguridad y información en general del portal cautivo. Capítulo lV, se describe el proceso
de desarrollo, para llevar a cabo la implementación del portal cautivo externo y la vinculación con la
controladora Extreme Wireless Controller. Capítulo V, se describen los pasos realizados para validar las
funcionalidades del protocolo RADIUS y validar la interporabilidad entre el portal cautivo y el programa
de Extreme Wireless Solution.
1
Capítulo II
2. Generalidades
Este capítulo contiene los objetivos y justificación del proyecto, así como la información general de la
institución donde se desarrolla la residencia profesional.
2.1. Objetivos
El objetivo se define como una meta a cumplir para la cual se disponen unos medios y recursos
determinados.
Realizar la ingeniería necesaria para que la Red Inalámbrica Institucional de la Unidad Iztapalapa de la
UAM opere bajo el esquema de portal cautivo y valide la identidad del solicitante del servicio como miembro
de la comunidad Universitaria y entonces otorgar el servicio.
2
2.2. Justificación
3
2.3. Caracterización de la empresa en la que participo
Dirección: Avenida San Rafael Atlixco 186, Colonia Vicentina CDMX CP 09340.
Teléfono: 5804-4600
Misión:
Integrar una comunidad de alto nivel académico que trabaje en la formación sólida de ciudadanos y
profesionales autónomos, críticos, propositivos, con valores y sentido ético, responsables ante la sociedad,
respetuosos del medio ambiente y la diversidad cultural. Esta comunidad asume como tarea el desarrollo,
aplicación, preservación y difusión de las ciencias, las artes, las humanidades y las tecnologías que
contribuyan oportunamente a la mejora del nivel de desarrollo humano de la sociedad, en particular en su zona
de influencia, y al fortalecimiento del proyecto académico de la UAM.
Visión:
La Unidad Iztapalapa de la UAM es en 2024 una institución con un alto grado de reconocimiento nacional
e internacional por sus contribuciones relevantes al conocimiento, la cultura y la tecnología, así como a la
mejora del nivel de desarrollo humano de la sociedad, en particular de su zona de influencia.
4
Valores:
La Unidad Iztapalapa tiene un compromiso irrenunciable con la práctica de los siguientes valores en
el desarrollo de sus funciones:
5
Estructura organizacional:
6
2.5. Alcances y limitaciones
Alcances:
Limitaciones:
• El desarrollo del portal cautivo se llevará a cabo en un espacio de pruebas para posteriormente
implementarlo en el servidor de producción.
• No se tendrá acceso directo a la base de datos en producción.
• La configuración del Extreme Wireless Controller es realizada únicamente por el equipo de Extreme
Networks.
7
Capítulo III
3. Fundamento Teórico
En el este capítulo se explica brevemente los protocolos de autenticación a utilizar, la definición de la
herramienta portal cautivo, así como protocolos que son requeridos para la implementación de dicha
herramienta.
Desde hace relativamente poco tiempo, se está viviendo lo que puede significar una revolución en el uso
de las tecnologías de la información. Esta revolución puede llegar a tener una importancia similar a la que tuvo
la adopción de Internet por el gran público. [1]
Una de las tecnologías más prometedoras y discutidas en esta década es la de poder comunicar
computadoras mediante tecnología inalámbrica. La conexión de computadoras mediante Ondas de Radio o
Luz Infrarroja actualmente está siendo ampliamente investigada.
También es útil para hacer posibles sistemas basados en plumas. Pero la realidad es que esta tecnología
está todavía en pañales y se deben de resolver varios obstáculos técnicos y de regulación antes de que las
redes inalámbricas sean utilizadas de una manera general en los sistemas de cómputo de la actualidad.
No se espera que las redes inalámbricas lleguen a remplazar a las redes cableadas. Estas ofrecen
velocidades de transmisión mayores que las logradas con la tecnología inalámbrica. Mientras que las redes
inalámbricas actuales ofrecen velocidades de Mbps, las redes cableadas ofrecen velocidades de 10 Mbps y
se espera que alcancen velocidades de hasta 100 Mbps. Los sistemas de Cable de Fibra Óptica logran
velocidades aún mayores, y pensando futuristamente se espera que las redes inalámbricas alcancen
velocidades de solo 10 Mbps.
• De Larga Distancia: Estas son utilizadas para transmitir la información en espacios que pueden variar
desde una misma ciudad o hasta varios países circunvecinos (mejor conocido como Redes de Área
Metropolitana MAN); sus velocidades de transmisión son relativamente bajas, de 4.8 a 19.2 Kbps.
8
• De Corta Distancia: Estas son utilizadas principalmente en redes corporativas cuyas oficinas se
encuentran en uno o varios edificios que no se encuentran muy retirados entre sí, con velocidades del
orden de 280 Kbps hasta los 2 Mbps.
Sistema de Distribución
El sistema de distribución es el componente lógico de la IEEE 802.11 o WIFI que se utiliza para
reenviar los marcos a su destino. Si bien 802.11 no especifica ninguna tecnología en particular para
implementar el sistema de distribución, generalmente solo se denomina Red de Backbone, y está formado
por las conexiones Ethernet que unen los distintos AP. [1]
Es el medio de transmisión utilizado por las estaciones para enviar y recibir marcos. Si bien 802.11
define varias capas físicas diferentes, las capas basadas en RF han sido mucho más populares que las
capas basadas en transmisión Infrarroja (IR). El hecho de que las señales no están circunscriptas a un
medio físico, como por ejemplo un cable, tiene como consecuencia que los límites geográficos de la red
son difusos.
Este dispositivo es el punto de acceso inalámbrico a la red de PCs (LAN) cableada. Es decir, es la
interfaz necesaria entre una red cableada y una red inalámbrica, es el traductor entre las comunicaciones
de datos inalámbricas y las comunicaciones de datos cableadas.
Estaciones
Las estaciones son dispositivos computacionales que poseen una interfaz de red inalámbrica.
Típicamente estos dispositivos son Notebooks, PDA, etc. Pero pueden ser computadoras normales en
lugares en que se ha optado no realizar un cableado de red y utilizar tecnologías inalámbricas solamente.
Adicionalmente varios fabricantes de dispositivos electrónicos están utilizando 802.11 para comunicar
dispositivos no computacionales.
9
3.1.2 Funcionamiento de una red inalámbrica.
El funcionamiento de una red inalámbrica es muy similar al funcionamiento de los teléfonos móviles.
Por un lado, se dispone de equipos de usuario: cualquier ordenador con una tarjeta de red inalámbrica
instalada (en sus diferentes versiones: USB, PCMCIA, PCI…). Por el otro, se encuentran los equipos de
acceso (denominados también puntos de acceso), que son los encargados de proporcionar la “cobertura” a
los equipos de usuario y permitir a los usuarios acceder a los distintos recursos de la red (páginas web,
servidores de ficheros…). [1]
La configuración formada por el Access Point y las estaciones ubicadas dentro del área de cobertura se
llama conjunto de servicio básico o BSS. Estos forman una célula. Cada BSS se identifica a través de un
BSSID (identificador de BSS) que es un identificador de 6 bytes (48 bits).
Cuando una estación se une a una célula, envía una solicitud de sondeo a cada canal. Esta solicitud
contiene el ESSID (identificador del conjunto de servicio extendido), que la célula está configurada para usar
y también el volumen de tráfico que su adaptador inalámbrico puede admitir. Si no se establece ningún ESSID,
la estación escucha a la red para encontrar un SSID.
Cada punto de acceso transmite una señal en intervalos regulares (diez veces por segundo
aproximadamente). Esta señal, que se llama señalización, provee información de su BSSID, sus
características y su ESSID, si corresponde. El ESSID se transmite automáticamente en forma predeterminada,
pero se recomienda que si es posible se deshabilite esta opción.
Cuando se recibe una solicitud de sondeo, el punto de acceso verifica el ESSID y la solicitud del volumen
de tráfico encontrado en la señalización. Si el ESSID dado concuerda con el del punto de acceso, éste envía
una respuesta con datos de sincronización e información sobre su carga de tráfico. Así, la estación que recibe
la respuesta puede verificar la calidad de la señal que envía el punto de acceso para determinar cuán lejos
está. En términos generales, mientras más cerca un punto de acceso esté, más grande será su capacidad de
transferencia de datos.
10
Por lo tanto, una estación dentro del rango de muchos puntos de acceso (que tengan el mismo SSID)
puede elegir el punto que ofrezca la mejor proporción entre capacidad de carga de tráfico y carga de tráfico
actual.
El acceso sin necesidad de cables, la razón que hace tan populares a las redes inalámbricas, es a
la vez el problema más grande de este tipo de redes en cuanto a seguridad se refiere. [1]
Cualquier equipo que se encuentre a 100 metros o menos de un punto de acceso, podría tener
acceso a la red inalámbrica.
Confidencialidad
• Riesgo de interferencia, usuarios no autorizados pueden obtener acceso al tráfico de datos en su red.
• Riesgo de arrebato de tráfico y riesgo de un ataque tipo de intermediario.
Integridad
Disponibilidad
Autenticación
11
Para poder considerar una red inalámbrica como segura, debería cumplir con los siguientes requisitos:
• Las ondas de radio deben confinarse tanto como sea posible. Esto es difícil de lograr totalmente, pero
se puede hacer un buen trabajo empleando antenas direccionales y configurando adecuadamente la
potencia de transmisión de los puntos de acceso.
• Debe existir algún mecanismo de autenticación en doble vía, que permita al cliente verificar que se
está conectando a la red correcta, y a la red constatar que el cliente está autorizado para acceder a
ella.
• Los datos deben viajar cifrados por el aire, para evitar que equipos ajenos a la red puedan capturar
datos mediante escucha pasiva.
Existen varios métodos para lograr la configuración segura de una red inalámbrica; cada método logra un
nivel diferente de seguridad y presenta ciertas ventajas y desventajas. Se hará a continuación una
presentación de cada uno de ellos.
Este método consiste en la creación de una tabla de datos en cada uno de los puntos de acceso a la red
inalámbrica. Dicha tabla contiene las direcciones MAC (Media Access Control) de las tarjetas de red
inalámbricas que se pueden conectar al punto de acceso. Como toda tarjeta de red posee una dirección MAC
única, se logra autenticar el equipo. Este método tiene como ventaja su sencillez, por lo cual se puede usar
para redes caseras o pequeñas. Sin embargo, posee muchas desventajas que lo hacen impráctico para uso
en redes medianas o grandes:
• No escala bien, porque cada vez que se desee autorizar o dar de baja un equipo, es necesario editar
las tablas de direcciones de todos los puntos de acceso. Después de cierto número de equipos o de
puntos de acceso, la situación se torna inmanejable.
• El formato de una dirección MAC no es amigable (normalmente se escriben como 6 bytes en
hexadecimal), lo que puede llevar a cometer errores en la manipulación de las listas.
• Las direcciones MAC viajan sin cifrar por el aire. Un atacante podría capturar direcciones MAC de
tarjetas matriculadas en la red empleando un sniffer, y luego asignarle una de estas direcciones
capturadas a la tarjeta de su computador, empleando programas tales como AirJack6 o WellenReiter,
7 entre otros. De este modo, el atacante puede hacerse pasar por un cliente válido.
• En caso de robo de un equipo inalámbrico, el ladrón dispondrá de un dispositivo que la red reconoce
como válido. En caso de que el elemento robado sea un punto de acceso el problema es más serio,
12
porque el punto de acceso contiene toda la tabla de direcciones válidas en su memoria de
configuración.
Debe notarse, además, que este método no garantiza la confidencialidad de la información transmitida,
ya que no prevé ningún mecanismo de cifrado.
El algoritmo WEP forma parte de la especificación 802.11, y se diseñó con el fin de proteger los
datos que se transmiten en una conexión inalámbrica mediante cifrado. WEP opera a nivel 2 del modelo
OSI y es soportado por la gran mayoría de fabricantes de soluciones inalámbricas.
En líneas generales WEP requiere de los siguientes datos de entrada para realizar el cifrado:
• Los datos que la trama deberá transportar como carga o payload. Estos son provistos por la capa
superior del stack de protocolos.
• Una clave secreta, utilizada para cifrar la trama. Dependiendo de la implementación, las claves pueden
ser especificadas como una cadena de bits o por el número de clave, ya que WEP permite almacenar
cuatro claves de forma simultánea.
• Un Vector de Inicialización (IV), utilizado junto con la clave secreta en la transmisión del marco.
Luego de realizar el proceso de cifrado, WEP ofrece como resultado: Una trama cifrada, lista para
transmitir sobre redes no confiables, con suficiente información en la cabecera para permitir su descifrado
en el receptor del marco. Como se ve en la Ilustración, el Driver y la interfaz de hardware son responsables
de procesar los datos y de enviar la trama cifrada utilizando la siguiente secuencia:
1. La trama 802.11 entra en la cola de transmisión. Esta trama consiste en una cabecera y en el payload.
WEP protege solamente el payload y deja la cabecera intacta.
2. Se calcula un Valor de Chequeo de Integridad (ICV) sobre el payload original. EL Chequeo de
Secuencia de la Trama (FCS) no ha sido calculado en este punto, por lo que no se incluye en el cálculo
del ICV. El ICV es un CRC, y por lo tanto es predecible y criptográficamente inseguro para chequeos
de integridad.
3. La Clave de Cifrado de la Trama (FEK) o WEP seed se ensambla en este punto, esta consta de dos
partes: la clave secreta y el vector de inicialización. Los stream ciphers producen el mismo flujo de
salida para la misma clave, por lo que el IV se utiliza para producir flujos de salida distintos para cada
trama transmitida y se coloca como prefijo de la clave secreta. El estándar 802.11 no establece
ninguna restricción para el algoritmo usado para elegir los IV. Algunas implementaciones asignan los
IV de forma secuencial, otras lo asignan a través de un algoritmo pseudoaleatorio. La selección del IV
tiene algunas implicaciones de seguridad, ya que una “pobre” selección en el IV puede comprometer
la clave.
13
4. La Clave de Cifrado de la Trama se usa como clave RC4 para cifrar el payload de la Trama original
del paso 1 y el ICV del paso 2. El proceso de cifrado casi siempre es realizado con hardware
especializado para el algoritmo RC4 en la placa inalámbrica.
5. Como último paso, se ensambla la trama a transmitir formada por el payload cifrado, la cabecera
original, y una cabecera WEP, formada por el IV y número de clave. Una vez ensamblada la nueva
trama se calcula el FCS y se realiza la transmisión. El descifrado de la trama se realiza en orden
inverso.
El algoritmo WEP resuelve aparentemente el problema del cifrado de datos entre emisor y receptor. Sin
embargo, existen dos situaciones que hacen que WEP no sea seguro en la manera que es empleado en la
mayoría de aplicaciones:
• La mayoría de instalaciones emplea WEP con claves de cifrado estáticas (se configura una clave en
el punto de acceso y no se la cambia nunca, o muy de vez en cuando). Esto hace posible que un
atacante acumule grandes cantidades de texto cifrado con la misma clave y pueda intentar un ataque
por fuerza bruta.
• WEP no ofrece servicio de autenticación. El cliente no puede autenticar a la red, ni al contrario; basta
con que el equipo móvil y el punto de acceso compartan la clave WEP para que la comunicación
pueda llevarse a cabo
Existen en este momento diversas herramientas gratuitas para romper la clave secreta de enlaces
protegidos con WEP. El primer programa que hizo esto posible fue WEPCrack, que consiste en una serie de
scripts escritos en lenguaje Perl diseñados para analizar un archivo de captura de paquetes de un sniffer. La
herramienta AirSnort9 hace lo mismo, pero integra las funciones de sniffer y rompedor de claves, y por lo tanto
es más fácil de usar. Airsnort captura paquetes pasivamente, y rompe la clave WEP cuando ha capturado
suficientes datos.
VPN
Una red privada virtual (Virtual Private Network, VPN) emplea tecnologías de cifrado para crear un canal
virtual privado sobre una red de uso público. Las VPN resultan especialmente atractivas para proteger redes
inalámbricas, debido a que funcionan sobre cualquier tipo de hardware inalámbrico y superan las limitaciones
de WEP. Para configurar una red inalámbrica utilizando las VPN, debe comenzarse por asumir que la red
inalámbrica es insegura. Esto quiere decir que la parte de la red que maneja el acceso inalámbrico debe estar
aislada del resto de la red, mediante el uso de una lista de acceso adecuada en un enrutador, o agrupando
todos los puertos de acceso inalámbrico en una VLAN si se emplea switching. Dicha lista de acceso y/o VLAN
solamente debe permitir el acceso del cliente inalámbrico a los servidores de autorización y autenticación de
14
la VPN. Deberá permitirse acceso completo al cliente, sólo cuando éste ha sido debidamente autorizado
y autenticado. [1]
Los servidores de VPN se encargan de autenticar y autorizar a los clientes inalámbricos, y de cifrar
todo el tráfico desde y hacia dichos clientes. Dado que los datos se cifran en un nivel superior del modelo
OSI, no es necesario emplear WEP en este esquema.
La utilización de las VPN añade bastante seguridad a las redes inalámbricas, pero tiene ciertas
desventajas una de ellas es la económica pues cada túnel tiene un costo para la empresa y cuando se
trata de proteger a cientos o miles de usuarios de una red inalámbrica WIFI, las VPN se convierten en
extremadamente costosas. Otro inconveniente es que las VPN han sido pensadas y diseñadas para
conexiones “dial-up” punto a punto, pero las redes inalámbricas WIFI transmiten ondas de RF (irradian)
por el aire que es un medio compartido.
3.2 RADIUS
Este protocolo se creó para poder resolver una necesidad, esta necesidad consistía en tener un
método de autenticación, autorización y contabilidad para los usuarios que necesitaban acceder a los
diferentes recursos de cómputo. RADIUS originalmente fue desarrollado por las empresas Livingston, es
un protocolo de control de acceso que verifica y autentica a los usuarios basado en el uso del método
común challenge/response. [2]
Merit Networks, una empresa que tuvo un papel muy importante en la creación de Internet, tenía un
problema con sus métodos de autenticación ya que eran específicos para cierto equipo, lo que generaba
demasiados gastos y su sistema no era flexible para presentar informes, conforme los usuarios fueron
creciendo, Merit se dio cuenta que necesitaban un mecanismo más flexible y extensible. Entonces Merit
15
solicitó propuestas para resolver este problema, los primeros en responder fue Livingston Enterprises, se
reunieron representantes de Merit Networks y Livingston Enterprises y posterior a esto se escribió una
primera versión de lo que hoy se conoce como RADIUS. Por otra parte, se tuvo que construir mucho
software para poder comunicar a los equipos de servicio creados en Livingston y el servidor RADIUS de
Merit, el cual operaba con un sistema UNIX. El desarrollador de RADIUS fue Steve Willins.
A partir de ese trabajo en conjunto Livingston Enterprise se convirtió en Lucent, Merit y Lucent tomaron
el protocolo RADIUS y trabajaron con él hasta su formalización y aceptación en la industria. RADIUS es muy
ocupado por los proveedores de Servicios de Internet, ISP (Internet Service Provider), y puede ser utilizado
en cualquier ambiente donde se requiera o se desee una autenticación central, una autorización regulada y
una contabilidad detallada de usuarios.
Modelo Cliente/Servidor
Un servidor de acceso a la red (NAS – Network Access Server) opera como cliente de RADIUS.
El cliente es responsable de transmitir la información del usuario al servidor RADIUS designado y después
actuar dependiendo de la respuesta que se le devuelva.
Un servidor RADIUS puede actuar como un cliente proxy de otro servidor RADIUS o de otro tipo de
servidor de autenticación. [3]
Seguridad de red
16
Las transacciones entre el cliente y el servidor RADIUS son autenticadas mediante el uso de clave
compartida, que nunca es enviada en la red. Por otra parte, las contraseñas de los usuarios al momento de
enviarse entre el cliente y el servidor RADIUS se encriptan, para eliminar la posibilidad que alguien que este
monitoreando la red no pueda ver las contraseñas.
El servidor RADIUS puede apoyarse en una variedad de métodos para autenticar a un usuario.
Cuando se proporciona un nombre de usuario y una contraseña dada por este, puede soportar PPP, PAP
o CHAP, login de UNIX, entre otros.
Protocolo extensible
Todas las transacciones están compuestas por tuplas de 3 valores: atributo-tamaño-valor de longitud
variable. Los nuevos valores de atributos pueden agregarse sin perturbar las implementaciones existentes
del protocolo, es decir, este protocolo puede extenderse.
El protocolo RADIUS utiliza paquetes UDP para hacer las transmisiones entre el cliente y el servidor.
El protocolo se comunica en el puerto 1812. Se utiliza este protocolo por 4 principales razones:
• Si una petición a un servidor de autenticación primario falla, un servidor secundario debe ser
consultado.
• Los requisitos de tiempo del protocolo RADIUS son significativamente diferentes a los que TCP
proporciona. Un extremo de la comunicación no requiere de una respuesta de detección de pérdida
de datos, el usuario está dispuesto a esperar varios segundos para completar la autenticación. En el
otro extremo, el usuario no está dispuesto a esperar varios minutos para la autenticación.
Modelo AAA
17
Este modelo recibe su nombre gracias a las iniciales de sus principales características: Authentication,
Authorization y Accounting.
El modelo AAA se centra en tres aspectos cruciales para el control de acceso a usuarios:
Lo anterior se usa comúnmente para describir el comportamiento del servicio de RADIUS, aunque se
debe de señalar que RADIUS fue creado antes de que se creará el modelo de la AAA. [4]
Este modelo sirve para administrar y reportar todas las transacciones de principio a fin. El proceso se
podría representar con unas sencillas preguntas:
El grupo de trabajo de la AAA se formó por la IETF (Internet Engineering Task Force) para crear una
arquitectura funcional que solucionará las limitaciones del sistema descrito anteriormente. Había una
necesidad de enfocarse en la descentralización de los equipos y en monitorear el uso en redes heterogéneas.
18
Después de mucho trabajo nació la arquitectura AAA.
802.1x
El autenticador, que es el equipo de red (19réate, enrutador, servidor de acceso remoto…) que recibe
la conexión del suplicante. El autenticador actúa como intermediario entre el suplicante y el servidor de
autenticación, y solamente permite el acceso del suplicante a la red cuando el servidor de autenticación
así lo autoriza.
19
La autenticación del cliente se lleva a cabo mediante el protocolo EAP (Extensible Authentication Protocol)
y el servicio RADIUS.
WPA es un estándar propuesto por los miembros de la Wi-Fi Alliance (que reúne a los grandes fabricantes
de dispositivos para WLAN) en colaboración con la IEEE. Este estándar busca subsanar los problemas de
WEP, mejorando el cifrado de los datos y ofreciendo un mecanismo de autenticación. Para solucionar el
problema de cifrado de los datos, WPA propone un nuevo protocolo para cifrado, conocido como TKIP
(Temporary Key Integrity Protocol). Este protocolo se encarga de cambiar la clave compartida entre punto de
acceso y cliente cada cierto tiempo, para evitar ataques que permitan revelar la clave. Igualmente se mejoraron
los algoritmos de cifrado de trama y de generación de los Ivs, con respecto a WEP. El mecanismo de
autenticación usado en WPA emplea 802.1x y EAP. Según la complejidad de la red, un punto de acceso
compatible con WPA puede operar en dos modalidades:
La principal debilidad de WPA es la clave compartida entre estaciones. Cuando un sistema basa su
seguridad en una contraseña siempre es susceptible de sufrir un ataque de fuerza bruta, es decir ir
comprobando contraseñas, aunque dada la longitud de la contraseña y si está bien elegida no debería plantear
mayores problemas. Se debe pensar que hay un momento de debilidad cuando la estación establece el diálogo
de autenticación. Este diálogo va cifrado con las claves compartidas, y si se entienden entonces se garantiza
el acceso y se inicia el uso de claves dinámicas. La debilidad consiste en se conoce el contenido del paquete
de autenticación y conocemos su valor cifrado. Ahora lo que queda es, mediante un proceso de ataque de
diccionario o de fuerza bruta, intentar determinar la contraseña.
20
3.3 Portal Cautivo
Un portal cautivo es una herramienta que vigila el tráfico HTTP y obliga a los usuarios de una red a
pasar por una página web especial si desean navegar por internet. [7]
Se encarga de interceptar todo el tráfico HTTP y no deja pasar ninguna petición hasta que el usuario
se autentique de forma correcta.
También puede controlar el tiempo que durarán las sesiones, el ancho de banda usado por cada
usuario, entre otras cosas.
Esta herramienta se puede implementar mediante la instalación de software en una máquina que
está conectada a la red o existen implementaciones en hardware. El portal cautivo generalmente es usado
en redes inalámbricas abiertas, es decir en redes públicas, donde se requiere mostrar un mensaje de
bienvenida a los usuarios en donde se les puede indicar las políticas de uso de dicha red.
• El más sencillo, simplemente obliga al usuario a mirar las políticas de uso y posteriormente aceptarlas
mediante el clic de un botón. Este tipo de configuración sirve para delegar responsabilidades al
usuario, y de esta forma absolver al proveedor del servicio de cualquier uso indebido o ilegal del
servicio, actualmente existe un debate sobre si es legalmente válido realizar esta delegación de
responsabilidades.
• Otros portales sirven para proveer publicidad del proveedor o de patrocinadores y el usuario tiene que
hacer clic en la publicidad para que pueda usar internet normalmente.
• Existen portales que requieren del ingreso de una identificación y clave asignada para poder acceder
a internet.
21
• Otro tipo de portal es en donde se requiere pagar, es decir, servicio de prepago para poder hacer uso
de internet, ya sea por tiempo o por cantidad de datos consultados.
El portal cautivo es una plataforma muy fácil de integrar. Se integra de manera natural mediante el
uso de interfaces de red.
Existen dos tipos de portales cautivos, los portales cautivos por software y los portales cautivos por
hardware.
Son programas o paquetes que permiten la implementación de un portal cautivo mediante la instalación
de éstos en un sistema o un servidor, algunos de estos programas son:
• PepperSpot
• NoCatAuth
• Chillispot
• CoovaChilli
• AirMarshal
• ZeroShell
• Easy Captive
• PfSense
• OpenSplash
• Wicap
• m0n0wall
• Ewrt
• HotSpotSystem
• WifiDog
• Antamedia HotSpot Software
• FirstSpot
22
Portales Cautivos por Hardware
Existe hardware que implementa el portal cautivo de forma nativa, algunos ejemplos de éstos son:
• Cisco BBSM-Hotspot
• Cisco Site Selection Gateway (SSG) / Subscriber Edge Services (SESM)
• Nomadix Gateway
• Aptilo Access Gateway
• Antica PayBridge
• 3G/Wimax
Se define como un conjunto de datos organizados en un archivo lógico y en uno o varios archivos
físicos. [5]
23
o Administrador de la base de datos (DBA). Es el usuario más importante de todos, ya que se
encarga de diseñar (construir) y modificar la estructura de la base de datos, así como de su
administración.
• Lenguaje de definición de datos (Data Definition Language – DDL): Permite describir el esquema de
la base de datos, es decir, la creación, modificación y eliminación de objetos de una base de datos,
como: tablas, vistas, etc. Los comandos utilizados son 24réate, alter, drop.
• Lenguaje de manipulación de datos (Data Manipulation Language – DML): Permite la manipulación
de los datos, como recuperación de la información almacenada, insertar nueva información, borrar
información, etc. Los comandos utilizados son select, update, insert, etc.
• Lenguaje de control de datos (Data Control Language – DCL): Controla el acceso y la seguridad en
una base de datos. Se usan los comandos (grant, revoke).
• Lenguaje de control de transacciones (Transaction Control Language – TCL): Controla las
transacciones que se deben de ejecutar de forma automática dado un evento, en otras palabras,
controla a los Triggers.
24
• Integridad: Se refiere a la exactitud y consistencia de los datos. El DBMS se encarga de hacer este
análisis. La integridad de datos debe cumplir con las siguientes restricciones:
o Integridad de entidades. Ninguna parte de la llave primaria (PK) puede ser nula.
o Integridad referencial. El valor de una FK debe coincidir con un valor de una PK.
o Integridad de columnas. Una columna debe contener sólo valores consistentes con el formato
de datos definidos para esa columna.
• Seguridad: Cuando se tiene información confidencial, se deben considerar muchos aspectos, al utilizar
un DBMS, se simplifican las consideraciones a tomar, ya que, por sí mismo, el DBMS implementa
métodos de seguridad, ya sea para la autenticación de usuarios, en la asignación de permisos, etc.
• Consistencia: Por la naturaleza de un DBMS, el utilizarlo asegura que la información será consistente,
es decir, no habrá redundancia (datos duplicados), o datos que se contradigan, ya que implementa
ciertas reglas que no permite que suceda lo anterior.
• Concurrencia: Si la información está guarda en archivos sencillos, y si varios usuarios acceden al
mismo tiempo a un dato pueden producirse errores. Al utilizar un DBMS, éste se encarga de establecer
los controles adecuados para sincronizar las peticiones simultáneas, lo que permite concurrencia.
Cuando se accede a la información que hay en una base de datos, el encargado de hacer eso es el
DBMS. El DBMS tiene que comunicarse con el sistema operativo ya que el acceso a los ficheros de datos
implica utilizar funciones propias del sistema operativo. [6]
25
Cuando un usuario quiere consultar información de la base de datos, lo hace por medio de un proceso.
La interacción que se lleva a cabo es la siguiente:
1. El proceso llama al DBMS indicándole la porción de la base de datos que se desea consultar.
2. El DBMS traduce dicha llamada a términos del esquema lógico de la base de datos. Accede al
esquema lógico comprobando derechos de acceso y la traducción física.
3. El DBMS obtiene el esquema físico.
4. El DBMS genera una llamada a los métodos de acceso del Sistema Operativo que permiten acceder
a los datos requeridos (archivos).
5. El Sistema Operativo accede a los datos que el DBMS le solicitó.
6. Los datos almacenados pasan del disco a una memoria intermedia o buffer.
7. Los datos pasan del buffer al área de trabajo del usuario (proceso del usuario).
8. El DBMS devuelve información al proceso de usuario, donde se indica si ocurrieron errores o
advertencias a considerar. Si la información es satisfactoria, los datos podrán ser utilizados por el
proceso de usuario.
26
Capítulo IV
4. Desarrollo
A lo largo de este capítulo se llevará a cabo la implementación de un portal cautivo para gestionar el
acceso a la red Inalámbrica de la UAM de Iztapalapa.
Se utilizaron diversas herramientas que a lo largo de este capítulo se irán explicando a detalle cada
una de estas tecnologías.
27
1. La secuencia comienza cuando el usuario realiza una solicitud HTTP.
2. Una vez el controlador intercepta la solicitud lo redirige al servidor web pasándole atributos como
token, destino (al cual el usuario hizo la petición) y la Ip del router donde se conectó el usuario.
3. A continuación, el servidor web invoca un script para preparar y mostrar la página de inicio de sesión.
4. Una vez se envíen los parámetros requeridos por la página login, se enviará la información al servidor
Radius para su validación.
5. Si la información enviada es correcta, el servidor web redirigirá automáticamente al usuario al sitio que
deseaba ingresar.
28
Figura 4. 3 Diseño de registro de login
29
4.2 Configuración del servidor RADIUS
NOTA: Se utilizo una maquina remota proporcionada por la UAM, la cual contiene la distribución CentOS
7 de Linux, con la que se trabajara y desarrollara todo el proyecto.
1) Ejecute el siguiente comando para actualizar el índice del paquete del sistema.
Realizaremos una búsqueda rápida de todos los paquetes FreeRADIUS disponibles, para asegurarnos
de que estén disponibles los paquetes: freeradius, freeradius-utils, freeradius-mysql freeradius-perl.
30
2) Instalamos freeradius, freeradius-utils, freeradius-mysql y freeradius-perl:
3) Una vez finalizada la instalación, inicie y active FreeRADIUS para que se ejecute y también se inicie en
el arranque:
31
4.2.2 Configuración del Firewall para freeRADIUS
Configuraremos firewalld para permitir el correcto funcionamiento de los paquetes radius y httpd.
1) El servidor RADIUS usa los puertos UDP 1812 y 1813. Puede verificar esto emitiendo el siguiente
comando:
$ cat /usr/lib/firewalld/services/radius.xml
Salida:
<service>
<short>RADIUS</short>
32
Salida de verificación de estado:
Docs: man:firewalld(1)
CGroup: /system.slice/firewalld.service
running
4) Se crean reglas permanentes para la zona predeterminada para permitir los servicios http, https y radius.
$ firewall-cmd --reload
$ firewall-cmd --get-default-zone
public
33
4.2.3 Instalar y configurar MariaDB en CentOS 7
$ nano /etc/yum.repos.d/MariaDB.repo
2) Agregue el siguiente contenido, guardamos y salimos del archivo cuando haya terminado:
[mariadb]
name = MariaDB
baseurl = http://yum.mariadb.org/10.1/centos7-amd64
gpgkey=https://yum.mariadb.org/RPM-GPG-KEY-MariaDB
gpgcheck=1
3) Actualizamos el índice del paquete:
$ yum -y update
4) Instalamos MariaDB:
enabled
34
7) Ejecute el siguiente comando y lo guiará a través de un proceso donde le permitirá: establecer la
contraseña de root, eliminar usuarios anónimos y no permitir el inicio de sesión remoto.
$ mysql_secure_installation
También se le pedirá que responda algunas preguntas para eliminar / mantener algunos
valores predeterminados:
35
4.2.4 Instala PHP 7 en CentOS 7
CentOS 7 se entrega con PHP 5.4 en el momento de la escritura, que ha sido oficialmente EOL por algún
tiempo.
Al usar PHP 7, las aplicaciones se cargarán más rápido y usarán menos recursos.
PHP 7.x está disponible en varios repositorios. Para nuestros propósitos, utilizaremos el Remi Repository,
que proporciona versiones más recientes de aplicaciones.
1) El Remi Repository depende del repositorio EPEL. Con la siguiente líne agregaremos EPEL y Remi:
2) Instalaremos PHP 7.3, que es la última versión estable en el momento de la escritura. Habilite el
repositorio PHP 7.3 Remi:
3) Y ejecute el siguiente comando para instalar PHP 7.3 junto con algunos de los módulos PHP más
comunes:
Es posible que se le pregunte durante la instalación si está de acuerdo con la importación de una clave
GPG. Responda ‘y’ y presione enter.
4) Con el siguiente comando podemos verificar la versión de PHP, para asegurarnos de que la instalación
fue exitosa:
$ php -v
36
4.2.5 Configure FreeRADIUS para usar MariaDB / MySQL
Para configurar FreeRADIUS para usar MariaDB / MySQL, tendremos que crear una base de datos
con tablas para ser utilizadas por el servidor FreeRADIUS para encontrar usuarios de RADIUS y
almacenar datos contables.
El paquete FreeRADIUS MySQL se entrega con la consulta necesaria para crear estas tablas, lo que
facilita mucho nuestro trabajo.
1) Para comenzar, iniciaremos sesión en MariaDB o MySQL y crearemos y configuraremos una base de
datos que llamaremos radius:
$ mysql -u root -p
2) Una vez que haya iniciado sesión, ejecute los siguientes comandos para crear y configurar la base de
datos:
3) A continuación, importe el esquema del radius a la base de datos RADIUS para completar la base de
datos:
37
Figura 4. 7 Creación y modificación de privilegios sobre la base radius
$ ln -s /etc/raddb/mods-available/sql /etc/raddb/mods-enabled/
5) Ahora configuraremos el servidor freeRADIUS para usar el servidor de base de datos. Haga esto abriendo
el archivo de configuración /raddb/mods-available/sql usando su editor de texto favorito:
1 $ nano /etc/raddb/mods-available/sql
La sección sql debería tener un aspecto similar al siguiente, aunque el suyo será un documento más largo
debido a explicaciones y otras líneas que están comentadas.
38
sql {
driver = "rlm_sql_mysql"
dialect = "mysql"
# Connection info:
server = "localhost"
port = 3306
login = "radius"
password = "#############"
radius_db = "radius"
# Set to ‘yes’ to read radius clients from the database (‘nas’ table)
read_clients = yes
Los pasos para seguir aquí son:
# Table to keep radius client info
a) Cambiar driver =“rlm_sql_null” a driver = "rlm_sq“_mysql”
client_table = “nas”
b) Cambiar dialect = ”sqlite" a dialect = "mysql"
c) Des comentar server, port, login y password mediante la eliminación # desde el principio de la línea,
ahí como cambiar passwor = "radass" a password = "#####".
39
Para ejemplificar, así es como se ven las líneas inicialmente:
#server = "localhost"
#port = 3306
#login = "radius"
#password = "##########"
Y así es como se ocupará:
e) Las otras líneas ya deberían estar configuradas de acuerdo con nuestras necesidades, para que
pueda guardar y cerrar el archivo cuando haya terminado. (Sin embargo, puede verificar para
asegurarse de que todo esté en orden)
40
4.3 Implementación del portal cautivo
4.3.1 Requisitos
⚫ PHP 7.3.12
⚫ MySQL
El funcionamiento que realiza cada uno de los archivos mostrados en la figura 11 se describen
en la página 42.
41
4.3.3 Vista previa del inicio de sesión.
Nota: La configuración que se mostrara a continuación fue proporcionada por la empresa Extreme.
En el apartado de VNS, Global, Authentication ingresamos la conexión al servidor donde está alojado el
protocolo FreeRADIUS, no pedirá un alias el cual será el nombre para identificarlo ya que puede haber más
42
de uno, posterior mente nos pedirá la IP donde está alojado, así como su Shered Secret el cual servirá
para comunicar ambas tecnologías de forma segura.
En el apartado de VNS, WLAN Services, Auth & Acct pedirá un modo de autenticación cuenta con
varios modos disponibles es escogerá la opción que se acomode al proyecto, enseguida se coloca el
RADIUS server que anterior mente se agregó la figura 4.12.
43
En el botón de configuración del modo de autenticación se localiza la conexión al EWP su puerto y la url
de redireccionamiento que apuntara al portal cautivo después de ingresar a la red Wi-Fi.
44
En el apartado de VNS, WLAN Services se realiza la configuración del AP que erradiara la señal Wi-
Fi y el rol a ejecutar.
En el apartado de VNS, Roles, VLAN & Class of Service se crean roles que funcionaran conjunto al
AP más aparte se le hace referencia a la redirección de portal cautivo.
45
Capítulo V
5. Pruebas y Resultados
En este capítulo se comentan las pruebas hechas que validan a este proyecto, como se solucionó la
problemática aplicando las herramientas adecuadas y adaptación de las mismas, para el perfecto
funcionamiento del portal Cautivo.
Se realizo como primera instancia la implementación del protocolo FreeRADIUS sobre la plataforma de
Ubuntu. Esto con la finalidad de conocer el funcionamiento, la modificación de archivos y la validación de
usuarios en local de dicho protocolo y posteriormente implementarlo en el sistema de CentOS 7 que nos
proveo la UAM.
46
Una vez instalado el protocolo FreeRADIUS, validamos que este se encuentre activo.
Se realizaron configuraciones en los archivos internos de radius para asegurar la correcta conexión
con la base de datos, así como el seleccionar el tipo de gestor que ocuparíamos.
47
Finalmente se realizó una prueba local para verificar el correcto funcionamiento al validar a los
usuarios.
Una vez instalado el protocolo FreeRADIUS en el servidor CentOS 7 tal como se mencionó en el capítulo
IV. Se procedió a realizar un testo de validación de usuario para verificar la comunicación entre el servidor y
la Extreme Wireless Controller.
Se procedió a iniciar el modo depuración dentro del servidor CentOS para que estuviera a la escucha de
posibles peticiones externas.
48
Figura 5. 5 Modo depurador del RADIUS
Dentro de la Extreme Wireless Controller se ejecutó un test para validar la conexión que se tenía con
la base de datos de FreeRADIUS. Dicha prueba nos solicitó las credenciales de acceso de un usuario.
49
Al Finalizar el test, Extreme Wireless Controller mostrara un mensaje donde especificara si el usuario
pudo ser autentificado exitosamente. En caso contrario se tendría que revisar la configuración de enlace.
De igual manera, el servidor CentOS al estar en modo depuración, recibirá las peticiones externas y
validará las credenciales del usuario.
50
Capítulo VI
6. Conclusiones
El control del ingreso de los usuarios al servicio del internet se puede administrar y cuantificar, por
lo que es posible adoptar nuevas políticas de uso según se vaya trabajando en el Portal Cautivo del
Instituto UAM de Iztapalapa.
El protocolo RADIUS no ofrece la opción de limitaciones de tiempo para los usuarios conectados al
Portal cautivo, pero la configuración actual está totalmente acorde con la política del Instituto UAM de
Iztapalapa, para que el servicio de internet esté libre por ser un servicio meramente de investigación y
con esta premisa no se debería limitar el tiempo de la indagación de conocimientos e información
académica.
El Portal Cautivo del Instituto UAM de Iztapalapa permite utilizar una encriptación básica de los datos
de los usuarios que viajan en la red inalámbrica para el uso del internet a un nivel de tipo académico.
Para finalizar, la autenticación es un mecanismo muy importante para proteger el acceso a los
recursos de información. Por otra parte, existen muchas herramientas que permiten llevar a cabo la
autenticación de usuarios en una red, cada una de éstas tiene ventajas y a la vez desventajas.
Dichas herramientas pueden ir desde un simple software hasta un protocolo complejo, es importante,
conocer la existencia de dichas herramientas ya que pueden ser de gran utilidad.
En el área de seguridad, se concluye que nada puede ser totalmente seguro, ya que algunas de las
desventajas que existen en las herramientas, son ocasionadas por la naturaleza del protocolo que se usa.
En otras implementaciones el punto más débil del mecanismo de autenticación es el propio usuario.
51
Referencias
[3] N. W. Group, «Remote Authentication Dial In User Service (RADIUS),» 2000. [En línea].
Available: http://tools.ietf.org/html/rfc2865. [Último acceso: 2 Octubre 2019].
[5] P. DUBOIS, MySQL. (Fourth Edition), USA: Pearson Education Inc, 2009.
52
Anexos
Anexo A
Los scripts son mínimos porque pretenden resaltar los pasos críticos requeridos para una
implementación de un portal cautivo externo.
⚫ net-auth.php: recibe solicitudes redirigidas de navegadores que intentan acceder a sitios web, verifica
que la redirección se haya enviado desde el controlador y, de ser así, muestra una página de inicio de
sesión adecuada.
⚫ login.php: este script se invoca como consecuencia de que un navegador envía el formulario de inicio
de sesión creado por net-auth.php. El script autentica la estación de la forma que quiera. Si la estación
está autorizada, el script selecciona una duración máxima de la sesión y una función de control de acceso
para la estación. Luego redirige el navegador de la estación a un servidor web en el controlador, utilizando
un URI que contiene el rol de control de acceso, la duración máxima de la sesión, otros datos requeridos
por el controlador y una firma.
⚫ Crypt_aws_s4.php: este archivo contiene el código que verifica las firmas en las URL recibidas y que
firma las URL que redirigen la estación al controlador.
53
⚫ register.php: este script se encarga de mostrar una página de registro, por lo que es responsable de guardar los datos
de los usuarios y almacenarlos en el schema radius.
⚫ code_register.php: se encarga de validar los campos del archivo register.php y de hacer los query necesarios para
almacenar dicha información.
⚫ conexion.php: antes de poder acceder a los datos en la base de datos MySQL, necesitamos poder conectarnos al
servidor, por lo que este script se encargara de realizar dicha acción.
⚫ Estilos.css: este archivo es utilizado para especificar la presentación de la página de inicio de sesión y de la página
de registro de usuarios.
⚫ Fonts.css: es utilizado para importar iconos en la página de inicio de sesión y de registro de usuarios.
54
net-auth.php
<?php
// net-auth.php
//
//
// Assumptions
// ===========
55
// algorithm (as of May 2014).
// redirection response.
require_once("ffecp_config.php");
require_once("crypt_aws_s4.php");
require_once("common_utilities.php");
// the mainline.
if (SimpleAws::AWS4_ERROR_NONE != $rc) {
printError(SimpleAws::getAwsError($rc));
exit;
$ewc_ip = trim($_REQUEST['hwc_ip']);
56
$ewc_port = trim($_REQUEST['hwc_port']);
} else {
// easy to fix but all this program can do is report the error.
printError("Controller must be configured to include its IP " . "address & port in the request.");
exit;
// subsequent authentication.
if(!tokenCheck($token)) {
exit;
exit;
57
printError("Error: <span style='color:red'>Failed to process the request: incorrect client MAC
address.</span>");
exit;
exit;
$dest = convertUrlParam($dest);
$bssid = convertUrlParam($bssid);
$vns = convertUrlParam($vns);
$ap_name = convertUrlParam($ap_name);
// 3. Compose the login page and send it to the user. The page
exit;
// End of mainline
function getURL($data) {
58
$protocol = $ssl ? "https" : "http";
$port = $data['SERVER_PORT'];
// server. The page displays the name of the VNS (service) the user
// a real login page would have more content on it. This routine
// that when the user submits his credentials all the information
<html lang=\"es\">
<head>
<meta charset=\"UTF-8\">
59
</head>
<body>
<div class=\"container-all\">
<div class=\"ctn-form\">
<div class=\"form-group\">
</div>
<span class=\"msg-error\"></span>
<div class=\"form-group\">
</div>
<span class=\"msg-error\"></span>
</form>
<div class=\"bottom\">
</div>
</div>
<div class=\"ctn-text\">
<div class=\"capa\"></div>
</div>
</div>
</body>
</html>";
return $template;
?>
61
Login.php
<?php
// login.php
// net-auth.php.
// Assumptions
// ===========
require_once("ffecp_config.php");
require_once("crypt_aws_s4.php");
require_once("common_utilities.php");
// The mainline begins here. The utilities are defined after the
// mainline.
$ewc_ip = trim($_REQUEST['ewc_ip']);
$ewc_port = trim($_REQUEST['ewc_port']);
$dest = trim($_REQUEST['dest']);
$token = trim($_REQUEST['token']);
$username = (isset($_REQUEST['userid'])) ?
trim($_REQUEST['userid']) : "";
$passwd = (isset($_REQUEST['passwd'])) ?
trim($_REQUEST['passwd']) : "";
63
$wlan = isset($_REQUEST['wlan']) ?
trim($_REQUEST['wlan']) : "";
if(!tokenCheck($token)) {
exit;
exit;
exit;
// again.
$max_duration = 36000;
// accessing.
64
if (false === $assigned_role) {
exit;
$max_duration);
$redirection = SimpleAws::createPresignedUrl(
$awsConfig['region'], $awsConfig['service'],
$awsConfig['expires']);
if (null == $redirection) {
exit;
exit;
65
// End of mainline.
// duration in seconds.
//
return false;
} else {
66
// user is logging into.
return "Guest_Access";
/**
* to decide.
*/
function isHttps() {
if (get_cfg_var('use_https')) {
if (1 == get_cfg_var('use_https')) {
$useHttps = true;
} else {
$useHttps = false;
} else {
$useHttps = false;
return $useHttps;
67
/**
* @param string $username The name the station's user logged in with
* @param int $wlanid Identifier for the WLAN the station is using
* @param string $dest The URL the station was trying to get to
*/
$max_duration) {
.$ewc_ip;
$redirectUrl .= ":".$ewc_port;
$redirectUrl .= EWC_REDIRECT_TARGET
.'token='. rawurlencode($token)
.'&wlan='.rawurlencode($wlanid)
.'&username='.rawurlencode($username)
68
.(is_not_empty($dest) ?'&dest='.rawurlencode($dest):'')
.(is_not_empty($assigned_role) ? '&role='.
rawurlencode($assigned_role):'')
.(is_not_empty($max_duration) ?'&opt27='.$max_duration:'');
return $redirectUrl;
?>
69
ffecp-config.php
<?php
// This example only uses the first one. Any printable ASCII
// secret so long as both the ECP and the controller use the
// same pair.
$awsKeyPairs = array(
'BigAuthInc'=>'secretferqrer123456667','testingidentity1'=>'secretferqrer12345666 8',
'testingidentity2'=>'secretferqrer123456669' );
// should be trusted.
?>
70
Crypt_aws_s4
<?php
class SimpleAws {
const AWS4_ERROR_NONE=0;
const AWS4_ERROR_NULL_INPUT=1;
const AWS4_ERROR_INPUT_BUFFER_TOO_SMALL=2;
const AWS4_ERROR_INVALID_PROTOCOL=3;
const AWS4_ERROR_INPUT_URL_TOO_BIG=4;
const AWS4_ERROR_INPUT_ID_TOO_BIG=5;
const AWS4_ERROR_INPUT_KEY_TOO_BIG=6;
const AWS4_ERROR_INVALID_REGION=7;
const AWS4_ERROR_INVALID_SIGNATURE=8;
const AWS4_ERROR_MISSING_QUERY=9;
const AWS4_ERROR_MISSING_QUERY_DATE=10;
const AWS4_ERROR_MISSING_QUERY_SIGNED_HEADERS=11;
const AWS4_ERROR_MISSING_QUERY_EXPIRES=12;
const AWS4_ERROR_MISSING_QUERY_SIGNATURE=13;
const AWS4_ERROR_MISSING_QUERY_CREDENTIAL=14;
const AWS4_ERROR_MISSING_QUERY_ALGORITHM=15;
const AWS4_ERROR_MISSING_QUERY_PARAMS=16;
const AWS4_ERROR_MISSING_CRED_PARAMS=17;
const AWS4_ERROR_STALE_REQUEST=2001;
const AWS4_ERROR_UNKNOWN_IDENTITY=2002;
const AWS4_EXTREME_REQUEST="aws4_request";
71
const AWS4_MAX_URL_SIZE= 512;
const AWS4_MANDATORY_CRED_PARAMS = 4;
/**
* Method to verify the AWS signature based on given full URL address.
*/
$awsKeyPairs) {
if($pUrl==NULL) {
return self::AWS4_ERROR_NULL_INPUT;
return self::AWS4_ERROR_INPUT_URL_TOO_BIG;
self::AWS4_HTTPS_REQ)!=0) {
return self::AWS4_ERROR_INVALID_PROTOCOL;
72
$urlParams = parse_url($pUrl);
if (!isset($urlParams['query'])) {
return self::AWS4_ERROR_MISSING_QUERY;
foreach($queryParams AS $el) {
$q[$arr[0]] = $arr[1];
$valResult = self::validateQueryParms($q);
if (self::AWS4_ERROR_NONE != $valResult) {
return $valResult;
$date = $q['X-Amz-Date'];
$sign = $q['X-Amz-Signature'];
$credentVal = rawurldecode($q['X-Amz-Credential']);
ksort($q);
unset($q['X-Amz-Signature']);
$pKey = $credentAttrs[0];
73
if (self::AWS4_MAX_URL_SIZE < strlen($pKey)) {
return self::AWS4_ERROR_INPUT_KEY_TOO_BIG;
return self::AWS4_ERROR_MISSING_CRED_PARAMS;
if (!isset($awsKeyPairs[$pKey])) {
return self::AWS4_ERROR_UNKNOWN_IDENTITY;
$scope = $credentAttrs[1]."/".$credentAttrs[2]."/"
.$credentAttrs[3]."/".$credentAttrs[4];
$port = $urlParams['port'];
$host = strtolower($urlParams['host']);
$host .= ':'.$port;
$canonical_request = self::getCanonicalFFECPContent($q,
$host, $urlParams['path']);
$stringToSign = "AWS4-HMAC-SHA256\n{$date}\n{$scope}\n" .
hash('sha256', $canonical_request);
$credentAttrs[3], $awsKeyPairs[$pKey]);
74
$mySign = hash_hmac('sha256', $stringToSign, $signingKey);
if (strcmp($mySign,$sign)){
return self::AWS4_ERROR_INVALID_SIGNATURE;
return self::AWS4_ERROR_NONE;
/**
*/
if (is_null($qParams)) {
return self::AWS4_ERROR_MISSING_QUERY;
if ((!isset($qParams['wlan'])) or (!isset($qParams['token']))
or (!isset($qParams['dest']))) {
return self::AWS4_ERROR_MISSING_QUERY_PARAMS;
75
if (!isset($qParams['X-Amz-Signature'])) {
return self::AWS4_ERROR_MISSING_QUERY_SIGNATURE;
if(!isset($qParams['X-Amz-Algorithm'])) {
return self::AWS4_ERROR_MISSING_QUERY_ALGORITHM;
if (!isset($qParams['X-Amz-Credential'])) {
return self::AWS4_ERROR_MISSING_QUERY_CREDENTIAL;
if (!isset($qParams['X-Amz-Date'])) {
return self::AWS4_ERROR_MISSING_QUERY_DATE;
if (!isset($qParams['X-Amz-Expires'])) {
return self::AWS4_ERROR_MISSING_QUERY_EXPIRES;
if (!isset($qParams['X-Amz-SignedHeaders'])) {
return self::AWS4_ERROR_MISSING_QUERY_SIGNED_HEADERS;
$redirectedAt = DateTime::createFromFormat('Ymd?Gis?',
$expires = $qParams['X-Amz-Expires'];
76
$now = date_create();
// The following gives some lattitude for clocks not being synched
print("<br>");
print("<br>");
print("<br>");
print($now->getTimeZone()->getName());
print("<br>");
print($redirectedAt->getTimeZone()->getName());
print("<br>");
print($expires);
print("<br>");
print($delta);
return self::AWS4_ERROR_STALE_REQUEST;
return self::AWS4_ERROR_NONE;
/**
77
* @param string $pUrl: the URL that need to be appened with AWS
parameters
*/
$service, $expires) {
$urlParams = parse_url($pUrl);
$scope = "{$scopeDate}/".$region."/".
$service."/".self::AWS4_EXTREME_REQUEST;
$duration = $expires;
$awsParams = array(
'X-Amz-Date'=>$httpDate,
'X-Amz-Algorithm'=> 'AWS4-HMAC-SHA256',
78
'X-Amz-Credential'=> $credential,
'X-Amz-SignedHeaders' =>'host',
'X-Amz-Expires'=> $duration
);
parse_str($urlParams['query'],$q);
$q = array_merge($q, $awsParams);
ksort($q);
$port = $urlParams['port'];
$host = strtolower($urlParams['host']);
$host .= ':'.$port;
$canonical_request = self::getCanonicalFFECPContent($q,
$stringToSign = "AWS4-HMAC-SHA256\n{$httpDate}\n{$scope}\n" .
hash('sha256', $canonical_request);
$signingKey = self::getSigningKey(
$scopeDate,
$region,
$service,
$sharedSecret
);
79
$q['X-Amz-Signature'] = hash_hmac('sha256', $stringToSign,
$signingKey);
$p = substr($pUrl, 0, strpos($pUrl,'?'));
$queryParams = array();
foreach($q AS $k=>$v) {
$queryParams[] = "$k=".rawurlencode($v);
$p .= '?'.implode('&', $queryParams);
return $p;
/**
* @return string
*/
$secretKey) {
80
return hash_hmac('sha256', self::AWS4_EXTREME_REQUEST, $serviceKey,
true);
/**
* @param string $host host name or ip address for the target service
* @param string $path the service address for the target service
encoded or not.
*/
$path, $encode=false) {
$queryParams = array();
foreach($queryHash AS $k=>$v) {
$queryParams[] = "$k=$v";
$canonical_request = "GET\n"
.$path."\n"
.implode('&',$queryParams)."\n"
.'host:'.$host
81
."\n\nhost\nUNSIGNED-PAYLOAD";
return $canonical_request;
/**
* @param integer $eid error code after verifying the AWS URL
*/
SWITCH ($eid) {
case self::AWS4_ERROR_NULL_INPUT:
break;
case self::AWS4_ERROR_INPUT_BUFFER_TOO_SMALL:
break;
case self::AWS4_ERROR_INVALID_PROTOCOL:
break;
case self::AWS4_ERROR_INPUT_URL_TOO_BIG:
break;
82
case self::AWS4_ERROR_INPUT_ID_TOO_BIG:
break;
case self::AWS4_ERROR_INVALID_REGION:
break;
case self::AWS4_ERROR_INVALID_SIGNATURE:
break;
case self::AWS4_ERROR_MISSING_QUERY:
break;
case self::AWS4_ERROR_MISSING_QUERY_DATE:
break;
case self::AWS4_ERROR_MISSING_QUERY_SIGNED_HEADERS:
break;
case self::AWS4_ERROR_MISSING_QUERY_EXPIRES:
break;
case self::AWS4_ERROR_MISSING_QUERY_SIGNATURE:
83
break;
case self::AWS4_ERROR_MISSING_QUERY_CREDENTIAL:
break;
case self::AWS4_ERROR_MISSING_QUERY_ALGORITHM:
break;
case self::AWS4_ERROR_MISSING_QUERY_PARAMS:
break;
case self::AWS4_ERROR_MISSING_CRED_PARAMS:
break;
case self::AWS4_ERROR_STALE_REQUEST:
break;
case self::AWS4_ERROR_UNKNOWN_IDENTITY:
secret.";
break;
default:
break;
84
}
return $res;
/**
*/
$eid = self::verifyAwsUrlSignature($pUrl);
return self::getAwsError($eid);
?>
85
Common_utilies.php
<?php
$errMsgList = array (
0 =>
1 =>
2 =>
3 =>
),
4 =>
86
5 =>
array ('label' => 'RADIUS shared security key fail','content' => '<span
style=\'color:red\'>A problem has occurred while trying to validate your
userid & password.<br>Please contact your system administrator.</span>',),
6 =>
7 =>
8 =>
9 =>
14 =>
15 =>
17 =>
87
array ('label' => 'Max concurrent session failure','content' => '<span
style=\'color:red\'>Login rejected because the maximum number of
concurrent sessions for this set of credentialshas been reached. Please
try again later.</span>',),
18 =>
99 =>
function printError($errorMsg) {
print
"<html>\n<head><title>Error</title></head><body>\n<p>\n$errorMsg\n</p>\n</body>\n</html>\n";
function base64_url_encode($input) {
88
}
function base64_url_decode($input) {
function my_xml2array($contents) {
$xml_values = array();
if (! isset($contents)) {
return false;
$parser = xml_parser_create('');
if(!$parser) {
return false;
xml_parser_set_option($parser, XML_OPTION_TARGET_ENCODING,'UTF-8');
xml_parser_free($parser);
if (!$xml_values) {
return array();
89
$xml_array = array();
$parents = array();
$last_counter_in_tag = array(1=>0);
switch($data['type']) {
case 'open':
$last_counter_in_tag[$data['level']+1] = 0;
if(isset($data['attributes']))
$new_tag['attributes'] = $data['attributes'];
$new_tag['value'] = trim($data['value']);
$last_tag_ar[$last_counter_in_tag[
$data['level']]] = $new_tag;
$last_counter_in_tag[$data['level']]++];
break;
case 'complete':
if(isset($data['attributes']))
$new_tag['attributes'] = $data['attributes'];
90
if(isset($data['value']) && trim($data['value']))
$new_tag['value'] = trim($data['value']);
$last_count = count($last_tag_ar)-1;
break;
case 'close':
break;
default:
break;
};
return $xml_array;
foreach($tag_path as $tag_name) {
$res = false;
$tmp_arr = $node;
91
$res = true;
break;
if(!$res) {
return false;
if( isset($tmp_arr['value']) ) {
return $tmp_arr['value'];
} else {
return null;
function is_not_empty($string) {
function tokenCheck($val){
function macCheck($val){
92
return preg_match("/^[A-Fa-f0-9]{2}:[A-Fa-f0-9]{2}:[A-Fa-f0-9]{2}:[AFa-f0-9]{2}:[A-
Fa-f0-9]{2}:[A-Fa-f0-9]{2}$/", $val);
function convertUrlParam($input) {
?>
93
register.php
<?php
include 'php/code_register.php';
?>
<!DOCTYPE html>
<html lang="es">
<head>
<meta charset="UTF-8">
</head>
<body>
<div class="container-all">
<div class="container-form">
<h1 class="title">Registrate</h1>
<label for="">Matricula</label>
<label for="">NIP</label>
94
<input type="submit" name="" id="" value="Registrarse">
</form>
</div>
<div class="container-text">
<div class="capa"></div>
</div>
</div>
</body>
</html>
95
code_register.php
<?php
require_once "conexion.php";
if ($_SERVER["REQUEST_METHOD"] == "POST") {
if(empty(trim($_POST["username"]))) {
}else{
$param_username = trim($_POST["username"]);
if(mysqli_stmt_execute($stmt)) {
mysqli_stmt_store_result($stmt);
if(mysqli_stmt_num_rows($stmt) == 1) {
}else {
$username = trim($_POST["username"]);
}else {
}
96
}
// VALIDANDO PASSWORD
if(empty(trim($_POST["password"]))) {
}elseif(strlen(trim($_POST["password"])) < 4) {
}else {
$password = trim($_POST["password"]);
$param_username = $username;
if(mysqli_stmt_execute(($stmt))) {
header("location: index.php");
}else {
97
}
mysqli_close($link);
?>
98
conexion.php
<?php
define('DB_SERVER', 'localhost');
define('DB_USERNAME', 'root');
define('DB_PASSWORD', '');
define('DB_NAME', 'portalcautivo');
?>
99
Estilos.css
@import
url('https://fonts.googleapis.com/css?family=Roboto:100,100i,300,300i,400,400i,500,500i,700,700i,900,900i&
display=swap');
*{
margin: 0;
padding: 0;
box-sizing: border-box;
text-decoration: none;
body {
padding: 20px;
.container-all {
width: 100%;
max-width: 1000px;
margin: auto;
margin-top: 30px;
display: flex;
border-radius: 20px;
overflow: hidden;
.container-form {
width: 80%;
100
padding: 40px;
background: #f7f7f7;
img.logo {
width: 150px;
display: block;
margin: auto;
.title {
text-align-last: center;
margin-top: 20px;
font-weight: 300;
color: #7A7A7A
label {
display: block;
margin-top: 30px;
font-size: 20px;
font-weight: 300;
color: #7A7A7A;
input[type="text"],
input[type="password"] {
width: 100%;
height: 30px;
101
background: rgba(0, 0, 0, 0);
border: 0px;
outline: 0px;
font-size: 16px;
input[type="submit"] {
width: 100%;
height: 50px;
margin-top: 60px;
color: white;
border: 0px;
font-weight: 300;
cursor: pointer;
font-size: 18px;
input[type="submit"]:hover {
.text-footer {
display: block;
margin-top: 100px;
text-align: center;
color: #7A7A7A;
102
font-weight: 300;
.text-footer a {
color: #006E2E;
font-weight: 500;
.container-text {
width: 100%;
background-image: url(../img/fondo.png);
background-position: center;
background-size: cover;
padding: 40px;
position: relative;
.capa {
width: 100%;
height: 100%;
position: absolute;
top: 0;
left: 0;
opacity: 0.6;
.title-description {
103
position: relative;
top: 80px;
color: white;
font-weight: 300;
font-size: 40px;
text-align: center;
.text-description {
position: relative;
top: 110px;
color: white;
font-size: 18px;
font-weight: 200;
text-align: justify;
.msg-error {
color: red;
display: block;
margin-top: 10px;
.container-welcome {
width: 100%;
max-width: 800px;
text-align: center;
padding: 40px;
104
margin: auto;
margin-top: 100px;
background: white;
border-radius: 20px;
.logo-welcome {
width: 200px;
margin: 20px;
.title-welcome {
font-weight: 400;
font-size: 40px;
margin-top: 20px;
.close-sesion {
width: 100%;
max-width: 600px;
margin: auto;
display: block;
padding: 20px;
margin-top: 40px;
color: white;
font-size: 20px;
105
font-weight: 300;
.close-sesion:hover {
.container-text {
display: none;
.container-form {
margin: auto;
width: 100%;
background: white;
.title-welcome {
font-weight: 400;
font-size: 30px;
margin-top: 20px;
106