Está en la página 1de 52

INSTALACIÓN DE FREERADIUS PARA AUTENTICACIÓN

WIFI con WPA2 Enterprise + EAP-TTLS/PAP + RADIUS +


LDAP
Esteban M. Navas Martín
Fecha última modicación: 28/02/2012

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

4 Estructura LDAP para RADIUS 5


4.1 Añadir radius.schema a ldap . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 6
4.2 Modicar el esquema LDAP de los usuarios: addradiustoldap . . . . . . . . . . . 7
4.3 Añadir los usuarios de un grupo a su grupo wi: addusertowigroup . . . . . . . 8
4.4 Desactivar el acceso wi de todos los alumnos de un grupo: disablewigroup . . . 10
4.5 Desactivar el acceso wi de un alumno de un grupo: disablewiuser . . . . . . . . 11
4.6 Activar el acceso wi de un alumno asignándolo a un grupo: enablewiuser . . . 12

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

10 Conguración de puntos de acceso 30

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

12 Instalación de freeradius en un servidor del instituto 43


12.1 Instalar el paquete radiustoldap-0.1 en nuestro equipo de administrador . . . . . 43
12.2 Instalar freeradius en el servidor LTSP . . . . . . . . . . . . . . . . . . . . . . . . 43
12.3 Instalar paquetes para congurar el servidor freeradius en el servidor LTSP . . . 43
12.3.1 Modicar /etc/freeradius/clients.conf . . . . . . . . . . . . . . . . . . . . . 45
12.3.2 Modicar /etc/freeradius/users . . . . . . . . . . . . . . . . . . . . . . . . 45

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

14 Servidor LTSP en eth0 y AP con hostapd en wlan0 48


14.1 Fichero /etc/network/interfaces . . . . . . . . . . . . . . . . . . . . . . . . . . . 49
14.2 Fichero /etc/default/dhcp3-server . . . . . . . . . . . . . . . . . . . . . . . . . . 49
14.3 Fichero /etc/dhcp3/dhcpd.conf . . . . . . . . . . . . . . . . . . . . . . . . . . . . 49
14.4 Tomamos como modelo el chero /etc/init.d/enable-nat . . . . . . . . . . . . . . 50
14.5 Fichero /etc/init.d/enable-nat-wi . . . . . . . . . . . . . . . . . . . . . . . . . . 50
14.6 Activar servicio enable-nat-wi . . . . . . . . . . . . . . . . . . . . . . . . . . . . 52

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.

Disponer de un servidor RADIUS nos proporciona la posiblidad de tener una in-


fraestructura de red wi segura y extensible.

2 Sistema elegido
Nos basaremos en una instalación Debian, a la que le añadimos todos los paquetes necesarios
para montar el servidor.

Usaremos como sistema base Debian por las siguientes cuestiones:

1. Es fácilmente actualizable.

2. Se integra perfectamente en la infraestructura actual, puesto que nuestros sistemas son


Debian.

3. Es posible instalarlo en una máquina independiente o en cualquiera de los otros servidores.

Como servidor utilizaremos freeradius, un servidor RADIUS de código abierto.

1 2
En cuanto al método de autenticación, me he decantado por EAP -TTLS /PAP. Motivos:

ˆ EAP-TTLS es un método de autenticación tunelado que implementa un sistema de dos


túneles de seguridad: Uno se crea para el intercambio de credenciales y otro para el traspaso
de la clave de cifrado de sesión con la que los puntos de acceso cifran el tráco con el
cliente que se conecta. Todo el tráco circula encriptado, de manera que nos proporciona
un sistema seguro de acceso a la red.

ˆ La autenticación se realiza solo con certicado de servidor y no es necesario generar cer-


ticados para cada cliente nuevo que desee conectarse a la red. Esto facilita el acceso de
nuevas máquinas a la red. Además, puesto que no tenemos que crear certicados para
3
los clientes, TTLS no nos obliga a disponer de una PKI Infraestructura de clave pública
activa.

ˆ 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.

ˆ De forma opcional EAP-TTLS permite usar certicado de cliente.

ˆ 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.

Microsoft no da soporte nativo a EAP-TTLS. Para nosotros, ésto no es ningún


problema puesto que nuestros clientes son LinEx. En cualquier caso, si quisiéramos
permitir el acceso wi de clientes Windows, siempre podríamos instalarles supli-
cantes como SecureW2 o Wpa_Supplicant.

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 permita realizar una conexión wi a profesores.

ˆ Un servidor radius en cada aula:

 que sólo permita realizar la conexión a los alumnos que tienen clase en dicho aula
dentro del horario de clases.

 que permita el acceso a profesores.

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.

3.1 Servidor radius en la intranet del centro


Siguiendo la propuesta, para dar servicio de acceso inalámbrico a profesores:

ˆ Instalamos un servidor freeradius en una máquina que tengamos disponible y la conectamos


a la intranet del centro para que preste servicio dentro de la red 172.x.x.x. Este servidor
podemos colocarlo en cualquier parte de esta red.

ˆ 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.

3.3 Elementos hardware necesarios


Los puntos de acceso o routers que utilicemos, como requisito básico deberán tener soporte para
802.1X RADIUS para que puedan congurarse como clientes de un servidor radius. No obstante,
recomiendo el siguiente punto de acceso: D-Link DAP-1353, por los siguientes motivos:

ˆ Es uno de los routers wi con soporte 802.1X RADIUS.

ˆ Es un punto de acceso N de 300 Mbps.

ˆ 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.

3.4 Procedimientos a realizar


Para disponer de este sistema de control de acceso inalámbrico, tendremos que realizar los sigu-
ientes procesos:

ˆ Preparar el servidor ldap para añadir el objeto radiusprole a los usuarios.

ˆ Instalar y congurar freeradius en los servidores LTSP que vayan a dar servicio de acceso
inalámbrico.

ˆ Congurar los puntos de acceso.

ˆ Congurar los clientes inalámbricos.

4 Estructura LDAP para RADIUS


Para controlar el acceso a la red inalámbrica, la idea es que cada usuario tenga dos atributos
más en su esquema:

ˆ 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.

Podemos actualizar el esquema de ldap con phpldapadmin, pero como es un poco


tedioso modicar uno a uno todos los usuarios para concederles o denegarles el
permiso de acceso wi, creé unos scripts que podemos tener disponibles instalando
un paquete: radiustoldap-0.1.deb que hice para ello. Este paquete instala cinco
scripts:

ˆ addradiustoldap: Añade el objetClass radiusprole y los atributos dialupAccess y radius-


GroupName a todos los usuarios, estableciendo su radiusGroupName a WPA2Enterprise
para profesores y disabled para alumnos. Podemos ejecutar este script todas las veces que
queramos porque tan sólo va a añadir los atributos a aquellos usuarios que no lo tuvieran
ya.

ˆ addusertowigroup: Cambia el valor del radiusGroupName de los alumnos de un grupo de


clase a su grupo. Ej: E-1A

ˆ disablewigroup: Cambia el valor del radiusGroupName de los alumnos de un grupo de


