lunes, mayo 07, 2007

Mini HOW-TO Freeradius en Debian (WPA)

Hola a todos, este será el primer post dedicado a implementar "algo informático". Basta de tanta música y post llenos de gilipolleces (como he acostumbrado a hacer hasta el momento). Por fín haré algo de provecho y de ayuda a la comunidad.

Mini HOW-TO Freeradius en Debian (WPA).


Contenido:

1.- Preámbulo.
2.- Sistema y requerimientos.
3.- Compilando Freeradius desde las fuentes.
4.- Creación e instalación de certificados.
5.- Configurando Freeradius.
6.- Configurando el AP (Punto de Acceso).
7.- Configurando clientes.
8.- Conclusiones.

-------------------------------------------------------------------------------------------------

1.- Preámbulo.

A estas alturas de la vida, con la Web 2.0 en pleno auge, las redes wifi son cada vez más frecuentes y con ellas el intento de hackeo. Normalmente un usuario ADSL con router wifi suele configurar su red con seguridad habilitada con clave WEP (Wired Equivalent Privacy). Esto consiste en crear una clave cifrada de entre 64 y 128 bits, esto supone una manera poco útil de proteger tu red ya que ha sido sobradamente demostrado la facilidad con la que se puede "reventar" dicha clave con poco esfuerzo (incluso el FBI ha demostrado que en tan sólo 3 minutos y con herramientas al alcance de todos se puede descifrar la clave WEP). Por ello surgió WPA (Wi-Fi Protected Access), un sistema mucho más robusto y seguro. Este mini HOW-TO intentará explicar como montar tu propio sistema WPA para proteger tu red wifi.

2.- Sistema y requerimientos.

Para montar el servidor con Freeradius yo he usado Debian etch (cómo no?!). Es un Athlon XP 64 bits con 80 gb de disco. La implementación de Freeradius se puede llevar a cabo en todas las distribuciones Linux, aquí sólo me centraré en instalarlo y configurarlo en Debian, con lo que es posible que algunos comandos cambien en tu distribución, así como la localización de mucho archivos.
Como siempre que uses un Linux no necesitarás una máquina muy potente para implementar una gran cantidad de servicios (no como en esos Güindoces que necesitan ordenadores de la NASA para soportar un simple IIS ;-) )

3.- Compilando Freeradius desde las fuentes.

Si aún estás leyendo es porque te interesa el tema y quieres montar tu porpio servidor, si no mejor no sigas leyendo ya que a partir de aquí viene lo "técnico".

Existen dos maneras de instalar Freeradius en tu sistema Debian:

1.- Desde los repositorios oficiales:
apt-get install freeradius
Aunque esta forma no es la más indicada ya que por un problema con la licencia de OpenSSL el binario oficial de Debian no incluye soporte para SSL.
2.- Desde las fuentes (RECOMENDADO):
Esta es la manera más indicada para instalar Freeradius (esta es la manera en la que yo lo he instalado). Para ello debes seguir estos pasos:
a) Necesitas instalar dpkg-dev, para ello:
apt-get install dpkg-dev
b) Descarga las fuentes desde la versión 1.1.5 (versión estable en el momento de escribir este mini HOW-TO). Freeradius
c) Una vez descargado:
$ tar zxf freeradius-1.1.5.tar.gz
$ cd freeradius-1.1.5
$ fakeroot dpkg-buildpackage -b -uc
$ sudo dpkg -i ../freeradius_1.1.5-0_i386.deb
Nota: Si estás como root no necesitarás hacer un fakeroot para compilar e instalar.
Nota II: Muy importante, antes de compilar y generar el binario debes revisar el fichero rules que se encuentra en el directorio debian dentro del directorio donde has descomprimido las fuentes de freeradius. Una vez lo edites (por ejemplo: vi rules) debes comentar la siguiente linea: buildssl = --with-rlm_sql_postgresql_lib_dir=`pg_config --libdir` --with-rlm_sql_postgresql_include_dir=`pg_config --includedir` ya que nosotros no queremos soporte para PostgreSQL.

4.- Creación e instalación de certificados.


Una vez tenemos instalado Freeradius en nuestra máquina Debian toca crear los certificados tanto de servidor como de cliente. Para facilitar este proceso usaremos los scripts de Raymond McKay's HOWTO. Estos scripts se pueden copiar y pegar tal cual, con los nombres que se proponen. Se debe tener en cuenta que algunas variables se deben modificar para adaptarlas a tu sistema.

Primero creamos el script para generar el certificado raíz:

CA.root
#En negrita las variables que se tienen que especificar.
# CAPL. Es el ejecutable de perl CA.pl que en Debian normalmente lo deberías encontrar en: /usr/lib/ssl/misc/CA.pl
# KEYGEN. Es el programa que se usará para generar un password aleatorio si no especificas #ninguno a la hora de crear los certificados. Yo he usado dnskeygen que los puedes encontrar en #las utilidades de bind (apt-get install bind).

#!/bin/sh

OPENSSL=openssl
CAPL=(path to your CA.pl)
KEYGEN=(your choice of key/password generator)
PASSDIR=pass
DERDIR=der
P12DIR=p12
PEMDIR=pem
VALIDFOR=365
PASSWD=$1

mkdir -p $PEMDIR $P12DIR $DERDIR $PASSDIR

if [ -z "${PASSWD}" ]; then
echo "No root password specified, trying $PASSDIR/root.pass."
if [ -a $PASSDIR/root.pass ]; then
PASSWD=`cat $PASSDIR/root.pass`
else
echo "Not found. Generating password, see $PASSDIR/root.pass for contents."
PASSWD=`$KEYGEN | head -c 32`
cat /dev/null > $PASSDIR/root.pass
echo $PASSWD >> $PASSDIR/root.pass
fi
fi

rm -rf demoCA

$OPENSSL req -new -x509 -days $VALIDFOR -keyout $PEMDIR/newreq.pem -out \
$PEMDIR/newreq.pem -passin pass:$PASSWD -passout pass:$PASSWD
echo "${PEMDIR}/newreq.pem" | $CAPL -newca >/dev/null
$OPENSSL pkcs12 -export -in demoCA/cacert.pem -inkey $PEMDIR/newreq.pem -out \
$P12DIR/root.p12 -cacerts -passin pass:$PASSWD -passout pass:$PASSWD
$OPENSSL pkcs12 -in $P12DIR/root.p12 -out $PEMDIR/root.pem -passin \
pass:$PASSWD -passout pass:$PASSWD
$OPENSSL x509 -inform PEM -outform DER -days $VALIDFOR -in $PEMDIR/root.pem \
-out $DERDIR/root.der -passin pass:$PASSWD

rm -rf $PEMDIR/newreq.pem

Segundo creamos el script para generar el certificado de servidor:

CA.server
# KEYGEN. Es el programa que se usará para generar un password aleatorio si no especificas #ninguno a la hora de crear los certificados. Yo he usado dnskeygen que los puedes encontrar en #las utilidades de bind (apt-get install bind)

#!/bin/sh

OPENSSL=openssl
KEYGEN=(your choice of key/password generator)
PASSDIR=pass
DERDIR=der
P12DIR=p12
PEMDIR=pem
VALIDFOR=365

SNAME=$1
PASSWD=$2
ROOTPASSWD=$3

mkdir -p $PEMDIR $P12DIR $DERDIR $PASSDIR

if [ -z "${SNAME}" ]; then
echo "WARNING: server name not specified. Using \"server\"."
SNAME=server
fi

if [ -z "${PASSWD}" ]; then
echo "No password specified, trying $PASSDIR/$SNAME.pass."
if [ -a $PASSDIR/$SNAME.pass ]; then
PASSWD=`cat $PASSDIR/$SNAME.pass`
else
echo "Not found. Generating password, see $PASSDIR/$SNAME.pass for contents."
PASSWD=`$KEYGEN | head -c 32`
cat /dev/null > $PASSDIR/$SNAME.pass
echo $PASSWD >> $PASSDIR/$SNAME.pass
fi
fi

if [ -z "${ROOTPASSWD}" ]; then
echo "No root password specified, trying $PASSDIR/root.pass."
if [ -a $PASSDIR/root.pass ]; then
ROOTPASSWD=`cat $PASSDIR/root.pass`
else
echo "FATAL: No root certification password."
exit
fi
fi

