EAP-TLS

El escenario que quiero presentar es una sistema de acceso red inalámbrica seguro. Los elementos de hardware que intervienen son, el punto de acceso, el autenticador, una estación cliente, el solicitante, y una máquina con un servidor de autenticación, el servidor radius. Suponemos que el punto de acceso y el servidor de autenticación tienen una conexión de red por cable.

El software que necesitamos será un servidor radius (freeradius), para autenticar y que se ejecuta en una máquina de la red cableada. El solicitante también necesita un software de conexión a la red, que va a ser wpa_supplicant. Por último necesitamos PKI, una infraestructura de llaves públicas para lo que vamos a utilizar openssl.

También tenemos la opción de utilizar una el adaptador de red inalámbrico de una estación cliente para crear un punto de acceso con él que actúe como autenticador.

Más información en redes inalámbricas

Openssl: certificados para EAP-TLS y PEAP

El primer paso para configurar la red inalámbrica es crear los certificados digitales necesario para establecer una validación mutua entre el autenticador y el solicitante, es decir el servidor necesita identificarse ante el cliente con un certificado y lo mismo le ocurre al cliente, que tiene que demostrar su identidad al servidor. Más información en certificados digitales.

La gestión de certificados se realiza mediante openssl. El fichero de configuarción se denomina openssl.cnf y dependiendo de la distribución puede tener distintas ubicaciones. En este texto supongo que se encuentra en el directorio $SSLDIR, directorio en el que residen los datos de openssl.

Para localizar el fichero podemos ejecutar

find / -name openssl.cnf


Modificar $SSLDIR

Los certificados digitales incluyen cierta información que es necesario personalizar ya adaptarla a nuestros datos. También se pueden modficar las rutas de la CA y de los ficheros de llaves, etc. En principio sólo nos interesa modificar los datos predeterminados de la entidad para definir los datos que aparecerán en los certificados.

countryName_default
        stateOrProvinceName_default
        localityName_default
        0.organizationName_default
        organizationalUnitName_default
        emailAddress_default

Por ejemplo:

countryName_default = ES

Y así establecemos como país predeterminado "ES".

Posteriormente deberemos modificar la ruta para indicar donde se almacenan los datos de la CA y pondremos:

dir = ./CA

y de esta forma utilizaremos la autoridad certificadora que haya en el diectorio activo.



Crear una autoridad certificadora

La forma más simple de hacerlo es mediante los scripts que proporciona el propio openssl. Un buen sitio para crear esta autoridad certificadora es el diectorio /etc/raddb/certs, pero antes de ejecutar estas órdenes deberíamos asegurarnos que no existe ninguna CA previa que no interese perder. Para crear una CA en /etc/raddb/certs ejecutamos:

mkdir  /etc/raddb/certs
cd  /etc/raddb/certs
/ruta/CA.pl -newca

y genera toda la estructura de directorio necesaria, la llave privada (cakey.pem) y el certificado (cacert.pem). Podemos elegir un directorio cualquiera en lugar del propuesto.

Durante el proces de creación de la CA tendremos que proporcionar la contraseña de la llave privada que tendremos que usar para crear certificados.

El script CA.pl lo podemos localizar con

locate CA.pl

o bien

find / -name CA.pl


Exportar el certificado raíz

Vamos a necesitar exportar el certificado raíz para distribuirlo entre los clientes, por lo que creamos varias versiones en distintos formatos. Cada cliente puede preferir un formato concreto.

cd  /etc/raddb/certs

openssl x509 -inform PEM -outform DER \

-in CA/cacert.pem -out root.der

y tenemos el certificado raíz en root.pem además de CA/cacert.pem



Crear el certificado para el servidor radius

Primero necesitamos crear un fichero llamado /etc/raddb/certs/xpextensions con el siguiente contenido:

#
#  For use with the 'CA.all' script.
#
[ xpclient_ext]
extendedKeyUsage = 1.3.6.1.5.5.7.3.2
[ xpserver_ext]
extendedKeyUsage = 1.3.6.1.5.5.7.3.1

y ya procedemos a crear el certificado para el servidor

cd  /etc/raddb/certs
openssl req -new -keyout key_radius.pem \

-out req_radius.pem -nodes

openssl ca  -policy policy_anything -out cert_radius.pem \

-extensions xpclient_ext -extfile xpextensions \

-infiles req_radius.pem

 

openssl pkcs12 -export -in cert_radius.pem \
 -inkey key_radius.pem -out cert-radius.p12 -clcerts

 

openssl x509 -inform PEM -outform DER \
  -in cert-radius.pem -out cert-radius.der

 

Y los ficheros cert_radius.pem y key_radius.pem contienen el certificado y la llave privada para el servidor radius que posteriormente utilizaremos en el fichero de configuración.

Hemos creado la llave privada sin contraseña. Para que la llave privada tenga contraseña basta quitar la opción -nodes.