clase a disabled.

ˆ disablewiuser: Cambia el valor del radiusGroupName de un alumno a disabled.

ˆ enablewiuser: Cambia el valor del radiusGroupName de un alumno al grupo que intro-


duzcamos por teclado.

Para preparar nuestro servidor habría que hacer lo siguiente:

1. Añadir radius.schema a ldap (en los institutos ya está hecho, por tanto, no es necesario)

2. Añadir los atributos dialupAccess y radiusGroupName a los usuarios mediante: addradius-


toldap

4.1 Añadir radius.schema a ldap


Este apartado, en los institutos no tenemos que hacerlo. Ya está hecho vía puppet.

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.

Una vez copiado, modicamos el chero /etc/ldap/slapd.conf para incluir el


schema radius:

include / e t c / l d a p / schema / r a d i u s . schema

6
Añadimos la posibilidad de indexar por radiusAuthType en /etc/ldap/slapd.conf:

index radiusAuthType eq , pres

Guardamos el chero y realizamos la indexación:

l d a p :~# slapindex −f / etc / ldap / slapd . conf

Como hemos indexado como root, ajustamos el propietario del directorio /var/lib/l-
dap:

chown −R openldap : openldap / var / l i b / ldap

Por último, reiniciamos el servicio:

l d a p :~# / e t c / i n i t . d/ s l a p d restart

4.2 Modicar el esquema LDAP de los usuarios: addradiustoldap


addradiustoldap es un script perl que añade el objeto radiusprole, junto con los atributos
dialupAccess y radiusGroupName. Éste es su código:

#!/ usr / bin / perl


#
# Esteban M. Navas
# IES Valle del Jerte
# 05/10/2010
# Requisito : Instalar el módulo de perl libnet - ldap - perl

use Net :: LDAP ;

my $ldapserver = ldap ;
my $dialupAccess ;
my $radiusGroupName ;

print " Introduce la contraseña del administrador de ldap : ";


system " stty - echo "; # disable echo
chomp ( my $pass = < STDIN >) ;
system " stty echo "; # enable echo

$ldap = Net :: LDAP -> new (" $ldapserver ") or die " $@ ";

# Abrimos una conexión


$ldap -> bind (" cn = admin , ou = People , dc = instituto , dc = extremadura , dc = es ", password = > $pass );

print " Obteniendo usuarios ...\ n ";


$mesg = $ldap -> search ( filter = >"(&( objectClass = person ) (!( objectClass = radiusprofile ))) ", base
= >" ou = People , dc = instituto , dc = extremadura , dc = es ") ;
print " Lista de usuarios obtenida .\ n\n ";

@entries = $mesg -> entries ;

foreach $entry ( @entries ) {

my $homeDirectory = $entry -> get_value ( homeDirectory );


my $uid = $entry -> get_value ( uid ) ;
my @objectClass = $entry -> get_value ( objectClass ) ;

my $tieneinetOrgPerson = grep / inetOrgPerson /, @objectClass ;

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 " ]
] );
}
}

print " Proceso concluido .\ n\n ";

# 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.

4.3 Añadir los usuarios de un grupo a su grupo wi: addusertowigroup


Al ejecutar el script addradiustoldap ya tenía asignado a los profesores el radiusGroupName
= WPA2Enterprise y a los alumnos el radiusGroupName = disabled. Estableciendo tan sólo
un par de reglas en el chero /etc/freeradius/users ya podía conseguir que los usuarios con
radiusGroupName = WPA2Enterprise tuvieran acceso vía wi en cualquier momento y que los
usuarios con radiusGroupName = disabled no tuvieran acceso wi.
Para controlar que los usuarios de un determinado grupo, pudieran acceder al servidor radius
de su aula, tendría que asignarles un grupo especíco. Para ello me jé en los nombres de los
grupos de aula en el servidor ldap. Por ejemplo, en mi centro los alumnos de 1ºA ESO pertenecen
al grupo E-1A, los alumnos de 1ºB eso pertenecen al grupo E-1B, etc... Para garantizar que tan
sólo los alumnos de 1ºA ESO pudieran acceder al servidor freeradius de su aula, les asigné
como radiusGroupName = E-1A y creé una regla en el chero /etc/freeradius/users que tan sólo
permitiera el acceso a los alumnos de este aula.
En lugar de asignar el valor radiusGroupName = E-1A uno a uno para todos los alumnos de
1ºA ESO, lo que hice fue crear un script perl que preguntara por el nombre del grupo, y, a todos

8
los alumnos de dicho grupo les pusiera el radiusGroupName que el usuario del script especicara
por teclado:

#!/ usr / bin / perl


# ------------------------------------------------------------
# script : addusertowifigroup
# Author : Esteban M. Navas Martín
# Date : 15 -06 -2011
# Ver : 15 -06 -2011
# Requisito : Instalar el módulo de perl libnet - ldap - perl
#
# Purpose : This program add the users of a group to a wifi group modifying the radiusGroupName
#
# Copyright (c) 2011 Esteban M. Navas Martín < adminies . valledeljerte@edu . juntaextremadura . net >.
# All rights reserved .
# This program is free software ; you can redistribute it and / or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation ; either version 2 of the License , or
# ( at your option ) any later version .
# This program is distributed in the hope that it will be useful ,
# but WITHOUT ANY WARRANTY ; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE . See the
# GNU General Public License for more details .
# You should have received a copy of the GNU General Public License
# along with this program . If not , see < http :// www . gnu . org / licenses / >.

use Net :: LDAP ;

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 ;

print " Introduce la contraseña del administrador de ldap : ";


system " stty - echo "; # disable echo
chomp ( my $pass = < STDIN >);
system " stty echo "; # enable echo
print "\ n ";

print " Introduce el radiusGroupName a asignar : ";


chomp ( my $radiusGroupName = < STDIN >);

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 " $@ ";

# Abrimos una conexión


$ldap -> bind (" cn = admin , ou = People , dc = instituto , dc = extremadura , dc = es ", password = > $pass );

# Obtenemos los miembros del grupo elegido


$mesg = $ldap -> search ( base => $baseGroup , filter = >"(&( objectclass = posixGroup )
( groupType = school_class )( cn = $radiusGroupName ))");

$mesg -> code && die $mesg -> error ;

foreach $entry ( $mesg - > entries ) {


my ( @members ) = $entry - > get_value ( ' memberUid ');

foreach $memberUid ( @members ) {


$mesg2 = $ldap -> search ( base = > $basePeople , filter = >"(&( objectClass = radiusprofile )
( dialupAccess = $memberUid ))");

$mesg2 -> code && die $mesg2 -> error ;

@users = $mesg2 -> entries ;

foreach $user ( @users ) {


$uid = $user -> get_value (' uid ');
print " Procesando : $uid -> radiusGroupName : $radiusGroupName \ n ";
$res = $ldap -> modify ( $user -> dn () , replace =>

9
[ radiusGroupName => [" $radiusGroupName "] ] );
}
}
}

