Red WiFi Segura: WPA+EAP-TLS+RADIUS

TOP meneame.net
Update: Actualmente hay una actualización a este manual aqui, que implementa EAP-MSCHAPv2 para autenticar clientes con usuario y contraseña sobre base de datos mysql.

Hasta hace un par de días tenía una red WiFi con cifrado WEP y controlaba los accesos a través de los logs del punto de acceso. Cada día crece el número de métodos para romper una red Wireless y crece el número de personas que lo intentan, por lo que al final me animé a cambiar el sistema.

El objetivo de este manual es montar una red WiFi segura, que empleará certificados de cliente y servidor para la autenticación, usando como servidor radius FreeRADIUS. Para ello realizaremos los siguientes pasos:

  1. Instalar FreeRADIUS
  2. Configurar el Punto de Acceso
  3. Configurar el Cliente.

La distribución que emplearé será Debian y trataremos de tirar de apt en la medida que se pueda.

El Punto de Acceso que emplearé a modo ejemplo será un DWL-2000AP+ con soporte WPA. El mio lo traia de fábrica, pero siel que vais a usar no lo tiene, probad actualizando el firmware.

El cliente que usaré, también como ejemplo, será el Mac OS X 10.4 y trataré de explicar tambien como hacerlo en Windows XP.

FreeRADIUS

Al principio traté de instalarlo por apt, pero descubrí que por un problema de licencias con openssl la versión de apt de freeradius no traia el módulo eap+tls, así que habrá que instalar freeradius desde el código fuente.

Primero, prepararle el entorno: necesiraremos openssl, libssl y libssl-dev.

# apt-get install openssl
# apt-get install libssl
# apt-get install libssl-dev

Ahora que ya tenemos el entorno, hay que bajarse la ultima versión de FreeRADIUS, compilarla e instalarla.

# cd /usr/src
# wget ftp://ftp.freeradius.org/pub/radius/freeradius-1.1.5.tar.gz
# tar xvfz freeradius-1.5.5.tar.gz
# cd freeradius-1.5.5
# ./configure –prefix=/ –with-raddbdir=/etc/raddb
# make
# make install

Ahora tendremos freeradius instalado en el sistema, queda configurarlo. Lo primero que haremos será crear los certificados apropiados con la ayuda de estos pequeños scripts procedentes en parte de aqui.

# cd /etc/raddb/certs
# wget http://karman.cc/blog/descargas/cascripts.tar.gz
# tar xvfz cascripts.tar.gz

Primero crearemos el certificado raíz:

# CA.root

Nos pedirá una serie de datos que realmente no son necesarios, yo solamente rellene 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:

# uname -n
karman.cc
# 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.

Ahora crearemos un certificado por cada usuario ejecutando el script con dos argumentos, el usuario y la contraseña:

# CA.client karman 12345

Como de costumbre, rellenamos los campos, le decimos que si a las dos ultimas preguntas y nos creará los archivos karman.der, karman.pem y karman.p12.

Como hemos dicho que el directorio de configuración sea /etc/raddb, el programa de instalación ha copiado una configuración básica para que arranque freeradius, pero no es lo que necesitamos, por lo que deberemos de modificar los siguientes archivos:

eap.conf

eap {

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

private_key_password = whatever
private_key_file = ${raddbdir}/certs/karman.cc.pem
certificate_file = ${raddbdir}/certs/karman.cc.pem
CA_file = ${raddbdir}/certs/root.pem
dh_file = ${raddbdir}/certs/dh
random_file = ${raddbdir}/certs/random
fragment_size = 1024
include_length = yes

}

}

Este es todo el contenido que tiene que tener el archivo eap.con. Nótese de cambiar los parámetros private_ket_file y certificate_file con los valores correspondientes.

clients.conf

# Punto de Acceso DLink
client 192.168.0.50 {

secret = pruebadeap
shortname = AP
nastype = other

}

Así es como hay que configurar un cliente. Ya viene con 127.0.0.1, que podemos modificar o borrar para que sirva a nuestros propositos. En todo caso, con el que el clients.conf tenga solamente las lineas anteriormente mostradas será suficiente para funcionar. Nótese de cambiar la ip en el campo client por la del punto de acceso y cambiar el campo secret por una contraseña que nosotros queramos.

users

“karman” Auth-Type := EAP

Esto es todo lo que deberá de ir en users. A la hora de añadir un usuario nuevo será tan sencillo como crearle un certificado, añadir esta linea con el nombre de usuario adecuado y darle a ese user su certificado para configurar el ordenador (lo veremos más adelante).

Llegados a este punto, sería conveniente hacer un usuario para el servidor radius añadiendo las siguientes lineas a nuestros passwd, shadow y group:

/etc/passwd: freerad:x:106:106::/etc/raddb:/bin/false
/etc/shadow: freerad:!:13611:0:99999:7:::
/etc/group: freerad:x:106:

