Red WiFi Segura: WPA+EAP-TLS+RADIUS
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:
- Instalar FreeRADIUS
- Configurar el Punto de Acceso
- 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)
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


Miercoles, Mayo 2nd 2007 at 8:19 pm
Eres una puta maquina …..
Miercoles, Mayo 2nd 2007 at 8:20 pm
eres una maquina
Lunes, Agosto 6th 2007 at 2:14 pm
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…
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.
Domingo, Septiembre 23rd 2007 at 9:46 pm
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.
Martes, Octubre 30th 2007 at 3:44 am
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.!!
Sabado, Abril 19th 2008 at 7:23 am
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!
Domingo, Abril 20th 2008 at 1:06 am
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
Miercoles, Junio 18th 2008 at 12:05 am
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
Martes, Julio 1st 2008 at 8:06 pm
¿Que ocurre si no se copia el certificado a los clientes?¿Se pueden conectar a la wifi los clientes ingresando la clave?
Miercoles, Julio 2nd 2008 at 8:54 pm
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.
Viernes, Julio 11th 2008 at 3:46 am
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
Viernes, Julio 11th 2008 at 3:56 am
mm otra cosita si te funciono en verdad podrias proporcionar tu radiusd.conf :P gracias
Viernes, Julio 11th 2008 at 11:18 am
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
Sabado, Julio 12th 2008 at 1:44 am
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
Viernes, Julio 18th 2008 at 10:53 pm
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
Viernes, Julio 25th 2008 at 2:10 am
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.
Martes, Septiembre 2nd 2008 at 12:22 pm
I disagree
Can you give more info?
Martes, Septiembre 2nd 2008 at 8:33 pm
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.