Red WiFi Segura con Gentoo: WPA + MSCHAP-EAP-TLS + RADIUS + MySQL

TOP meneame.net

Update: Recientemente he creado esta aplicación web para gestionar los usuarios WiFi de la base de datos en MySQL.

El objetivo de este artículo es que al final hayamos configurado un acceso seguro a la red WiFi a través de algo tan sencillo como un usuario y una contraseña. Eston son los elementos que tomarán parte:

  • WPA: Es el método de acceso que se ha de configurar en el AP (Punto de Acceso).
  • TLS: Será nuestro método de cifrado de la información que circule a través de la WiFi.
  • MSCHAP: Utilizaremos la implementación de Microsoft del protocolo CHAP para la autenticación por ser el mas extendido.
  • RADIUS: Instalaremos un servidor RADIUS que soporte TLS, CHAP y utilice como base de datos MySQL para autenticar a nuestros usuarios.
  • MySQL: Será utilizado principalmente para almacenar usuarios y contraseñas.

Se toma como punto de partida que tenemos un Sistema Operativo instalado junto a un servidor MySQL. Este manual está principalmente orientado a Gentoo, aunque puede utilizarse como punto de referencia para otras distribuciones GNU/Linux.

Instalando FreeRADIUS

Como servidor RADIUS utilizaremos FreeRADIUS por ser de los mas completos que existen en el mundo OpenSource. Para instalarlo en Gentoo tendremos en cuenta los ‘uses’ necesarios, bien añadiendolos a nuestro /etc/portage/package.use o bien especificándolos antes del emerge:

# USE=”ssl mysql” emerge freeradius

El soporte SSL es necesario para el cifrado de la señal mientras que el soporte MySQL será empleado para conectar a la base de datos.

Creando los certificados

Antes de proceder a la configuración de FreeRADIUS es necesario que tengamos bien claro donde van a estar los certificados, y nada mejor para ello que crearlos primero. Yo empleo esta pequeña colección de scripts para la creación de los certificados que deben de estar en /etc/raddb/certs. Empecemos con el certificado raíz (root) o ‘entidad emisora’:

# CA.root

A continuación nos pedirá una serie de datos que realmente no son necesarios (yo solamente relleno los 3 primeros). Si todo ha salido bien, nos habrá creado los archivos root.der, root.p12 y root.pem. El siguiente certificado a crear es el del servidor con el CA.server que toma como parámetro un nombre. Aqui normalmente se pone el nombre del servidor:

# CA.server karman.cc

En este caso es importante que rellenemos el campo Common name con el nombre del servidor, karman.cc en este caso. Cuando nos pregunte [y/n], respondemos y ambas veces. Si todo ha ido bien, nos habrá creado los archivos karman.cc.p12, karman.cc.der y karman.cc.pem.

Como curiosidad, se puede autenticcar clientes a través de certificados en lugar de usuario y contraseña (chap) creandolos primero con el script CA.client e instalandolos en los clientes sin necesidad de tocar nada de la configuración que se explica a continuación.

Creando la base de datos en MySQL

Esta parte es bien sencilla. Primero creamos la base de datos y le damos permisos:

mysql> CREATE DATABASE ‘freeradius’;
mysql> GRANT all ON freeradius.* TO ’someuser’@'localhost’ IDENTIFIED BY ’somepass’;

Ahora utilizaremos el archivo /etc/raddb/sql/mysql/schema.sql para crear la estructura interna de la base de datos:

# mysql -u root -p freeradius < /etc/raddb/sql/mysql/schema.sql

Configurando FreeRADIUS

El directorio de trabajo de freeradius (por lo menos en la version en la que trabajo, 2.0.5) es /etc/raddb. Entramos y empezamos por el archivo de configuración padre, radius.conf.

Casi nada de este archivo necesita tocarse pues funciona bien por defecto, salvo las siguiente directivas (en listen poner la dirección IP en donde queremos escuchar peticiones):

user = radiusd
group = radiusd
listen {

type = auth
ipaddr = 192.168.0.1
port = 0

}
listen {

type = acct
ipaddr = 192.168.0.1
port = 0

}
authorize {

mschap
eap
sql

}

A continuación, eap.conf (tener en cuenta el path y nombre de los certificados):

eap {

default_eap_type = peap
timer_expire = 60
ignore_unknown_eap_types = no
cisco_accounting_username_bug = no
tls {

certdir = ${confdir}/certs
cadir = ${confdir}/certs
private_key_password = whatever
private_key_file = ${certdir}/karman.cc.pem
certificate_file = ${certdir}/karman.cc.pem
CA_file = ${cadir}/root.pem
dh_file = ${certdir}/dh
random_file = ${certdir}/random
fragment_size = 1024
include_length = yes
cipher_list = “DEFAULT”

}
peap {

default_eap_type = mschapv2

}
mschapv2 {
}

}

Ahora sql.conf (tener en cuenta el usuario, contraseña y nombre de la base de datos creada anteriormente):

sql {

database = “mysql”
driver = “rlm_sql_${database}”
server = “localhost”
login = “someuser”
password = “somepass”
radius_db = “freeradius”
acct_table1 = “radacct”
acct_table2 = “radacct”
postauth_table = “radpostauth”
authcheck_table = “radcheck”
authreply_table = “radreply”
groupcheck_table = “radgroupcheck”
groupreply_table = “radgroupreply”
usergroup_table = “radusergroup”
deletestalesessions = yes
sqltrace = no
sqltracefile = ${logdir}/sqltrace.sql
num_sql_socks = 2
connect_failure_retry_delay = 60
nas_table = “nas”
$INCLUDE sql/${database}/dialup.conf

}