$OPENSSL req -new -keyout $PEMDIR/newreq.pem -out $PEMDIR/newreq.pem -passin \
pass:$PASSWD -passout pass:$PASSWD
$OPENSSL ca -policy policy_anything -out $PEMDIR/newcert.pem -key $ROOTPASSWD \
-extensions xpserver_ext -extfile xpextensions -days $VALIDFOR -infiles $PEMDIR/newreq.pem
$OPENSSL pkcs12 -export -in $PEMDIR/newcert.pem -inkey $PEMDIR/newreq.pem -out \
$P12DIR/$1.p12 -clcerts -passin pass:$PASSWD -passout pass:$PASSWD
$OPENSSL pkcs12 -in $P12DIR/$SNAME.p12 -out $PEMDIR/$SNAME.pem -passin \
pass:$PASSWD -passout pass:$PASSWD
$OPENSSL x509 -inform PEM -outform DER -in $PEMDIR/$SNAME.pem -out $DERDIR/$SNAME.der

rm -rf $PEMDIR/newcert.pem $PEMDIR/newreq.pem

Finalmente creamos el script para generar el certificado del cliente.

CA.client

# KEYGEN. Es el programa que se usará para generar un password aleatorio si no especificas #ninguno a la hora de crear los certificados. Yo he usado dnskeygen que los puedes encontrar en #las utilidades de bind (apt-get install bind)

#!/bin/sh

OPENSSL=openssl
KEYGEN=(your choice of key/password generator)
PASSDIR=pass
DERDIR=der
P12DIR=p12
PEMDIR=pem
VALIDFOR=365

CLNAME=$1
PASSWD=$2
ROOTPASSWD=$3

mkdir -p $PEMDIR $P12DIR $DERDIR $PASSDIR

if [ -z "${CLNAME}" ]; then
echo "WARNING: client name not specified. Using \"client\"."
CLNAME=client
fi

if [ -z "${PASSWD}" ]; then
echo "No password specified, trying $PASSDIR/$CLNAME.pass."
if [ -a $PASSDIR/$CLNAME.pass ]; then
PASSWD=`cat $PASSDIR/$CLNAME.pass`
else
echo "Not found. Generating password, see $PASSDIR/$CLNAME.pass for contents."
PASSWD=`$KEYGEN | head -c 16`
cat /dev/null > $PASSDIR/$CLNAME.pass
echo $PASSWD >> $PASSDIR/$CLNAME.pass
fi
fi

if [ -z "${ROOTPASSWD}" ]; then
echo "No root password specified, trying $PASSDIR/root.pass."
if [ -a $PASSDIR/root.pass ]; then
ROOTPASSWD=`cat $PASSDIR/root.pass`
else
echo "FATAL: No root certification password."
exit
fi
fi

$OPENSSL req -new -keyout $PEMDIR/newreq.pem -out $PEMDIR/newreq.pem -passin \
pass:$PASSWD -passout pass:$PASSWD
$OPENSSL ca -policy policy_anything -out $PEMDIR/newcert.pem -passin \
pass:$PASSWD -key $ROOTPASSWD -extensions xpclient_ext -days $VALIDFOR \
-extfile xpextensions -infiles $PEMDIR/newreq.pem
$OPENSSL pkcs12 -export -in $PEMDIR/newcert.pem -inkey $PEMDIR/newreq.pem -out \
$P12DIR/$CLNAME.p12 -clcerts -passin pass:$PASSWD -passout pass:$PASSWD
$OPENSSL pkcs12 -in $P12DIR/$CLNAME.p12 -out $PEMDIR/$CLNAME.pem -passin \
pass:$PASSWD -passout pass:$PASSWD
$OPENSSL x509 -inform PEM -outform DER -in $PEMDIR/$CLNAME.pem -out \
$PEMDIR/$CLNAME.der

rm -rf $PEMDIR/newcert.pem $PEMDIR/newreq.pem

Ahora sólo nos queda crear un fichero para adaptar los certificados a las particularidades de Windows XP:

xpextensions

[ xpclient_ext ]
extendedKeyUsage = 1.3.6.1.5.5.7.3.2

[ xpserver_ext ]
extendedKeyUsage = 1.3.6.1.5.5.7.3.1


Una vez tenemos creados los scripts para los certificados, vamos a generar dichos certificados:

Primero creamos el certificado de raíz:

$ ./CA.root [password]

El argumento "password" es opcional (pero te recomiendo ponerlo). En el proceso se te preguntarán una serie de cosas, cuando se te pregunte por "common name", deja el campo en blanco.

El siguiente paso es crear el certificado de servidor:

$ ./CA.server server-name [password [root-password]]

Donde server-name puede ser el nombre del servidor RADIUS. password y root-password son opcionales, pero te recomiendo ponerlos, donde password será el password para el certificado que estás creando y root-password es el password que espacificaste anteriormente al crear el certificado raíz, si no pusiste ninguno el sólo buscará el archivo root.pass.
Se te volverán a preguntar una serie de cosas, cuando se te pregunte por "common name" debes poner el fully-qualified domain-name (FQDN) del servidor (para saberlo hostname -fqdn)

Finalmente creamos el certificado de cliente:

$ ./CA.client client-name [password [root-password]]

Donde client-name puede ser el nombre del cliente (lo mejor sería el FQDN del equipo cliente). Cuando se te pregunte por el "common name" introduce los mismo que pusiste en client-name al invocar el script.

Obviamente, necesitarás repetir este paso para todos los clientes que quieras autenticar.

Ahora toca instalar los certificados.

Copia los ficheros der/root.der y p12/client-name.p12 al cliente XP.

Primero instala el certificado raíz para establecernos a nosotros mismo como una autoridad.

1. Doble click en root.der.
2. En la ventana de propiedades de certificado, click en Instalar certificado.
3. En el asistente, pulsar Siguiente.
4. Seleccionar la opicón “Colocar todos los certificados en el siguiente almacén” y tras pulsar “Examinar” se tiene que seleccionar el almacén "Entidades emisoras raíz de confianza”
5. Click Siguiente para finalizar.

Siguiente, instala el certificado de cliente:

1. Doble click en nombreFQDNDelCliente.p12.
2. En el asistente, click "Siguiente" y "Siguiente" otra vez.
3. Te preguntará el password. Este password es el que indicaste al crear el certificado del cliente cuando se ejecutó CA.client.
4. Elegir la opción “Seleccionar automáticamente el almacén de certificados en base al tipo de certificado.
5. Click "Siguiente" para finalizar.

En el servidor RADIUS debemos hacer los siguiente:

Primero, crearemos un repositorio de certificados, por ejemplo podemos elegir: /etc/autoridad-wifi

Como root ejecutamos:

# mkdir /etc/autoridad-wifi

Copia las claves privadas:

# cp pem/root.pem pem/server-name.pem /etc/autoridad-wifi

Ahora toca asginar los permisos correctos a las claves. Como ejecutaremos freeradius con usuario y grupo freerad, tenemos que asignar permisos rw al superusuario y al grupo freerad permisos r.

# chown root.freerad /etc/autoridad-wifi/*.pem
# chmod 0640 /etc/autoridad-wifi/*.pem


5.- Configurando Freeradius.

Antes de nada se tienen que crear unos ficheros aleatorios, para ello:

# /usr/sbin/dnskeygen > /etc/autoridad-wifi/DH
# /usr/sbin/dnskeygen > /etc/autoridad-wifi/random
# chown root:freerad /etc/autoridad-wifi/DH /etc/autoridad-wifi/random
# chmod 0640 /etc/autoridad-wifi/DH /etc/autoridad-wifi/random


Configurando el corazón de freeradius.

Nota: Es probable que tengas que cambiar cosas de este fichero para adaptarlo a las particularidades de tu sistema.

Ejecutamos: vi /etc/freeradius/radiusd.conf, y debemos dejarlo algo parecido a esto:

# radiusd.conf
# Configuration of this RADIUS server.
#
# IMPORTANT: THIS FILE CONTAINS SECRETS.
# This file should have -rw-r----- root:radiusd permissions.

# Various directories
prefix = /usr
exec_prefix = /usr
sysconfdir = /etc
localstatedir = /var
sbindir = /usr/sbin
logdir = ${localstatedir}/log/radius
raddbdir = ${sysconfdir}/raddb
radacctdir = ${logdir}/radacct

# Location of config and logfiles
confdir = ${raddbdir}
run_dir = ${localstatedir}/run/radiusd
log_file = ${logdir}/radius.log

# Libraries, modules, etc.
libdir = /usr/lib

# The pid file
pidfile = ${run_dir}/radiusd.pid

# User/group config of the RADIUS server
user = freerad
group = freerad

# Request handling
max_request_time = 30
delete_blocked_requests = no
cleanup_delay = 5
max_requests = 1024

# bind_address: we need only listen on the wireless subnet.
bind_address = (IP address to listen on)
port = 0
hostname_lookups = no