Certificados para los clientes


#!/bin/sh
if [ $# -ne 2 ]
then
        echo "Uso:"
        echo "$0 usuario dias"
        exit
fi
DIR=/etc/raddb/certs
user=$1
dates=$2
CFG=$DIR/openssl.cnf
CFGU=$DIR/Users/$user/openssl-$user.cnf
CERTPATH=$DIR/Users/$user
[ -d $DIR/Users ] || mkdir -p $DIR/Users/$user
if ! [ -f $CERTPATH/openssl-$user.cnf ]
then
  cat $CFG|\

sed "s/(commonName_default[ ]*=).*/&1 $user/g" |\

sed "s/emailAddress_default[ ]*=).*/&1 $Esta dirección de correo electrónico está siendo protegida contra los robots de spam. Necesita tener JavaScript habilitado para poder verlo./g" >$CFGU

fi


openssl req -batch -config $CFGU \
 -new -nodes -keyout $CERTPATH/$user.key \
 -out $CERTPATH/$user.req -days $dates
openssl ca -batch -config $CFGU \
 -policy policy_anything -out $CERTPATH/$user.crt \
 -extensions xpclient_ext -extfile $DIR/xpextensions \
 -infiles $CERTPATH/$user.req
openssl x509 -in $CERTPATH/$user.crt -out $CERTPATH/$user.pem
openssl pkcs12 -export -nodes  -in $CERTPATH/$user.pem \
 -inkey $CERTPATH/$user.key \
 -certfile $DIR/CA/cacert.pem \
 -name "$user" \
 -out $CERTPATH/$user.p12 -clcerts
cp $DIR/CA/cacert.pem $CERTPATH
cp $DIR/root.der $CERTPATH
# fin

 

 

Cuando ejecutamos este script como

certificados.sh julia 365

debería crear un directorio /etc/raddb/certs/Users/julia que contiene todos los ficheros necesarios para la conexión. En Linux con wpa_supplicante deberemos utilizar julia.pem como certificado, julia.key como llave privada y cacert.pem como certificado de la CA. En sistemas win32 tendremos que usar julia.p12 como certificado que contiene también la llave privada y root.der que contiene el certificado de la CA. Con un doble click sobre ellos se pueden instalar.

Para revocar un certificado podemos ejecutar

openssl -revoke  /ruta/cert.pem

y regeneramos la lista de certificados revocados.

openssl ca -gencrl -config $SSLDIR/openssl.cnf -out $DIR/CA/crl/revoke.crl

Servidor RADIUS

Preparación

Vamos a crear un fichero llamado dh de parámetros para Diffie-Hellman parameters file:

openssl dhparam -check -text -5 512 -out /etc/raddb/certs/dh

Y ahora un fichero con datos aleatorios.

dd if=/dev/urandom of=/etc/raddb/certs/random count=2

El usuario y grupo predeterminados que ejecutan radis puede ser radiusd o nobody; eso se especifica en el fichero de configuración. El usuario debe tener permiso de lectura sobre todos los ficheros que utiliza, incluidos los certificados y llaves.

Fichero radiusd.conf


eap-tls

Es el fichero de configuración principal de RADIUS y si sólo queremos EAP-TLS no hay necesidad de modificarlo.


peap

Si quermos configurar PEAP, por ejemplo para utilizar los usuario de un dominio, sí hay que hacer alguna modificación:

        mschap {           
#               authtype = MS-CHAP
                authtype = EAP
                use_mppe = yes
                require_encryption = yes
                require_strong = yes
                with_ntdomain_hack = yes
                ntlm_auth = "/usr/bin/ntlm_auth --request-nt-key         --username=%{Stripped-User-Name:-%{User-Name:-None}} --challenge=%{mschap:Challenge :-00} --nt-response=%{mschap:NT-Response:-00}"
        }
...
        realm IPASS {
                format = prefix
                delimiter = "/"
                ignore_default = no
                ignore_null = no
        }
        #  'username@realm'
        #
        realm suffix {
                format = suffix
                delimiter = "@"
                ignore_default = no
                ignore_null = no
        }
        #  'username%realm'
        #
        realm realmpercent {
                format = suffix
                delimiter = "%"
                ignore_default = no
                ignore_null = no
        }
        #
        #  'domain\user'
        #
        realm ntdomain {
                format = prefix
                delimiter = "\\"
                ignore_default = no
                ignore_null = no
        }
...
authorize {
        preprocess
        chap
        mschap
        IPASS
        suffix
        ntdomain
        eap
        files
}

Fichero eap.conf

El fichero eap.conf quedaría como:

        eap {

default_eap_type = tls

# default_eap_type = peap

#              default_eap_type = ttls
                timer_expire     = 60
                ignore_unknown_eap_types = no
                cisco_accounting_username_bug = no
                md5 {
                }
                leap {
                }
                tls {
                        private_key_password = whatever
                        private_key_file = ${raddbdir}/certs/key_radius.pem
                        certificate_file = ${raddbdir}/certs/cert_radius.pem
                        CA_file = ${raddbdir}/certs/CA/cacert.pem
                        dh_file = ${raddbdir}/certs/dh
                        random_file = ${raddbdir}/certs/random
                }
                ttls {
                        default_eap_type = md5
                        copy_request_to_tunnel = no
                        use_tunneled_reply = no
                }
                 peap {
                        default_eap_type = mschapv2
                      copy_request_to_tunnel = yes
                      use_tunneled_reply = yes
                      proxy_tunneled_request_as_eap = no
                }
                mschapv2 {
                }
        }

Y en este fichero tendremos que decidir qué tipo de eap vamos a utlizar, en nuestro caso TLS o PEAP.



Fichero clients.conf

En este fichero describimos los clientes que admite freeradius; cada cliente es una red y además comparte, por seguridad, una contraseña con el punto de acceso.

En este fichero añadimos:

client 127.0.0.1 {

secret = contraseña_compartida_con_el_punto_de_acceso

        shortname       = localhost
        nastype     = other     
}
client 192.168.0.0/24 {

secret = contraseña_compartida_con_el_punto_de_acceso

        shortname       = nombre
        nastype = other
}


Fichero proxy.conf

Sólo tiene sentido modificarlo si vamos utilizar PEAP

realm DOMINIO_LOCAL {
        type            = radius
       authhost        = LOCAL
       accthost        = LOCAL
       secret          = contraseña_compartida
        nostrip
}

Hostapd

Existe la posibilidad de poder utilizar un adaptador de red como punto de acceso con hostapd. Este paquete tendremos que instalarlo explícitamente.


Fichero hostapd.conf

El fichero principal de configuración de hostapd lo encontramos en /etc/hostapd.conf y su contenido puede ser algo así:

interface=wlan0
driver=hostap
ssid=ssid_de_la_red
auth_algs=3 
eap_server=0
ieee8021x=1
eap_message=Hola
own_ip_addr=192.168.0.211
nas_identifier=hostapd.midominio.dom 
auth_server_addr=127.0.0.1 
auth_server_port=1812 
auth_server_shared_secret=contraseña_de_radius
acct_server_addr=127.0.0.1 
acct_server_port=1813 
acct_server_shared_secret=contraseña_de_radius
wpa=1 
wpa_key_mgmt=WPA-EAP 
wpa_pairwise=CCMP # o TKIP CCMP
wpa_group_rekey=600 
wpa_gmk_rekey=86400

El fichero de configuración evidentemente depende del adaptador. Si el adaptador no admite el modo master entonces no podrá funcionar en modo punto de acceso.

Ahora para activar el adaptador ejecutamos primero:

hostapd -d /etc/hostapd.conf

y comprobamos el funcionamiento con los mensajes de ejecución. Cuando el fichero de configuración esté depurado podremos ejecutar:

hostapd -B /etc/hostapd.conf

para tenerlo en segundo plano.

wpa_supplicant

El fichero wpa_supplicant.conf (en /etc o /etc/wpa_supplicant) describe la lista de redes a las cuales queremos conectar.


wpa_supplicant con TLS

Fichero wpa_supplicant.conf para una conexión TLS quedaría como:

network={
        ssid="el_ssid"
        scan_ssid=1
        key_mgmt=WPA-EAP IEEE8021X
        auth_alg=OPEN
        pairwise=CCMP TKIP
        group=CCMP TKIP WEP104 WEP40
        eap=TLS
        identity="identidad"
        ca_cert="/etc/raddb/certs/CA/cacert.pem"
        private_key="/etc/raddb/certs/Users/ina.key"
        client_cert="/etc/raddb/certs/Users/ina.der"
        private_key_passwd=
        phase1="include_tls_length=1 
        peaplabel=0"
}


wpa_supplicant con PEAP

El fichero wpa_supplicant.conf para una conexión PEAP:

network ={
        ssid="el_ssid"
        scan_ssid=1
         key_mgmt=IEEE8021X
        pairwise=CCMP TKIP
        group=CCMP TKIP WEP104 WEP40
        eap=PEAP
        identity="DOMINIO\usuario"
        password="contraseña para el dominio"
        phase1="peaplabel=1"
        phase2="auth=MSCHAPV2"
}

Conexión con Windows XP (SP2)

Conexión TLS con Windows XP

Para la conexión TLS primero tenemos que instalar los cetificados con un doble click sobre los ficheros root.der y usuario.p12 según la salida del script descrito anteriormente.

Después tenemos que configurar la red inalámbrica concreta indicando que queremos usar un certificado inteligente.


Conexión PEAP con Windows XP

En la configuración de la red seleccionamos PEAP como método de autenticación.

Más artículos...

  1. Recursos