print " Proceso concluido .\ n\n ";


$ldap -> unbind ;

4.4 Desactivar el acceso wi de todos los alumnos de un grupo: disablewi-


group
Para desactivar el acceso wi a los alumnos de un grupo, creé un script perl que pregunta el
grupo a desactivar y cambia el valor de radiusGroupName de cada usuario del grupo a disabled
(radiusGroupName = disabled).

#!/ usr / bin / perl


# ------------------------------------------------------------
# script : disablewifigroup
# Author : Esteban M. Navas Martín
# Date : 15 -06 -2011
# Ver : 15 -06 -2011
# Requisito : Instalar el módulo de perl libnet - ldap - perl
#
# Purpose : This program disable the wifi access of users in a group
# changing the radiusGroupName to " disabled "
#
# Copyright (c) 2011 Esteban M. Navas Martín < adminies . valledeljerte@edu . juntaextremadura . net >.
# All rights reserved .

# This program is free software ; you can redistribute it and / or modify


# it under the terms of the GNU General Public License as published by
# the Free Software Foundation ; either version 2 of the License , or
# ( at your option ) any later version .

# This program is distributed in the hope that it will be useful ,


# but WITHOUT ANY WARRANTY ; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE . See the
# GNU General Public License for more details .
# You should have received a copy of the GNU General Public License
# along with this program . If not , see < http :// www . gnu . org / licenses / >.

use Net :: LDAP ;

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 ;

print " Introduce la contraseña del administrador de ldap : ";


system " stty - echo "; # disable echo
chomp ( my $pass = < STDIN >);
system " stty echo "; # enable echo
print "\ n ";

print " Introduce el radiusGroupName a desactivar : ";


chomp ( my $radiusGroupName = < STDIN >);

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 " $@ ";

# Abrimos una conexión


$ldap -> bind (" cn = admin , ou = People , dc = instituto , dc = extremadura , dc = es ", password = > $pass );

# Obtenemos los miembros del grupo elegido


$mesg = $ldap -> search ( base => $baseGroup , filter = >"(&( objectclass = posixGroup )

10
( groupType = school_class )( cn = $radiusGroupName ))");

$mesg -> code && die $mesg -> error ;

foreach $entry ( $mesg - > entries ) {


my ( @members ) = $entry - > get_value ( ' memberUid ');

foreach $memberUid ( @members ) {


$mesg2 = $ldap -> search ( base = > $basePeople , filter = >"(&( objectClass = radiusprofile )
( dialupAccess = $memberUid ))");

$mesg2 -> code && die $mesg2 -> error ;

@users = $mesg2 -> entries ;


foreach $user ( @users ) {
$uid = $user -> get_value (' uid ');
$res = $ldap -> modify ( $user -> dn () , replace =>
[ radiusGroupName => [" disabled "] ] );
print " Procesando : $uid -> radiusGroupName : disabled \n ";
}
}
}

print " Proceso concluido .\ n\n ";

$ldap -> unbind ;

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.

4.5 Desactivar el acceso wi de un alumno de un grupo: disablewiuser


Para desactivar el acceso wi de un solo alumno, creé un script perl que pregunta el username
del usuario que queramos desactivar y cambia el valor de radiusGroupName a disabled (radius-
GroupName = disabled).

#!/ usr / bin / perl


# ------------------------------------------------------------
# script : disablewifiuser
# Author : Esteban M. Navas Martín
# Date : 15 -06 -2011
# Ver : 15 -06 -2011
# Requisito : Instalar el módulo de perl libnet - ldap - perl
#
# Purpose : This program disable the wifi access of users in a group changing the
# radiusGroupName to " disabled "
#
# Copyright (c) 2011 Esteban M. Navas Martín < adminies . valledeljerte@edu . juntaextremadura . net >.
# All rights reserved .

# This program is free software ; you can redistribute it and / or modify


# it under the terms of the GNU General Public License as published by
# the Free Software Foundation ; either version 2 of the License , or
# ( at your option ) any later version .

# This program is distributed in the hope that it will be useful ,


# but WITHOUT ANY WARRANTY ; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE . See the
# GNU General Public License for more details .
# You should have received a copy of the GNU General Public License
# along with this program . If not , see < http :// www . gnu . org / licenses / >.

use Net :: LDAP ;

my $ldapserver = ldap ;
my $basePeople = " ou = People , dc = instituto , dc = extremadura , dc = es ";
my $userName ;

print " Introduce la contraseña del administrador de ldap : ";


system " stty - echo "; # disable echo

11
chomp ( my $pass = < STDIN >);
system " stty echo "; # enable echo
print "\ n ";

print " Introduce el username del usuario a desactivar : ";


chomp ( my $userName = < STDIN >);

if (! $userName ) {
print " $0 : Debe especificar el nombre del usuario a desactivar \ n ";
exit 1;
}

$ldap = Net :: LDAP -> new (" $ldapserver ") or die " $@ ";

# Abrimos una conexión


$ldap -> bind (" cn = admin , ou = People , dc = instituto , dc = extremadura , dc = es ", password = > $pass );

# Obtenemos el usuario
$mesg = $ldap -> search ( base => $basePeople , filter = >"(&( objectclass = posixAccount )( uid = $userName ))");

$mesg -> code && die $mesg -> error ;

foreach $entry ( $mesg - > entries ) {


$uid = $entry -> get_value (' uid ');
$res = $ldap -> modify ( $entry -> dn () , replace => [ radiusGroupName = > [" disabled "] ] );
print " Procesando : $uid -> radiusGroupName : disabled \n ";
}

print " Proceso concluido .\ n\n ";

$ldap -> unbind ;

4.6 Activar el acceso wi de un alumno asignándolo a un grupo: enablewiuser


Por ultimo, ya puestos, para activar el acceso wi de un solo alumno, creé un script perl que
pregunta el username del usuario que queramos desactivar, el grupo que le queremos asignar y
cambia el valor de radiusGroupName a dicho grupo.

#!/ usr / bin / perl


# ------------------------------------------------------------
# script : enablewifiuser
# Author : Esteban M. Navas Martín
# Date : 15 -06 -2011
# Ver : 15 -06 -2011
# Requisito : Instalar el módulo de perl libnet - ldap - perl
#
# Purpose : This program enable the wifi access of a user changing the radiusGroupName to value introd
#
# Copyright (c) 2011 Esteban M. Navas Martín < adminies . valledeljerte@edu . juntaextremadura . net >. All r

# This program is free software ; you can redistribute it and / or modify


# it under the terms of the GNU General Public License as published by
# the Free Software Foundation ; either version 2 of the License , or
# ( at your option ) any later version .

# This program is distributed in the hope that it will be useful ,


# but WITHOUT ANY WARRANTY ; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE . See the
# GNU General Public License for more details .
# You should have received a copy of the GNU General Public License
# along with this program . If not , see < http :// www . gnu . org / licenses / >.

use Net :: LDAP ;

my $ldapserver = ldap ;
my $basePeople = " ou = People , dc = instituto , dc = extremadura , dc = es ";
my $userName ;

