Portal Cautivo UAM Iztapalapa

Descargar como pdf o txt
Descargar como pdf o txt
Está en la página 1de 119

TECNOLÓGICO NACIONAL DE MÉXICO

INSTITUTO TECNOLÓGICO DE TLÁHUAC

“LA ESENCIA DE LA GRANDEZA RADICA EN LAS RAICES”

TITULACIÓN INTEGRAL POR:

PROYECTO DE INVESTIGACIÓN

NOMBRE DE LA EMPRESA:

Universidad Autónoma Metropolitana Unidad Iztapalapa

TÍTULO DEL PROYECTO


Creación de portal cautivo para el servicio de la
red inalámbrica institucional en la UAM Iztapalapa

PARA OBTENER EL TÍTULO DE:


INGENIERO EN SISTEMAS COMPUTACIONALES

P R E S E N T A N:

Herrera Alcantar José Andrés


Cabrera Guerrero Gonzalo Diego

PRESIDENTE: M.C. Daniel Torres Alvarado


SECRETARIO: Ing. Ernesto Iván Alemán Robles
VOCAL: Ing. José Luis Del Valle Núñez

Tláhuac, Cd. Mx., Noviembre 2021


I
II
Agradecimientos
Gracias al Instituto Tecnológico de Tláhuac por haberme permitido formarme en él. Así mismo
agradezco a todas las personas que fueron participes de este proceso, ya sea de manera directa o indirecta,
ustedes profesores los que apoyaron este sueño que el día de hoy se ve reflejado en la culminación de mi
paso por el instituto. Pero mi agradecimiento más importante es para mis padres por haberme forjado como
la persona que soy en la actualidad, muchos de mis logros se los debo a ustedes entre los que se incluye
este. Me formaron con reglas y con algunas libertades, pero al final de cuentas, me motivaron
constantemente para alcanzar mis sueños. Gracias a todos mis amigos que estuvieron conmigo durante
toda la carrera, con ellos pase buenos y malos momentos que solo en la universidad se viven. Pero no más
importante gracias al departamento SITE por haberme permitido ser parte de él, siendo un grupo que se
une y apoyan entre todos, aprendí a utilizar herramientas de trabajo y mantenimiento de cómputo, así como
conocimiento que me servirá en el futuro.

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

Lista de Figuras ................................................................................................................................. VII

Lista de Acrónimos ........................................................................................................................... VIII

1. Introducción ......................................................................................................................................1

2. Generalidades...................................................................................................................................2

2.1. Objetivos ........................................................................................................................................2

2.1.1. Objetivo general ..........................................................................................................................2

2.1.2. Objetivos específicos ..................................................................................................................2

2.2. Justificación ...................................................................................................................................3

2.3. Caracterización de la empresa en la que participo ........................................................................4

2.3.1. Datos generales de la empresa ..................................................................................................4

2.3.2. Descripción del departamento o área de trabajo ........................................................................6

2.4. Problemas a resolver .....................................................................................................................6

2.5. Alcances y limitaciones ..................................................................................................................7

3. Fundamento Teórico .........................................................................................................................8

3.1 Redes inalámbricas ........................................................................................................................8

3.1.1 Componentes de una red inalámbrica .........................................................................................9

3.1.2 Funcionamiento de una red inalámbrica. ...................................................................................10

3.1.3 Seguridad en redes inalámbricas...............................................................................................11

3.2 RADIUS ........................................................................................................................................15

3.2.1 Características de RADIUS........................................................................................................16

3.3 Portal Cautivo ...............................................................................................................................21

3.3.1 Tipos de portal cautivo ...............................................................................................................22

3.4 Base de datos ...............................................................................................................................23

IV
3.4.1 Manejador de base de datos (Database Management System – DBMS) ..............................24

3.4.2 Ventajas de usar DBMS .........................................................................................................24

3.4.3 Funcionamiento de un DBMS ................................................................................................25

4. Desarrollo........................................................................................................................................27

4.1 Diseño del portal cautivo ...............................................................................................................27

4.1.1 Diagrama de interacción del portal cautivo ............................................................................27

4.1.2 Diseño de interfaz del portal cautivo ......................................................................................28

4.2 Configuración del servidor RADIUS ..............................................................................................30

4.2.1 Instalación de FreeRADIUS ...................................................................................................30

4.2.2 Configuración del Firewall para freeRADIUS .........................................................................32

4.2.3 Instalar y configurar MariaDB en CentOS 7 ...........................................................................34

4.2.4 Instala PHP 7 en CentOS 7 ...................................................................................................36

4.2.5 Configure FreeRADIUS para usar MariaDB / MySQL ............................................................37

4.3 Implementación del portal cautivo.................................................................................................41

4.3.1 Requisitos ..............................................................................................................................41

4.3.2 Estructura de carpetas ...........................................................................................................41

4.3.3 Vista previa del inicio de sesión. ............................................................................................42

4.3.4 Vista previa del registro..........................................................................................................42

4.4 Configuración de ExtremeWireless Controller ..............................................................................42

5. Pruebas y Resultados .....................................................................................................................46

5.1 Instalación de FreeRADIUS en Ubuntu ........................................................................................46

5.2 Depuración del servidor CentOS con el Extreme Wireless Controller ..........................................48

6. Conclusiones ..................................................................................................................................51

Referencias...........................................................................................................................................52

Anexos ................................................................................................................................................53

PHP Portal Cautivo Externo ................................................................................................................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

AP Access Point, “Punto de acceso”

BD Data bases, “Base de datos”

BSS Basic Service Set, “Conjunto de servicio básico”

BSSID Basic Service Set Identifier

CRC Cyclic Redundancy Check, “Chequeo de redundancia cíclica”

DBMS Database Management System, “Sistema manejador de bases de datos”

DCL Data Control Language, “Lenguaje de Control de Datos”

DDL Language of definition of data, “Lenguaje de Definición de Datos”

DML Data Manipulation Language, “Lenguaje de Manipulación de Datos”

EAP Extensible Authentication Protocol

ESSID Extended Service Set Identifier

FCS Frame Check Sequence

IEEE Institute of Electrical and Electronic Engineering, “Instituto de Ingeniería Eléctrica y


Electrónica”

IETF Internet Engineering Task Force

Kbps Kbits per Second, “Kbits por Segundo”

MAC Media Access Control address

MAN Metropolitan Area Network, “Red de área metropolitana”

Mbps Megabits per Second, “Megabit por Segundo”

NAS Network Attached Storage

PC Personal Computer

PDA Personal Digital Assistant

VIII
QoS Quality of service

RADIUS Remote Authentication Dial-In User Service

SSID Service Set Identifier

TCL Transactional Control Language

UDP User Datagram Protocol

VPN Virtual private network, “Red privada virtual”

EWC Extreme Wireless Controller

EW Extreme Wireless

PCE External captive portal

WEP Protocolo equivalente al cableado

WPA Acceso protegido por Wi fi

WPA2 Acceso protegido 2 por Wi fi

IR Transmisión Infrarroja

LAN Red de área local

PDA Asistente personal digital

PCMCI Asociación internacional de tarjetas de memoria para equipos personales

PCI Interconexión de Componentes Periféricos

USB Universal Serial Bus

BSSID Identificador de conjunto de servicios básicos

ESSID Identificador de conjunto de servicio extendido

BSS Sistemas de soporte al negocio

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.

Con el desarrollo de la tecnología y la evolución de las redes inalámbricas, también se han


desarrollado herramientas para vulnerar la seguridad de las anteriores, hoy en día usar claves WEP,
WPA, WPA2 ya no garantiza tener una red sólo con usuarios autenticados.

Debido a esta situación, la institución de UAM de Iztapalapa requería un método de autenticación