y cambiar de usuario y los permisos de todos los archivos de /etc/raddb:

# chmod 700 -R /etc/raddb
# chown -R freerad:freerad /etc/raddb

radiusd.conf

bind_address = 192.168.0.1
user = freerad
group = freerad

En este caso, la modificacion de bind_address no es necesaria, yo la hice porque el ordenador que alberga el radius es a su vez mi router, y no quería que escuchase peticiones de login en internet, solo en intranet. En este archivo hay muchas cosas que podríamos tocar para afinar la configuración, pero de momento nos bastará como viene, ajustes finos a gusto de cada cual.

Ahora que tenemos todo en su sitio como toca, haremos una prueba de arranque con

# radiusd -X

lo que nos dará una salida detallada de arranque. Si todo ha ido bien y sin problemas, podemos bajarnos este script de inicio para debian, copiarlo en /etc/init.d y arrancaremos el servicio con

# /etc/init.d/radius start

Punto de Acceso (AP)

Configuracion de WPA para el Dlink DWL-2000AP+El siguiente paso es configurar nuestro punto de acceso para que cifre la red wireless con WPA (ojo, NO WPA-PSK). Si lo soporta, nos pedirá básicamente tres datos: IP del servidor radius, puerto del servidor radius y el ’secreto’, que viene siendo una contraseña. En nuestro caso ejemplo:

IP: 192.168.0.1
Puerto: 1812
Shared Secret: pruebadeap

Configurando un Cliente Windows/Mac OS X

Es tan sencillo como copiar en el ordenador cliente el certificado /etc/raddb/certs/karman.p12 (o elnombredelusuario.p12) y añadirlo con un doble click sobre el mismo. Nos preguntará si queremos añadirlo a los certificados, le decimos que si y entonces nos preguntará la contraseña que pusimos para cifrar el certificado a la hora de crearlo (12345).

Ahora que tenemos el certificado añadido al sistema, simplemente le damos a conectar a la wifi, con esto tendremos ya la wireless wpa+eap-tls.

Cualquier problema o duda, posteadla como comentario, ya que el manual lo he escrito dos días después de configurar mi WiFi y no se si se me ha podido pasar algo. Si alguien sabe como añadir el certificado y usarlo para autenticación WPA en linux agradecería que me lo enviase por correo o lo posteara en comentarios.

Update: En adición al artículo, he notado que al mes los certificados dejan de funcionar por la siguiente opcion del /etc/ssl/openssl.cnf:

default_crl_days= 30

Yo la he cambiado a 365 días, para que tarde un año.

También hay que editar CA.root y añadir en la instruccion openssl la opcion -days X, donde X es el valor en días que tardará en caducar el certificado raiz, que por defecto está a 30 dias. Ej, lo tengo a 3650 días, 10 años:

openssl req -new -days 3650 -x509 -keyout newreq.pem -out newreq.pem -passin pass:whatever -passout pass:whatever

<< Volver