print " Introduce la contraseña del administrador de ldap : ";


system " stty - echo "; # disable echo

12
chomp ( my $pass = < STDIN >);
system " stty echo "; # enable echo
print "\ n ";

print " Introduce el username del usuario a activar : ";


chomp ( my $userName = < STDIN >);

if (! $userName ) {
print " $0 : Debe especificar el nombre del usuario a activar \n ";
exit 1;
}

print "\ n ";

print " Introduce el radiusGroupName a asignar : ";


chomp ( my $radiusGroupName = < STDIN >);

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 " $@ ";

# Abrimos una conexión


$ldap -> bind (" cn = admin , ou = People , dc = instituto , dc = extremadura , dc = es ", password = > $pass );

# Obtenemos el usuario
$mesg = $ldap - > search ( base => $basePeople , filter = >"(&( objectclass = posixAccount )( uid = $userName ))");

$mesg -> code && die $mesg -> error ;

foreach $entry ( $mesg - > entries ) {


$uid = $entry -> get_value (' uid ');
$res = $ldap -> modify ( $entry -> dn () , replace => [ radiusGroupName = > [" $radiusGroupName "] ] );
print " Procesando : $uid -> radiusGroupName : $radiusGroupName \ n ";
}

print " Proceso concluido .\ n\n ";

$ldap -> unbind ;

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:

ˆ Instalar freeradius en Debian Squeeze.

ˆ Instalar freeradius en Debian Lenny.

ˆ Instalar freeradius desde código fuente.

5.1 Instalación de freeradius en Debian Squeeze


Nos aseguramos de tener los repositorios mínimos de squeeze en /etc/apt/sources.list:

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

Y después instalamos los paquetes:

# 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.

5.2 Instalación de freeradius en Debian Lenny


Inicialmente instalé freeradius desde el código fuente. Después comprobé que los paquetes del
repositorio lenny-backports funcionaban perfectamente con la conguración que había realizado
las pruebas. Así que, para facilitar la instalación de los mismos en nuestros centros, se subieron
al repositorio de LinEx.

5.2.1 Instalación desde los repositorios de LinEx

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

E instalar los paquetes:

# 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.

5.2.2 Instalación desde el repositorio lenny-backports

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:

# echo " deb h t t p : / /www . b a c k p o r t s . o r g / d e b i a n l e n n y −b a c k p o r t s main "


>> / e t c / a p t / s o u r c e s . l i s t

Luego actualizamos los índices de los repositorios:

# a p t −g e t update

Y, por último, instalamos los paquetes:

# 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

Si queremos disponer también de la herramienta freeradius-dialupadmin, instalaremos también


su paquete:

# 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:

# echo " freeradius hold " | dpkg −− s e t − s e l e c t i o n s


# echo " f r e e r a d i u s −common hold " | dpkg −− s e t − s e l e c t i o n s
# echo " libfreeradius2 hold " | dpkg −− s e t − s e l e c t i o n s
# echo " f r e e r a d i u s −l d a p hold " | dpkg −− s e t − s e l e c t i o n s

Si hemos instalado freradius-dialupadmin, lo bloqueamos también:

# echo " f r e e r a d i u s −d i a l u p a d m i n hold " | dpkg −− s e t − s e l e c t i o n s

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:

1. Usar el certicado que se crea automáticamente al instalar freeradius.

2. Crear un certicado autormado.

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.

Lo más sencillo es utilizar el certicado que se crea automáticamente al instalar freeradius. No


obstante, incluyo un apartado por si alguien necesita crear su propio certicado autormado.
Los certicados de freeradius se guardan por defecto en el directorio:

/ etc / freeradius / certs

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

6.2 Crear un certicado de servidor autormado


Si no queremos usar la clave y el certicado creados por defecto en la instalación de freera-
dius, podemos crear un certicado autormado para luego usarlo en nuestro servidor. El crear
un certicado de servidor autormado puede parecer complicado, pero como veremos, es muy
sencillo:
Lo primero es crear una clave privada:

# openssl genrsa −o u t s e r v e r . key 1024

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 ):

# openssl req −new −k e y s e r v e r . key −o u t server . 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.

ˆ Firmar el certicado mediante nuestra autoridad de certicación, si la tenemos.

Como en este apartado lo que estamos tratando es crear un certicado autormado, vamos a ver
cómo lo auto-rmamos:

# openssl x509 − r e q −d a y s 365 −i n server . csr −s i g n k e y s e r v e r . key


−o u t server . crt

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:

# cat s e r v e r . key server . crt > s e r v e r . pem


# cp s e r v e r . pem / e t c / s s l / c e r t s
# cp s e r v e r . key / etc / s s l / private

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

7.1 Fichero radiusd.conf


Si queremos que se que se guarden logs de las solicitudes de autenticación, lo activamos en la
siguiente sección del chero:

# Log authentication requests to the log file .


#
# allowed values : { no , yes }
#
auth = y e s

# Log passwords with the authentication requests .


# auth_badpass − logs password if it ' s rejected
# auth_goodpass − logs password if it ' s correct
#
# allowed values : { no , yes }
#
auth_badpass = y e s
a u t h _ g o o d p a s s = no

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:

# $INCLUDE sql . conf


# $INCLUDE s q l / mysql / c o u n t e r . c o n f
# $INCLUDE sqlippool . conf

7.2 Directorio sites-available


En la versión 2 de freeradius es posible crear diferentes servidores virtuales, de una forma muy
similar a como se crean en apache.

En el directorio sites-available se encuentran los archivos de conguración de cada


uno de los servidores virtuales que vayamos a crear. Y, por supuesto, cada uno de
estos servidores podría tener una conguración diferente.

Por poner un ejemplo, podríamos tener un servidor virtual asignado a un puerto,


tarjeta de red o dirección IP que atendiera a nuestros clientes LinEx usando una
conguración con un sistema de autenticación EAP-TTLS. Y otro servidor virtual
asignado a otro puerto, tarjeta de red o dirección IP que controlara la autenticación
de clientes Windows con un sistema de autenticación EAP-MCHAPv2. O, incluso,
podríamos denir un servidor radius y un proxy radius en diferentes servidores
virtuales.

Para más información sobre servidores virtuales, consultar el chero /etc/freeradius/sites-


available/README.

En este directorio existe un chero que dene un servidor precongurado: el chero


default. Para crear un nuevo servidor virtual, podemos hacer una copia del chero default.
Por ejemplo:

radius1 :/ etc / freeradius / sites − a v a i l a b l e# cp default f r e e r a d i u s −i e s

Como he congurado un servidor freeradius en cada aula, podríamos nombrar este chero con el
nombre del aula. Por ejemplo:

radius1 :/ etc / freeradius / sites − a v a i l a b l e# cp default a08

Este chero lo modicaremos después para adaptarlo a nuestras necesidades.

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 {
}

7.4 Directorio sites-enabled