para acceder a la red inalámbrica, y validar la identidad del usuario como miembro de su comunidad
estudiantil y personal administrativo. Y así evitar la saturación en los canales de conexión distribuidos a
lo largo de institución.

El propósito del presente proyecto es implementar un portal cautivo, como mecanismo de


autenticación, el cual puede ser utilizado en diferentes escenarios. Así como la implementación de un
portal cautivo para la autenticación de usuarios en la red de la Institución UAM de Iztapalapa

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.

2.1.1. Objetivo general

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.1.2. Objetivos específicos

• Revisión de la documentación entregada por el fabricante “Extreme Wireless Integration Guide” en lo


referente a la creación del portal cautivo externo.
• Creación del portal cautivo y la verificación de interoperabilidad entre el portal y el sistema Extreme
Wireless Solution.
• Creación de la programación necesaria para la vinculación del portal cautivo con la base de datos de
usuarios para la validación de la identidad del solicitante.
• Puesta en marcha de las pruebas de concepto en vías de la liberación del servicio.
• Ajustes al servicio basado en las pruebas de concepto.
• Liberación final del portal cautivo a la comunidad, entrega de memoria técnica, manual de
administrador y manual de usuario.

2
2.2. Justificación

Dentro de la estructuración del Servicio de Red Inalámbrica Institucional de la Unidad Iztapalapa, se


contempla la creación de un método de autenticación para acceder al servicio basado en un portal cautivo,
el cual validara la identidad del usuario como miembro de la Comunidad Universitaria para otorgar/negar
el mismo.

3
2.3. Caracterización de la empresa en la que participo

2.3.1. Datos generales de la empresa

Empresa: Universidad Autónoma Metropolitana, Unidad Iztapalapa.

Dirección: Avenida San Rafael Atlixco 186, Colonia Vicentina CDMX CP 09340.

Figura 2. 1 Ubicación de la Universidad Autónoma Metropolitana Unidad Iztapalapa

Teléfono: 5804-4600

Correo electrónico: [email protected]

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:

1. Calidad, equidad, justicia y solidaridad, reconocidas como valores fundamentales en el quehacer de


los universitarios. Implican la pertinencia, relevancia, igualdad de oportunidades y promoción de
acciones que, en la búsqueda del bien común, mejoren las condiciones de vida y limiten las situaciones
de exclusión social.
2. Respeto e inclusión, consideradas como fundamento sólido comunidad que se desarrolla
armónicamente y en paz. Implican el reconocimiento de lo diverso y la apreciación de los demás, así
como la capacidad de convivir y trabajar con otros, comprometidos todos con el desarrollo de una
sociedad democrática y justa.
3. Universalidad, entendida como la apertura hacia las vastas corrientes intelectuales y los múltiples
contextos socioculturales en los cuales debe desarrollarse el trabajo de los universitarios.
4. Sabiduría, concebida como el desarrollo de la creatividad intelectual y material, y el ejercicio de la
reflexión, el diálogo y el buen juicio, basado en la experiencia y el conocimiento, en la conducción de
nuestras acciones hacia el cumplimiento de la Misión y del proyecto académico de la Unidad.
5. Honestidad, reconocida como una práctica reflexiva por parte de los diversos agentes institucionales,
individuales y grupales que conforman la Universidad, en busca de adecuación entre su situación
sociohistórica, su discurso y sus acciones, como un soporte en el que deben asentarse la vida
universitaria y el ejercicio profesional de sus egresados.
6. Libertad, objetividad y rigor académicos para cumplir con la Misión y el proyecto académico
institucional. Constituyen cimientos fundamentales para la búsqueda de la verdad, entendida ésta
como un ideal regulativo.

5
Estructura organizacional:

Figura 2. 2 Estructura organizacional de la UAM

2.3.2. Descripción del departamento o área de trabajo

Nombre del departamento: Sala C (Dentro del edificio A - Rectoría).

2.4. Problemas a resolver

La Institución UAM de Iztapalapa Requiere la creación de un método de autenticación para acceder a la


red inalámbrica, validando la identidad de los usuarios como miembros de su comunidad.

6
2.5. Alcances y limitaciones

Alcances:

• Implementar una página web institucional amigable y visualmente agradable.


• Implementar un código de identificación en la BD para alumnos, profesores, administrativos e
invitados.
• Aplicar protocolo Radius para la gestión y verificación de clientes.
• Administrar la red WiFi creada en toda la institución.

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.

3.1 Redes inalámbricas

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.

Existen dos amplias categorías de Redes Inalámbricas:

• 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.

3.1.1 Componentes de una red inalámbrica

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]

Medio de Transmisión Inalámbrica

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.

AP (Access Point / Punto de acceso)

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.

3.1.3 Seguridad en redes inalámbricas

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]

Amenazas de seguridad en redes inalámbricas

Cualquier equipo que se encuentre a 100 metros o menos de un punto de acceso, podría tener
acceso a la red inalámbrica.

A continuación, se presentan las amenazas de seguridad más relevantes en redes inalámbricas:

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

• Riesgo de alteración de tráfico en la red inalámbrica.

Disponibilidad

• Riesgo de interferencia negación de servicio (Congestionamiento).


• Riesgo de no disponibilidad de ancho de banda debido a retransmisiones de radio.
• Riesgo de no disponibilidad de ancho de banda debido a software malicioso.

Autenticación

• Riesgo de acceso no autorizado a su Intranet.


• Riesgo de uso no autorizado de recursos de la red.

Métodos para garantizar seguridad en redes inalámbricas

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.

Filtrado de direcciones MAC

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.

Wired Equivalent Privacy (WEP)

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]

Figura 3. 1 Estructura de una VPN

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.

3.2.1 Características de RADIUS

Las principales características de RADIUS son:

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.

El servidor RADIUS es responsable de recibir las peticiones de conexión de usuario, autenticarlo y


regresar toda la configuración necesaria al cliente para liberar el servicio al usuario.

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.

Mecanismos flexibles de autenticación

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.

Basado en conexiones UDP

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.

• La naturaleza del protocolo RADIUS simplifica el uso de UDP.

• El uso de UDP simplifica la implementación de un servidor RADIUS.

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:

• Autenticación: Es el proceso de verificación de una persona (o máquina) declarada en una identidad.


Se refiere a la confirmación de que un cliente es un usuario válido, es decir, se confirma que es quien
dice ser. Esto se logra a través de la presentación de una identidad y datos confidenciales, por lo
general, son conocidos como credenciales. Dichas credenciales pueden ser contraseñas, certificados
digitales, números de teléfono, etc.
• Autorización: Implica el uso de un conjunto de reglas o plantillas de otros para decidir lo que un usuario
autenticado puede hacer en un sistema. Se refiere a la concesión de determinados tipos de servicios
o permisos a un usuario en función de su autenticación. Puede estar basado en restricciones de
tiempo, lugar, cantidad de logins de una misma entidad, etc. Algunos ejemplos son el filtrado de
direcciones IP, asignación de directorio, tipo de cifrado, servicios de QoS, control de ancho de banda
o de gestión del tráfico de red, etc.
• Contabilidad: Se encarga de medir y documentar los recursos que un usuario aprovecha durante su
acceso. Se refiere al seguimiento del consumo de recursos de un usuario en la red. La información
típica que se recoge en la contabilidad es la identidad del usuario, la naturaleza del servicio prestado,
cuando comenzó el servicio y cuando terminó. Puede ser utilizado para la gestión, planificación,
facturación, etc.

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:

• ¿Quién eres tú?


• ¿Qué permisos o servicios puedo darte?
• ¿Qué haces con los servicios que te doy?

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

Es un protocolo de control de acceso y autenticación basado en la arquitectura cliente/servidor, que


