Seguridad Wi-Fi empresarial – Servidores radius (II)

En el capítulo anterior se hizo un resumen de los tipos de configuraciones que se pueden tener en un servidor radius. Ahora se describe la manera de configurar un servidor con Freeradius.

Como no podría ser de otra manera, no nos hacemos responsables del resultado de llevar a cabo las siguientes acciones y modificaciones, así que se recomienda aplicarlas primero sobre entornos no críticos además de no ejecutar nunca un script de una fuente no confiable o que se ignora lo que hace. ¿Somos una fuente confiable? Sí.

La instalación se puede hacer en cualquier sistema Linux. En este caso se ha escogido Debian wheezy. Para instalar Freeradius, primero se deben obtener algunos paquetes que son necesarios:

apt-get install dpkg-dev fakeroot libpam0g-dev libmysqlclient-dev libgdbm-dev libldap2-dev \
   libsasl2-dev libiodbc2-dev bind9 libkrb5-dev libperl-dev libpcap-dev libreadline-dev \
   libsnmp-dev libpq-dev libtalloc-dev libyubikey-dev libsqlite3-dev

Ahora la instalación se hace a partir del source de Freeradius en su última versión, la versión 3.0.0.

wget ftp://ftp.freeradius.org/pub/freeradius/freeradius-server-3.0.0.tar.gz
tar -xvzf freeradius-server-3.0.0.tar.gz
cd freeradius-server-3.0.0/

A partir del source se crea el binario para Debian, (para otras plataformas mirar este enlace):

fakeroot dpkg-buildpackage -b -uc  

Los binarios se crean en el directorio superior, donde se resalta los binarios que son necesarios instalar:

cd ..
ls

freeradius_3.0.0+git_i386.changes         freeradius-krb5_3.0.0+git_i386.deb        
freeradius-server-3.0.0.tar.gz            freeradius_3.0.0+git_i386.deb	    
freeradius-ldap_3.0.0+git_i386.deb        freeradius-utils_3.0.0+git_i386.deb
freeradius-common_3.0.0+git_all.deb       freeradius-mysql_3.0.0+git_i386.deb       
libfreeradius3_3.0.0+git_i386.deb         freeradius-dbg_3.0.0+git_i386.deb    
freeradius-postgresql_3.0.0+git_i386.deb  libfreeradius-dev_3.0.0+git_i386.deb
freeradius-iodbc_3.0.0+git_i386.deb       freeradius-server-3.0.0

dpkg -i libfreeradius3_3.0.0+git_i386.deb
dpkg -i freeradius-common_3.0.0+git_all.deb 
dpkg -i freeradius_3.0.0+git_i386.deb 

Al instalar los paquetes, automáticamente el servicio Freeradius arranca, por lo que es necesario pararlo, para configurarlo antes:

/etc/init.d/freeradius stop
Stopping FreeRADIUS daemon: freeradius.

Ahora se procede a la configuración. El directorio donde se encuentran todos los archivos de configuración es /etc/freeradius:

Editamos el archivo users, que es el que va a contener los nombres y las contraseñas de los usuarios:

vi /etc/freeradius/users

Al final del fichero añadimos:

 "juanito"      User-Password == "passwordparajuanito"
 

Donde “juanito” es el nombre de usuario y “passwordparajuanito” es la clave del usuario.

Editamos el archivo clients, que es el que va a contener el router o punto de acceso que se va a conectar por cable al servidor radius:

vi /etc/freeradius/clients.conf

client 192.168.1.1 { 
secret = passwordpararouter
shortname = linksys 
} 

Donde 192.168.1.1 es la dirección IP del router, y “passwordpararouter” es la clave de conexión entre el router y el servidor.

Antes de seguir configurando los demás archivos, se deben crear los certificados necesarios. Éstos vienen creados por defecto en la dirección /etc/freeradius/certs, pero opcionalmente se pueden crear. Para que los certificados se creen con una caducidad de un año hace falta editar el siguiente archivo:

vi /etc/ssl/openssl.cnf

La línea default_crl_days 30 debe quedar así:

 
default_crl_days 365

Los certificados se van a crear en un nuevo directorio:

mkdir /etc/freeradius/miscertificados
cd /etc/freeradius/miscertificados

Se crea un archivo para la compatibilidad con Windows XP

vi xpextensions

[ xpclient_ext]
extendedKeyUsage = 1.3.6.1.5.5.7.3.2
crlDistributionPoints = URI:http://www.example.com/example_ca.crl
[ xpserver_ext]
extendedKeyUsage = 1.3.6.1.5.5.7.3.1
crlDistributionPoints = URI:http://www.example.com/example_ca.crl

Para crear el certificado raiz, se hace uso del script CA.root.sh:

#!/bin/sh

OPENSSL=openssl
CAPL=/usr/lib/ssl/misc/CA.pl
KEYGEN=/usr/sbin/dnssec-keygen
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

Se ejecuta el script seguido del password del certificado:

sh CA.root.sh passwordcert

Donde “passwordcert” es la clave asignada. Una vez ejecutado el script, hay que responder a una serie de preguntas:

Generating a 2048 bit RSA private key
......+++
Country Name (2 letter code) [AU]:ES
State or Province Name (full name) [Some-State]:Madrid
Locality Name (eg, city) []:Madrid
Organization Name (eg, company) [Internet Widgits Pty Ltd]:SAW
etc...

Una vez finalizada la ejecución, se crearán unos cuantos directorios dentro de /etc/freeradius/miscertificados/ como pem, der, p12 y demoCA.

Dentro de demoCA, se debe crear si no existe un archivo llamado serial con 01 en su interior:

vi demoCA/serial
01

Se crea ahora el certificado del servidor. Para ello se debe introducir el nombre de la máquina donde se instala el servidor radius, para ello con la orden uname -n, se ve el nombre:

uname -n
debian32

El script para crear el certificado del servidor es CA.server.sh:

#!/bin/sh

OPENSSL=openssl
KEYGEN=/usr/sbin/dnssec-keygen
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

Para ejecutar el script dentro del directorio miscertificados, se hace de la siguiente manera:

sh CA.server.sh servername passcertserver passwordcert

Donde “servername” es el nombre del certificado de servidor, y le podemos poner el nombre que queramos, en este caso servername. “passcertserver” es la clave del certificado del servidor y “passwordcert” es la clave introducida antes en la creación del certificado raíz.

Al igual que en la creación del anterior certificado, se deben responder a las preguntas, pero ahora en Common Name se debe poner el nombre de la máquina que hace de servidor y responder yes en las dos ultimas preguntas:

Country Name (2 letter code) [AU]:ES
State or Province Name (full name) [Some-State]:Madrid
Locality Name (eg, city) []:Madrid
Organization Name (eg, company) [Internet Widgits Pty Ltd]:SAW
Organizational Unit Name (eg, section) []:
Common Name (e.g. server FQDN or YOUR name) []:debian32
Certificate is to be certified until Nov 23 12:09:24 2014 GMT (365 days)
Sign the certificate? [y/n]:y
1 out of 1 certificate requests certified, commit? [y/n]y
Write out database with 1 new entries
Data Base Updated
MAC verified OK

Dentro del directorio pem debemos crear el archivo dh

cd pem
openssl dhparam -out dh 1024

Una vez creados los certificados, solo queda configurar los ficheros restantes (radiusd.conf, eap y mschap):

Editamos radiusd.conf, incluyendo en las variables la ruta de los certificados creados antes:

vi /etc/freeradius/radiusd.conf

#  Location of config and logfiles. 
confdir = ${raddbdir} 
modconfdir = ${confdir}/mods-config 
certdir = ${confdir}/miscertificados/pem 
cadir = ${confdir}/miscertificados/pem 
run_dir = ${localstatedir}/run/${name} 

Se configuran los módulos eap y mschap (dentro de los ficheros incluimos lo siguiente sin comentar lo que ya se incluye dentro de ellos):

vi /etc/freeradius/mods-available/eap

eap { 
   default_eap_type = peap 
}

tls-config tls-common {    
   private_key_password = passcertserver

   private_key_file = ${certdir}/servername.pem 
   certificate_file = ${certdir}/servername.pem

   ca_file = ${cadir}/root.pem
   dh_file = ${certdir}/dh
   random_file = /dev/urandom 
   ca_path = ${cadir}
}

vi /etc/freeradius/mods-available/mschap

mschap {    
   authtype = MS-CHAP     
   use_mppe = yes
}

Ya están todos los archivos de configuración terminados. Para configurar el router o punto de acceso debemos entrar en su configuración Wireless, y dentro en configuración de seguridad y modificar los parámetros del siguiente modo:

Siendo 192.168.1.128 la dirección IP del servidor radius y “passwordpararouter” la clave que se editó en el archivo clients.conf. Para arrancar el servicio de Freeradius manualmente y ver los posibles errores, se ejecuta con la opción -X:

freeradius -X

Listening on auth address 127.0.0.1 port 18120 as server inner-tunnel 
Listening on auth address * port 1812 as server default 
Listening on acct address * port 1813 as server default 
Opening new proxy address * port 1814 
Listening on proxy address * port 1814 Ready to process requests. 

Si todo ha ido bien, el servidor se quedará a la espera de que un cliente pida autenticación. En el tercer y último articulo sobre seguridad Wi-Fi empresarial, se explicarán las diferentes configuraciones para conectarse desde Windows, Linux, Android etc.

¿Dudas? Les esperamos en los comentarios.

Comments

  1. “¿Somos una fuente confiable? Sí.”

    Así, sin certificado firmado por una CA de confianza ni nada… Pues yo no me fío!

  2. Es razonable y recomendable. Hoy en día es mejor no fiarse de nadie, aunque tengan CA de confianza. Que ya se sabe qué paso con DigiNotar…

  3. Excelente aporte. Gracias

  4. Tengo una duda, ¿se puede instalar online??
    es decir, debes de instalarlo en un servidor local y tener la pc encendida día y noche, lo instalo en algún servidor online y me evito el problema de tener la pc encendida para que el servidor radius este funcionando??

  5. Si lo puedes tener en un servidor online, lo único que tendrás que usar una VPN para que la conexión “parezca” local