Así como los servidores virtuales se denen en /etc/freeradius/sites-available, para activarlos
tenemos que crear un enlace en el directorio /etc/freeradius/sites-enabled. Para poder utilizar el
servidor denido en el apartado anterior, tenemos que activarlo. Activarlo es tan sencillo como
crear un enlace simbólico que apunte a este chero, en el directorio sites-enabled:

radius1 :/ etc / freeradius / sites −e n a b l e d#


ln −s ../ s i t e s −a v a i l a b l e / f r e e r a d i u s −i e s f r e e r a d i u s −i e s

7.5 Fichero eap.conf


Otro de los cheros que tenemos que congurar es el chero eap.conf. A continuación muestro
un listado de la conguración que he aplicado para lograr tener EAP-TTLS. No muestro los
comentarios para reducir el tamaño del listado.
En este chero, básicamente tenemos que denir dónde se encuentran los certicados del
servidor y de la autoridad de certicación. Indicaremos los directorios en que hemos almacenado
dichos certicados.
El directorio confdir es /etc/freeradius.
Una observación: Si ponemos en el mismo chero tanto la clave pública como la clave privada
del servidor, en las variables private_key_le y certicate_le tendremos que indicar el mismo
nombre de chero: radius1_keycert.pem.
En la conguración que muestro a continuación, se puede ver que tengo los cheros separados,
cuando inicialmente había puesto tanto la clave privada como el certicado juntas en el chero
radius1_keycert.pem. Ésto lo he modicado para que coincida con la conguración por defecto
de freeradius en Debian.

# eap . c o n f −− Configuration for EAP t y p e s (PEAP, TTLS , etc . )

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 {
}
}

He dejado peap y mschapv2, aunque no lo voy a usar de momento.

7.6 Fichero modules/ldap


ldap es el chero que nos permite congurar el acceso de freeradius a ldap. Se encuentra dentro
del directorio /etc/freeradius/modules/

Vamos a ver dos posibles conguraciones:

ˆ Comunicación freeradius <-> ldap sin cifrar: Puerto 389

ˆ Comunicación freeradius <-> ldap cifrada: Puerto 636

Con la actual conguración del servidor ldap, a día de hoy debemos utilizar la segunda (apartado
7.6.2).

7.6.1 Acceso a ldap sin cifrar

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:

# Lightweight Directory Access Protocol (LDAP)


#
ldap {
server = " localhost "
b a s e d n = " ou=P e o p l e , dc=i n s t i t u t o , dc=e x t r e m a d u r a , dc=e s "
filter = " d i a l u p A c c e s s=%u "

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
}

7.6.2 Acceso cifrado a ldap

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.

ˆ También indicamos en qué rama de ldap se encuentran nuestros usuarios (basedn).

ˆ 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:

# Lightweight Directory Access Protocol (LDAP)


ldap {
p o r t = 636
s e r v e r = " ldap "
i d e n t i t y = " cn=admin , ou=P e o p l e , dc=i n s t i t u t o , dc=e x t r e m a d u r a , d c=e s "
p a s s w o r d = PASSWORDLDAP
b a s e d n = " ou=P e o p l e , dc=i n s t i t u t o , dc=e x t r e m a d u r a , dc=e s "
filter = " d i a l u p A c c e s s=%u "
b a s e _ f i l t e r = " ( o b j e c t c l a s s=r a d i u s p r o f i l e ) "

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.

ˆ La entrada especial DEFAULT representa cualquier usuario.

ˆ 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 una entrada contiene el item Fall-Through = Yes, se continúa el procesamiento de la


siguiente entrada en orden.

ˆ 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.

DEFAULT Ldap−Group == WPA2Enterprise


F a l l −Through = no

DEFAULT Auth−Type := Reject


Reply −M e s s a g e = " P l e a s e call the helpdesk ."

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:

DEFAULT Ldap−Group == WPA2Enterprise , L o g i n −Time := "Wk0800 − 2130"


F a l l −Through = no

DEFAULT Auth−Type := Reject


Reply −M e s s a g e = " P l e a s e call the helpdesk ."

Con ésto, tan sólo los usuarios con radiusGroupName = WPA2Enterprise tendrán acceso wi de
8:00 a 21:30

7.7.2 En los servidores freeradius de las aulas (subredes 192.x.x.x), podríamos


denir las siguientes reglas:

ˆ A los usuarios con radiusGroupName = WPA2Enterprise (profesores) se les permite el


acceso de 08: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.

De acuerdo con el ejemplo, el chero users quedaría más o menos así:

DEFAULT Ldap−Group == d i s a b l e d , Auth−Type := Reject


Reply −M e s s a g e = " A c c o u n t disabled . Please call the helpdesk ."

DEFAULT Ldap−Group == "E−1B" , L o g i n −Time := "Wk0800 − 1500"

DEFAULT Ldap−Group == " WPA2Enterprise " , L o g i n −Time := "Wk0800 − 2130"


F a l l −Through = no

DEFAULT Auth−Type := Reject


Reply −M e s s a g e = " P l e a s e call the helpdesk ."

7.8 Fichero clients.conf


En el chero clients.conf denimos los clientes que van a tener acceso a nuestro servidor radius:
nuestros puntos de acceso, nuestros routers wi, etc...
Para las pruebas en el localhost, hemos denido un cliente 127.0.0.1. Una vez hechas las
pruebas, podemos borrarlo. En cuanto a las passwords de los puntos de acceso, no olvidemos
que es un secreto compartido y en secret=clave debemos especicar la clave compartida que
hemos denido para el acceso radius en cada punto de acceso. Además, debemos especicar una
clave fuerte.

7.8.1 En el servidor freeradius para la red 172.x.x.x denimos la clave compartida


con cada punto de 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
}

7.8.2 En el servidor freeradius de un aula denimos la clave compartida con su


punto de acceso:

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

7.9 Controlar el acceso de un usuario por MAC.


Con el sistema que tenemos montado, hemos establecido un control de acceso mediante usuario
y password. Si queremos añadir un poco más de seguridad, para evitar, por ejemplo, que un
usuario pueda conectarse desde otra máquina diferente del portátil que le ha sido asignado,
podemos realizar también un control de acceso por MAC.
Para controlar el acceso de un usuario por MAC, debemos hacer lo siguiente:

ˆ Añadir el atributo radiusCallingStationId en la cuenta del usuario y asignarle valor,


concretamente la dirección MAC de la tarjeta wi con la que va a acceder a nuestra red.

ˆ Activar el módulo checkval en nuestro sitio. En el ejemplo de pruebas que estamos


tratando en este documento, sería freeradius-ies.

ˆ Modicar el módulo checkval para adaptarlo a nuestras necesidades.

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

# The attribute to look for in check items . Can be multi valued


c h e c k −name = C a l l i n g − S t a t i o n −I d

# The data type . Can be


# s t r i n g , i n t e g e r , ipaddr , date , abinary , o c t e t s
d a t a −t y p e = s t r i n g

# If set to yes and we dont find the i t e m −name attribute in the


# request then we send back a reject
# DEFAULT is no
#n o t f o u n d − r e j e c t = no
}

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.