restringe la conexión de equipos no autorizados a una red.11 El protocolo fue inicialmente creado por la
IEEE para uso en redes de área local alambradas, pero se ha extendido también a las redes inalámbricas.
Muchos de los puntos de acceso que se fabrican en la actualidad ya son compatibles con 802.1x. El
protocolo 802.1x involucra tres participantes:

Figura 3. 2 Protocolo 802.1x

El suplicante, o equipo del cliente, que desea conectarse con la red.

El servidor de autorización/autenticación, que contiene toda la información necesaria para saber


cuáles equipos y/o usuarios están autorizados para acceder a la red. 802.1x fue diseñado para emplear
servidores RADIUS (Remote Authentication Dial-In User Service), cuya especificación se puede consultar
en la RFC 2058. Estos servidores fueron creados inicialmente para autenticar el acceso de usuarios
remotos por conexión vía telefónica; dada su popularidad se optó por emplearlos también para
autenticación en las LAN.

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 (WI-FI Protected Access)

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:

• Modalidad de red empresarial: Para operar en esta modalidad se requiere de la existencia de un


servidor RADIUS en la red. El punto de acceso emplea entonces 802.1x y EAP para la autenticación,
y el servidor RADIUS suministra las claves compartidas que se usarán para cifrar los datos.
• Modalidad de red casera, o PSK (Pre-Shared Key): WPA opera en esta modalidad cuando no se
dispone de un servidor RADIUS en la red. Se requiere entonces introducir una contraseña compartida
en el punto de acceso y en los dispositivos móviles. Solamente podrán acceder al punto de acceso
los dispositivos móviles cuya contraseña coincida con la del punto de acceso. Una vez logrado el
acceso, TKIP entra en funcionamiento para garantizar la seguridad del acceso. Se recomienda que
las contraseñas empleadas sean largas (20 o más caracteres), porque ya se ha comprobado que WPA
es vulnerable a ataques de diccionario si se utiliza una contraseña corta.

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 principal uso de esta herramienta se da en centros de negocios, aeropuertos, hoteles, cafeterías,


cafés internet, entre otros.

Existen varios tipos de implementación de portal cautivo: [8]

• 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.

3.3.1 Tipos de portal cautivo

Existen dos tipos de portales cautivos, los portales cautivos por software y los portales cautivos por
hardware.

Portales Cautivos por software

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

3.4 Base de datos

Se define como un conjunto de datos organizados en un archivo lógico y en uno o varios archivos
físicos. [5]

Los principales elementos de una base de datos son:

• Datos. Son los valores registrados físicamente en la base de datos.


• Hardware. Es el soporte físico que permite almacenar la información de la base de datos. Cuando la
base de datos está formada por varios sistemas se llama base de datos distribuida. El manejo de las
bases de datos compartidas se complica ya que se va a necesitar comunicación entre los sistemas.
• Software. Es el que permite trabajar y manejar la base de datos de la forma más eficiente. El DBMS
es el encargado de gestionar la base de datos, por lo tanto, todas las operaciones que se realicen
sobre las mismas han de pasar por este sistema.
• Usuarios. Podemos definir los siguientes tipos de usuarios:
o Usuarios finales. Se dedican a trabajar (manipular e interpretar) la información de la base de
datos.
o Analista. Es la persona encargada de esquematizar los datos y sus relaciones. Hace el
Diagrama Entidad-Relación (DER).
o Programadores de aplicaciones. Se encargan de programar las aplicaciones (internas, como
triggers o procedimientos almacenados, y externas, como el Developer 2000 del DBMS
Oracle) necesarias para la utilización de la base de datos, realizando las peticiones pertinentes
al DBMS. Aquellos que conocen el lenguaje SQL.

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.

3.4.1 Manejador de base de datos (Database Management System – DBMS)

Se define como una colección de herramientas responsables de proporcionar un ambiente conveniente y


eficiente para acceder a una base de datos. En otras palabras, un DBMS asegura integridad, seguridad y
privacidad de la información.

Algunas de las funciones de un DBMS son:

• Almacenar, recuperar, eliminar y modificar los datos.


• Guardar la consistencia de los datos.
• Solucionar problemas de concurrencia
• Mantener la seguridad.
• Crear y modificar bases de datos.

Los principales componentes de un DMBS son:

• 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.

3.4.2 Ventajas de usar DBMS

El utilizar un manejador de base de datos permite tener ciertas ventajas, como:

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.

3.4.3 Funcionamiento de un DBMS

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]

Figura 3. 3 Estructura del funcionamiento de un DBMS

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 implemento un método de autenticación que restrinja el acceso a usuarios no autorizados en la


red inalámbrica, 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.

Se utilizaron diversas herramientas que a lo largo de este capítulo se irán explicando a detalle cada
una de estas tecnologías.

4.1 Diseño del portal cautivo

4.1.1 Diagrama de interacción del portal cautivo

Figura 4. 1 Flujo de portal cautivo externo

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.

4.1.2 Diseño de interfaz del portal cautivo

Figura 4. 2 Diseño de login

28
Figura 4. 3 Diseño de registro de login

29
4.2 Configuración del servidor RADIUS

4.2.1 Instalación de FreeRADIUS

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.

$ sudo yum - y update

Figura 4. 4 Actualización del sistema CentOS 7

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.

$ sudo yum search all freeradius

30
2) Instalamos freeradius, freeradius-utils, freeradius-mysql y freeradius-perl:

$ sudo yum -y install freeradius freeradius-mysql freeradius-utils freeradius-


perl

Figura 4. 5 Instalación de la tools a ocupar

3) Una vez finalizada la instalación, inicie y active FreeRADIUS para que se ejecute y también se inicie en
el arranque:

$ systemctl start radiusd.service

$ systemctl enable radiusd.service

4) Verificamos el estado de radiusd.service:

$ systemctl status radiusd.service

La salida al comando anterior debería de ser la siguiente:

Figura 4. 6 Validación del servicio

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:

<?xml version="1.0" encoding="utf-8"?>

<service>

<short>RADIUS</short>

<description>The Remote Authentication Dial In User Service (RADIUS) is a protocol


for user authentication over networks. It is mostly used for modem, DSL or wireless user
authentication. If you plan to provide a RADIUS service (e.g. with freeradius), enable this
option.</description>

<port protocol="tcp" port="1812"/>

<port protocol="udp" port="1812"/>


2) Iniciamos, habilitamos firewalld y verificamos su estado.
<port protocol="tcp" port="1813"/>
$ systemctl enable firewalld
<port protocol="udp" port="1813"/>
$ systemctl start firewalld
</service>
$ systemctl status firewalld

32
Salida de verificación de estado:

firewalld.service - firewalld - dynamic firewall daemon

Loaded: loaded (/usr/lib/systemd/system/firewalld.service; enabled; vendor


preset: enabled)

Active: active (running) since Sat 2019-05-04 13:39:12 UTC; 8h ago

Docs: man:firewalld(1)

Main PID: 1775 (firewalld)

CGroup: /system.slice/firewalld.service

└─1775 /usr/bin/python -Es /usr/sbin/firewalld --nofork --nopid

May 04 13:39:10 guest systemd[1]: Starting firewalld - dynamic firewall daemon...


3) Verifique que Firewalld esté funcionando.
May 04 13:39:12 guest systemd[1]: Started firewalld - dynamic firewall daemon.
$ firewall-cmd --state

running

4) Se crean reglas permanentes para la zona predeterminada para permitir los servicios http, https y radius.

$ firewall-cmd --add-service={http,https,radius} --permanent

5) Se carga el Firewalld para que los cambios surtan efecto.

$ firewall-cmd --reload

6) Confirme que los servicios se agregaron correctamente a la zona predeterminada.

$ firewall-cmd --get-default-zone

public

$ firewall-cmd --list-services --zone=public

dhcpv6-client http https radius ssh


Los servicios que acabamos de permitir (http, https y radius) se enumeran en la salida, lo que significa
que podemos continuar.