# How the server conducts itself
allow_core_dumps = no
regular_expressions = yes
extended_expressions = yes

# Logging behaviour
log_stripped_names = no
log_auth = no
log_auth_badpass = no
log_auth_goodpass = no

# User handling
usercollide = no
lower_user = no
lower_pass = no
nospace_user = no
nospace_pass = no

# RADIUS Checker
checkrad = ${sbindir}/checkrad

# Security options
security {
max_attributes = 200
reject_delay = 1
status_server = no
}

# DON'T proxy requests
proxy_requests = no

# CLIENTS CONFIGURATION
# Include the clients here.
$INCLUDE ${confdir}/clients.conf

# Don't use SNMP.
snmp = no

# Thread-pooling
thread pool {
start_servers = 2
max_servers = 10

min_spare_servers = 3
max_spare_servers = 10

max_requests_per_server = 0
}

# MODULE CONFIGURATION
modules {
# This is an EAP-based operation.
eap {
default_eap_type = tls
timer_expire = 60

tls {
private_key_password = (server's private key password, e.g. in pass/server-name.pass)
private_key_file = /etc/autoridad-wifi/server-name.pem
certificate_file = /etc/autoridad-wifi/server-name.pem

CA_file = /etc/autoridad-wifi/root.pem

dh_file = /etc/autoridad-wifi/DH
random_file = /etc/autoridad-wifi/random

fragment_size = 1024
include_length = yes
}
}

# Preprocess the incoming RADIUS request
preprocess {
huntgroups = ${confdir}/huntgroups
hints = ${confdir}/hints

with_ascend_hack = no
ascend_channels_per_line = 23

with_ntdomain_hack = no
with_specialix_jetstream_hack = no
with_cisco_vsa_hack = no
}

# The users file
files {
usersfile = ${confdir}/users
acctusersfile = ${confdir}/acct_users
compat = no
}

# Write a detailed log of all accounting records received
detail {
detailfile = ${radacctdir}/%{Client-IP-Address}/detail-%Y%m%d
detailperm = 0600
}

acct_unique {
key = "User-Name, Acct-Session-Id, NAS-IP-Address, Client-IP-Address, NAS-Port-Id"
}

radutmp {
filename = ${logdir}/radutmp
username = %{User-Name}
case_sensitive = yes
check_with_nas = yes
perm = 0600
callerid = "yes"
}

radutmp sradutmp {
filename = ${logdir}/sradutmp
perm = 0644
callerid = "no"
}

expr {
}

counter daily {
filename = ${raddbdir}/db.daily
key = User-Name
count-attribute = Acct-Session-Time
reset = daily
counter-name = Daily-Session-Time
check-name = Max-Daily-Session
allowed-servicetype = Framed-User
cache-size = 5000
}

always fail {
rcode = fail
}

always reject {
rcode = reject
}

always ok {
rcode = ok
simulcount = 0
mpp = no
}

exec {
wait = yes
input_pairs = request
}

exec echo {
wait = yes
program = "/bin/echo %{User-Name}"
input_pairs = request
output_pairs = reply
}

ippool main_pool {
range-3 = (starting IP address)
range-stop = (ending IP address)
netmask = 255.255.255.0
cache-size = 800
session-db = ${raddbdir}/db.ippool
ip-index = ${raddbdir}/db.ipindex
override = no
}

}

# MODULE INSTANTIATION
instantiate {
expr
daily
}

# AUTHORISATION PROCESS
authorize {
preprocess
eap
files
}

# AUTHENTICATION PROCESS
authenticate {
eap
}

# ACCOUNTING
preacct {
preprocess
files
}

accounting {
acct_unique
detail
radutmp
}

session {
radutmp
}

post-auth {
}

Base de datos de puntos de acceso.

Aquí necesitarás la clave que asignaste al certificado de servidor (CA.server). Editamos el fichero /etc/freeradius/clients.conf y lo dejamos algo parecido a esto (adaptandolo a nuestras necesidades):

# clients.conf
# Network access points that authenticate through RADIUS specified here.
#
# IMPORTANT: THIS FILE CONTAINS SECRETS.
# This file should have -rw-r----- root:radiusd permissions.

# The wireless access point
client "(the AP's IP address)" {
secret = (RADIUS shared secret)
shortname = (a name for logging, etc.)
nastype = (your AP's NAS type; if unknown, try "other")
}

La base de datos de usuarios:

Editamos el fichero /etc/freeradius/users y lo dejamos algo parecido a este:

# users
# A list of users and their authentication types.

"client-name" Auth-Type := EAP

# This is important: it makes RADIUS reject users not found above
DEFAULT Auth-Type := Reject
Reply-Message = "LOS HACKERS NO SON BIENVENIDOS y tú no tienes permiso para entrar en esta red, desiste de intentar conectarte. MÁRCHATE!!!!! / HACKERS AREN'T WELCOME HERE and you don't have permission to enter this network, please desist to retry. GO AWAY!!!!!"

Por cada máquina cliente que quieras conectar deberás tener una línea igual que "client-name" Auth-Type := EAP, donde "client-name" será el FQDN del cliente.

Iniciamos el servicio de freeradius, para ello ejecutamos:

# freeradius

Si todo ha ido bien deberíamos ver algo así:

# ps faux | grep freeradius
freerad 3973 0.0 2.6 68132 24240 ? Ssl May04 0:00 freeradius

Sí el servicio no se arranca prueba con:
# freeradius -X -A para debugar.

6.- Configurando el AP (Punto de Acceso).

Accederemos a la configuración vía web del AP, y en la sección de configuración wireless en el apartado "Authentication" seleccionamos "WPA" y nos solicitará que introduzcamos la ip del servidor radius, el puerto (por defecto poner 1812) y el password que indicamos en el fichero clients.conf.

7.- Configurando clientes.

Para evitarnos problemas lo mejor es que nuestro cliente tenga instalado Service Pack 2 de Windows XP. Si no lo tuviese es necesario instalar, como mínimo, Service Pack 1 de Windows XP y el hotfix Q815485 (descargable a través de microsoft).
Normalmente windows debería detectar automáticamente todas las redes wifi al alcance de nuestra máquina cliente. Accederemos a la lista de las redes disponibles (pulsando doble click en el icono de los dos ordenadores que aparecerán en la barra de tareas al lado de la hora de windows). Seleccionamos la red que acabamos de crear y como ya tenemos el certificado instalado automáticamente hará la autenticación contra freeradius y se conectará a nuestra nueva y flamante red segura wifi.

8.- Conclusiones.

Si estás leyendo esto es porque acabaste el HOW-TO y ya tienes tu red wifi más segura o porque no entendiste nada y aún así has hecho el esfuerzo de intentar encontrar algo en claro. Si no es por ninguna de estas dos cosas, mejor dedicate a otra cosa...
Para los que hayan conseguido instalar freeradius y hacerlo funcionar, enhorabuena. Como habréis visto hay una gran diferencia entre tener una red con WEP y una red con WPA. Juzgar vosotros mismos.
Por último quería mandar un avíso a todos de la proliferación de las redes wifi gemelas, esto consiste en crear una red de las mismas características a una red que exista, con el mismo SSID y demás, así cuando un usuario (con pocas luces por cierto) quiera conectarse a la red verá dos redes iguales y por equivocación puede llegar a conectarse a la red gemela propiedad de un usuario malintencionado con lo cual pondremos a su alcance todos nuestros ficheros sin darnos cuenta. ESTAD ATENTOS A ESTO.


Próximamente: HOW-TO Clúster de correo Postfix de manera casera en Debian.

Creative Commons License
Esta obra está bajo una licencia de Creative Commons.


9 comentarios:

Unknown dijo...

¿Algo de ayuda a la comunidad?.

Nen, tu comunidad bloggera somos los de siempre (Laia, Àlex, Norma, Minu... y poco más).

Si quieres ayudarnos vuelve a ser el de antaño y no nos hables en xino tío.

Por cierto, si me echas un cable con cambiar mi plantilla te estaré eternamente agradecido que tengo un mierdón que lo flipas y no me mola nada.

Cupido dijo...

Jajajaja, me refiero a la comunidad linuxera, a la gente del software libre, a los frikis como nos llamáis vosotros, a gente que quiere haceros la vida más fácil a vosotros (pu@~#@~@{[¬½{ usuarios) y no sabe como ni por donde empezar. Esto es un blog sobre debianitas y eso es lo que voy a intentar hacer a partir de ahora poner cosas de interés para los debianitas.

Lo de la plantilla lo miramos cuando quieras, pero para eso alex es un hacha!

Cupido dijo...

Aunque también pondré cosas para que me podáis criticar como hasta ahora mis asiduos lectores!

cameraphp dijo...

Hola, soy nuevo en esto, lme llamo Juan Pablo Camera logre seguir al pie de la letra tus pasos, pero cuanto ejecuto
./CA.server server-name [password [root-password]]
./CA.client client-name [password [root-password]]
me da el sgte error
bash: ./CA.server: cannot execute binary file
en ambos casos
luego hacia la parte final
radtest test test localhost 1812 testing123

Sending Access-Request of id 9 to 127.0.0.1 port 1812
User-Name = "test"
User-Password = "test"
NAS-IP-Address = 255.255.255.255
NAS-Port = 1812
rad_recv: Access-Reject packet from host 127.0.0.1:1812, id=9, length=20

en el log del servidor da
rad_recv: Access-Request packet from host 127.0.0.1:32772, id=9, length=56
User-Name = "test"
User-Password = "test"
NAS-IP-Address = 255.255.255.255
NAS-Port = 1812
Sending Access-Reject of id 9 to 127.0.0.1 port 32772

En fin por lo que entiendo me esta rechazando las conexiones por ser un usuuario no valido y pienso que este error se viene arrastrando desde los errores en la creacion de los certificados tanto para el cliente como del servidor

cameraphp dijo...

Favor enviar pronta respuesta y muchas gracias de antemano

Cupido dijo...

Hola Juan Pablo, le has dado permisos de ejecución al script? Evidentemente si la generación de certificados no es correcta el servidor te rechazará las conexiones. Entiendo que "server-name" y "client-name" los sustituyes por los nombres que se adecuan a tu entorno.
Has añadido el cliente dentro del fichero clients.conf? Has instalado los certificados en el cliente?

Que versión de Windows es tu cliente?

Saludos

Cupido dijo...

El cliente lo tienes que añadir en el fichero users y el access point dentro de clients.conf. Puedes poner la configuración de tus ficheros? Puedes revisar si tienes algún error de sintaxis dentro de los scripts de creación de los certificados?

Saludos

cameraphp dijo...

gracias por los apuntes, pero he encontrado otro manual por internet y lo publico entero, cabe destacar que le sumo lo sgte:

apt-get install libssl-dev libgdbm-dev libmysql++-dev libkrb5-dev libperl-dev

y ademas se tiene que copiar la carpeta misc contrenedora de CA.pl en /etc/ssl para que funcionen bien

******************************



Webstats4U - Free web site statistics

Guía para instalar FreeRADIUS

en Redes Privadas v1.0



Por

Daniel Romero Peña

romero.cl@gmail.com

Escuela de Ingeniería Informática

Universidad Diego Portales

Santiago, Chile.





Contenidos:



1. Configuración de Servidores. 1

1.1. Descarga e instalación de freeradius. 1

1.2. Instalación de MySQL 4.1. 5

1.3. Configuración base de freeradius. 6

2. Configurando FreeRadius con EAP/PEAP. 9

2.1. Configuración NAS. 9

2.2. Creación de certificados para EAP/PEAP. 9

2.3. Habilitando EAP/PEAP. 11

2.4. Definición de grupos y usuarios de prueba. 17

2.5. Configuración del suplicante en Windows XP SP2. 18

3. Referencias. 31


1. Configuración de Servidores



En el presente capítulo se explicará como instalar freeradius y MySQL en un sistema Debian, dejándolo en funcionamiento con su configuración por defecto. Para esto necesitaremos un PC que cuente con el sistema operativo anteriormente señalado recién instalado, sin programas ajenos a la distribución del sistema, y con su interfaz de red ya configurada para acceder a Internet.


1.1. Descarga e instalación de freeradius



El primer paso es obtener el código fuente o un paquete pre-hecho para Debian. En el caso de Debian se puede obtener un paquete precompilado con la utilidad apt-get. Nosotros optaremos por descargar el código fuente.

Para esto debemos descargar el siguiente archivo:



ftp://ftp.freeradius.org/pub/radius/freeradius-1.1.3.tar.bz2



Este archivo contiene el código fuente correspondiente a la versión actual de freeradius en Octubre del 2006.



Para descargarlo podemos hacerlo con la utilidad wget. De no contar con wget podemos instalarla ejecutando apt-get install wget.



radius:/home/user# wget ftp://ftp.freeradius.org/pub/radius/freeradius-1.1.3.tar.bz2



Luego debemos extraer los archivos ejecutando la siguiente sentencia:



radius:/home/user# tar jxvf freeradius-1.1.3.tar.bz2



Con esto los archivos serán extraídos en un nuevo directorio llamado freeradius-1.1.3



Luego debemos ingresar a este nuevo directorio y en el ejecutar el script de configuración para luego poder compilarlo:



radius:/home/user# cd freeradius-1.1.3

radius:/home/user/freeradius-1.1.3# ./configure

checking for gcc... no

checking for cc... no

checking for cc... no

checking for cl... no

configure: error: no acceptable C compiler found in $PATH

See `config.log' for more details.



Este error se debe a que en nuestro sistema no está instalado el compilador gcc (GNU Compiler Collection, antes GNU C Compiler). En Debian podemos instalar gcc simplemente ejecutando:



radius:/home/user/freeradius-1.1.3# apt-get install gcc





Finalizada la instalación de gcc nuevamente ejecutamos el script de configuración:



radius:/home/user/freeradius-1.1.3# ./configure

checking for gcc... gcc

checking for C compiler default output file name... configure: error: C compiler cannot create executables

See `config.log' for more details.



Para solucionar este error debemos instalar el paquete libc6-dev, correspondiente a “GNU C Library: Development Libraries and Header Files”. Con esto el sistema quedará en condiciones de crear los archivos ejecutables.



radius:/home/user/freeradius-1.1.3# apt-get install libc6-dev



Luego volvemos a intentar ejecutar el script de configuración:



radius:/home/user/freeradius-1.1.3# ./configure

checking for gcc... gcc

checking for C compiler default output file name... a.out

checking whether the C compiler works... yes

.

.

.

checking for gmake... no

checking for make... /usr/local/bin/make

configure: error: GNU Make is not installed. Please download and install it

from ftp://prep.ai.mit.edu/pub/gnu/make/ before continuing.



Nuevamente un error, pero no hay que frustrarse... Como lo menciona el mensaje, lo que falta es instalar la aplicación make. Para esto nuevamente recurriremos a apt:



radius:/home/user/freeradius-1.1.3# apt-get install make



Nuevamente ejecutamos:



radius:/home/user/freeradius-1.1.3# ./configure

checking for gcc... gcc

.

.

/usr/bin/ld: cannot find –lperl



Ahora nos avisa que nuestro sistema no cuenta con el lenguaje perl instalado. Solución:




Finalemente:


radius:/home/user/freeradius-1.1.3# apt-get install libssl-dev libgdbm-dev libmysql++-dev libkrb5-dev libperl-dev



radius:/home/user/freeradius-1.1.3# ./configure

checking for gcc... gcc

checking for C compiler default output file name... a.out

checking whether the C compiler works... yes.

.

.

.

config.status: creating Makefile

config.status: creating config.h

config.status: config.h is unchanged

configure: configuring in src/modules/rlm_checkval

configure: running /bin/sh './configure' --prefix=/usr/local --enable-ltdl-install=no --cache-file=/dev/null --srcdir=.

configure: creating ./config.status

config.status: creating Makefile

radius:/home/user/freeradius-1.1.3#



üOK









Luego ejecutamos:



radius:/home/user/freeradius-1.1.3# make

radius:/home/user/freeradius-1.1.3# make install



Con esto freeradius está listo para correr por primera vez en nuestro sistema.

Ejecutando radius:/home/user/freeradius-1.1.3# radiusd –x se iniciará el servidor en modo de debug, en donde nos mostrará información acerca de los eventos que recibe. Si no lo ejecutamos con la opción –x el servidor se inicia, pero no mostrará ninguna información en pantalla.



root@radius:~/radius/freeradius-1.1.3# radiusd -x

Starting - reading configuration files ...

Using deprecated naslist file. Support for this will go away soon.

Module: Loaded exec

.

.

.

Initializing the thread pool...

Listening on authentication *:1812

Listening on accounting *:1813

Ready to process requests.



Con esto ya tenemos corriendo el servidor freeradius en nuestro sistema, con la configuración que trae por defecto.



Por defecto el servidor crea un cliente de nombre y password test y con un secret = testing123.



Ahora podemos realizar un pequeño test de conexión con la utilidad radtest que biene con freeradius:



radius:~# radtest test test localhost 0 testing123

Sending Access-Request of id 88 to 127.0.0.1 port 1812

User-Name = "test"

User-Password = "test"

NAS-IP-Address = 255.255.255.255

NAS-Port = 0

Re-sending Access-Request of id 88 to 127.0.0.1 port 1812

User-Name = "test"

User-Password = "test"

NAS-IP-Address = 255.255.255.255

NAS-Port = 0

rad_recv: Access-Reject packet from host 127.0.0.1:1812, id=88, length=20







En freeradius se reportó lo siguiente:



rad_recv: Access-Request packet from host 127.0.0.1:32775, id=84, length=56

User-Name = "test"

User-Password = "test"

NAS-IP-Address = 255.255.255.255

NAS-Port = 0

rad_recv: Access-Request packet from host 127.0.0.1:32775, id=84, length=56

Sending Access-Reject of id 84 to 127.0.0.1 port 32775



radtest envío un Access-Request, el cual fue recibido por freeradius y contestado con un Access-Reject. Con esto podemos verificar que a lo menos el servidor se esta ejecutando de manera correcta.


1.2. Instalación de MySQL 4.1



Ya que tenemos instalado y funcionando freeradius, instalaremos MySQL con el fín de reemplazar la configuración de usuarios y clientes y los logs de accounting que por defecto se hacen en archivos de texto, por una base de datos que permita una mejor administración de estos.



Primero debemos proceder a instalar MySQL. En esta ocasión instalaremos la versión 4.1 utilizando apt-get:



root@radius:~# apt-get install mysql-server-4.1



Luego de instalar MySQL debemos crear la base de datos que utilizará freeradius. Para esto ingresamos a la shell de MySQL ejecutando como root:



root@radius:~# mysql

Welcome to the MySQL monitor. Commands end with ; or \g.

Your MySQL connection id is 4 to server version: 4.1.15-log



Type 'help;' or '\h' for help. Type '\c' to clear the buffer.



mysql>



Luego ejecutamos las siguientes instrucciones SQL, las que crearán la base de datos con el nombre radius, crearán un usuario también de nombre radius con todos los permisos sobre esta base de datos y le asignarán un password=radius:



mysql> create database radius;

mysql> grant all privileges on radius.* to radius@localhost;

mysql> set password for radius@localhost = old_password('radius');



Ahora debemos proceder a crear la base de datos. Para esto freeradius provee un script sql que puede ser encontrado en el directorio freeradius-1.1.3/doc/examples/mysql.sql.



Para ejecutar el script, podemos hacerlo directamente desde MySQL:



mysql> connect radius;

mysql> \. /home/user/freeradius-1.1.3/doc/examples/mysql.sql



Para ver la estructura de las tablas podemos utilizar los siguientes comandos de mysql: “show tables;” y “desc tablename;”.



Ahora debemos poblar la base de datos con algún usuario y cliente (NAS) de prueba:



insert into radgroupcheck values ('', 'admin', 'Auth-Type', ':=', 'Local');

insert into radgroupreply values ('', 'admin', 'Framed-Protocol', ':=', 'PPP');

insert into radgroupreply values ('', 'admin', 'Service-Type', ':=', 'Framed-User');

insert into radgroupreply values ('', 'admin', 'Framed-Compression', ':=', 'Van-Jacobsen-TCP-IP');



insert into usergroup values ('dromero', 'admin','');

insert into radcheck values ('', 'dromero', 'Password', '==', 'dromero');

insert into radreply values ('', 'dromero', 'Framed-IP-Address', ':=', '192.168.100.50');



insert into nas values ('', 'test',NULL, '3coml',NULL, 'radiusUDP', NULL, NULL);



Con esto hemos creado un usuario dromero con password dromero, el cual pertenece al grupo admin que posee un conjunto de atributos determinados. Además hemos agregado un NAS de nombre test, tipo 3coml, y secret radiusUDP.
1.3. Configuración base de freeradius



Como queremos que freeradius trabaje con MySQL debemos realizar algunos cambios en los archivos de configuración. Estos archivos los podemos encontrar en el directorio /usr/local/etc/raddb.



El archivo users contiene la información de los usuarios, pero estos ahora se almacenarán en MySQL, por lo que no tocaremos este archivo.



El archivo clients.conf se utiliza para configurar los NAS con que interactúa freeradius. Aunque ya tenemos el NAS agregado en la base de datos, debemos configurar la ip de este en el archivo. La ultima modificación que haremos en este archivo es agregar al final los siguiente:



client 200.14.84.159{

secret = radiusUDP

shortname = 3com1

}



donde 200.14.84.159 es la IP de nuestro AP.



Luego debemos configurar el acceso a la base de datos, indicándole a freeradius cual es la IP del servidor MySQL, el usuario y el password. Esto lo haremos en el archivo sql.conf, en donde deberemos modificar las siguientes líneas:



# Connect info

server = "localhost"

login = "radius"

password = "radius"



# Database table configuration

radius_db = "radius"



donde localhost corresponde a la dirección del servidor MySQL, login es el nombre de usuario y su password para acceder a la base de datos, y radius_db corresponde al nombre de la base de datos que hemos creado para freeradius.





Luego en el archivo radius.conf configuraremos freeradius para que deje de ocupar los archivos y comience a ocupar MySQL. Para esto modificaremos las siguientes secciones del archivo, las cuales se encuentran al final de este:



authorize {

preprocess

chap

mschap

suffix

eap

sql

}

authenticate {

Auth-Type PAP {

pap

}

Auth-Type CHAP {

chap

}

Auth-Type MS-CHAP {

mschap

}

}

preacct {

preprocess

acct_unique

suffix

}

accounting {

detail

radutmp

sql

}

session {

radutmp

sql

}

post-auth {

sql

}

pre-proxy {

}

post-proxy {

eap

}



Finalmente echamos a correr nuestro freeradius con MySQL:



root@radius:~# radiusd -x

Starting - reading configuration files ...

Using deprecated naslist file. Support for this will go away soon.

Module: Loaded exec

rlm_exec: Wait=yes but no output defined. Did you mean output=none?

Module: Instantiated exec (exec)

Module: Loaded expr

Module: Instantiated expr (expr)

Module: Loaded PAP

Module: Instantiated pap (pap)

Module: Loaded CHAP

Module: Instantiated chap (chap)

Module: Loaded MS-CHAP

Module: Instantiated mschap (mschap)

.

.

.

Module: Loaded SQL

rlm_sql (sql): Driver rlm_sql_mysql (module rlm_sql_mysql) loaded and linked

rlm_sql (sql): Attempting to connect to radius@localhost:/radius

rlm_sql (sql): starting 0

rlm_sql (sql): Attempting to connect rlm_sql_mysql #0

rlm_sql_mysql: Starting connect to MySQL server for #0

rlm_sql (sql): Connected new DB handle, #0

.

.

.

Initializing the thread pool...

Listening on authentication *:1812

Listening on accounting *:1813

Ready to process requests.



2. Configurando FreeRadius con EAP/PEAP


2.1. Configuración NAS



Cada fabricante provee una interfás particular para realizar esta labor.

En general la configuración de los NAS es bastante sencilla: en cada uno de ellos debemos habilitarlo como cliente RADIUS, configurar la IP del servidor RADIUS, el puerto en que este escucha y el “secreto” que el NAS comparte con el servidor RADIUS para encriptar las comunicaciones (configurado en el archivo clients.conf).



Para más detalles consulte el manual del NAS que utilizará.
2.2. Creación de certificados para EAP/PEAP



Al utilizar EAP/PEAP deberemos porveer a cada cliente del certificado del servidor. FreeRadius biene con un set de certificados ya creados, que pueden ser encontrados en el directorio /usr/local/raddb/certs, pero no es aconsejable el utilizar estos, ya que son de dominio público, por lo que procederemos a crear certificados propios.



Para crear estos certificados es necesario tener instalado OpenSSL.

Teniendo instalado OpenSSL debemos proceder a configurarlo para nuestra máquina. Esto se debe hacer en el archivo /usr/local/openssl/ssl/openssl.cnf en donde deberemos modificar la siguiente sección para que coincida con el formato de los directorios que creará freeradius para guardar los certificados, tal cual como lo podemos ver en el directorio /usr/local/raddb/certs. Solo deberemos modificar la siguiente sección del archivo:



[ CA_default ]



dir = ./demoCA

certs = $dir/certs

crl_dir = $dir/crl

database = $dir/index.txt

#unique_subject = no

new_certs_dir = $dir/newcerts

certificate = $dir/cacert.pem

serial =/home/dromero/free/raddb/certs/demoCA/serial
crlnumber = $dir/crlnumber

crl = $dir/crl.pem

private_key = $dir/private/cakey.pem

RANDFILE = $dir/private/.rand

x509_extensions = usr_cert



En nuestro caso lo único que fue necesario modificar fue la ubicación del archivo serial, que fue cambiado de serial = $dir/serial a la ubicación que se indica anteriormente, que corresponde a la ubicación del tar de freeradius que descomprimimos al principio de este tutorial.



FreeRadius incorpora un script ya programado para crear los certificados. Este script (certs.sh) se puede encontrar en el directorio “scripts” del tar del código fuente. Este script interactúa con 2 scripts más que se encuentran en el mismo directorio: CA.all y CA.certs.

Lo primero que debemos hacer en estos 3 scripts es modificar las rutas para que apunten a la ubicación correcta de openssl en nuestra máquina (/usr/local/openssl).

En nuestro caso modificamos las siguientes líneas:



CA.all

SSL=/etc/ssl

echo "newreq.pem" | /usr/local/ssl/misc/CA.pl –newca



CA.certs

[ "$SSL" = "" ] && SSL=/etc/ssl



certs.sh

[ "$SSL" = "" ] && SSL=/etc/ssl

/usr/bin/openssl gendh > dh



Adicionalmente, en el archivo CA.certs debemos llenar los datos de quien emitirá los certificados, o sea, nosotros. Solo debemos modificar el archivo en la siguiente sección de él:



#

# Edit the following variables for your organization.

#

COUNTRY="CL"

PROVINCE="Región Metropolitana"

CITY="Santiago"

ORGANIZATION="UDP"

ORG_UNIT=`RadiusUDP`

PASSWORD="radiusUDP"

COMMON_NAME_CLIENT="RadiusUDP Client certificate"

EMAIL_CLIENT="client@example.com"

PASSWORD_CLIENT=$PASSWORD

COMMON_NAME_SERVER="Radius UDP Server certificate"

EMAIL_SERVER="server@example.com"

PASSWORD_SERVER=$PASSWORD

COMMON_NAME_ROOT="Radius UDP Root certificate"

EMAIL_ROOT="root@example.com"

PASSWORD_ROOT=$PASSWORD

#

# lifetime, in days, of the certs

#

LIFETIME=730

#####EL APORTE
luego

cp -R /usr/lib/ssl/misc /etc/ssl/




####
Una vez editados estos 3 archivos crearemos los certificados ejecutando:

#sh certs.sh



Si todo va bien, deberíamos ver en pantalla lo siguiente:



root@radius:~/radiussrc/scripts# sh certs.sh

Generating DH parameters, 512 bit long safe prime, generator 2

This is going to take a long time

.....+.......+........+.........................................+..................+.+........+......................+..........................+......................................................+....+..................................................+........................................+.............+...++*++*++*++*++*++*

See the 'certs' directory for the certificates.

The 'certs' directory should be copied to .../etc/raddb/

All passwords have been set to 'whatever'



Con esto hemos creado los certificados para nuestro servidor. Estos certificados ahora se encuentran en el directorio certs que está dentro del directorio scripts en el cual hemos estado trabajando. Finalmente, debemos copiar este directorio al directorio donde se encuentra la configuración de freeradius, o sea, /usr/local/etc/raddb/.


2.3. Habilitando EAP/PEAP



Nuevamente deberemos ir a editar los archivos radiusd.conf y eap.conf para habilitar la autenticación con eap/peap y mschapv2.



Nuestra configuración fue la siguiente:



eap.conf



eap {

default_eap_type = peap

timer_expire = 60



tls {

private_key_password = radiusUDP

private_key_file = ${raddbdir}/certs/cert-srv.pem

certificate_file = ${raddbdir}/certs/cert-srv.pem

CA_file = ${raddbdir}/certs/demoCA/cacert.pem

dh_file = ${raddbdir}/certs/dh

random_file = ${raddbdir}/certs/random

}



peap {

default_eap_type = mschapv2

}



mschapv2 {

}

}



Lo que hicimos fue configurar como eap predeterminado peap, habilitar las contraseñas mschapv2 y configurar las rutas hacia los diferentes certificados que creamos en la sección anterior además del indicar el password con que fueron creados estos certificados.



radiusd.conf



Debemos asegurarnos que que en la sección modules se encuentre incluido el modulo eap y mschap.



modules {

.

.

.

$INCLUDE ${confdir}/eap.conf

mschap {

}

.

.

.

}



La configuración de las otras secciones será la siguiente (lo que no aparece aquí se deja como viene por defecto):



instantiate {

exec

expr

}

authorize {

preprocess

eap

sql

}

authenticate {

Auth-Type MS-CHAP {

mschap

}

eap

}

preacct {

preprocess

acct_unique

suffix

}

accounting {

detail

radutmp

sql

}





session {

radutmp

sql

}

post-auth {

sql

}

pre-proxy {

}

post-proxy {

}



Ahora que todo está configurado, podemos ejecutar freeradius:

Si todo va bien, veremos lo siguiente:



root@radius:~# radiusd -X

Starting - reading configuration files ...

reread_config: reading radiusd.conf

Config: including file: /usr/local/etc/raddb/proxy.conf

Config: including file: /usr/local/etc/raddb/clients.conf

Config: including file: /usr/local/etc/raddb/eap.conf

Config: including file: /usr/local/etc/raddb/sql.conf

main: prefix = "/usr/local"

main: localstatedir = "/usr/local/var"

main: logdir = "/usr/local/var/log/radius"

main: libdir = "/usr/local/lib"

main: radacctdir = "/usr/local/var/log/radius/radacct"

main: hostname_lookups = no

main: max_request_time = 30

main: cleanup_delay = 5

main: max_requests = 1024

main: delete_blocked_requests = 0

main: port = 0

main: allow_core_dumps = no

main: log_stripped_names = no

main: log_file = "/usr/local/var/log/radius/radius.log"

main: log_auth = no

main: log_auth_badpass = no

main: log_auth_goodpass = no

main: pidfile = "/usr/local/var/run/radiusd/radiusd.pid"

main: user = "(null)"

main: group = "(null)"

main: usercollide = no

main: lower_user = "no"

main: lower_pass = "no"

main: nospace_user = "no"

main: nospace_pass = "no"

main: checkrad = "/usr/local/sbin/checkrad"

main: proxy_requests = yes

proxy: retry_delay = 5

proxy: retry_count = 3

proxy: synchronous = no

proxy: default_fallback = yes

proxy: dead_time = 120

proxy: post_proxy_authorize = yes

proxy: wake_all_if_all_dead = no

security: max_attributes = 200

security: reject_delay = 1

security: status_server = no

main: debug_level = 0

read_config_files: reading dictionary

read_config_files: reading naslist

Using deprecated naslist file. Support for this will go away soon.

read_config_files: reading clients

read_config_files: reading realms

radiusd: entering modules setup

Module: Library search path is /usr/local/lib

Module: Loaded exec

exec: wait = yes

exec: program = "(null)"

exec: input_pairs = "request"

exec: output_pairs = "(null)"

exec: packet_type = "(null)"

rlm_exec: Wait=yes but no output defined. Did you mean output=none?

Module: Instantiated exec (exec)

Module: Loaded expr

Module: Instantiated expr (expr)

Module: Loaded eap

eap: default_eap_type = "peap"

eap: timer_expire = 60

eap: ignore_unknown_eap_types = no

eap: cisco_accounting_username_bug = no

tls: rsa_key_exchange = no

tls: dh_key_exchange = yes

tls: rsa_key_length = 512

tls: dh_key_length = 512

tls: verify_depth = 0

tls: CA_path = "(null)"

tls: pem_file_type = yes

tls: private_key_file = "/usr/local/etc/raddb/certs/cert-srv.pem"

tls: certificate_file = "/usr/local/etc/raddb/certs/cert-srv.pem"

tls: CA_file = "/usr/local/etc/raddb/certs/demoCA/cacert.pem"

tls: private_key_password = "radiusUDP"

tls: dh_file = "/usr/local/etc/raddb/certs/dh"

tls: random_file = "/usr/local/etc/raddb/certs/random"

tls: fragment_size = 1024

tls: include_length = yes

tls: check_crl = no

tls: check_cert_cn = "(null)"

tls: cipher_list = "(null)"

tls: check_cert_issuer = "(null)"

rlm_eap_tls: Loading the certificate file as a chain

rlm_eap: Loaded and initialized type tls

peap: default_eap_type = "mschapv2"

peap: copy_request_to_tunnel = no

peap: use_tunneled_reply = no

peap: proxy_tunneled_request_as_eap = yes

rlm_eap: Loaded and initialized type peap

mschapv2: with_ntdomain_hack = no

rlm_eap: Loaded and initialized type mschapv2

Module: Instantiated eap (eap)

Module: Loaded preprocess

preprocess: huntgroups = "/usr/local/etc/raddb/huntgroups"

preprocess: hints = "/usr/local/etc/raddb/hints"

preprocess: with_ascend_hack = no

preprocess: ascend_channels_per_line = 23

preprocess: with_ntdomain_hack = no

preprocess: with_specialix_jetstream_hack = no

preprocess: with_cisco_vsa_hack = no

preprocess: with_alvarion_vsa_hack = no

Module: Instantiated preprocess (preprocess)

Module: Loaded SQL

sql: driver = "rlm_sql_mysql"

sql: server = "localhost"

sql: port = ""

sql: login = "radius"

sql: password = "radius"

sql: radius_db = "radius"

sql: nas_table = "nas"

sql: sqltrace = no

sql: sqltracefile = "/usr/local/var/log/radius/sqltrace.sql"

sql: readclients = no

sql: deletestalesessions = yes

sql: num_sql_socks = 5

sql: sql_user_name = "%{User-Name}"

sql: default_user_profile = ""

sql: query_on_not_found = no

.

.

.

sql: safe-characters = "@abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789.-_: /"

rlm_sql (sql): Driver rlm_sql_mysql (module rlm_sql_mysql) loaded and linked

rlm_sql (sql): Attempting to connect to radius@localhost:/radius

rlm_sql (sql): starting 0

rlm_sql (sql): Attempting to connect rlm_sql_mysql #0

rlm_sql_mysql: Starting connect to MySQL server for #0

rlm_sql (sql): Connected new DB handle, #0

rlm_sql (sql): starting 1

rlm_sql (sql): Attempting to connect rlm_sql_mysql #1

rlm_sql_mysql: Starting connect to MySQL server for #1

rlm_sql (sql): Connected new DB handle, #1

rlm_sql (sql): starting 2

rlm_sql (sql): Attempting to connect rlm_sql_mysql #2

rlm_sql_mysql: Starting connect to MySQL server for #2

rlm_sql (sql): Connected new DB handle, #2

rlm_sql (sql): starting 3

rlm_sql (sql): Attempting to connect rlm_sql_mysql #3

rlm_sql_mysql: Starting connect to MySQL server for #3

rlm_sql (sql): Connected new DB handle, #3

rlm_sql (sql): starting 4

rlm_sql (sql): Attempting to connect rlm_sql_mysql #4

rlm_sql_mysql: Starting connect to MySQL server for #4

rlm_sql (sql): Connected new DB handle, #4

Module: Instantiated sql (sql)

Module: Loaded Acct-Unique-Session-Id

acct_unique: key = "User-Name, Acct-Session-Id, NAS-IP-Address, Client-IP-Address, NAS-Port"

Module: Instantiated acct_unique (acct_unique)

Module: Loaded realm

realm: format = "suffix"

realm: delimiter = "@"

realm: ignore_default = no

realm: ignore_null = no

Module: Instantiated realm (suffix)

Module: Loaded detail

detail: detailfile = "/usr/local/var/log/radius/radacct/%{Client-IP-Address}/detail-%Y%m%d"

detail: detailperm = 384

detail: dirperm = 493

detail: locking = no

Module: Instantiated detail (detail)

Module: Loaded radutmp

radutmp: filename = "/usr/local/var/log/radius/radutmp"

radutmp: username = "%{User-Name}"

radutmp: case_sensitive = yes

radutmp: check_with_nas = yes

radutmp: perm = 384

radutmp: callerid = yes

Module: Instantiated radutmp (radutmp)

Listening on authentication *:1812

Listening on accounting *:1813

Ready to process requests.



Y ya tenemos nuestro servidor configurado con EAP/PEAP!!!



Durante este proceso de configuración experimentamos un par de problemas:



· Al inicializar el servidor, nos indicaba lo siguiente:



rlm_eap_tls: Loading the certificate file as a chain

rlm_eap: SSL error error:0906D06C:PEM routines:PEM_read_bio:no start line

rlm_eap_tls: Error reading private key file

rlm_eap: Failed to initialize type tls

radiusd.conf[1]: eap: Module instantiation failed.

radiusd.conf[398] Unknown module "eap".

radiusd.conf[381] Failed to parse authenticate section.



La causa de este problema fue que por un error al tipear el PASSWORD con que se crearon los certificados y el password configurado para ellos en eap.conf no coincidían. Utilizando los mismos password este problema desapareció.



· Otro error que cometimos en un principio fue el configurar freeradius como proxy pensando en dar acceso hacia internet. Esto fue un error de concepto, ya que cuando un servidor RADIUS actúa como proxy, su función es exclusivamente el redireccionar determinados paquetes del protocolo RADIUS hacia otros servidores RADIUS, y NO es un proxy http. Esta configuración de proxy permite tener diferentes servidores RADIUS, cada uno se encarguandose de funciones específicas como accounting, authentication, etc.


2.4. Definición de grupos y usuarios de prueba



Para probar nuestro servidor crearemos 3 grupos de usuarios y 3 usuarios de prueba. Los grupos de usuarios los llamaremos dromero, profesores y alumnos, y le asignaremos las VLANs 2, 3 y 4 respectivamente para así aislar el tráfico de cada grupo como si estuvieran en redes físicas individuales. Para insertar estos grupos y usuarios a MySQL puedes referirte a la sección 1.2 de este tutorial.

Las propiedades para los grupos y usuarios quedarían de la siguiente manera:



Grupo admin



Auth-Type := EAP

Framed-Protocol := PPP

Service-Type := Framed-user

Framed-Compression := Van-Jacobsen-TCP-IP

Tunnel-Medium-Type := 6

Tunnel-Type := 13

Tunnel-Private-Group-Id := 2





Grupo profesores



Auth-Type := EAP

Framed-Protocol := PPP

Service-Type := Framed-user

Framed-Compression := Van-Jacobsen-TCP-IP

Tunnel-Medium-Type := 6

Tunnel-Type := 13

Tunnel-Private-Group-Id := 3



Grupo alumnos



Auth-Type := EAP

Framed-Protocol := PPP

Service-Type := Framed-user

Framed-Compression := Van-Jacobsen-TCP-IP

Tunnel-Medium-Type := 6

Tunnel-Type := 13

Tunnel-Private-Group-Id := 4



Tunnel-Type se refiere al protocolo que se utilizará para los túneles.

'Framed-IP-Address'Tunnel-Medium-Type se refiere al medio de transporte utilizado para los túneles.



Tunnel-Private-Group-Id se refiere al identificador del túnel a utilizar (VLAN tag).



Información detallada acerca de los atributos de los túneles puede ser encontrada en RFC 2868.



Usuario dromero perteneciente al grupo admin



Password := hola



Usuario profesor01 perteneciente al grupo profesores



Password := siempreflojo



Usuario alumno01 perteneciente al grupo alumnos



Password := copypaste



En el primer capitulo de este tutorial creamos un usuario que tenía en el atributo Framed-IP-Address una IP especificada. Al utilizar EAP/PEAP estas IP no son utilizadas y esta función debe seguir siendo realizada por un DHCP. El atributo Framed-IP-Address fue creado para trabajar principalmente con usuarios Dial-up como por ejemplo conexiones xDSL.



Ahora que nuestro servidor esta ejecutándose y que tenemos ingresados los grupos y usuarios que usaremos estamos listos para conectarnos a través de nuestro NAS.
2.5. Configuración del suplicante en Windows XP SP2



El primer paso es instalar el certificado del servidor. Este certificado corresponde al archivo root.pem que está en la carpeta raddb/certs de nuestro servidor. Deberemos copiar este archivo a cada PC con el que queramos conectarnos a la red.



Para instalarlo comenzaremos por hacer doble click sobre él, con lo cual aparecerá la siguiente ventana:





Luego hacemos click en Instalar Certificado...





Seleccionamos “Colocar todos los certificados en el siguiente almacén” y apretamos “Examinar”.





Seleccionamos “Entidades emisoras raíz de confianza” y apretamos “Aceptar”







Apretamos “Siguiente” y después finalizamos la instalación del certificado.





Ahora lo único que falta es conectarnos!!!



Para eso iremos a ver las redes inalámbricas que están disponibles:







En esta ventana debemos seleccionar la red a la cual nos queremos conectar. En nuestro caso esta red se llama “RadiusLab” y como se puede apreciar en la imágen posee seguridad WPA.



Para ir a configurar esta red debemos hacer click en “Cambiar configuración avanzada”.





Luego le damos a “Agregar”







Indicamos el nombre de nuestra red y seleccionamos WPA para la autenticación y TKIP para el cifrado, ya que nuestro AP se ha configurado con ese mecanismo y no con AES.



Luego nos vamos a la pestaña de “Autenticación”





Seleccionamos “EAP protegido PEAP” y luego nos vamos “Propiedades”





Aquí debemos dejar marcadas las opciones tal cual como se indica en la imágen y en la lista de “Entidades emisoras de certificados raíz de confianza” debemos buscar y seleccionar el certificado de nuestro servidor que instalamos anteriormente. Si este no aparece, significa que no se instaló correctamente o que no lo instalamos en el amacén “Entidades emisoras raíz de confianza” como se ha especificado en este tutorial. De se este el caso debemor tratar de reinstalarlo, ya que sin él NO podremos ingresar a la red.



Luego debemos ir a “Configurar” y en la ventana que aparecerá dejar todo desmarcado.





Luego aceptamos todo una y otra vez hasta salir de la configuración de la red y volver al listado de conexiones de redes inalámbricas.

Seleccionamos nuestra red y apretamos “Conectar”







El suplicante procederá a conectarse y nos desplegará una ventana en donde deberemos ingresar nuestro nombre de usuario y password.









Ingresamos la información del usuario y luego apretamos “Aceptar”.

Si todo va bien lograremos autenticarnos logrando acceder a la red.





De ocurrir algún problema, se no sindicará en la esquina superior derecha, en el lugar en donde en la foto aparece “Conectado”.



Si no hemos instalado el certificado del servidor o este no es inválido la autenticación fallará y se nos bloqueará el acceso a la red.



Al autenticarnos con este usuario en nuestro servidor veremos el siguiente log:



rad_recv: Access-Request packet from host 192.168.100.185:1372, id=0, length=202

Message-Authenticator = 0x7fc3ea093d12cda33ad83cd169ed5bca

Service-Type = Framed-User

User-Name = "dromero"

Framed-MTU = 1488

Called-Station-Id = "00-18-6E-18-62-00:RadiusLab"

Calling-Station-Id = "00-0E-6A-9B-86-20"

NAS-Identifier = "3Com Access Point 7760"

NAS-Port-Type = Wireless-802.11

Connect-Info = "CONNECT 54Mbps 802.11g"

EAP-Message = 0x0200000c0164726f6d65726f

NAS-IP-Address = 192.168.100.185

NAS-Port = 3

NAS-Port-Id = "STA port # 3"

Processing the authorize section of radiusd.conf

.

. *muchos mensajes*

.

modcall[post-auth]: module "sql" returns ok for request 16

modcall: leaving group post-auth (returns ok) for request 16

Sending Access-Accept of id 8 to 192.168.100.185 port 1372

Framed-Protocol := PPP

Service-Type := Framed-User

Framed-Compression := Van-Jacobson-TCP-IP

Tunnel-Type:0 := VLAN

Tunnel-Medium-Type:0 := IEEE-802

Tunnel-Private-Group-Id:0 := "2"

MS-MPPE-Recv-Key = 0x7cfe3b6a3288cd2317c91bb8e3e79785d08506aba199e9bf1a58253886bbd074

MS-MPPE-Send-Key = 0x98944f7295b2e93fe8a843bd9a73251a32b37918f3d9d0828eb5a693d92f48ef

EAP-Message = 0x03080004

Message-Authenticator = 0x00000000000000000000000000000000

User-Name = "dromero"

Finished request 16

Going to the next request

Waking up in 5 seconds...



En donde entre otras cosas podemos ver que la respuesta final fue un Access.Accept y que el usuario está dentro de la VLAN 2 (Tunnel-Private-Group-Id:0 := "2").



Si ingresamos con el usuario profesor01 y alumno01 veremos lo siguiente:



rad_recv: Access-Request packet from host 192.168.100.185:1391, id=36, length=208

Message-Authenticator = 0x2e69d9b0d8c5a078c157f7e3f554e707

Service-Type = Framed-User

User-Name = "profesor01"

Framed-MTU = 1488

Called-Station-Id = "00-18-6E-18-62-00:RadiusLab"

Calling-Station-Id = "00-0E-6A-9B-86-20"

NAS-Identifier = "3Com Access Point 7760"

NAS-Port-Type = Wireless-802.11

Connect-Info = "CONNECT 54Mbps 802.11g"

EAP-Message = 0x0224000f0170726f6665736f723031

NAS-IP-Address = 192.168.100.185

NAS-Port = 3

NAS-Port-Id = "STA port # 3"

.

.

.

Sending Access-Accept of id 44 to 192.168.100.185 port 1391

Framed-IP-Address := 192.168.100.211

Framed-IP-Netmask := 255.255.255.0

Framed-Protocol := PPP

Service-Type := Framed-User

Framed-Compression := Van-Jacobson-TCP-IP

Tunnel-Medium-Type:0 := IEEE-802

Tunnel-Type:0 := VLAN

Tunnel-Private-Group-Id:0 := "3”

MS-MPPE-Recv-Key = 0x1714c6bb40821fd973e97f7bbfa7a05110206fb083138414a453fb4c08ab3b56

MS-MPPE-Send-Key = 0x6d7baa66c5cea48be8998e1bf9b04a46ae59905700e923b6f9a1462da7ce3b22

EAP-Message = 0x032c0004

Message-Authenticator = 0x00000000000000000000000000000000

User-Name = "profesor01"

Finished request 8

Going to the next request



---------------------------------------------------------------------------------------------------------------



rad_recv: Access-Request packet from host 192.168.100.185:1030, id=18, length=204

Message-Authenticator = 0x286de06d779a4fb34c5f0992036c45c1

Service-Type = Framed-User

User-Name = "alumno01"

Framed-MTU = 1488

Called-Station-Id = "00-18-6E-18-62-00:RadiusLab"

Calling-Station-Id = "00-0E-6A-9B-86-20"

NAS-Identifier = "3Com Access Point 7760"

NAS-Port-Type = Wireless-802.11

Connect-Info = "CONNECT 54Mbps 802.11g"

EAP-Message = 0x0212000d01616c756d6e6f3031

NAS-IP-Address = 192.168.100.185

NAS-Port = 1

NAS-Port-Id = "STA port # 1"

.

.

.

Sending Access-Accept of id 26 to 192.168.100.185 port 1030

Framed-IP-Address := 192.168.100.212

Framed-IP-Netmask := 255.255.255.0

Framed-Protocol := PPP

Service-Type := Framed-User

Framed-Compression := Van-Jacobson-TCP-IP

Tunnel-Medium-Type:0 := IEEE-802

Tunnel-Type:0 := VLAN

Tunnel-Private-Group-Id:0 := "4”

MS-MPPE-Recv-Key = 0xe0149d60e451a3b6b9f7e9806f66786ae8a8ee42b26136dc8bb61107b6a93dce

MS-MPPE-Send-Key = 0xca9ca668a8580fa06b0ccf3a7c38798d3d7be0b247ae4d5f165dbf7ce5f4d8ba

EAP-Message = 0x031a0004

Message-Authenticator = 0x00000000000000000000000000000000

User-Name = "alumno01"

Finished request 8

Going to the next request



Si la autenticación falla en vez de una Access-Accept veremos:



rad_recv: Access-Request packet from host 192.168.100.185:1367, id=7, length=246

Sending Access-Reject of id 7 to 192.168.100.185 port 1367

EAP-Message = 0x04070004

Message-Authenticator = 0x00000000000000000000000000000000

--- Walking the entire request list ---





Si hemos logrado ingresar a la red significa que nuestro servidor y suplicante estan bien configurados y que nuestra red se encuentra protegida con 802.1x. Luego podremos definir más grupos y usuarios según vayan siendo los requerimeintos de la red.



Con esto hemos concluído nuestro tutorial, dejando en funcionamiento una red inalambrica protegida con 802.1x (en particular EAP/PEAP) que brinda acceso a una red física dentro de nuestra organización.


3. Referencias



1. FREERADIUS WIKI (http://wiki.freeradius.org/index.php/FAQ)



2. Authentication Server: Setting up FreeRADIUS (http://www.tldp.org/HOWTO/8021X-HOWTO/freeradius.html)



3. The Freeradius-Users Archives (https://list.xs4all.nl/pipermail/freeradius-users)

Cupido dijo...

Me alegro de que te haya funcionado. La verdad es que a mi me funcionó de la manera que lo tengo explicado, pero como se suele decir lo que a mi me ha funcionado no tiene porque funcionarle a los demás. Bueno ahora a disfrutar de tu red inálambrica segura.

Saludos.