clients.conf (archivo de dispositivo de red autenticador en donde definimos la ip del dispositivo autenticador o punto de acceso):

client 192.168.0.2 {

secret = somesecret
shortname = SomeName
nastype = other

}

y para terminar, /etc/raddb/modules/mschap.conf:

mschap {

authtype = MS-CHAP
use_mppe = yes
require_encryption = yes
require_strong = yes

}

Y listo, ya tenemos nuestro servidor FreeRADIUS totalmente configurado.

Creando usuarios en MySQL

Basta con añadirlos en la tabla radcheck de la base de datos freeradius:

mysql> INSERT INTO ‘freeradius’.'radcheck’ (‘username’, ‘attribute’, ‘op’, ‘value’) VALUES (“WiFiUser”,”Cleartext-Password”,”:=”,”WiFiPassWord”);

Configurando el Punto de Acceso

Ya que cada punto de acceso es diferente paso a explicar mas o menos lo que debería de pedir para configurarlo con el servidor RADIUS:

  • Dirección IP del servidor RADIUS. (192.168.0.1)
  • Puerto. (1812)
  • Secreto o contraseña de asociación, configurado en clients.conf. (somesecret)
  • En algunos casos puede que pida el tiempo de renovacion de la clave en segundos.

Este es un ejemplo de configuración en DD-WRT:

DDWRT Radius Configuration

DDWRT Radius Configuration

Probando el funcionamiento

Para probar que la configuración carga correctamente y para ver cierta salida de debug del FreeRADIUS lo ejecutaremos del siguiente modo:

# radiusd -X

Ahora podemos probar a conectarnos a la WiFi, que nos pedirá un usuario y contraseña (WiFiUser y WiFiPassWord usados en los ejemplos). Podemos comprobar como funciona tambien mirando el log en /var/log/radius/radius.log:

[FECHA] : Auth: Login OK: [WiFiUser/] (from client WIFISSID port 0 cli CLIENT:MAC:ADDRESS)

Si todo ha funcionado correctamente, podemos interrumpir la ejecución de FreeRADIUS para añadirlo como sistema al inicio:

# rc-update add radiusd default
# /etc/init.d/radiusd start

Enhorabuena! Ya tenemos un servidor radius que soporta mschap sobre mysql para la autenticacion de usuarios wifi. Este artículo es una actualización del que escribí hace dos años para autenticarse con certificados y del cual es aprox. su aniversario.

<< Volver

6 comments to “Red WiFi Segura con Gentoo: WPA + MSCHAP-EAP-TLS + RADIUS + MySQL”

  1. Comment by cesar:

    hola amigo he segudo el tutorial al pie de la letra, sin embargo, al terminar de configurarlo lo ejecuto con radiusd -X y me manda un erreor en la estructura de listen me dice que la ip no puede ser asignada… caul seria el error

  2. Zen Comment by KaR]V[aN:

    Buenas,

    No hay que copiar las configuraciones tal cual, hay que adaptarlas al entorno que estás utilizando. En el caso de listen, pone:

    ipaddr = 192.168.0.1

    Esto significa que la ip en la que tiene que escuchar es 192.168.0.1, si es la que quieres. En su lugar tendrás que poner la que quieres tu, en tu caso particular.

  3. Comment by cesar:

    yes sir, jejej si asi es gracias por la respuesta, y te quedo muy chulo el how to

  4. Comment by cesar:

    hola amigo, todo bien con el how to pero no puedo conectar mi cliente windows al servidor radius, hace la comprobacion de usuario, pero hasta ahi se queda no manda ningun error radius, solo termina de hacer el analisis de la red y queda de nuevo en espera, intente con la configuracion pepmschapv2 en cliente windows y ahora intente con tls pero nose que certificado seleccionar en la opcion de autenticar por cervidor.

  5. Comment by Gonzalo:

    Hola
    Estoy siguiendo la guía qe dejas y casi tengo el sistema montado al completo, si bien no consigo hacer que funcione. Las pruebas en sistema local (radtest) funcionan OK, pero al probar con un equipo real, intentando conectar con una red real, me da errores. La conexión APRADIUS parece OK, recive mensajes y procesa OK, pero se queja de un error de CA:

    TLS Alert read:fatal:unknow CA
    TLS_accept: failed in SSLv3 read client certificate A

    Supongo que simplemente RADIUS está cofigurado para usar conexión TLS con certificados de usuario, cuando en realidad (supongo) solamente necesita comprobar usuario y contraseña.
    Sabrías qué hay que cambiar para corregirlo? Acaso debo instalar un certificado de usuario en el PC cliente? (Habia entendido que no era tu intención, ese sería el caso de tu otro manual)

    Por último, una opinion:
    El sistema de seguridad aquí propuesto sería la solución para muchos bares, cafeterías, restaurantes y demás que tienen problemas para mentener un servicio a sus clientes sin que los vecinos se pongan las botas. No entiendo porqué no se usa más. Acaso da muchas complicaciones o es poco compatible?

    Muchas gracias por tu aporte :)

  6. Zen Comment by KaR]V[aN:

    Buenas, el Unknow CA tiene pinta de ser una mala configuracion del archivo eap.conf, en las lineas:

    eap {
    tls {
    private_key_file = ${certdir}/karman.cc.pem
    certificate_file = ${certdir}/karman.cc.pem
    CA_file = ${cadir}/root.pem
    }
    }

    Este sistema se puede utilizar sencillamente con sistemas embebidos para ese tipo de instalaciones: routers que tienen linux, radius, sql e impresoras, que al darle a un boton te generan e imprimen usuarios de tiempo limitado.

    Este manual está mas orientado a grandes instalaciones como colegios, empresas, universidades, etc.

Contador