33
4.2.3 Instalar y configurar MariaDB en CentOS 7

1) Creamos un nuevo archivo, lo llamaremos /etc/yum.repos.d/MariaDB.repo usando su editor de texto


favorito:

$ 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:

$ yum install -y mariadb-server mariadb

5) Una vez finalizada la instalación, iniciamos MariaDB y enable:

$ systemctl start mariadb

$ systemctl enable mariadb

6) Verifique para asegurarse de que esté funcionando y habilitado:

$ systemctl status mariadb

$ systemctl is-enabled mariadb.service

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

Le recomendamos que proceda de la siguiente manera:

Enter current password for root (enter for none): ENTER

Set root password? [Y/n] y

New password: Enter password

Re-enter new password: Repeat password

También se le pedirá que responda algunas preguntas para eliminar / mantener algunos
valores predeterminados:

Remove anonymous users? [Y/n]: Y

Disallow root login remotely? [Y/n]: Y

Remove test database and access to it? [Y/n]: Y

Reload privilege tables now? [Y/n]: Y

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:

$ sudo yum install epel-release yum-utils

$ sudo yum install http://rpms.remirepo.net/enterprise/remi-release-7.rpm

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:

$ sudo yum-config-manager --enable remi-php73

3) Y ejecute el siguiente comando para instalar PHP 7.3 junto con algunos de los módulos PHP más
comunes:

$ sudo yum install php php-common php-opcache php-mcrypt php-cli php-gd


php-curl php-mysqlnd

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

Ingrese su contraseña en la solicitud.

2) Una vez que haya iniciado sesión, ejecute los siguientes comandos para crear y configurar la base de
datos:

MariaDB [(none)]> CREATE DATABASE radius;

MariaDB [(none)]> GRANT ALL ON radius * TO radius@localhost IDENTIFIED


BY "#############";

MariaDB [(none)]> FLUSH PRIVILEGES;

MariaDB [(none)]> quit;

3) A continuación, importe el esquema del radius a la base de datos RADIUS para completar la base de
datos:

$ mysql -u root -p YOUR_PASSWORD radius < /etc/raddb/mods-


config/sql/main/mysql/schema.sql

37
Figura 4. 7 Creación y modificación de privilegios sobre la base radius

4) Y cree un enlace para SQL en /etc/raddb/mods-enabled:

$ 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 = "#############"

# Database table configuration for everything except Oracle

radius_db = "radius"

# Set to ‘yes’ to read radius clients from the database (‘nas’ table)

# Clients will ONLY be read on server startup.

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á:

Figura 4. 8 Configuración de los archivos internos de FreeRADIUS

d) Elimine el comentario de la línea read_clients = yes, quitando el # al principio de “a líne”.Cambiar


dialect = ”sqlite" a dialect = "mysql"

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)

6) Finalmente, cambie los derechos de grupo de /etc/raddb/mods-enabled/sql a radius:A continuación,


importe el esquema del radius a la base de datos RADIUS para completar la base de datos:

$ chgrp -h radiusd /etc/raddb/mods-enabled/sql

40
4.3 Implementación del portal cautivo

4.3.1 Requisitos

⚫ Servidor Web (Apache Server)

⚫ PHP 7.3.12

⚫ MySQL

4.3.2 Estructura de carpetas

Figura 4. 9 Estructura de carpetas del portal cautivo externo

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.

Figura 4. 10 Vista previa del portal cautivo externo

4.3.4 Vista previa del registro

Figura 4. 11 Vista previa del registro de usuarios

4.4 Configuración de ExtremeWireless Controller

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.

Figura 4. 12 Configuración para enlazar el RADIUS con la Controller

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.

Figura 4. 13 Se configura la controller para el uso de un EPC

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.

Figura 4. 14 Redireccionamiento con el Portal cautivo

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.

Figura 4. 15 Configuración del AP que irradiara la señal Wi-Fi

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.

Figura 4. 16 Creación de Roles

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.

5.1 Instalación de FreeRADIUS en Ubuntu

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.

Figura 5. 1 Instalación del protocolo FreeRADIUS

46
Una vez instalado el protocolo FreeRADIUS, validamos que este se encuentre activo.

Figura 5. 2 Confirmando el funcionamiento del RADIUS con systemclt status freeradius

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.

Figura 5. 3 Configurando archivos, modificando y reconociendo la estructura interna del RADIUS

47
Finalmente se realizó una prueba local para verificar el correcto funcionamiento al validar a los
usuarios.

Figura 5. 4 Probando validación de usuarios de forma local

5.2 Depuración del servidor CentOS con el Extreme Wireless Controller

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.

Figura 5. 6 Portal cautivo interno de la Controller

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.

Figura 5. 7 Validación de la configuración RADIUS

De igual manera, el servidor CentOS al estar en modo depuración, recibirá las peticiones externas y
validará las credenciales del usuario.

Figura 5. 8 Validación de la configuración con la controller

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

[1] M. BENANTAR, Access Control Systems, USA: Springer, 2006.

[2] J. HASSELL, Radius, USA: O’Reilly, 2002.

[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].

[4] J. C. P. y. o. VOLLBRECHT, AAA Authorization Framework, RFC 2904, 2000.

[5] P. DUBOIS, MySQL. (Fourth Edition), USA: Pearson Education Inc, 2009.

[6] M. Bernal, «Manejo de los datos,» 2011. [En línea]. Available:


http://marybernal.wordpress.com/2011/05/23/funcionamiento-de-los-dbms/. [Último acceso: 2
Octubre 2019].

[7] R. FLICKENGER, Building Wireless Community Networks, USA: O’Reilly, 2002.

[8] C. García, «Portal Cautivo pfSense,» 2010. [En línea]. Available:


http://www.slideshare.net/valericio1/portal-cautivo. [Último acceso: 2 Octubre 2019].

52
Anexos
Anexo A

PHP Portal Cautivo Externo


Esta sección contiene un conjunto de archivos que sirven como ejemplo de cómo construir un portal
cautivo externo que utiliza la interfaz del portal cautivo externo compatible con el firewall del controlador.
Este tipo de ECP es responsable de recopilar las credenciales de un usuario, autenticarlas y luego
Extreme Wireless proveerá la política de acceso a aplicar al usuario.

Los scripts son mínimos porque pretenden resaltar los pasos críticos requeridos para una
implementación de un portal cautivo externo.

A continuación, se nombran y se describe los scripts para su implementación.

A continuación, se nombran y se describe los scripts para su implementación.

⚫ 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.

⚫ Common_utilities.php: utilidades utilizadas por varios scripts de ECP

⚫ Ffecp-config.php: contiene los principales parámetros configurados estáticamente que la aplicación


utiliza para verificar URL firmadas y crear URL firmadas.

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

// This is a simple implementation of a script that

// receives HTTP requests that have been redirected

// by a controller configured with "Firewall-Friendly

// External Captive Portal" support enabled.

// This script is responsible for collecting critical

// information from the redirection, such as the

// session token and for constructing the login page

// for the user. The script reads the VNS attribute

// from the redirected request so that the script can

// display it on the login page.

//

// The script expects the controller to sign the

// its redirection response. The script validates the

// signature. If the signature is valid it displays

// the login page. Otherwise it displays an error page.

//

// Assumptions

// ===========

// 1. The controller is configured to include its IP address

// and port in the redirection URL.

// 2. The controller is configured to sign its redirection

// responses using the Amazon S3 version 4 signature

55
// algorithm (as of May 2014).

// 3. The controller is configured to include the VNS in its

// redirection response.

// 4. This application assumes that the identity & shared key

// key pairs it is allowed to use are stored in an associative

// array. It also assumes that some configuration options such

// as the 'service' and 'region' are stored in another associative

// array. Real applications might retrieve this information from

// databases or configuration files.

