Documentos de Académico
Documentos de Profesional
Documentos de Cultura
Contents
1 Objetivo 3
2 Sistema elegido 3
3 Infraestructuras posibles 4
3.1 Servidor radius en la intranet del centro . . . . . . . . . . . . . . . . . . . . . . . 4
3.2 Servidor radius en la subred del aula . . . . . . . . . . . . . . . . . . . . . . . . . 5
3.3 Elementos hardware necesarios . . . . . . . . . . . . . . . . . . . . . . . . . . . . 5
3.4 Procedimientos a realizar . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 5
5 Instalación de freeradius 13
5.1 Instalación de freeradius en Debian Squeeze . . . . . . . . . . . . . . . . . . . . . 13
5.2 Instalación de freeradius en Debian Lenny . . . . . . . . . . . . . . . . . . . . . . 14
5.2.1 Instalación desde los repositorios de LinEx . . . . . . . . . . . . . . . . . . 14
5.2.2 Instalación desde el repositorio lenny-backports . . . . . . . . . . . . . . . 14
5.3 Instalación de freeradius desde el código fuente . . . . . . . . . . . . . . . . . . . 15
6 Certicados 16
6.1 Usar el certicado que se crea al instalar freeradius desde los repositorios . . . . . 16
6.2 Crear un certicado de servidor autormado . . . . . . . . . . . . . . . . . . . . . 17
7 Conguración de freeradius 18
7.1 Fichero radiusd.conf . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 18
7.2 Directorio sites-available . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 19
7.3 Fichero de nuestro servidor virtual: freeradius-ies . . . . . . . . . . . . . . . . . . 20
7.4 Directorio sites-enabled . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 21
7.5 Fichero eap.conf . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 21
7.6 Fichero modules/ldap . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 22
7.6.1 Acceso a ldap sin cifrar . . . . . . . . . . . . . . . . . . . . . . . . . . . . 22
1
7.6.2 Acceso cifrado a ldap . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 23
7.7 Fichero users . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 25
7.7.1 En el servidor freeradius para la red 172.x.x.x podemos denir, por ejemplo,
tan sólo un par de reglas: . . . . . . . . . . . . . . . . . . . . . . . . . . . 25
7.7.2 En los servidores freeradius de las aulas (subredes 192.x.x.x), podríamos
denir las siguientes reglas: . . . . . . . . . . . . . . . . . . . . . . . . . . 25
7.8 Fichero clients.conf . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 26
7.8.1 En el servidor freeradius para la red 172.x.x.x denimos la clave compartida
con cada punto de acceso: . . . . . . . . . . . . . . . . . . . . . . . . . . . 26
7.8.2 En el servidor freeradius de un aula denimos la clave compartida con su
punto de acceso: . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 26
7.9 Controlar el acceso de un usuario por MAC. . . . . . . . . . . . . . . . . . . . . . 27
8 Arranque de freeradius 29
8.1 Arranque del demonio freeradius . . . . . . . . . . . . . . . . . . . . . . . . . . . 29
8.2 Arrancar freeradius en modo debug . . . . . . . . . . . . . . . . . . . . . . . . . . 29
9 Herramientas de administración 29
11 Conguración de clientes 31
11.1 NetworkManager . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 31
11.1.1 Establecer una conexión wi antes de iniciar sesión mediante NetworkMan-
ager . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 32
11.1.2 Modicar políticas de NetworkManager . . . . . . . . . . . . . . . . . . . 33
11.1.3 Automatizar la conguración de acceso wi en los portátiles . . . . . . . . 34
11.2 Wicd . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 39
11.3 Android . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 42
13 hostapd+freeradius en Debian 45
13.1 Fichero /etc/network/interfaces . . . . . . . . . . . . . . . . . . . . . . . . . . . 46
13.2 Fichero /etc/default/dhcp3-server . . . . . . . . . . . . . . . . . . . . . . . . . . . 46
13.3 Fichero /etc/freeradius/clients.conf . . . . . . . . . . . . . . . . . . . . . . . . . . 47
13.4 Fichero /etc/hostapd/hostapd.conf . . . . . . . . . . . . . . . . . . . . . . . . . 47
2
1 Objetivo
Montar una infraestructura de autenticación para clientes wi basada en servidores
RADIUS que realicen la autenticación y autorización de los clientes inalámbricos del
centro contra la base de datos del servidor de ldap. Esto quiere decir que nuestros
usuarios se van a conectar a la red wi mediante el nombre de usuario y password
con el que ya están dados de alta en el servidor ldap del centro.
2 Sistema elegido
Nos basaremos en una instalación Debian, a la que le añadimos todos los paquetes necesarios
para montar el servidor.
1. Es fácilmente actualizable.
1 2
En cuanto al método de autenticación, me he decantado por EAP -TTLS /PAP. Motivos:
En este sistema, lo primero que hace el cliente es comprobar el certicado del servidor.
Una vez comprobado, se crea un túnel para realizar el traspaso de credenciales del cliente
al servidor de forma segura.
Otro de los motivos que me han llevado a utilizar EAP-TTLS es que nos permite usar
una base de datos LDAP para autenticar los usuarios. Anteriormente había montado un
servidor RADIUS con ZeroShell usando EAP-PEAP y credenciales EAP-MSCHAPv2. El
problema es que el método de autenticación EAP-PEAP no permite usar LDAP como base
de datos de autenticación.
1
Extensible Authentication Protocol
2
Tuneled Transport Layer Security
3
Public Key Infraestructure
3
Por otra parte, EAP-TTLS no es vulnerable actualmente a ataques MITM ni ataques de
diccionario.
3 Infraestructuras posibles
Tenemos la posibilidad de montar el servidor radius en una máquina independiente, en el servidor
nfs, en el servidor de ldap o incluso en los servidores de aula.
Con un servidor radius por centro sería más que suciente, pero quizás por simplicidad a la
hora de poner reglas de acceso y para cumplir las restricciones de las que se quiere disponer,
puede que la mejor opción sea disponer de:
Un servidor radius para controlar el acceso wi en la parte de intranet del centro,
que sólo permita realizar la conexión a los alumnos que tienen clase en dicho aula
dentro del horario de clases.
4
En el esquema propuesto tenemos una serie de NAS , es decir, puntos de acceso que reciben
las peticiones de los clientes wi y las derivan al servidor RADIUS. De este modo, los puntos
de acceso no realizan el papel de autenticador y su única función es encapsular los paquetes de
tipo EAP en paquetes RADIUS. Esto nos proporciona una ventaja importante: Ampliar nuestra
cobertura wi es tan sencillo como añadir nuevos puntos de acceso a nuestra infraestructura de
red sin tener que congurar un sistema de autenticación en cada uno de ellos.
Instalamos puntos de acceso en aquellos lugares donde queramos dar cobertura de acceso
inalámbrico, conectándolos a tomas dentro de la red 172.x.x.x.
Conguraremos los puntos de acceso para que actúen como clientes del servidor freeradius
instalado.
4
Network Access Server
4
3.2 Servidor radius en la subred del aula
Para dar servicio a las aulas, montaremos un punto de acceso por aula y lo conectaremos a la
subred 192.x.x.x:
Para los que tenemos switches en las aulas, lo más sencillo es colocar el punto de acceso
dentro del armario donde está ubicado el switch y conectarlo a una de las tomas de 1Gbps,
mediante un cable CAT5e o CAT6.
Para los que no tengan armarios, podrían colocarlo dentro del cajón donde se encuentra el
servidor de terminales, conectado directamente a la tarjeta de red de 1Gbps, por ejemplo.
Con ésto conseguimos que los alumnos y profesores que se conecten al punto de acceso del aula
se encuentren dentro de la subred 192.x.x.x de ese aula.
Por otra parte, instalaremos freeradius en los servidores LTSP que vayan a dar servicio de
acceso wi.
El puerto ethernet que tiene es Gigabit. En las aulas podemos conectarlo a la toma Gigabit
que tenemos libre en el switch.
En sus especicaciones indica que aplica una política para reducir interferencias con redes
vecinas.
Admite múltiples SSID. Esto permite que un único dispositivo físico esté lógicamente di-
vidido en varios puntos de acceso virtuales.
Instalar y congurar freeradius en los servidores LTSP que vayan a dar servicio de acceso
inalámbrico.
dialupAccess
radiusGroupName
5
El atributo dialupAccess coincidirá con su nombre de usuario y el radiusGroupName será un
nombre con el que controlaremos el acceso por grupos en el servidor freeradius. De este modo,
tan sólo tengo que asignar un valor a dichos atributos en aquellos usuarios a los que quiero dar
acceso vía wi. Por ejemplo, si tengo un usuario con cn=smartind21, a dialupAccess le asigno
el valor smartind21 y a radiusGroupName: WPA2Enterprise. Luego, en un chero de freeradius
estableceré que permita el acceso a usuarios con radiusGroupName = WPA2Enterprise. Así,
si un usuario no tiene valor en el atributo dialupAccess o no pertenece al radiusGroupName
WPA2Enterprise, no tendrá acceso vía wi.
1. Añadir radius.schema a ldap (en los institutos ya está hecho, por tanto, no es necesario)
Para que el sistema fuera lo más versátil posible y nos permitiera la posibilidad de
elegir entre dar servicio a todos los usuarios o tan sólo a una parte de ellos, decidí
hacer uso del esquema de radius para ldap: radius.schema.
Para disponer de este esquema, lo primero que tenemos que hacer es copiar el chero
radius.schema en la carpeta /var/lib/ldap/schemas.
6
Añadimos la posibilidad de indexar por radiusAuthType en /etc/ldap/slapd.conf:
Como hemos indexado como root, ajustamos el propietario del directorio /var/lib/l-
dap:
l d a p :~# / e t c / i n i t . d/ s l a p d restart
my $ldapserver = ldap ;
my $dialupAccess ;
my $radiusGroupName ;
$ldap = Net :: LDAP -> new (" $ldapserver ") or die " $@ ";
if ( $homeDirectory =~ / profesor / ) {
7
$dialupAccess = $uid ;
$radiusGroupName = " WPA2Enterprise ";
}
else {
$dialupAccess = $uid ;
$radiusGroupName = " disabled ";
}
print " Procesando : $uid ...\ n ";
print " dialupAccess : $dialupAccess \n ";
print " radiusGroupName : $radiusGroupName \ n ";
if ( $tieneinetOrgPerson ) {
$mesg = $ldap - > modify ( $entry - > dn () ,
changes => [
replace => [ objectClass = > [' top ', ' posixAccount ', ' shadowAccount ' , '
person ', ' inetOrgPerson ',' radiusprofile ' ]] ,
add => [ dialupAccess => " $dialupAccess " ] ,
add => [ radiusGroupName => " $radiusGroupName " ]
] );
} else {
$mesg = $ldap - > modify ( $entry - > dn () ,
changes => [
replace => [ objectClass = > [' top ', ' posixAccount ', ' shadowAccount ' , '
person ', ' radiusprofile ' ]] ,
add => [ dialupAccess => " $dialupAccess " ] ,
add => [ radiusGroupName => " $radiusGroupName " ]
] );
}
}
# Cerramos la conexión
$ldap -> unbind ;
Este script establece como dialupAccess el username del usuario. Además, si es un profesor,
le asigna como radiusGroupName -> WPA2Enterprise y si es un alumno le asigna el valor
disabled. El radiusGroupName lo usaremos para realizar controles de acceso por grupos.
Este script, además me resuelve el problema que tenía en bash para añadir el objectClass
radiusprole y sus atributos en los usuarios que no tenían el objectClass inetOrgPerson.
Una de las cosas que me habían pedido, para aumentar la seguridad, era controlar que un
usuario tan sólo pudiera acceder desde el portátil que le ha sido asignado. Es decir, que para que
un usuario tenga acceso a la red, además de introducir su login y su password, tan sólo pueda
hacerlo desde su máquina. Esto es sencillo de controlar haciendo uso del módulo checkval de
freeradius y añadiendo un atributo más a su cuenta de ldap: radiusCallingStationId.
8
los alumnos de dicho grupo les pusiera el radiusGroupName que el usuario del script especicara
por teclado:
my $ldapserver = ldap ;
my $baseGroup = " ou = Group , dc = instituto , dc = extremadura , dc = es ";
my $basePeople = " ou = People , dc = instituto , dc = extremadura , dc = es ";
my $radiusGroupName ;
if (! $radiusGroupName ) {
print " $0 : Debe especificar el nombre del grupo \ n ";
print " Ejemplos : E -1A , E -1B , B -1A , disabled ...\ n "; exit 1;
}
$ldap = Net :: LDAP -> new (" $ldapserver ") or die " $@ ";
9
[ radiusGroupName => [" $radiusGroupName "] ] );
}
}
}
my $ldapserver = ldap ;
my $baseGroup = " ou = Group , dc = instituto , dc = extremadura , dc = es ";
my $basePeople = " ou = People , dc = instituto , dc = extremadura , dc = es ";
my $radiusGroupName ;
if (! $radiusGroupName ) {
print " $0 : Debe especificar el nombre del grupo \ n ";
print " Ejemplos : E -1A , E -1B , B -1A , disabled ...\ n ";
exit 1;
}
$ldap = Net :: LDAP -> new (" $ldapserver ") or die " $@ ";
10
( groupType = school_class )( cn = $radiusGroupName ))");
De todos modos, también se podría desactivar el acceso wi, modicando la regla que les da
permiso de acceso en el chero /etc/freeradius/users, sin cambiar el radiusGroupName.
my $ldapserver = ldap ;
my $basePeople = " ou = People , dc = instituto , dc = extremadura , dc = es ";
my $userName ;
11
chomp ( my $pass = < STDIN >);
system " stty echo "; # enable echo
print "\ n ";
if (! $userName ) {
print " $0 : Debe especificar el nombre del usuario a desactivar \ n ";
exit 1;
}
$ldap = Net :: LDAP -> new (" $ldapserver ") or die " $@ ";
# Obtenemos el usuario
$mesg = $ldap -> search ( base => $basePeople , filter = >"(&( objectclass = posixAccount )( uid = $userName ))");
my $ldapserver = ldap ;
my $basePeople = " ou = People , dc = instituto , dc = extremadura , dc = es ";
my $userName ;
12
chomp ( my $pass = < STDIN >);
system " stty echo "; # enable echo
print "\ n ";
if (! $userName ) {
print " $0 : Debe especificar el nombre del usuario a activar \n ";
exit 1;
}
if (! $radiusGroupName ) {
print " $0 : Debe especificar el nombre del grupo \ n ";
print " Ejemplos : E -1A , E -1B , B -1A , disabled ...\ n ";
exit 1;
}
$ldap = Net :: LDAP -> new (" $ldapserver ") or die " $@ ";
# Obtenemos el usuario
$mesg = $ldap - > search ( base => $basePeople , filter = >"(&( objectclass = posixAccount )( uid = $userName ))");
5 Instalación de freeradius
Podemos instalar freeradius desde el código fuente o desde los repositorios. Lo más rápido
y sencillo es instalarlo desde los repositorios, pero, por si alguien tiene problemas o necesita
compilar los paquetes por alguna razón especial, dejo un apartado en el documento en el que se
detalla el proceso de instalación desde el código fuente.
Hasta hace poco, en Debian teníamos el inconveniente de que los binarios no venían compi-
lados con soporte para SSL por un problema con la licencia de OpenSSL. Éste problema ya no
existe porque Squeeze viene compilado con dicho soporte y se ha hecho un backport a Lenny.
En este apartado detallaremos cómo:
deb http :// f t p . debian . org / debian / squeeze main contrib non− f r e e
13
Actualizamos los índices de los repositorios:
# a p t −g e t update
# a p t −g e t install freeradius f r e e r a d i u s −l d a p
Con ésto instalamos freeradius y el soporte para ldap. Y se instalarán además todas las depen-
dencias.
Como en nuestros centros tenemos los repositorios de LinEx, para instalar freeradius no tenemos
más que actualizar los índices de los repositorios:
# a p t −g e t update
# a p t −g e t install freeradius f r e e r a d i u s −l d a p
Así de sencillo.
Si no utilizáis los repositorios de LinEx, tendréis que usar el repositorio lenny-backports, así que,
primero, debereis añadir el repositorio al sources.list, si no lo habéis añadido antes:
# a p t −g e t update
# a p t −g e t −t l e n n y −b a c k p o r t s install freeradius f r e e r a d i u s −l d a p
14
5.3 Instalación de freeradius desde el código fuente
Si queremos instalar freeradius desde el código fuente, lo descargamos de http://www.freeradius.org.
La instalación es sencilla:
$ ./ configure
$ make
$ make install
No obstante, como estamos usando Debian, en lugar de instalar freeradius de la forma anterior,
es mejor crear los paquetes de freeradius usando dpkg-buildpackage. Si lo instalamos directamente
desde el código fuente, sin usar dpkg-buildpackage, no será posible desinstalarlo posteriormente.
Para compilar e instalar software, instalamos los siguientes paquetes: build-essential, dpkg-dev
y fakeroot.
En relación con la creación de paquetes hay que decir que es recomendable usar fakeroot para
no construir los paquetes como root. Por otra parte, también es recomendable, siendo un poco
organizado, usar el directorio /usr/src para colocar allí todo el software que instalemos desde
código fuente. Como el directorio /usr/src es propiedad del usuario root y del grupo src, para
que un usuario que no sea administrador pueda trabajar en él, hay que añadirlo al grupo src.
Para compilar freeradius con soporte ssl, tenemos que instalar también libssl-dev.
Bueno, pues una vez que tenemos todas las herramientas necesarias, copiamos el código fuente
de freeradius al directorio /usr/src y lo instalamos:
$ cp f r e e r a d i u s −s e r v e r − 2 . 1 . 8 . t a r . gz / usr / src
$ cd / usr / src
$ tar xfvz f r e e r a d i u s −s e s r v e r − 2 . 1 . 8 . t a r . gz
$ cd f r e e r a d i u s −s e r v e r −2.1.8
$ fakeroot dpkg− b u i l d p a c k a g e −b −uc
El comando dpkg-buildpackage tardará un poco en crear los paquetes. Si el proceso se corta por
algún error, seguramente será porque nos falta alguna librería de desarrollo. Nos jamos en qué
librería nos falta, la instalamos y volvemos a ejecutar dpkg-buildpackage hasta que se creen los
paquetes.
Una vez terminado el proceso, podemos ver el resultado:
f r e e r a d i u s −common_2 . 1 . 8 + g i t _ a l l . deb
f r e e r a d i u s −ldap_2 . 1 . 8 + g i t _ i 3 8 6 . deb
f r e e r a d i u s − u t i l s _ 2 . 1 . 8 + g i t _ i 3 8 6 . deb
f r e e r a d i u s −dbg_2 . 1 . 8 + g i t _ i 3 8 6 . deb
f r e e r a d i u s −mysql_2 . 1 . 8 + g i t _ i 3 8 6 . deb
freeradius_2 .1.8+ git_i386 . changes
f r e e r a d i u s −d i a l u p a d m i n _ 2 . 1 . 8 + g i t _ a l l . deb
f r e e r a d i u s − p o s t g r e s q l _ 2 . 1 . 8 + g i t _ i 3 8 6 . deb
f r e e r a d i u s _ 2 . 1 . 8 + g i t _ i 3 8 6 . deb
f r e e r a d i u s −i o d b c _ 2 . 1 . 8 + g i t _ i 3 8 6 . deb
f r e e r a d i u s −s e r v e r −2.1.8
libfreeradius −dev_2 . 1 . 8 + g i t _ i 3 8 6 . deb
f r e e r a d i u s −krb5_2 . 1 . 8 + g i t _ i 3 8 6 . deb
f r e e r a d i u s −s e r v e r − 2 . 1 . 8 . t a r . gz
l i b f r e e r a d i u s 2 _ 2 . 1 . 8 + g i t _ i 3 8 6 . deb
Siendo root, instalaremos al menos, los paquetes que necesitamos para nuestros propósitos:
15
# dpkg −i f r e e r a d i u s −common_2 . 1 . 8 + g i t _ a l l . deb
# dpkg −i l i b f r e e r a d i u s 2 _ 2 . 1 . 8 + g i t _ i 3 8 6 . deb
# dpkg −i f r e e r a d i u s _ 2 . 1 . 8 + g i t _ i 3 8 6 . deb
# dpkg −i f r e e r a d i u s −ldap_2 . 1 . 8 + g i t _ i 3 8 6 . deb
# dpkg −i f r e e r a d i u s −d i a l u p a d m i n _ 2 . 1 . 8 + g i t _ a l l . deb
Como hemos hecho adaptaciones para compilar freeradius en formato binario, es necesario evitar
su actualización automática a nuevas versiones, que no tengan soporte ssl por ejemplo, desde los
repositorios. Así que, una vez instalado freeradius, lo 'bloqueamos ' para que no se actualice:
6 Certicados
El método de autenticación EAP-TTLS no nos obliga a crear una autoridad de certicación,
aunque sí vamos a necesitar tener un certicado de servidor. Para disponer de dicho certicado
tenemos varias opciones:
3. Crear nuestra propia autoridad de certicación, con la que generaremos dicho certicado.
Además, el tener una infraestructura PKI puede serme útil también por si, en algún mo-
mento, decido utilizar certicados de cliente, cosa opcional en EAP-TTLS, o para otros
nes.
6.1 Usar el certicado que se crea al instalar freeradius desde los repositorios
Cuando instalamos freeradius desde los repositorios, se nos crean automáticamente los certica-
dos y claves de servidor en la máquina que lo hemos instalado. La opción más sencilla es usar
estos certicados.
Para que podamos usarlos en otras aplicaciones, la instalación de freeradius en Debian alma-
cena los certicados en /etc/ssl y crea enlaces a los mismos en el directorio /etc/freeradius/certs.
Veamos dónde se almacena cada chero:
16
r a d i u s 1 : / e t c / f r e e r a d i u s / c e r t s# l s −l
total 4
c a . pem −> / e t c / s s l / c e r t s / c a . pem
dh
random −> / d e v / urandom
s e r v e r . key −> / etc / s s l / private / ssl −c e r t − s n a k e o i l . k e y
s e r v e r . pem −> / e t c / s s l / c e r t s / s s l − c e r t − s n a k e o i l . pem
Como se puede ver, estoy creando una clave privada de 1024 bits en el chero server.key, sin
contraseña. El crear la clave con contraseña es más seguro, pero me obligaría a introducir la
contraseña cada vez que se inicie el servicio. Aquí, que cada uno decida el nivel de seguridad que
desea establecer.
Una vez que tenemos la clave rsa en el chero server.key, generaremos una solicitud de rma
5
de certicado (CSR ):
Con la línea anterior, estamos creando una petición de certicado en el chero server.csr, medi-
ante la clave server.key.
Bien, pues ahora que ya disponemos de una solicitud de certifcado en el chero server.csr,
tenemos dos opciones:
Autormar el certicado.
Como en este apartado lo que estamos tratando es crear un certicado autormado, vamos a ver
cómo lo auto-rmamos:
Como podemos ver, lo que hacemos es crear un certicado en el archivo server.crt con una
duración de 365 días, a partir de la solicitud almacenada en el archivo server.csr y rmándolo
con la clave privada almacenada en server.key.
Para poder usar el certicado creado, no tendríamos más que copiar los cheros:
5
Certicate Signing Request
17
7 Conguración de freeradius
En versiones anteriores de freeradius (versiones 1.x) la conguración se almacenaba en /etc/raddb.
Actualmente en versiones 2.x la conguración se almacena en /etc/freeradius.
Freeradius ofrece multitud de posibilidades de conguración para diferentes entornos. Y son
tantas las posibilidades que tan sólo voy a especicar los cheros y conguraciones a realizar
para montar nuestro servidor radius con EAP-TTLS.
Una cuestión a comentar es que freeradius en su versión 2 es capaz de leer algunos cheros de
conguración en tiempo real, como por ejemplo el chero clients.conf. En cualquier caso, para
que freeradius vuelva a leer los cheros de conguración cuando hayamos hecho un cambio, no
tenemos más que hacer un:
# / e t c / i n i t . d/ f r e e r a d i u s f o r c e −r e l o a d
Guardar log de las peticiones de autenticación puede ser útil al menos mientras estamos haciendo
pruebas, o si detectamos problemas. En caso contrario, podemos desactivarlo.
Por otra parte, he desactivado el proxy puesto que éste va a ser nuestro único servidor radius:
# PROXY CONFIGURATION
#
# proxy_requests : Turns proxying of RADIUS requests on or off .
#
# The server has proxying turned on by default . If your system i s NOT
# set up to proxy requests to another server , then you can turn proxying
# off here . This will save a small amount of resources on the server .
#
# If you have proxying turned off , and your configuration files say
# to proxy a request , then an error message will be logged .
#
# To disable proxying , change the " yes " to " no " , and comment the
# $INCLUDE line .
#
18
# allowed values : { no , yes }
#
proxy_requests = no
#$INCLUDE p r o x y . c o n f
Por último, ya que no vamos a tener nuestros usuarios almacenados en una BD y no vamos a
usar sql para nada, en las sección modules de este chero he comentado las siguientes lineas:
Como he congurado un servidor freeradius en cada aula, podríamos nombrar este chero con el
nombre del aula. Por ejemplo:
19
7.3 Fichero de nuestro servidor virtual: freeradius-ies
Una vez creado el servidor virtual, como hemos dicho, pasamos a modicar su chero de con-
guración para adaptarlo a nuestras necesidades. Como a mi servidor virtual le he llamado
freeradius-ies, éste será el chero que tendré que modicar. A continuación muestro mi chero,
al que le he quitado los comentarios:
authorize {
preprocess
auth_log
suffix
eap {
ok = r e t u r n
}
files
ldap
checkval
expiration
logintime
}
authenticate {
Auth−Type LDAP {
ldap
}
# A l l o w EAP a u t h e n t i c a t i o n .
eap
}
preacct {
preprocess
acct_unique
suffix
files
}
accounting {
detail
unix
radutmp
a t t r _ f i l t e r . accounting_response
}
session {
radutmp
}
p o s t −a u t h {
exec
P o s t −Auth−Type REJECT {
attr_filter . access_reject
20
}
}
p r e −p r o x y {
}
p o s t −p r o x y {
}
eap {
default_eap_type = ttls
timer_expire = 60
ignore_unknown_eap_types = no
c i s c o _ a c c o u n t i n g _ u s e r n a m e _ b u g = no
max_sessions = 4096
tls {
certdir = $ { c o n f d i r }/ c e r t s
c a d i r = $ { c o n f d i r }/ c e r t s
private_key_password = miclave
p r i v a t e _ k e y _ f i l e = $ { c e r t d i r }/ s e r v e r . k e y
certificate_file = $ { c e r t d i r }/ s e r v e r . pem
21
C A _ f i l e = $ { c a d i r } / c a . pem
d h _ f i l e = $ { c o n f d i r }/ c e r t s / dh
r a n d o m _ f i l e = $ { c o n f d i r }/ c e r t s / random
c i p h e r _ l i s t = "DEFAULT"
cache {
e n a b l e = no
lifetime = 24 # h o u r s
max_entries = 255
}
}
ttls {
default_eap_type = tls
c o p y _ r e q u e s t _ t o _ t u n n e l = no
u s e _ t u n n e l e d _ r e p l y = no
include_length = yes
}
peap {
d e f a u l t _ e a p _ t y p e = mschapv2
c o p y _ r e q u e s t _ t o _ t u n n e l = no
u s e _ t u n n e l e d _ r e p l y = no
}
mschapv2 {
}
}
Con la actual conguración del servidor ldap, a día de hoy debemos utilizar la segunda (apartado
7.6.2).
Normalmente las consultas al servidor LDAP se realizan por el puerto 389 (protocolo ldap) pero
dichas consultas se transmiten sin cifrar. Éste es el modo de acceso más habitual, en el que no
tendremos que especicar el puerto, ya que por defecto es el 389.
22
Si montamos nuestro servidor radius en la misma máquina en que hayamos montado una
réplica de ldap, tendremos que indicar que el servidor de ldap es localhost (server = localhost).
Pero, si queremos usar el servidor ldap del centro, lo único que tenemos que hacer es cambiar
server = localhost por server = ldap .
También indicaremos en qué rama de ldap se encuentran nuestros usuarios (basedn).
Y por otra parte denimos el ltro de acceso: El acceso a través de radius se hace con aquellos
usuarios cuyo nombre de usuario está en el campo dialupAccess.
Así es como quedaría el chero /etc/freeradius/modules/ldap, si usamos un acceso a ldap sin
cifrar:
ldap_connections_number = 5
timeout = 4
timelimit = 3
net_timeout = 1
tls {
s t a r t _ t l s = no
}
d i c t i o n a r y _ m a p p i n g = $ { c o n f d i r }/ l d a p . a t t r m a p
password_attribute = userPassword
edir_account_policy_check = yes
g r o u p n a m e _ a t t r i b u t e = radiusGroupName
g r o u p m e m b e r s h i p _ f i l t e r = " ( d i a l u p A c c e s s=%u ) "
g r o u p m e m b e r s h i p _ a t t r i b u t e = radiusGroupName
}
La nueva instalación del servidor ldap que actualmente tenemos funcionando, se ha congu-
rado para que el acceso a ciertos datos, como las contraseñas se encuentre restringido y no se
encuentren accesibles mediante un acceso anónimo.
Para realizar consultas seguras cifrando los datos con SSL, es necesario utilizar el
puerto 636 (protocolo ldaps o protocolo ldap seguro). Para ello, el servidor deberá
disponer de un certicado rmado por una entidad certicadora (CA) y habrá que
congurar slapd para que utilice los certicados.
Tendremos que indicar que el puerto a usar para las consultas ldap es el 636 (port = 636)
23
Imaginemos que montamos nuestro servidor radius en una máquina independiente y quer-
emos que consulte los datos en el ldap del centro; tendremos que indicar que el servidor de
ldap es ldap (server = ldap).
Por otra parte, tendremos que indicar cuál es el usuario administrador y su password.
Por otra parte denimos el ltro de acceso: El acceso a través de radius se hace con aquellos
usuarios cuyo nombre de usuario está en el campo dialupAccess.
Como vamos a utilizar conexiones SSL seguras a ldap, pero no vamos a hacer uso de tls en el
apartado tls de este chero, tendremos que indicar: start_tls = no.
Por otra parte, si usamos ldaps, tendremos que copiar la clave pública del servidor de ldap a un
lugar en la máquina que tenemos montado el servidor freeradius. Por ejemplo en /etc/ldap/ssl/:
cacertle = /etc/ldap/ssl/ldap-server-pubkey.pem
Una cuestión importante que me ha traído de cabeza al hacer las pruebas, ha sido
que en el atributo password_attribute = userPassword hacía que no funcionara la
autenticación. El problema era tan sencillo como indicar: password_attribute =
clearPassword Así es como quedaría el chero /etc/freeradius/modules/ldap, si usamos un
acceso a ldap seguro:
ldap_connections_number = 5
timeout = 4
timelimit = 3
net_timeout = 1
tls {
s t a r t _ t l s = no
cacertfile = / e t c / l d a p / s s l / l d a p − s e r v e r −pubkey . pem
require_cert = " never "
}
d i c t i o n a r y _ m a p p i n g = $ { c o n f d i r }/ l d a p . a t t r m a p
password_attribute = clearPassword
e d i r _ a c c o u n t _ p o l i c y _ c h e c k = no
g r o u p n a m e _ a t t r i b u t e = radiusGroupName
g r o u p m e m b e r s h i p _ f i l t e r = " ( d i a l u p A c c e s s=%u ) "
g r o u p m e m b e r s h i p _ a t t r i b u t e = radiusGroupName
}
24
7.7 Fichero users
En el chero /etc/freeradius/users especicamos las reglas de control de acceso para cada uno
de los grupos denidos mediante el atributo radiusGroupName en ldap.
Las líneas que comiencen por # se tratan como comentarios y son ignoradas.
Las entradas del chero users son procesadas en orden desde el principio hasta el nal del
archivo.
Si una entrada contiene el item Fall-Through = No, el procesamiento del chero se detiene
y no se procesarán más entradas.
Si la solicitud de acceso no coincide con ninguna de las entradas, la solicitud será rechazada.
7.7.1 En el servidor freeradius para la red 172.x.x.x podemos denir, por ejemplo,
tan sólo un par de reglas:
Una que permita el acceso a aquellos usuarios que tienen el atributo de grupo WPA2Enterprise,
es decir, profesores.
Otra regla que deniegue el acceso a cualquier usuario que no tenga este atributo.
Si quisiéramos añadir control horario para que el servidor tan sólo permita el acceso de 08:00 a
21:30, el chero quedaría de la siguiente manera:
Con ésto, tan sólo los usuarios con radiusGroupName = WPA2Enterprise tendrán acceso wi de
8:00 a 21:30
A los usuarios con radiusGroupName = E-1A (1ºA ESO) se les permite el acceso de 08:00
a 15:00.
25
A los usuarios con radiusGroupName = disabled no se les permite el acceso.
client 172.19.144.18 {
secret = unaclave
shortname = iesvalledeljerte31
}
client 172.19.144.11 {
secret = otraclave
shortname = iesvalledeljerte32
}
client 172.19.144.37 {
secret = unamas
shortname = a08
}
client 172.19.144.38 {
secret = otramas
shortname = a09
}
26
client 192.168.0.253 {
secret = clavecompartida
shortname = a u l a s
}
Como el servidor ltsp de cada aula tiene la IP 192.168.0.254, al punto de acceso del aula le asigno
la IP 192.168.0.253
Fichero /etc/freeradius/sites-enabled/freeradius-ies:
authorize {
preprocess
auth_log
eap {
ok = r e t u r n
}
files
ldap
checkval
expiration
logintime
}
authenticate {
Auth−Type LDAP {
ldap
}
# A l l o w EAP a u t h e n t i c a t i o n .
eap
}
preacct {
preprocess
acct_unique
27
suffix
files
}
accounting {
detail
unix
radutmp
a t t r _ f i l t e r . accounting_response
}
session {
radutmp
}
p o s t −a u t h {
exec
P o s t −Auth−Type REJECT {
attr_filter . access_reject
}
}
p r e −p r o x y {
}
p o s t −p r o x y {
}
Fichero /etc/freeradius/modules/checkval:
checkval {
# The attribute to look for in the request
i t e m −name = C a l l i n g − S t a t i o n −I d
Es importante tener en cuenta que los puntos de acceso envían el atributo Calling-Station-Id
de diferente forma: Algunos separan los elementos de la dirección MAC mediante :. Otros lo
separan mediante guiones.
28
8 Arranque de freeradius
Una vez que tenemos instalado freeradius, comprobamos que se ha instalado correctamente y
arranca antes de pasar a congurarlo.
# / e t c / i n i t . d/ f r e e r a d i u s start
# / e t c / i n i t . d/ f r e e r a d i u s stop
# / e t c / i n i t . d/ f r e e r a d i u s restart
# / e t c / i n i t . d/ f r e e r a d i u s f o r c e −r e l o a d
# / e t c / i n i t . d/ f r e e r a d i u s reload
# freeradius −X
Eso sí. No debemos olvidar parar el daemon antes de iniciar freeradius en modo debug.
9 Herramientas de administración
Para administrar freeradius, podemos usar freeradius-dialupadmin, un administrador gráco que
nos permite gestionar freeradius desde otra máquina usando el navegador.
29
10 Conguración de puntos de acceso
La conguración de los puntos de acceso es algo particular y va a variar dependiendo de la marca.
1. Por ejemplo, si estamos congurando el punto de acceso D-Link DAP-1353, debemos tener
en cuenta que tiene la IP 192.168.0.50 por defecto. Lo primero que tenemos que hacer es
conectar un equipo a la toma ethernet del router y congurarlo con una ip dentro del rango
192.168.0.X.
5. Cambiar la IP del punto de acceso, más que nada por tenerlo un poco organizado. Como
los servidores de aula tienen la IP 192.168.0.254, a los puntos de acceso de cada aula les
pondremos la ip 192.168.0.253
A continuación, os muestro un pantallazo de uno de mis puntos de acceso, para que veáis cómo
se congura como cliente del servidor freeradius:
30
11 Conguración de clientes
Veamos, en este apartado cómo aplicar nuestra conguración en tres clientes: NetworkManager,
Wicd y un cliente con sistema operativo Android:
11.1 NetworkManager
NetworkManager es el cliente gráco que actualmente tenemos montado en los portátiles de los
centros y que nos permite conectarnos a una red ethernet o inalámbrica.
Una de las ventajas de NetworkManager es que nos permite establecer una conexión inalám-
brica y una conexión ethernet al mismo tiempo.
Lo he probado con EAP-TTLS/PAP y funciona, así que pongo a continuación una captura
de pantalla en la que se pueden ver los datos que es necesario especicar para conectarnos a una
red con este tipo de seguridad:
31
Hace tiempo, NetworkManager tenía un problema: Que no permitía establecer una conexión
hasta que el usuario no hubiera iniciado sesión en el sistema. Pero, a partir de la versión 0.7, esa
deciencia quedó resuelta.
11.1.1 Establecer una conexión wi antes de iniciar sesión mediante NetworkMan-
ager
Como ya hemos dicho, a partir de la versión 0.7, NetworkManager ya permite establecer conex-
iones a redes wi durante el arranque del sistema. Veamos cómo lograrlo:
Si echamos un vistazo al chero /etc/NetworkManager/NetworkManager.conf, veremos que,
como mínimo, contiene lo siguiente:
[ main ] p l u g i n s=i f u p d o w n , k e y f i l e
[ ifupdown ] managed= f a l s e
NetworkManager usa "plugins" que parsean y almacenan conguraciones en disco que se en-
contrarán disponibles para NetworkManager antes de que cualquier usuario haya iniciado sesión.
El plugin "keyle" nos va a permitir hacer lo que queremos: Almacenar la conguración de
conexión de nuestra red y establecer dicha conexión antes de que iniciemos la sesión. Si no se
encontrara añadida la palabra keyle en plugins, dentro de este chero, lo añadimos y reiniciamos
NetworkManager:
# / e t c / i n i t . d / n e t w o r k −manager restart
Por defecto, las conguraciones de las redes a las que se conecta cada usuario, se almacenan
en un directorio dentro de su home, concretamente en:
/home/USUARIO / . g c o n f / s y s t e m / n e t w o r k i n g / w i r e l e s s / n e t w o r k s /
/ e t c / NetworkManager / s y s t e m − c o n n e c t i o n s / n o m b r e c o n e x i o n
Bien, pues una vez activado el plugin keyle, no tenemos más que crear nuevas conexiones,
en el entorno gráco:
32
Haciendo clic con el botón derecho sobre el icono de nm-applet y seleccionando la opción
"Editar las conexiones".
Una vez introducidos los parámetros de conguración de la red, marcamos las casillas "Conectar
automáticamente" y "Disponible para todos los usuarios", como se muestra en la imagen de
ejemplo:
Nos pedirá que introduzcamos la password de root para poder almacenar la conguración y
la almacenará en:
/ e t c / NetworkManager / s y s t e m − c o n n e c t i o n s / n o m b r e c o n e x i o n
dentro de un chero que comienza por la palabra Auto, seguido del nombre de la red.
Si nos desplazamos al directorio /etc/NetworkManager/system-connections/, veremos que se
encuentra creado el chero con los datos necesarios para establecer la conexión.
Una vez hecho ésto, cada vez que encendamos el equipo, se habrá establecido la conexión
inalámbrica antes de iniciar la sesión, algo muy útil para las actualizaciones de los portátiles del
centro, vía puppet.
Cuando realicé todo lo que comento en el apartado anterior para convertir una conexión de
usuario en una conexión de sistema, me di cuenta de que había un problema: Si guardaba la
conexión de usuario como conexión del sistema, al volver a editarla, por ejemplo, para modicar
la password del usuario, el sistema me pedía la password de root. Si ésto era así, cuando un
usuario cambiara su contraseña de acceso, debería cambiarla posteriormente en NetworkManager,
pero no podría hacerlo, porque no conocería la password de root. Investigando un poco el
funcionamiento de NetworkManager, descubrí que la solución era modicar las políticas denidas
para esta herramienta.
NetworkManager usa PolicyKit para ofrecer un control de acceso "de grano no" a carac-
terísticas especícas para asegurar que el administrador del sistema pueda controlar qué pueden
33
hacer y que no pueden hacer los usuarios. Por ejemplo: Controlar que los usuarios puedan editar
conexiones de sistema, crear redes adhoc abiertas, etc...
Para solucionar este problema, tendremos que cambiar la política de NetworkManager, mod-
icando el chero:
</ m e s s a g e >
<d e f a u l t s >
</ d e f a u l t s >
</ a c t i o n >
Para modicarlo no tenemos más que jarnos en que es la sección que nos permite modicar
conexiones de sistema (Modify system connections). Para ser más exactos, cambiaremos la línea
que dice:
por:
Guardamos y listo. Ahora cuando el usuario tenga que cambiar los parámetros de conexión,
como por ejemplo, su clave, NetworkManager no le pedirá la password de administrador.
Las posibles opciones son:
auth_admin
auth_admin_keep
yes
no
Un valor de "auth_admin" hará que se pida la password de administrador cada vez que un
usuario quiera hacer cambios en la conexión.
Un valor de "auth_admin_keep" hará que se pida la password de administrador tan sólo
una vez y se cacheará para no volver a pedírsela al usuario durante la misma sesión.
Un valor de "yes" hará que no se pida la password de administrador al usuario cuando éste
quiera modicar la conexión. Éste es el valor que nosotros necesitamos usar en este caso.
Por último, un valor de "no" signica que se deniega el permiso completamente.
Aprovechando que fui clonando de nuevo los portátiles y tenía que cachear las credenciales de
acceso de los nuevos usuarios, para automatizar un poco la conguración de acceso wi, creé:
addusuario.sh
34
#!/ b i n / b a s h
# E s t e b a n M. Navas Martín
HOST= ` h o s t n a m e `
clear
DIALOG=$ {DIALOG=d i a l o g }
t e m p f i l e =` t e m p f i l e 2>/ d e v / n u l l ` || t e m p f i l e =/tmp/ t e s t $ $
r e t v a l =$ ?
case $retval in
0)
USUARIO= ` c a t $tempfile `
if [ "$USUARIO" ] ; then
r e t v a l =$ ?
case $retval in
0)
PASSWORD= ` c a t $tempfile `
;;
*)
$DIALOG −− t i t l e "ERROR" −− c l e a r \
exit 1
esac
fi
;;
*)
$DIALOG −− t i t l e "ERROR" −− c l e a r \
exit 1
esac
cd /tmp
if [ "$USOPROFESOR" ]; then
r e t v a l =$ ?
if [ $retval −e q 0 ]; then
sed " s /USER/$USUARIO/ " Auto \ IESVALLEDELJERTE3 > /tmp/ Auto \ IESVALLEDELJERTE3 . 1
fi
else
35
wget −O /tmp/ Auto \ $AULA −i e s v a l l e d e l j e r t e 3 h t t p : / / s e r v i d o r / f i c h e r o s / Auto \ $AULA −i e s v a l l e d e l j e r t e 3
r e t v a l =$ ?
if [ $retval −e q 0 ]; then
fi
fi
fi
Como podemos, ver, el script pregunta por el nombre y la password del usuario, se descarga
del servidor del centro una plantilla en la que congura el acceso wi con los datos de dicho
usuario y cachea sus credenciales de acceso.
En el directorio cheros del servidor nfs (/var/www/cheros), colocamos la plantilla de conex-
ión de cada aula para que el script pueda descargarla. Y si tenemos una plantilla de conexión
para portátiles de profesores, la colocamos también allí.
Veamos un ejemplo de plantilla:
a08-iesvalledeljerte3
[ connection ]
i d=Auto −i e s v a l l e d e l j e r t e 3
a08
t y p e =802−11− w i r e l e s s
t i m e s t a m p=0
[802 −1 x ]
e a p= t t l s ;
i d e n t i t y =USER
phase2 −a u t h=pap
p a s s w o r d=PASSWORD
[ ipv4 ]
method=a u t o
[ ipv6 ]
method=i g n o r e
[802 − 11 − w i r e l e s s ]
ssid =97;48;56;45;105;101;115;118;97;108;108;101;100;101;108;106;101;114;116;101;51;
mode= i n f r a s t r u c t u r e
seen −b s s i d s = 3 4 : 0 8 : 0 4 : 9 9 : e 5 : 5 c ;
s e c u r i t y =802 −11− w i r e l e s s − s e c u r i t y
[802 − 11 − w i r e l e s s − s e c u r i t y ]
key −mgmt=wpa−e a p
La forma más sencilla de crear la plantilla es usar un portátil, crear la conguración de forma
gráca y guardar la plantilla como disponible para todos los usuarios. Luego, nos vamos a
la carpeta /etc/NetworkManager/system-connections/ y desde allí la copiamos al servidor nfs:
servidor:/var/www/cheros/
Por otra parte, para simplicar la tarea de congurar la plantilla de acceso wi, he
colocado en /root/ un script de login (.bash_login) mediante una tarea puppet en la
36
clase especica-portatil-alumno que se ejecutará cuando el usuario root haga login
y me permitirá congurar la plantilla de acceso wi, si no está congurada aún, y
cachear automáticamente las credenciales del usuario: .bash_login.sh
HOST= ` hostname `
AULA= ` e x p r substr $HOST 1 3`
USOPROFESOR= ` g r e p " portatil −p r o f e s o r " / etc / escuela2 .0 `
if [ "$USOPROFESOR" ]; then
FICHEROCONFIG= ` l s / e t c / NetworkManager / s y s t e m − c o n n e c t i o n s / | g r e p IESVALLEDELJE
else
FICHEROCONFIG= ` l s / e t c / NetworkManager / s y s t e m − c o n n e c t i o n s / | g r e p $AULA`
fi
clear
DIALOG=$ {DIALOG=d i a l o g }
t e m p f i l e =` t e m p f i l e 2>/ d e v / n u l l ` || t e m p f i l e =/tmp/ t e s t $ $
trap "rm −f $tempfile " 0 1 2 5 15
r e t v a l=$ ?
case $retval in
0)
USUARIO= ` c a t $tempfile `
if [ "$USUARIO" ] ; then
r e t v a l=$ ?
case $retval in
0)
PASSWORD= ` c a t $tempfile `
;;
*)
$DIALOG −− t i t l e "ERROR" −− c l e a r \
−−msgbox " Es n e c e s a r i o introducir la password del usuario ." 12
esac
37
fi
;;
*)
$DIALOG −− t i t l e "ERROR" −− c l e a r \
−−msgbox " Es n e c e s a r i o introducir el login del usuario ." 12 46
esac
if [ −z "$WIFICONFIGURADA" ]; then
r e t v a l=$ ?
if [ $retval −e q 0 ]; then
sed " s /USER/$USUARIO/" /tmp/ Auto \ IESVALLEDELJERTE3 > /tmp/ Auto \ IESV
sed " s /PASSWORD/$PASSWORD/" /tmp/ Auto \ IESVALLEDELJERTE3 . 1 > / e t c / N
chmod 600 / e t c / NetworkManager / s y s t e m − c o n n e c t i o n s / Auto \ IESVALLEDELJE
r e t v a l=$ ?
if [ $retval −e q 0 ]; then
sed " s /USER/$USUARIO/" /tmp/ Auto \ $AULA− i e s v a l l e d e l j e r t e 3 > /tmp/ Aut
sed " s /PASSWORD/$PASSWORD/" /tmp/ Auto \ $AULA− i e s v a l l e d e l j e r t e 3 . 1 > /
chmod 600 / e t c / NetworkManager / s y s t e m − c o n n e c t i o n s / Auto \ $AULA− i e s v a l l
38
if [ "$USUARIO" ] && [ "$PASSWORD" ]; then
# Cacheamos las credenciales de usuario
cc_test −s t o r e any $USUARIO $PASSWORD
fi
fi
Como me interesaba tener el script en los portátiles, por si necesito re-congurar la wi
y/o cachear las credenciales, he colocado, mediante una tarea puppet en la clase especica-
portatil-alumno:
addusuario.sh en /usr/local/sbin/
.bash_login en /root/
file {
" a d d u s u a r i o . sh " :
p a t h => "/ u s r / l o c a l / s b i n / a d d u s u a r i o . s h " ,
owner => r o o t , g r o u p => r o o t , mode => 7 5 5 ,
s o u r c e => " p u p p e t : / / p u p p e t i n s t i t u t o / f i l e s / p o r t a t i l −alumno / a d d u s u a r i o . s h "
11.2 Wicd
Nuestros portátiles inicialmente tenían Wicd Network Manager como herramienta de gestión de
redes. Wicd es un programa muy ligero que no tiene muchas dependencias para ser instalado.
El problema es que Wicd no disponía de una plantilla que nos permitiera conectarnos a
nuestra red usando EAP-TTLS. Así que tuve que crearla.
Actualmente, ya no usamos WiCD, por los problemas de conexión que se han tenido, pero
por si alguien quisiera usarlo,
name = EAP−TTLS
a u t h o r = E s t e b a n M. Navas
version = 1
require identity * Identity password * Password
−−−−−
c t r l _ i n t e r f a c e =/ v a r / r u n / w p a _ s u p p l i c a n t
n e t w o r k={
s s i d ="$_ESSID"
s c a n _ s s i d=$_SCAN
key_mgmt=WPA−EAP
p r o t o=WPA2
p a i r w i s e=CCMP TKIP
g r o u p=CCMP TKIP
e a p=TTLS
i d e n t i t y ="$_IDENTITY"
39
p a s s w o r d="$_PASSWORD"
p h a s e 2="a u t h=PAP"
}
Creamos un archivo llamado instituto, por ejemplo, dentro del directorio /etc/wicd/encryp-
tion/templates :
nano / e t c / wicd / e n c r y p t i o n / t e m p l a t e s / i n s t i t u t o
Para congurar el acceso a nuestra red hacemos clic en Propiedades . Se nos abrirá una
ventana en la que haremos clic en Usar cifrado y seleccionaremos el cifrado EAP-TTLS:
40
Al desplegar la lista de tipos de cifrado nos aparecerá entre ellos el que hemos creado: Lo
seleccionamos:
Una vez seleccionado EAP-TTLS, introducimos el nombre y la password del usuario con el
que vamos a entrar. Y ya tendremos congurado el acceso.
Para conectar, haremos clic en el botón Conectar y listo.
41
11.3 Android
Algunos profesores me han preguntado si podían conectarse a la wi del centro usando sus móviles
Android. Como no hay ningún problema, incluyo en este apartado la conguración a especicar
en el móvil para establecer la conexión:
Identidad: milogin
Contraseña: mipassword
Veámoslo en imágenes:
Lo primero que hacemos es Activar Wi-Fi. Una vez activada, nos desplazamos en la
pantalla y seleccionamos Añadir red Wi-Fi. Veremos una pantalla en la que tendremos que
seleccionar nuestro SSID e introducir los datos de conexión:
42
12 Instalación de freeradius en un servidor del instituto
Como ya vimos en el apartado 3 de este documento, la idea es tener dos redes:
Una vía de acceso wi general en la red principal del centro, a la que, en principio sólo
acceden profesores.
Una red wi en la subred de cada aula a la que acceden los alumnos del aula y a la que
también pueden acceder los profesores.
Viendo la extensión del documento, el procedimiento puede parecer un poco complicado. Así
que, para que se vea lo sencillo que puede ser, voy a tratar de resumir los pasos a realizar para
convertir un servidor de terminales en servidor freeradius para controlar el acceso inalámbrico
de los alumnos de un aula y de profesores. La conguración de un servidor de terminales para la
red principal del centro se haría, básicamente, del mismo modo. Prácticamente, no cambiarían
más que las reglas de acceso.
# a p t −g e t install freeradius f r e e r a d i u s −l d a p
43
O instalamos el paquete freeradius2ies-0.2_amd64.deb, si el servidor LTSP si el sistema
operativo es de 64 bits.
Por ejemplo, si vamos a instalar freeradius en un servidor LTSP, que tiene un sistema de 64 bits:
Hace copia de seguridad de los cheros originales de freeradius que va a modicar, añadién-
doles la extensión .dpkg.
Copia los cheros con la conguración necesaria para usar la autenticación wi mediante
EAP-TTLS/PAP.
Deja una copia de dicha conguración en cheros con extensión .ies, por si el usuario
quisiera restaurar la conguración en algún momento.
/etc/freeradius/radiusd.conf
/etc/freeradius/eap.conf
/etc/freeradius/modules/ldap
/etc/freeradius/clients.conf
/etc/freeradius/users
/etc/freeradius/sites-available/freeradius-ies
/etc/freeradius/sites-enabled/freeradius-ies
También se nos pedirá que introduzcamos la password del administrador de ldap y la pondrá
en el chero /etc/freeradius/modules/ldap. Esto es necesario porque usamos un acceso a ldap
cifrado.
Por último, nos mostrará un mensaje en el que nos informa de que para terminar
de congurar freeradius es necesario:
Modicar el chero /etc/freeradius/users con las reglas de control de acceso a la red wi.
44
12.3.1 Modicar /etc/freeradius/clients.conf
En este chero, añadiremos los datos de todos los puntos de acceso que vayan a ser clientes del
servidor freeradius que estamos congurando.
En el chero de conguración tan sólo he incluido un punto de acceso que sería el que daría
servicio al aula, pero se podrían añadir todos los que quisiéramos.
client 192.168.0.253 {
secret = clavecompartida
shortname = a u l a s
}
En la línea que dice secret = clavecompartida cambiaremos la clave. Esta clave será la
misma que conguraremos en el punto de acceso (secreto compartido).
Por último, modicaremos el chero /etc/freeradius/users con las reglas que queramos. Si os
jáis, he incluido una reglas que podrían ser básicas para un aula, pero que se pueden modicar
según las necesidades:
La regla Ldap-Group == E-1B está comentada a propósito. Para que se aplique, quitáis el
comentario y en el valor entre comillas especicáis el grupo de clase que corresponda.
13 hostapd+freeradius en Debian
Me habían dicho que, por alguna razón, no era posible hacer funcionar hostapd con freeradius.
Así que, ahora que tenía a mano una tarjeta Dlink DWA-556 y quería montarla en un servidor de
terminales para que actuara como punto de acceso, me he puesto a probarlo instalando hostapd
en un servidor de terminales en el que anteriormente había instalado freeradius.
El servidor LTSP tiene Debian Lenny. Tengo que decir que con el kernel 2.6.30-1 el driver de
hostapd no funcionaba muy bien después de un tiempo. Actualicé a un kernel 2.6.32 de backports
y desde entonces no he vuelto a tener ningún problema.
La conclusión, después de unas cuantas pruebas y conguraciones, es que la combinación de
hostapd+freeradius funciona. Es decir, que es posible montar un punto de acceso en un equipo
y que la autenticación se haga mediante un servidor freeradius.
Personalmente preero utilizar un punto de acceso Dlink DAP-1353 en lugar de una tarjeta
Dlink DWA-556 funcionando con hostapd, por varias razones, pero principalmente por dos:
El punto de acceso me aporta más funcionalidad, como por ejemplo, gestionar los canales de
forma automática, algo interesante para evitar que las señales de puntos de acceso cercanos
se solapen e intereran.
45
Teniendo en cuenta que ya tenemos instalado freeradius, lo primero que habría que hacer sería
instalar hostapd:
Una vez instalado, vamos a ver qué cheros tenemos que modicar para usar hostapd
con freeradius en el IES:
/etc/network/interfaces
/etc/default/dhcp3-server
/etc/freeradius/clients.conf
/etc/hostapd/hostapd.conf
Hasta ahora, la interfaz eth0 tenía la dirección IP 192.168.0.254. Como el servidor ltsp en el
que vamos a congurar hostapd ya no se va a usar como servidor de terminales, se la ponemos
a la interfaz wlan0.
#
# This is a POSIX shell fragment
46
#
De este modo, le decimos a DHCP que debe escuchar peticiones en eth0 y wlan0 (aunque
eth0 no se va a usar en este caso).
client a22 −p r o {
ipaddr = 192.168.0.254
secret = clavecompartida
}
En el caso anterior, estamos diciendo a freeradius que tendrá un cliente con IP 192.168.0.254
y clave "clavecompartida". En el chero hostapd, tendremos que especicar quién es el servidor
freeradius y cuál es la clave compartida entre ambos.
i n t e r f a c e =w l a n 0
c o u n t r y _ c o d e=ES
d r i v e r=n l 8 0 2 1 1
l o g g e r _ s y s l o g =−1
l o g g e r _ s y s l o g _ l e v e l =2
l o g g e r _ s t d o u t=−1
l o g g e r _ s t d o u t _ l e v e l =2
d u m p _ f i l e=/tmp/ h o s t a p d . dump
c t r l _ i n t e r f a c e =/ v a r / r u n / h o s t a p d
s s i d=IESVALLEDELJERTE3PRUEBAS
m a c a d d r _ a c l=0
47
hw_mode=g
c h a n n e l =11
wme_enabled=1
i e e e 8 0 2 1 1 n =1
a u t h _ a l g s =3
i e e e 8 0 2 1 x =1
e a p o l _ v e r s i o n =2
e a p _ m e s s a g e=h e l l o −IES−AP
e a p o l _ k e y _ i n d e x _ w o r k a r o u n d=1
wpa=3
wpa_key_mgmt=WPA−EAP
w p a _ p a i r w i s e=TKIP CCMP
wpa_group_rekey =600
wpa_gmk_rekey=86400
e a p _ s e r v e r =0
own_ip_addr = 1 9 2 . 1 6 8 . 0 . 2 5 4
n a s _ i d e n t i f i e r=a22AP
auth_server_addr = 1 9 2 . 1 6 8 . 0 . 2 5 4
a u t h _ s e r v e r _ p o r t =1812
a u t h _ s e r v e r _ s h a r e d _ s e c r e t=c l a v e c o m p a r t i d a
acct_server_addr =192.168.0.254
a c c t _ s e r v e r _ p o r t =1813
a c c t _ s e r v e r _ s h a r e d _ s e c r e t=c l a v e c o m p a r t i d a
# / e t c / i n i t . d/ n e t w o r k i n g restart
# / e t c / i n i t . d / dhcp3− s e r v e r restart
# / e t c / i n i t . d/ h osta pd restart
# / e t c / i n i t . d/ f r e e r a d i u s restart
48
14.1 Fichero /etc/network/interfaces
Me aseguro de que ya tengo denido el interfaz wlan0 en el chero /etc/network/interfaces:
#
# This is a POSIX shell fragment
#
49
subnet 192.168.1.0 netmask 255.255.255.0 {
range 192.168.1.10 192.168.1.253;
option routers 192.168.1.254;
option b r o a d c a s t −a d d r e s s 192.168.1.255;
option domain−name− s e r v e r s 172.19.144.3;
option domain−name " v a l l e d e l j e r t e 3 " ;
}
Con las líneas que he añadido, deno la conguración de red que se va a asignar a las
máquinas que se conecten vía wi al servidor que estamos congurando como punto de acceso.
Estas máquinas estarán en la red 192.168.1.0
En cuanto a los terminales, se les seguirá asignando direcciones del rango 192.168.0.0, tal y
como está denido en el servidor de ldap.
a22 −p r o :~# cp / e t c / i n i t . d / e n a b l e −n a t / e t c / i n i t . d / e n a b l e −n a t − w i f i
#! / bin / sh
### BEGIN INIT INFO
# Provides : e n a b l e −n a t − w i f i
# R e q u i r e d −S t a r t : $remote_fs
# S h o u l d −S t a r t : $network
# R e q u i r e d −S t o p : $remote_fs
# S h o u l d −S t o p : $network
# D e f a u l t −S t a r t : 2 3 4 5
# D e f a u l t −S t o p : 0 1 6
# S h o r t −D e s c r i p t i o n : E n a b l i n g NAT f o r clients behind wlan0
# Description : Enabling Network Address Translation for clients
# sitting in the thin client network behind wlan0
### END INIT INFO
IPTABLES=/ s b i n / i p t a b l e s
NETWORK_TO_NAT=
OUTSIDE_IF=e t h 3
50
NETWORK_TO_NAT= " 1 9 2 . 1 6 8 . 1 . 0 / 2 4 "
fi
if [ −f / e t c / d e f a u l t / e n a b l e −n a t − w i f i ] ; then
. / e t c / d e f a u l t / e n a b l e −n a t − w i f i
fi
do_status ( ) {
$IPTABLES −L − t nat | grep −A3 POSTROUTING
}
is_enabled () {
if do_status | grep −q "$NETWORK_TO_NAT" ; then
true
else
false
fi
}
do_start ( ) {
if is_enabled ; then
echo "NAT f o r clients on n e t w o r k $NETWORK_TO_NAT a l r e a d y enabled . "
else
echo " E n a b l i n g NAT f o r clients on n e t w o r k $NETWORK_TO_NAT. "
$IPTABLES −t nat −A POSTROUTING −s $NETWORK_TO_NAT −o $OUTSIDE_IF −j MASQUE
fi
do_status
}
do_stop ( ) {
if is_enabled ; then
echo " D i s a b l i n g NAT f o r clients on n e t w o r k $NETWORK_TO_NAT. "
$IPTABLES −F − t nat
else
echo "NAT f o r clients on n e t w o r k $NETWORK_TO_NAT a l r e a d y disabled ."
fi
do_status
}
51
do_start
;;
stop )
do_stop
;;
r e s t a r t | f o r c e −r e l o a d )
do_stop
do_start
;;
status )
do_status
;;
*)
echo " Usage : $0 { s t a r t | s t o p | r e s t a r t | f o r c e − r e l o a d | s t a t u s }"
exit 2
;;
esac
exit 0
# insserv / e t c / i n i t . d / e n a b l e −n a t − w i f i
insserv leerá las cabeceras del archivo enable-nat-wi y creará los enlaces necesarios para
iniciar y parar el servicio en los niveles denidos en dichas cabeceras.
52