Red WiFi Segura: WPA+EAP-TLS+RADIUS

TOP meneame.net

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.homelinux.net/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.homelinux.net
# CA.server karman.homelinux.net

En este caso es importante que rellenemos el campo Common name con el nombre del servidor, karman.homelinux.net en este caso. Cuando nos pregunte [y/n], respondemos y ambas veces. Si todo ha ido bien, nos habrá creado los archivos karman.homelinux.net.p12, karman.homelinux.net.der y karman.homelinux.net.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.homelinux.net.pem
certificate_file = ${raddbdir}/certs/karman.homelinux.net.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

19 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 JoNiuX:

    Hola: podrias ser mas específico con las versiones?, hace años instalé una plataforma utilizando freeradius y openssl (había que compilar tres versiones distintas para que operara) y hoy quiero migrar esa plataforma, pero me ha sido imposible por conflictos de versiones.

    Desde ya, muchas gracias!

  8. Zen Comment by KaR]V[aN:

    Pues la verdad cuando lo instalé al haber usado apt ni me preocupé por el versionado… estas son las versiones:

    - ppenssl: 0.9.8c-4
    - libssl-dev: 0.9.8c-4
    - freeradius: 1.1.5

    El de freeradius se podía ver cuando escribí la descarga :P (wget ftp://ftp.freeradius.org/pub/radius/freeradius-1.1.5.tar.gz).

    Un saludo y suerte con la migración

  9. Comment by jesus alamilla:

    hola yo estoy tratando de instalar un servidor radius enuanmac os x 10.2.2 si es posible y si tienes un amanual es que me interesa aprender mucho soy nuevo en esto espero que me puedas ayudar de antemano gracias

  10. Comment by rafaelsalcedo:

    ¿Que ocurre si no se copia el certificado a los clientes?¿Se pueden conectar a la wifi los clientes ingresando la clave?

  11. Zen Comment by KaR]V[aN:

    Pues no se que decirte, pero no lo creo porque en realidad la ‘clave’ que hay que ingresar es una cadena bastante larga que se encuentra cifrada en el certificado ssl o algo parecido.

  12. Comment by Omar:

    tengo una duda por que en el scrip de CA.client no le dejaste el whatever como password, por que le pusiste una variable que me imagino que captura el password cuando ejecutas el escrip ./CA.client cliente 12345, la verdad es que tengo muy parecida mi configuracion tengo mis certificados mi eap con tls, radius ya se ejecuta, mi ap bien configurado y no me funciona, voy a hacer el paso de crearle un usuario a freeradius que me imagino que lo crea el instalador y asignarle todo a ese usuario, si sabes alguna cosa importante que se te olvido mencionar te agradeceria en verdad

  13. Comment by Omar:

    mm otra cosita si te funciono en verdad podrias proporcionar tu radiusd.conf :P gracias

  14. Zen Comment by KaR]V[aN:

    No dejé whatever como contraseña porque el proposito de este artículo es la seguridad y dejar una contraseña por defecto no es seguro nunca.

    Lo de que los usuarios los crea el instalador no es correcto ya que no existe tal instalador. Recuerda, freeradius lo instalo descargando y compilando manualmente, no mediante apt ni nada parecido.

    No tengo problema en proporcionarte mi radius.conf, pero ten en cuenta que es 99% default, yo solo he cambiado lo que escribí en el artículo.

    Recuerda de revisar los archivos eap.conf y clients.conf, que estén bien configurados y revisa también que freeradius se inicie correctamente y sin fallos. Revisa también que el certificado esté correctamente instalado en los clientes y que estén configurados para autenticarse por certificado. Este ultimo sobre todo suele dar mas problemas.

    Un saludo

  15. Comment by Omar:

    ok gracias por ayudar voy a hacer lo del usuario y a bajar el programa , compilarlo y ejecutarlo y a revisar lo que me mencionas si funciona te lo hare saber, otra ves gracias

  16. Comment by Omar:

    Hola, pues a qui molestando de nuevo lo que pasa es que tengo una duda, para son el archivo dh y ramdon, lo que pasa es que me marca un error

    WARNING: rlm_eap_tls: Unable to set DH parameters. DH cipher suites may not work!
    WARNING: Fix this by running the OpenSSL command listed in eap.conf

  17. Comment by Omar:

    Problema resuelto el freeradius funciona con eap+peap+mysql, y eap+tls+certificados, ahora en ves de usar un ap, intento usar un switch cisco :P, gracias :P.

  18. Comment by Derek:

    I disagree
    Can you give more info?

  19. Comment by Emilio:

    hola karman. muy buen tutorial. disculpa pero tengo un problemita. cada vez que modifico el modulo eap.conf para activar el tls como tu lo muestras (o de cualquier otra forma), e intento correr con radiusd -X intenta arrancar y al final muestra lo siguiente . que sera? de antemano muchas gracias.

    eap: default_eap_type = “tls”
    eap: timer_expire = 60
    eap: ignore_unknown_eap_types = no
    eap: cisco_accounting_username_bug = no
    rlm_eap: Loaded and initialized type md5
    rlm_eap: Loaded and initialized type leap
    gtc: challenge = “Password: ”
    gtc: auth_type = “PAP”
    rlm_eap: Loaded and initialized type gtc
    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.

Comentalo

Contador