8.1 Arranque del demonio freeradius


Como todos los servicios, freeradius dispone de un script en /etc/init.d -> /etc/init.d/freeradius
Al instalar freeradius se crean los enlaces para que el servicio se inicie al arrancar la máquina.
El script de inicio de freeradius tiene cinco modicadores: start, stop, restart, force-reload y
reload.
Arrancar, parar, reiniciar, cargar o forzar la carga de la conguración es tan sencillo como:

# / 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

8.2 Arrancar freeradius en modo debug


Muchas veces nos interesa arrancar freeradius en modo debug, en lugar de arrancarlo en modo
daemon, por ejemplo, para comprobar si se está aplicando la conguración que pretendíamos o
para ver si recibe y procesa bien las peticiones de los clientes.
Para ello, en lugar de arrancarlo usando el script de inicio, llamamos directamente al pro-
grama, con el parámetro -X:

# 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.

Freeradius-dialupadmin se encuentra en paquete debian o en código fuente junto a


freeradius.

Otra herramienta gráca basada en dialup-admin, de la que he oído hablar bien


es phpRADmin. phpRADmin es una herramienta potente y grácamente atractiva
creada por Toni de la Fuente, un administrador de sistemas linux. Se puede descar-
gar desde http://www.phpradmin.org/ en formato iso live cd o en formato .tar.gz.
Eso sí. Tan sólo hay una versión disponible desde el año 2006: phpradmin-0.01-pre-
alpha1.

En cualquier caso, nosotros no vamos a necesitarlas porque para gestionar nuestros


usuarios y grupos de acceso wi ya tenemos phpldapadmin.

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.

Para congurar el punto de acceso básicamente tendremos que hacer lo siguiente:

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.

2. Una vez conectado y congurado el equipo, abrimos el navegador y escribimos la ip del


punto de acceso (192.168.0.50) en la barra de navegación. Se nos mostrará la interfaz web
del mismo, donde nos pedirá un usuario y una password. El usuario administrador es
admin y la password por defecto está en blanco.

3. Una vez abierta la interfaz web, conguraremos el SSID.

4. Después seleccionaremos el método de autenticación WPA2-Enterprise e introducir los


datos de:

(a) IP del servidor radius.

(b) Password compartida con el servidor radius.

(c) Puerto radius (Por defecto, dejamos el 1812).

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 /

dentro de un directorio con el nombre del SSID de la red, en un archivo %gconf.xml. Es


decir, que si nuestra red tiene el SSID WLAN_44, la conguración se almacenará en el chero:

/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 /WLAN_44/% g c o n f . xml

En cuanto a las conguraciones de sistema, que se encontrarán disponibles para realizar la


conexión antes de que el usuario inicie sesión, se almacenarán 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

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".

ˆ Llamando directamente al editor de conguraciones, desde un terminal: /usr/bin/nm-


connection-editor

ˆ Editando a mano los cheros de conguración.

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.

11.1.2 Modicar políticas de NetworkManager

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:

/ usr / share / polkit −1/ a c t i o n s / o r g . f r e e d e s k t o p . n e t w o r k −manager− s e t t i n g s . system . p o l i c y

Concretamente, modicaremos la siguiente sección, que he acortado quitando las descrip-


ciones y mensajes de los diferentes idiomas para mostrarlo aquí:

<a c t i o n i d =" o r g . f r e e d e s k t o p . n e t w o r k −manager− s e t t i n g s . s y s t e m . m o d i f y ">

< d e s c r i p t i o n >M o d i f y system c o n n e c t i o n s </ d e s c r i p t i o n >

<d e s c r i p t i o n xml : l a n g =" e s "> M o d i f i c a r conexiones de s i s t e m a </ d e s c r i p t i o n >

<m e s s a g e xml : l a n g =" e s "> P o l í t i c a de sistema evita modificación de configuración de sistema

</ m e s s a g e >

<d e f a u l t s >

< a l l o w _ i n a c t i v e >no</ a l l o w _ i n a c t i v e >

<a l l o w _ a c t i v e >auth_admin_keep </ a l l o w _ a c t i v e >

</ 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:

<a l l o w _ a c t i v e >auth_admin_keep</ a l l o w _ a c t i v e >

por:

<a l l o w _ a c t i v e >y e s </ a l l o w _ a c t i v e >

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.

11.1.3 Automatizar la conguración de acceso wi en los portátiles

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é:

ˆ Un script al que llamé addusuario.sh

ˆ Una plantilla de conexión wi.

addusuario.sh

34
#!/ b i n / b a s h

# a d d u s u a r i o . sh : Configura el acceso wifi del usuario y cachea sus credenciales

# E s t e b a n M. Navas Martín

# IES Valle del Jerte