13 comments to “Red WiFi Segura: WPA+EAP-TLS+RADIUS”

  1. Comment by santi:

    Eres una puta maquina …..

  2. Comment by santi:

    eres una maquina

  3. Comment by Migdalis:

    Hola, saludos a todos……Bueno, quiero implementar un servidor freeradius con clientes windows Xp, en una red ethernet….
    Estoy intentando configurar esto y nada de nada…..
    Por favor necesito de su ayuda….
    Si tienen algun manual de confoguraciòn o los archivos de conffiguracion para guiarme de alli, se los agradezco muchisimo….
    Gracias….Esperando su pronta ayuda…

  4. Comment by tengo un problema:

    es muy bueno tu howto pero tengo un problema al arrancar el radiusd -X, (en el mio no es asi sino, freeradius -X) y me bota este problema al final de la prueba de arranque ….
    #freeradius -X
    .
    .
    .
    rlm_eap: Failed to link EAP-Type/tls: rlm_eap_tls.so: cannot open shared object file: No such file or directory
    radiusd.conf[10]: eap: Module instantiation failed.
    radiusd.conf[1939] Unknown module “eap”.
    radiusd.conf[1886] Failed to parse authenticate section.

  5. Zen Comment by KaR]V[aN:

    Buenas ‘tengo un problema’,

    Eso es porque no ha compilado el módulo rlm_eap_tls.so, es normal si no tienes los paquetes de open ssl (para evitar problemas de licencias, freeradius no incluye este módulo).

    Yo puse:

    Primero, prepararle el entorno: necesiraremos openssl, libssl y libssl-dev.

    # apt-get install openssl
    # apt-get install libssl
    # apt-get install libssl-dev

    Hay que hacerlo precisamente por el modulito de marras jeje

    Si no usais debian ni ningún sucedaneo que tenga apt, pues tendreis que instalarlo manualmente, bajando el source y compilando.

    Un saludo y disculpas por contestar tan tarde.

  6. Comment by Carlos:

    Hola, sabes si se puede restringir a usuarios ciertos puertos o tráfico (creo q es traffic shaping) o aplicar QoS basado en perfiles.. cualquier sugerencia gracias desde ya.!!

  7. Comment by RECORD:

    Hola, increíble el manual sobre freeradius, felicidades, hay que decir que fue una lucha conseguir una configuración correcta para el cliente wifi Linux, en respuesta a tu comentario sobre la configuración para clientes en Linux, basta con instalar wpasupplicant y crear un fichero de configuración.

    # apt-get install wpasupplicant

    A continuación editamos el fichero ubicado en /etc/wpa_supplicant/wpa_supplicant.conf :

    network {
    ssid=”nombre de la red wifi”
    scan_ssid=1
    proto=WPA
    key_mgmt=WPA-EAP
    pairwise=TKIP # o CCMP el que utilizemos para nuestro punto de acceso
    group=TKIP # o CCMP el que utilizemos para nuestro punto de acceso
    eap=TLS
    identify=”nombre de usuario” # seria el creado con el CA.client
    ca_cert=”path donde hemos colocado el root.pem”
    client_cert=”path donde hemos colocado el user.pem” # que creamos con CA.client
    private_key=”path donde hemos colocado el user.p12″ # que creamos con CA.client
    private_key_passwd=”password” # que introdujimos al crear el cliente con CA.client
    }

    Seguidamente ejecutamos wpasupplicant de la siguiente manera :
    # wpa_supplicant -B -iwlan0 -Dwext -c /etc/wpa_supplicant/wpa_supplicant.conf -d

    donde -i habrá que substituirlo por el nombre de nuestra interfaz wifi y -D se refiere al driver que debe utilizar wpasupplicant para ejecutar el enlace, por defecto sin driver funciona con casi todos los chips.

  8. Comment by RECORD:

    Gracias por tu manual fue de gran ayuda, hasta otra

  9. Zen Comment by KaR]V[aN:

    Buenas,

    Solo queria agradecerte tu ayuda, investigación y colaboración con el uso de wpasuplicant :D

    Un saludo

  10. Comment by RECORD:

    falta un símbolo :
    network ={

    En respuesta al compañero:
    Comment by tengo un problema:
    Lunes, Septiembre 10th 2007 at 8:54 pm

    es muy bueno tu howto pero tengo un problema al arrancar el radiusd -X, (en el mio no es asi sino, freeradius -X) y me bota este problema al final de la prueba de arranque ….
    #freeradius -X
    .
    .
    .
    rlm_eap: Failed to link EAP-Type/tls: rlm_eap_tls.so: cannot open shared object file: No such file or directory
    radiusd.conf[10]: eap: Module instantiation failed.
    radiusd.conf[1939] Unknown module “eap”.
    radiusd.conf[1886] Failed to parse authenticate section.

    El error compañero esta en que la versión precompilada de debian que por defecto no lleva soporte nativo para EAP-TLS , a mi me sucedió y baje el código fuente del fabricante , además de indicarle al ./configure la opción –with-rlm_eap_tls para incluirlo .

    Gracias a todos por la fuente de información.

  11. Comment by Oscar:

    como reinicio el servidor radius cuando hago cambios en los user o los demas archivos

  12. Zen Comment by KaR]V[aN:

    Normalmente:

    # /etc/init.d/radiusd restart

  13. Comment by DEBBy:

    Hola tengo un problema al ejecutar el script CA.server y es que cuando termino de rellenar los campos me da el siguiente error:

    ERROR: loading the config file ‘xpextensions’
    139729146685096:error:02001002:system library:fopen:No such file or directory:bs
    s_file.c:169:fopen(‘./demoCA/index.txt.attr’,'rb’)
    139729146685096:error:2006D080:BIO routines:BIO_new_file:no such file:bss_file.c
    :172:
    139729146685096:error:0E078072:configuration file routines:DEF_LOAD:no such file
    :conf_def.c:197:
    139729146685096:error:02001002:system library:fopen:No such file or directory:bs
    s_file.c:169:fopen(‘xpextensions’,'rb’)
    139729146685096:error:2006D080:BIO routines:BIO_new_file:no such file:bss_file.c
    :172:
    139729146685096:error:0E078072:configuration file routines:DEF_LOAD:no such file
    :conf_def.c:197:
    Error opening input file newcert.pem
    newcert.pem: No such file or directory
    Error opening input file debian.p12
    debian.p12: No such file or directory
    Error opening Certificate debian.pem
    139659231532712:error:02001002:system library:fopen:No such file or directory:bs
    s_file.c:398:fopen(‘debian.pem’,'r’)
    139659231532712:error:20074002:BIO routines:FILE_CTRL:system lib:bss_file.c:400:
    unable to load certificate

    ¿Alguna idea?

Contador