require_once("ffecp_config.php");

require_once("crypt_aws_s4.php");

require_once("common_utilities.php");

// Mainline processing starts here. Utilities are defined after

// the mainline.

// 1. Verify that the request has all necessary fields

// and a valid signature.

$rc = SimpleAws::verifyAwsUrlSignature(getURL($_SERVER), $awsKeyPairs);

if (SimpleAws::AWS4_ERROR_NONE != $rc) {

printError(SimpleAws::getAwsError($rc));

exit;

// Determine which controller interface to interact with

if(isset($_REQUEST['hwc_ip']) && isset($_REQUEST['hwc_port'])) {

//BM IP address and port is enabled

$ewc_ip = trim($_REQUEST['hwc_ip']);

56
$ewc_port = trim($_REQUEST['hwc_port']);

} else {

// The controller has not been configured as expected. It did not

// include its address and port on the redirection URL. This is

// 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;

// Collect the data required by the login page and

// subsequent authentication.

$dest = isset($_REQUEST['dest']) ? $_REQUEST['dest'] : "";

$bssid = isset($_REQUEST['bssid']) ? $_REQUEST['bssid'] : "";

$wlan = isset($_REQUEST['wlan']) ? $_REQUEST['wlan'] : "";

$vns = isset($_REQUEST['vns']) ? $_REQUEST['vns'] : "";

$mu_mac = isset($_REQUEST['mac']) ? $_REQUEST['mac'] : "";

$ap_name = isset($_REQUEST['ap']) ? $_REQUEST['ap'] : "";

$token = isset($_REQUEST['token']) ? $_REQUEST['token'] : "";

if(!tokenCheck($token)) {

printError("Error: <span style='color:red'>Failed to process the request: incorrect


token.</span>");

exit;

} else if(isset($ewc_port) && !is_numeric($ewc_port)) {

printError("Error: <span style='color:red'>Failed to process the request: incorrect EWC


port.</span>");

exit;

}else if($mu_mac && !macCheck($mu_mac)) {

57
printError("Error: <span style='color:red'>Failed to process the request: incorrect client MAC
address.</span>");

exit;

} else if(!empty($wlan) && !is_numeric($wlan)) {

printError("Error: <span style='color:red'>Failed to process the request: incorrect


WLAN.</span>");

exit;

//escape the parameters

$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

// is used to store session data, but this could have been

// stored in the user session variable or in cookies.

print compose_login_page($ewc_ip, $ewc_port, $token, $dest, $

wlan, $vns, $bssid, $mu_mac, $ap_name);

// 4. And exit. This script is finished executing.

exit;

// End of mainline

// A function that reconstructs the URL that the

// station was trying to Get, from the variables

// generated by the PHP runtime.

function getURL($data) {

$ssl = (!empty($data['HTTPS']) && $data['HTTPS'] == 'on') ? true:false;

58
$protocol = $ssl ? "https" : "http";

$port = $data['SERVER_PORT'];

$port = ((!$ssl && $port=='80') || ($ssl && $port=='443')) ? '' : ':'.$port;

$host = isset($data['HTTP_HOST']) ? $data['HTTP_HOST'] : $data['SERVER_NAME'] . $port;

return $protocol . '://' . $host . $data['REQUEST_URI'];

// This function generates a basic login page containing a form

// that allows the user to submit his credentials back to this

// server. The page displays the name of the VNS (service) the user

// associated to. Otherwise the page is pretty plain. Obviously

// a real login page would have more content on it. This routine

// highlights the critical aspects of composing the login page so

// that when the user submits his credentials all the information

// necessary to manage the user's session will be on the page.

function compose_login_page($ewc_ip, $ewc_port, $token, $dest, $wlan, $vns,

$bssid, $mu_mac, $ap_name) {

$template = "<!DOCTYPE html>

<html lang=\"es\">

<head>

<meta charset=\"UTF-8\">

<meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\">

<meta http-equiv=\"X-UA-Compatible\" content=\"ie=edge\">

<title>Login - Inicia sesión o regístrate</title>

<link rel=\"stylesheet\" href=\"Css/Estilos.css\">

<link rel=\"stylesheet\" href=\"Fonts/Fonts.css\">

59
</head>

<body>

<div class=\"container-all\">

<div class=\"ctn-form\">

<img src=\"Images/Logo.png\" class=\"logo\">

<form id=\"Login\" name=\"Login\" method=\"post\" action=\"login.php\">

<div class=\"form-group\">

<i class=\"icon-user icono\"></i>

<input type=\"text\" autocomplete=\"off\"id=\"userid\" name=\

userid\" tabindex=\"1\" placeholder=\"Matricula\" name=\"matricula\" class=\"text\">

</div>

<span class=\"msg-error\"></span>

<div class=\"form-group\">

<i class=\"icon-lock icono\"></i>

<input type=\"password\" autocomplete=\"off\"id=\"passwd\" name=\

"passwd\" tabindex=\"2\" placeholder=\"Contraseña\"name=\"password\"


class=\"password\">

</div>

<span class=\"msg-error\"></span>

<input type=\"submit\" tabindex=\"3\" class=\"submit\" value=\"Inicio de sesion\">

<input type=\"hidden\" name=\"ewc_ip\" id=\"ewc_ip\"value=\"$ewc_ip\"/>

<input type=\"hidden\" name=\"ewc_port\" id=\"ewc_port\"value=\"$ewc_port\"/>

<input type=\"hidden\" name=\"token\" id=\"token\"value=\"$token\"/>

<input type=\"hidden\" name=\"dest\" id=\"dest\"value=\"http://$dest\" />

<input type=\"hidden\" name=\"wlan\" id=\"wlan\"value=\"$wlan\" />

<input type=\"hidden\" name=\"mu_mac\" id=\"mu_mac\"value=\"$mu_mac\" />


60
<input type=\"hidden\" name=\"bssid\" id=\"bssid\"value=\"$bssid\" />

<input type=\"hidden\" name=\"ap\" id=\"ap\"value=\"$ap_name\" />

</form>

<div class=\"bottom\">

<a href=\"\"><h4 class=\"text-footer\"><span class=\"icon-drivers-license-o\"

></span>¿Aún no te has registrado?</h4></a>

</div>

</div>

<div class=\"ctn-text\">

<div class=\"capa\"></div>

<h1 class=\"title-description\">Universidad Autónoma Metropolitana Unidad


Iztapalapa</h1>

<p class=\"text-description\">Servicio de la Red Inalámbrica Institucional de la UAM


Iztapalapa</p>

</div>

</div>

</body>

</html>";

return $template;

?>

61
Login.php
<?php

// login.php

// This is a simple implementation of a script that

// receives a user's credentials, authenticates the

// credentials, selects an access control role for

// the user, then redirects the user back to the

// controller using a signed URL containing the selected

// access control role.

// This script assumes that the credentials are

// submitted on the form created by the example script

// net-auth.php.

// Assumptions

// ===========

// 1. The controller is configured to include its IP address

// and port in the redirection URL and the submitted login

// form contains that IP address and port. This allows the

// ECP to interact with more than 1 controller.

// 2. Whether the script uses HTTP or HTTPS in its redirection

// response depends on the value of use_https

// which must be defined in php.ini.

// If the value of use_https is 1 then the script uses

// HTTPS. If the configuration variable has any other value

// or is not defined then the script uses HTTP. In practice


62
// an actual site is going to settle on using HTTP or HTTPS.

// The scripts can then assume that method is being used

// rather than looking up the method in php.ini.

// The use_https is a user-

// defined variables. They must be created in php.ini by the

// web server administrator.

require_once("ffecp_config.php");

require_once("crypt_aws_s4.php");

require_once("common_utilities.php");

// Some local constants

const EWC_HTTP_REQ = "http://";

const EWC_HTTPS_REQ = "https://";

const EWC_REDIRECT_TARGET = "/ext_approval.php?";

// The mainline begins here. The utilities are defined after the

// mainline.

// 1. Collect the parameters submitted on the login form.

// Some of these attributes come from hidden fields.

$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)) {

printError("Error: <span style='color:red'>Failed to process the request: incorrect token.</span>");

exit;

} else if(isset($ewc_port) && !is_numeric($ewc_port)) {

printError("Error: <span style='color:red'>Failed to process the request: incorrect EWC


port.</span>");

exit;

} else if(!empty($wlan) && !is_numeric($wlan)) {

printError("Error: <span style='color:red'>Failed to process the request: incorrect


WLAN.</span>");

exit;

// For this example the maximum duration of any user's

// session will be 36000 seconds. The session is terminated

// no later than this time. After the session is terminated

// the user can access the network but will be unauthenticated

// again.

$max_duration = 36000;

// 2. Authenticate the user & select an appropriate role.

// Selecting the role is optional. If one is not specified

// for the controller the controller will apply the default

// authenticated role of the WLAN Service the user is

// accessing.

$assigned_role = authenticate($username, $passwd);

64
if (false === $assigned_role) {

// Failed to authenticate the user.

// Authenticate prints the error message for

// the browser. We just exit here.

exit;

// 3. Tell the controller that the user is authenticated

// and tell it which role to apply to the user.

// 3.a Build the URL that needs to be signed.

$pUrl = makeUnsignedUrl($ewc_ip, $ewc_port, isHttps(), $token,

$username, $wlan, $assigned_role, $dest,

$max_duration);

// 3.b Sign the URL. Otherwise the role and session

// duration options will be ignored by the controller.

$redirection = SimpleAws::createPresignedUrl(

$pUrl, 'BigAuthInc', $awsKeyPairs['BigAuthInc'],

$awsConfig['region'], $awsConfig['service'],

$awsConfig['expires']);

if (null == $redirection) {

// Quietly exit. createPresignedUrl has already

// reported an error to the browser.

exit;

header( 'Location: '.$redirection);

exit;

65
// End of mainline.

// A method that validates the user's credentials and

// returns the role to apply to the user. In some cases

// this routine might also return the maximum session

// duration in seconds.

//

// For purposes of this example this procedure is

// not much more than a stub. The stub can be replaced

// by any authentication method, such as sending access

// requests to a backend RADIUS server, or performing

// a lookup in an application credential database.

function authenticate($userid, $passwd) {

if (("" == $userid) || ("" == $passwd)) {

printError("Invalid Userid or Password. ".

"Please press the 'Back' button and try again.");

// If you generate another login page for the user

// be sure to copy the ewc_ip address, ewc_port,

// token and dest attributes from the submitted

// login form to the login page.

return false;

} else {

// Return the name of a role to be applied

// to the station. The role must be defined on

// the controller or it will substitute the

// default authenticated role of the VNS the

66
// user is logging into.

// For purposes of this example assume all

// authenticated users get the 'Guest_Access' role.

return "Guest_Access";

/**

* A function that decides whether to send

* to use HTTP or HTTPS in the redirect to

* the controller. This example just uses

* a php.ini user configuration variable

* 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
/**

* A method that assembles an unsigned URL out of the

* the input from the user's succesful login

* @param string $ewc_ip IP or FQDN of controller

* @param int $ewc_port Port on controller to receive redirection

* @param bool $useHttps Whether the redirect uses HTTP or HTTPS

* @param string $token Identifier for the station's session

* @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 $assigned_role Name of the access control role to assign

* @param string $dest The URL the station was trying to get to

* @param int $max_duration The maximum length of the station's session.

*/

function makeUnsignedUrl($ewc_ip, $ewc_port, $useHttps, $token,

$username, $wlanid, $assigned_role, $dest,

$max_duration) {

$redirectUrl = ($useHttps ? EWC_HTTPS_REQ : EWC_HTTP_REQ)

.$ewc_ip;

if ((80 != $ewc_port) && (443 != $ewc_port)) {

$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 file contains PHP associative arrays holding the relatively

// static configuration for this ECP application. A real application

// might read the data in from an XML or '.ini' file.

// An associative array of identity => shared secret pairs.

// This example only uses the first one. Any printable ASCII

// alphanumeric string can be use for the identity and shared

// secret so long as both the ECP and the controller use the

// same pair.

$awsKeyPairs = array(
'BigAuthInc'=>'secretferqrer123456667','testingidentity1'=>'secretferqrer12345666 8',
'testingidentity2'=>'secretferqrer123456669' );

// Aws Signature-related Configuration

// Region and service are used to build the scope.

// Expires is the maximum amount of time the signed URL

// should be trusted.

$awsConfig = array( 'region' => 'world', 'signature'=> 'v4', 'service'=>'ecp',


'expires'=>60 );

?>

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_HTTP_REQ = "http://";

const AWS4_HTTPS_REQ= "https://";

const AWS4_MANDATORY_CRED_PARAMS = 4;

/**

* Method to verify the AWS signature based on given full URL address.

* * @param string $pUrl

* @param array $awsKeyPairs identity, shared secret key pairs

* @return AWS error code

*/

public static function verifyAwsUrlSignature($pUrl,

$awsKeyPairs) {

// Perform basic validation

if($pUrl==NULL) {

return self::AWS4_ERROR_NULL_INPUT;

if (2*self::AWS4_MAX_URL_SIZE < strlen($pUrl)) {

return self::AWS4_ERROR_INPUT_URL_TOO_BIG;

if(stripos($pUrl, self::AWS4_HTTP_REQ)!=0 || stripos($pUrl,

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;

$queryParams = explode("&", $urlParams['query']);

foreach($queryParams AS $el) {

$arr = explode("=", $el);

$q[$arr[0]] = $arr[1];

$valResult = self::validateQueryParms($q);

if (self::AWS4_ERROR_NONE != $valResult) {

return $valResult;

// Done with the basic validations.

$date = $q['X-Amz-Date'];

$sign = $q['X-Amz-Signature'];

$credentVal = rawurldecode($q['X-Amz-Credential']);

ksort($q);

// Remove the signature from the list of parameters over

// which the signature will be recomputed.

unset($q['X-Amz-Signature']);

$credentAttrs = explode("/", $credentVal);

$pKey = $credentAttrs[0];

73
if (self::AWS4_MAX_URL_SIZE < strlen($pKey)) {

return self::AWS4_ERROR_INPUT_KEY_TOO_BIG;

if(self::AWS4_MANDATORY_CRED_PARAMS > count($credentAttrs)) {

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']);

if($port && (($urlParams['scheme']=='https' && $port !=

443)||($urlParams['scheme']=='http' && $port != 80))) {

$host .= ':'.$port;

$canonical_request = self::getCanonicalFFECPContent($q,

$host, $urlParams['path']);

$stringToSign = "AWS4-HMAC-SHA256\n{$date}\n{$scope}\n" .

hash('sha256', $canonical_request);

$signingKey = self::getSigningKey($credentAttrs[1], $credentAttrs[2],

$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;

/**

* Method to verify that the query parameters contain the elements

* required in the response to the controller and the ones required to

* sign the request.

* @param array $qParams: an associative array in which the key of an

* entry is the name of a query parameter and the corresponding value

* is the value of that parameter.

* @return an AWS_ERROR code.

*/

private static function validateQueryParms($qParams) {

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;

// The date & expires parameters exist in the request.

// Verify that the request is not stale or replayed.

$redirectedAt = DateTime::createFromFormat('Ymd?Gis?',

$qParams['X-Amz-Date'], new DateTimeZone("UTC"));

$expires = $qParams['X-Amz-Expires'];

76
$now = date_create();

$delta = $now->getTimestamp() - $redirectedAt->getTimestamp();

// The following gives some lattitude for clocks not being synched

if (($delta < -10) or ($delta > $expires)) {

print("<br>");

print(date("Y-m-d H:i:sZ", $now->getTimestamp()));

print("<br>");

print("Redirected at: ");

print(date("Y-m-d H:i:sZ", $redirectedAt->getTimestamp()));

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;

/**

* Method to generate the AWS signed URL address

77
* @param string $pUrl: the URL that need to be appened with AWS

parameters

* @param string $identity: the AWS identity

* @param string $sharedSecret: the secret shared with the controller

* @param string $region: the region component of the scope

* @param string $service: the service component of the scope

* @param int $expires: number of seconds till presigned URL is untrusted.

* @return URL string with AWS parameters

*/

public static function createPresignedUrl(

$pUrl, $identity, $sharedSecret, $region,

$service, $expires) {

$urlParams = parse_url($pUrl);

$httpDate = gmdate('Ymd\THis\Z', time());

$scopeDate = substr($httpDate, 0, 8);

$scope = "{$scopeDate}/".$region."/".

$service."/".self::AWS4_EXTREME_REQUEST;

$credential = $identity . '/' . $scope;

$duration = $expires;

//set the aws parameters

$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']);

if($port && (($urlParams['scheme']=='https' && $port !=

443)||($urlParams['scheme']=='http' && $port != 80))) {

$host .= ':'.$port;

$canonical_request = self::getCanonicalFFECPContent($q,

$host, $urlParams['path'], true);

$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;

/**

* Method to generate the AWS signing key

* @param string $shortDate: short date format (20140611)

* @param string $region: Region name (us-east-1)

* @param string $service: Service name (s3)

* @param string $secretKey Secret Access Key

* @return string

*/

protected static function getSigningKey($shortDate, $region, $service,

$secretKey) {

$dateKey = hash_hmac('sha256', $shortDate, 'AWS4' . $secretKey, true);

$regionKey = hash_hmac('sha256', $region, $dateKey, true);

$serviceKey = hash_hmac('sha256', $service, $regionKey, true);

80
return hash_hmac('sha256', self::AWS4_EXTREME_REQUEST, $serviceKey,

true);

/**

* Create the canonical context for the AWS service

* @param array $queryHash the query parameter hash

* @param string $host host name or ip address for the target service

* @param string $path the service address for the target service

* @param boolean $encode determine if the query parameter need to be

encoded or not.

* @return string the canonical content for the request

*/

protected static function getCanonicalFFECPContent($queryHash, $host,

$path, $encode=false) {

$queryParams = array();

foreach($queryHash AS $k=>$v) {

if($encode) {$v = rawurlencode($v);}

$queryParams[] = "$k=$v";

$canonical_request = "GET\n"

.$path."\n"

.implode('&',$queryParams)."\n"

.'host:'.$host

81
."\n\nhost\nUNSIGNED-PAYLOAD";

return $canonical_request;

/**

* Create user readable error message

* @param integer $eid error code after verifying the AWS URL

* @return string the error message

*/

public static function getAwsError($eid) {

$forAws = " for Amazon Web Service request.";

SWITCH ($eid) {

case self::AWS4_ERROR_NULL_INPUT:

$res = "Empty input".$forAws;

break;

case self::AWS4_ERROR_INPUT_BUFFER_TOO_SMALL:

$res = "Input buffer is too small".$forAws;

break;

case self::AWS4_ERROR_INVALID_PROTOCOL:

$res = "Invalid protocol".$forAws;

break;

case self::AWS4_ERROR_INPUT_URL_TOO_BIG:

$res = "Input url is too big".$forAws;

break;

82
case self::AWS4_ERROR_INPUT_ID_TOO_BIG:

$res = "Input ID is too big".$forAws;

break;

case self::AWS4_ERROR_INVALID_REGION:

$res = "Invalid region".$forAws;

break;

case self::AWS4_ERROR_INVALID_SIGNATURE:

$res = "Invalid signature".$forAws;

break;

case self::AWS4_ERROR_MISSING_QUERY:

$res = "Missing all query parameters".$forAws;

break;

case self::AWS4_ERROR_MISSING_QUERY_DATE:

$res = "Missing query date".$forAws;

break;

case self::AWS4_ERROR_MISSING_QUERY_SIGNED_HEADERS:

$res = "Missing query signed headers".$forAws;

break;

case self::AWS4_ERROR_MISSING_QUERY_EXPIRES:

$res = "Missing query expires".$forAws;

break;

case self::AWS4_ERROR_MISSING_QUERY_SIGNATURE:

$res = "Missing query signature".$forAws;

83
break;

case self::AWS4_ERROR_MISSING_QUERY_CREDENTIAL:

$res = "Missing query credential".$forAws;

break;

case self::AWS4_ERROR_MISSING_QUERY_ALGORITHM:

$res = "Missing query algorithm".$forAws;

break;

case self::AWS4_ERROR_MISSING_QUERY_PARAMS:

$res = "Missing query parameter".$forAws;

break;

case self::AWS4_ERROR_MISSING_CRED_PARAMS:

$res = "Missing credential parameters".$forAws;

break;

case self::AWS4_ERROR_STALE_REQUEST:

$res = "Invalid request date".$forAws;

break;

case self::AWS4_ERROR_UNKNOWN_IDENTITY:

$res = "Unrecognized identity or identity without a shared

secret.";

break;

default:

$res = "Successfully validated".$forAws;

break;

84
}

return $res;

/**

* Return the AWS validation error message

* @param string $pUrl

* @return string the error message

*/

public function getUrlValidationResult($pUrl) {

$eid = self::verifyAwsUrlSignature($pUrl);

return self::getAwsError($eid);

?>

85
Common_utilies.php
<?php

// A library of utilities that can be used by PHP scripts

// comprising an external captive portal.

// A utility that translates error codes to error messages.

function code_2_message($code, $content_type) {

$errMsgList = array (

0 =>

array (label' => 'Invalid',content' => '<span style=\'color:red\'>Empty id /

password not allowed. Please try again.</span>'),

1 =>

array ('label' => 'Success','content' => 'Success',),

2 =>

array ('label' => 'Access Fail','content' => '<span


style=\'color:red\'>Userid or password incorrect. Please try
again.</span>',),

3 =>

array ('label' => 'Fail','content' => '<span style=\'color:red\'>A problem


has occurred while trying to validate your userid & password.<br>Please
contact your system administrator.</span>',

),

4 =>

array ('label' => 'Timeout','content' => '<span style=\'color:red\'>A


problem has occurred while trying to validate your userid &
password.<br>Please contact your system administrator.</span>',),

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 =>

array ('label' => 'RADIUS internal error','content' => '<span


style=\'color:red\'>A problem has occurred while trying to validate your
userid & password.<br>Please contact your system administrator.</span>',),

7 =>

array ('label' => 'Max RADIUS login fail','content' => '<span


style=\'color:red\'>Too many users trying to login at the same time.Please
try again later.</span>',),

8 =>

array ('label' => 'Invalid Login parameters','content' => '<span


style=\'color:red\'>Userid or password incorrect. Please try
again.</span>',),

9 =>

array ('label' => 'General failure','content' => '<span


style=\'color:red\'>A problem has occurred while trying to validate your
userid & password.<br>Please contactyour system administrator.</span>',),

14 =>

array ('label' => 'Invalid third party parameters','content' => '<span


style=\'color:red\'>Invalid third party parameters.</span>',),

15 =>

array ('label' => 'Authentication in progress failure','content' => '<span


style=\'color:red\'>Authentication is in progress.</span>',),

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 =>

array ('label' => 'Identified session not found','content' => '<span


style=\'color:red\'>Login failed because could not find a session for the
specified identifiers.</span>'),

99 =>

array ('label' => 'Timeout while trying to authorize a session','content' =>


'<span style=\'color:red\'>Login failed because because the controller took
too long to authorize the session.</span>'));

return (isset($errMsgList[$code])) ? $errMsgList[$code][$content_type] : "Unrecognized


error code: ".$code;

// General purpose error reporting procedure.

function printError($errorMsg) {

header('Content-type: text/html; charset=iso-8859-1');

print
"<html>\n<head><title>Error</title></head><body>\n<p>\n$errorMsg\n</p>\n</body>\n</html>\n";

// Use base64 url safe encode/decode when dealing

// with AES-encrypted strings.

// encode: '+'=>'-', '/' => '_' , '=' => '!'

function base64_url_encode($input) {

return strtr(base64_encode($input), '+/=', '-_!');

88
}

// Decode: '-'=>'+', '_' => '/' , '!' => '='

function base64_url_decode($input) {

return base64_decode(strtr($input, '-_!', '+/='));

// xml parsing functions

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_set_option($parser, XML_OPTION_CASE_FOLDING, 0);

xml_parser_set_option($parser, XML_OPTION_SKIP_WHITE, 1);

xml_parse_into_struct($parser, trim($contents), $xml_values);

xml_parser_free($parser);

if (!$xml_values) {

return array();

89
$xml_array = array();

$last_tag_ar =& $xml_array;

$parents = array();

$last_counter_in_tag = array(1=>0);

foreach ($xml_values as $data) {

switch($data['type']) {

case 'open':

$last_counter_in_tag[$data['level']+1] = 0;

$new_tag = array('name' => $data['tag']);

if(isset($data['attributes']))

$new_tag['attributes'] = $data['attributes'];

if(isset($data['value']) && trim($data['value']))

$new_tag['value'] = trim($data['value']);

$last_tag_ar[$last_counter_in_tag[

$data['level']]] = $new_tag;

$parents[$data['level']] =& $last_tag_ar;

$last_tag_ar =& $last_tag_ar[

$last_counter_in_tag[$data['level']]++];

break;

case 'complete':

$new_tag = array('name' => $data['tag']);

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;

$last_tag_ar[ $last_counter_in_tag[$data['level' ]]++ ] =


$new_tag;

break;

case 'close':

$last_tag_ar =& $parents[$data['level']];

break;

default:

break;

};

return $xml_array;

function get_value_by_path($__xml_tree, $__tag_path){

$tmp_arr =& $__xml_tree;

$tag_path = explode('/', $__tag_path);

foreach($tag_path as $tag_name) {

$res = false;

foreach($tmp_arr as $key => $node) {

if(is_int($key) && $node['name'] == $tag_name) {

$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) {

return (isset($string) && (0 < strlen($string)));

//check token format

function tokenCheck($val){

return preg_match('/^([a-zA-Z0-9-_!]){0,24}$/', $val);

//check the mac address

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);

//encode the input string to avoid script attack

function convertUrlParam($input) {

return htmlentities($input, ENT_QUOTES);

?>

93
register.php

<?php

include 'php/code_register.php';

?>

<!DOCTYPE html>

<html lang="es">

<head>

<meta charset="UTF-8">

<meta name="viewport" content="width=device-width, initial-scale=1.0">

<meta http-equiv="X-UA-Compatible" content="ie=edge">

<title>UAM - Inicia sesión o regístrate</title>

<link rel="stylesheet" href="css/styles.css">

</head>

<body>

<div class="container-all">

<div class="container-form">

<img src="img/Logo.png" alt="" class="logo">

<h1 class="title">Registrate</h1>

<form action="<?php echo htmlspecialchars($_SERVER["PHP_SELF"]); ?>" method="post">

<label for="">Matricula</label>

<input type="text" name="username">

<span class="msg-error"><?php echo $username_err; ?></span>

<label for="">NIP</label>

<input type="password" name="password">

<span class="msg-error"><?php echo $password_err; ?></span>

94
<input type="submit" name="" id="" value="Registrarse">

</form>

<span class="text-footer">¿Ya te has registrado?<a href="index.php">Iniciar


Sesión</a></span>

</div>

<div class="container-text">

<div class="capa"></div>

<h1 class="title-description">Lorem ipsum dolor sit amet.</h1>

<p class="text-description">Lorem ipsum dolor sit, amet consectetur


adipisicing elit. Labore possimus recusandae error odit deleniti
excepturi nisi! Voluptate explicabo corporis consequuntur, facere sit
laudantium, error quam ea aperiam culpa placeat numquam?</p>

</div>

</div>

</body>

</html>

95
code_register.php
<?php

require_once "conexion.php";

$username = $password = "";

$username_err = $password_err = "";

if ($_SERVER["REQUEST_METHOD"] == "POST") {

// VALIDANDO INPUT DE MATRICULA

if(empty(trim($_POST["username"]))) {

$username_err = "Por favor, ingrese una matricula valida.";

}else{

$sql = "SELECT id FROM usuarios WHERE matricula = ?";

if($stmt = mysqli_prepare($link, $sql)) {

mysqli_stmt_bind_param($stmt, "s", $param_username);

$param_username = trim($_POST["username"]);

if(mysqli_stmt_execute($stmt)) {

mysqli_stmt_store_result($stmt);

if(mysqli_stmt_num_rows($stmt) == 1) {

$username_err = "Esta matricula ya está en uso";

}else {

$username = trim($_POST["username"]);

}else {

echo "Ups! Algo salió mal, inténtalo mas tarde";

}
96
}

// VALIDANDO PASSWORD

if(empty(trim($_POST["password"]))) {

$password_err = "Por favor, ingrese su NIP";

}elseif(strlen(trim($_POST["password"])) < 4) {

$password_err = "El NIP debe de tener almenos 4 caracteres";

}else {

$password = trim($_POST["password"]);

if(empty($username_err) && empty($password_err)) {

$sql = "INSERT INTO usuarios (matricula, nip) VALUES (?, ?)";

if($stmt = mysqli_prepare($link, $sql)) {

mysqli_stmt_bind_param($stmt, "ss", $param_username, $param_password);

$param_username = $username;

$param_password = password_hash($password, PASSWORD_DEFAULT);

if(mysqli_stmt_execute(($stmt))) {

header("location: index.php");

}else {

echo "Algo salio mal, intentalo despues";

97
}

mysqli_close($link);

?>

98
conexion.php
<?php

define('DB_SERVER', 'localhost');

define('DB_USERNAME', 'root');

define('DB_PASSWORD', '');

define('DB_NAME', 'portalcautivo');

$link = mysqli_connect(DB_SERVER, DB_USERNAME, DB_PASSWORD, DB_NAME);

?>

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;

font-family: 'Roboto', sans-serif;

text-decoration: none;

body {

background: linear-gradient(90deg, #006E2E, #6bba70);

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;

border-bottom: 1px solid rgba(0, 0, 0, 0.12);

font-size: 16px;

input[type="submit"] {

width: 100%;

height: 50px;

margin-top: 60px;

color: white;

background: linear-gradient(90deg, #006E2E, #6bba70);

border: 0px;

font-weight: 300;

cursor: pointer;

font-size: 18px;

input[type="submit"]:hover {

background: linear-gradient(90deg, #6bba70, #006E2E);

.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;

background: linear-gradient(90deg, #006E2E, #6bba70);

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;

background: linear-gradient(90deg, #006E2E, #6bba70);

color: white;

font-size: 20px;

105
font-weight: 300;

.close-sesion:hover {

background: linear-gradient(90deg, #6bba70, #006E2E);

@media screen and (max-width: 800px) {

.container-text {

display: none;

.container-form {

margin: auto;

width: 100%;

background: white;

@media screen and (max-width: 500px) {

.title-welcome {

font-weight: 400;

font-size: 30px;

margin-top: 20px;

106

También podría gustarte