HOST= ` h o s t n a m e `

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 `

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

$DIALOG −− t i t l e " P o r t a t i l : $HOST" −− c l e a r \


−−i n p u t b o x " I n t r o d u z c a e l l o g i n d e l usuario de este equipo : " 10 51 2> $tempfile

r e t v a l =$ ?

case $retval in

0)

USUARIO= ` c a t $tempfile `

if [ "$USUARIO" ] ; then

$DIALOG −− t i t l e " P a s s w o r d d e l u s u a r i o " −− c l e a r \

−−i n p u t b o x " I n t r o d u z c a l a p a s s w o r d d e l usuario " 10 51 2> $tempfile

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 46

exit 1

esac

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

exit 1

esac

cd /tmp

if [ "$USOPROFESOR" ]; then

wget −O /tmp/ Auto \ IESVALLEDELJERTE3 h t t p : / / s e r v i d o r / f i c h e r o s / Auto \ IESVALLEDELJERTE3

r e t v a l =$ ?

if [ $retval −e q 0 ]; then

sed " s /USER/$USUARIO/ " Auto \ IESVALLEDELJERTE3 > /tmp/ Auto \ IESVALLEDELJERTE3 . 1

sed " s /PASSWORD/$PASSWORD/ " /tmp/ Auto \ IESVALLEDELJERTE3 . 1 > / e t c / NetworkManager / s y s t e m −c o n n e c t


chmod 600 / e t c / NetworkManager / s y s t e m − c o n n e c t i o n s / Auto \ IESVALLEDELJERTE3

# Borramos los archivos de configuracion temporales por si volvemos a ejecutar el script

rm /tmp/ Auto \ IESVALLEDELJERTE3 /tmp/ Auto \ IESVALLEDELJERTE3 . 1

fi

else

if [ −f / e t c / NetworkManager / s y s t e m − c o n n e c t i o n s / Auto \ IESVALLEDELJERTE3 ]; then

rm / e t c / NetworkManager / s y s t e m − c o n n e c t i o n s / Auto \ IESVALLEDELJERTE3


fi

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

sed " s /USER/$USUARIO/ " Auto \ − i e s v a l l e d e l j e r t e 3 > /tmp/ Auto \ $AULA− i e s v a l l e d e l j e r t e 3 . 1


$AULA

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 > / e t c / N e t w o r k M a n a g e r / s y s t e m − c

chmod 600 / e t c / N e t w o r k M a n a g e r / 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 e d e l j e r t e 3

# Borramos los archivos de configuracion temporales por si volvemos a ejecutar el script

rm /tmp/ Auto \ $AULA −i e s v a l l e d e l j e r t e 3 /tmp/ Auto \ $AULA −i e s v a l l e d e l j e r t e 3 .1

fi

fi

if [ "$USUARIO" ] && [ "$PASSWORD" ]; then

# Cacheamos las credenciales de usuario

cc_test −s t o r e any $USUARIO $PASSWORD

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

−764 a −46 f 1 −8e b 0 −a 0 2 3 2 9 f 1 7 5 4 2


u u i d=a 1 a 4 8 2 4 3

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

# " Des−c o m e n t a r " esta condición cuando queramos forzar la reconfiguración de la


#FICHEROCONFIG=""

# Si la wifi ya está configurada , cerramos y no hacemos nada


if [ −z "$FICHEROCONFIG" ]; then

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

$DIALOG −− t i t l e " P o r t a t i l : $HOST" −− c l e a r \


−−i n p u t b o x " I n t r o d u z c a e l l o g i n d e l usuario de este equipo : " 10 51 2> $

r e t v a l=$ ?

case $retval in
0)

USUARIO= ` c a t $tempfile `

if [ "$USUARIO" ] ; then

$DIALOG −− t i t l e " P a s s w o r d d e l u s u a r i o " −− c l e a r \


−−i n p u t b o x " I n t r o d u z c a l a p a s s w o r d d e l usuario " 10 51 2> $tempf

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

WIFICONFIGURADA= ` g r e p $USUARIO "$FICHEROCONFIG" `

if [ −z "$WIFICONFIGURADA" ]; then

if [ "$USOPROFESOR" ] && [ "$USUARIO" ] && [ "$PASSWORD" ]; then


wget −O /tmp/ Auto \ IESVALLEDELJERTE3 h t t p : / / s e r v i d o r / f i c h e r o s / Auto \ IESV

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

# Borramos los archivos de configuracion temporales por si volvemos


rm /tmp/ Auto \ IESVALLEDELJERTE3 /tmp/ Auto \ IESVALLEDELJERTE3 . 1
else
echo "No existe el fichero de configuración Auto \ IESVALLEDELJERTE3
fi
else
if [ "$USUARIO" ] && [ "$PASSWORD" ]; then
if [ −f / e t c / NetworkManager / s y s t e m − c o n n e c t i o n s / Auto \ IESVALLEDELJERTE3
rm / e t c / NetworkManager / s y s t e m − c o n n e c t i o n s / Auto \ IESVALLEDELJERTE3
fi

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 / Aut

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

# Borramos los archivos de configuracion temporales por si volvemos


rm /tmp/ Auto \ $AULA− i e s v a l l e d e l j e r t e 3 /tmp/ Auto \ $AULA− i e s v a l l e d e l j e
else
echo "No existe el fichero de configuración Auto $AULA− i e s v a l l e d e l j e
fi
fi
fi
fi

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 "

" . bash_login " :


p a t h => "/ r o o t / . b a s h _ l o g i n " ,
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 / b a s h _ l o g i n . po
}

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,

la plantilla en cuestión es la siguiente:

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

Y le añadimos el contenido anterior. Guardamos y cerramos.


Bueno, pues ahora que ya tenemos nuestra plantilla tenemos que activarla para que aparezca
entre las opciones de wicd. Así que abrimos el archivo /etc/wicd/encryption/templates/active
y añadimos el nombre de nuestra plantilla al nal: instituto. Guardamos y salimos. Ahora ya
podemos utilizarla.
Pero no olvidemos que si tenemos abierto el cliente de wicd, debemos cerrarlo y volver a
abrirlo. Al abrirlo veremos nuestra red: En mi caso IESVALLEDELJERTE3.

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:

ˆ Seguridad: 802.1x EAP

ˆ Método EAP: TTLS

ˆ Autenticación de fase 2: PAP

ˆ Identidad: milogin

ˆ Identidad anónima: anonymous

ˆ 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.

12.1 Instalar el paquete radiustoldap-0.1 en nuestro equipo de administrador


Lo primero que vamos a hacer es instalar el paquete radiustoldap-0.1 en nuestro equipo. Al
instalar este paquete dispondremos de unos scripts perl que nos permitirán añadir atributos de
radius a nuestro servidor ldap:

# dpkg −i radiustoldap − 0 . 1 _ i 3 8 6 . deb


# a p t −g e t install ldap−u t i l s

El paquete radiustoldap-0.1_i386.deb copia a /usr/bin/ los siguientes scripts:

ˆ addradiustoldap: Añade el objeto radiusprole, junto con los atributos dialupAccess y


radiusGroupName a cada usuario de ldap.

ˆ addusertowigroup: Asigna el grupo introducido por teclado a todos los alumnos de un


grupo de clase.

ˆ disablewigroup: Desactiva el acceso wi a un grupo de clase.

ˆ disablewiuser: Desactiva el acceso wi a un usuario.

ˆ enablewiuser: Activa el acceso wi a un solo usuario.

12.2 Instalar freeradius en el servidor LTSP


El siguiente paso será instalar freeradius en el equipo que vamos a convertir en servidor freeradius.
Esto es tan sencillo como instalar los paquetes freeradius y freeradius-ldap:

# a p t −g e t install freeradius f r e e r a d i u s −l d a p

12.3 Instalar paquetes para congurar el servidor freeradius en el servidor


LTSP
Una vez instalado freeradius, instalaremos un paquete que he preparado para realizar la cong-
uración de una forma más o menos automática:

ˆ Instalamos el paquete freeradius2ies-0.2_i386.deb, si el servidor LTSP si el sistema opera-


tivo es de 32 bits.

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:

# dpkg −i freeradius2ies − 0 . 2_amd64 . deb

El paquete freeradius2ies-0.2_amd64.deb congura el servidor freeradius con los


ajustes necesarios para usar un sistema de autenticación wi mediante EAP-TTLS/PAP.
El paquete:

ˆ 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.

Los cheros de conguración de freeradius que se van a modicar son:

ˆ /etc/freeradius/radiusd.conf

ˆ /etc/freeradius/eap.conf

ˆ /etc/freeradius/modules/ldap

ˆ /etc/freeradius/clients.conf

ˆ /etc/freeradius/users

Además, se va a crear un chero con la denición del sitio:

ˆ /etc/freeradius/sites-available/freeradius-ies

Y el enlace correspondiente para activarlo:

ˆ /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:

ˆ Congurar en el chero /etc/freeradius/clients.conf los puntos de acceso que van a ser


clientes de freeradius.

ˆ Modicar el chero /etc/freeradius/users con las reglas de control de acceso a la red wi.

Veamos qué es lo que tenemos que modicar en estos dos cheros:

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).

12.3.2 Modicar /etc/freeradius/users

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:

DEFAULT Ldap−Group == d i s a b l e d , Auth−Type := Reject


Reply −M e s s a g e = " A c c o u n t disabled . Please call the helpdesk ."

# DEFAULT Ldap−Group == "E−1B"

DEFAULT Ldap−Group == " WPA2Enterprise "


F a l l −Through = no

DEFAULT Auth−Type := Reject


Reply −M e s s a g e = " P l e a s e call the helpdesk ."

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:

ˆ La diferencia de precio no es muy grande.

ˆ 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:

# aptitude install 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

13.1 Fichero /etc/network/interfaces


Como vamos a convertir el servidor ltsp en punto de acceso, denimos los valores para la interfaz
wlan0, como se muestra en el chero:
/etc/network/interfaces

# This file describes the network interfaces available on your system


# and how to activate them . For more information , see interfaces (5).

# The loopback network interface


auto lo eth0 eth3 wlan0
iface lo inet loopback

iface eth3 inet dhcp


ifup eth3
p o s t −up / usr / sbin / ethtool − s $IFACE w o l g
p o s t −down / u s r / s b i n / e t h t o o l − s $IFACE w o l g

iface wlan0 inet static


address 192.168.0.254
netmask 255.255.255.0
broadcast 192.168.0.255

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.

13.2 Fichero /etc/default/dhcp3-server


En este chero, añadimos wlan0 a la denición INTERFACES="eth0" de tal forma que quedaría
así: INTERFACES="eth0 wlan0":
/etc/default/dhcp3-server

# Defaults for dhcp initscript


# sourced by / e t c / i n i t . d / dhcp
# installed at / e t c / d e f a u l t / dhcp3− s e r v e r by the maintainer scripts

#
# This is a POSIX shell fragment

46
#

# On what interfaces should t h e DHCP s e r v e r ( dhcpd ) s e r v e DHCP r e q u e s t s ?


# Separate multiple interfaces with spaces , e.g. " eth0 eth1 " .

INTERFACES=" e t h 0 wlan0 "

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).

13.3 Fichero /etc/freeradius/clients.conf


En este chero, denimos los clientes que se van a poder comunicar con freeradius mediante la
clave que especiquemos en secret:
/etc/freeradius/clients.conf

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.

13.4 Fichero /etc/hostapd/hostapd.conf


En este chero denimos la conguración que va a tener nuestro punto de acceso. La congu-
ración que muestro a continuación es la que he denido para que hostapd se comunique con un
servidor freeradius con seguridad WPA-EAP:
/etc/hostapd/hostapd.conf

# Configuración ajustada para trabajar con freeradius externo


# EAP−TTLS+PAP
# E s t e b a n M. Navas Martín
# IES Valle del Jerte − Plasencia

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

Como puede verse, en auth_server_addr especicamos la ip del servidor freradius y en


auth_server_shared la clave compartida con el servidor. En este caso, el servidor freeradius
y hostapd se encuentran en la misma máquina.

# / 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

14 Servidor LTSP en eth0 y AP con hostapd en wlan0


En el punto anterior se sustituye la interfaz eth0 por wlan0 para dar servicio de acceso wi. Esto
está bien para un aula en el que se van a sustituir los terminales por portátiles. Pero, ¾y si lo
que quiero es que el aula siga dando servicio a los terminales (en la interfaz eth0) pero también
quiero que de servicio de acceso wi al mismo tiempo (en la interfaz wlan0)? Para conseguirlo,
habría que hacer lo siguiente:

48
14.1 Fichero /etc/network/interfaces
Me aseguro de que ya tengo denido el interfaz wlan0 en el chero /etc/network/interfaces:

a22 −p r o :~# cat / e t c / network / i n t e r f a c e s

# This file describes the network interfaces available on your system


# and how to activate them . For more information , see interfaces (5).

# The loopback network interface


auto lo eth0 eth3 wlan0
iface lo inet loopback

iface eth3 inet dhcp


ifup eth3
p o s t −up / usr / sbin / ethtool − s $IFACE w o l g
p o s t −down / u s r / s b i n / e t h t o o l − s $IFACE w o l g

iface wlan0 inet static


address 192.168.0.254
netmask 255.255.255.0
broadcast 192.168.0.255

14.2 Fichero /etc/default/dhcp3-server


Me aseguro de que dhcp3-server escucha en las dos interfaces: eth0 y wlan0:

a22 −p r o :~# cat / e t c / d e f a u l t / dhcp3− s e r v e r

# Defaults for dhcp initscript


# sourced by / e t c / i n i t . d / dhcp
# installed at / e t c / d e f a u l t / dhcp3− s e r v e r by the maintainer scripts

#
# This is a POSIX shell fragment
#

# On what interfaces should t h e DHCP s e r v e r ( dhcpd ) s e r v e DHCP r e q u e s t s ?


# Separate multiple interfaces with spaces , e.g. " eth0 eth1 " .
INTERFACES=" e t h 0 wlan0 "

14.3 Fichero /etc/dhcp3/dhcpd.conf


Modico el chero de conguración del servidor dhcp para que quede tal que así:

l d a p −s e r v e r " ldap " ;


l d a p −p o r t 389;
l d a p −b a s e −dn " dc=i n s t i t u t o , dc=e x t r e m a d u r a , dc=e s " ;
l d a p −dhcp− s e r v e r −cn " ldap " ;
l d a p −debug − f i l e "/ v a r / l o g / dhcp−l d a p − s t a r t u p . l o g " ;
l d a p −method dynamic ;
ddns −u p d a t e − s t y l e none ;

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.

14.4 Tomamos como modelo el chero /etc/init.d/enable-nat


Como en los servidores de terminales ya tenemos un chero que activa nat para los clientes detrás
de la interfaz eth0, lo copiamos y modicamos para hacer nat para los clientes que se conecten
a través de wlan0:

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

14.5 Fichero /etc/init.d/enable-nat-wi


Modicamos el chero enable-nat-wi para que quede como se muestra en el siguiente listado.
Este chero activará el enmascaramiento de los paquetes que vengan de la red 192.168.1.X y
vayan dirigidos a la interfaz eth3.

a22 −p r o :~# cat / 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

# Only enable by default if LTSP or lessdisks is installed


if [ −e / opt / l t s p −o −d / var / l i b / l e s s d i s k s ] ; then

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

# Bail out if no iptables binary or no configuration


[ −x $ {IPTABLES} −a "$NETWORK_TO_NAT" ] || exit 0

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

# Enable IP− f o r w a r d i n g if it isn ' t enabled already .


if [ 0 = " ` cat / proc / s y s / net / ipv4 / ip_forward ` " ]; then
echo " Enabling IPv4 forwarding ."
echo 1 > / proc / s y s / net / ipv4 / ip_forward
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
}

case " $1 " in


start )

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

14.6 Activar servicio enable-nat-wi


Por último, pero no menos importante, activamos el servicio que acabamos de crear mediante
insserv.

# 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.

Por último, reiniciaremos los servicios oportunos y habremos terminado.

52

También podría gustarte