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.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)
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
Miércoles, Mayo 2nd 2007 at 8:19 pm
Eres una puta maquina …..
Miércoles, 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.!!
Sábado, Enero 3rd 2009 at 12:23 am
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.
Sábado, Enero 3rd 2009 at 12:24 am
Gracias por tu manual fue de gran ayuda, hasta otra
Miércoles, Enero 7th 2009 at 9:03 am
Buenas,
Solo queria agradecerte tu ayuda, investigación y colaboración con el uso de wpasuplicant :D
Un saludo
Miércoles, Marzo 25th 2009 at 8:05 pm
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.
Domingo, Abril 12th 2009 at 7:46 pm
como reinicio el servidor radius cuando hago cambios en los user o los demas archivos
Lunes, Abril 13th 2009 at 5:30 am
Normalmente:
Miércoles, Junio 11th 2014 at 10:42 am
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?