9.6. Servidor RADIUS

RADIUS es un protocolo de autenticación y autorización para acceso a la red, muy utilizado en redes wifi, que utiliza para el establecimiento de las conexiones el puerto 1812/UDP. Permite que cada solicitante acceda a la red utilizando una pareja de credenciales (usuario/contraseña) propias.

En el caso que queremos resolver, tenemos tres agentes:

  1. Una servidor Debian que actúa como servidor RADIUS, cuya implementación más extendida de código abierto es Freeradius, La instalación, como es habitual cuando existe paquete, es sumamente sencilla:

    # apt install freeradius
    

    En este servidor deberán almacenarse las credenciales de todos aquellos a los que se permite el acceso a la red.

  2. El solicitante, que es el dispositivo inalámbrico que pide acceso a la red. Deberá disponer de unas credenciales válidas para poder acceder.

  3. Un punto de acceso que actúa como autenticador o NAS[1] (servidor de acceso a la red) u que es el que permite acceder a solicitante consultando con el servidor RADIUS sus credenciales. Actúa, pues. como intermediario entre el solicitante y el servidor RADIUS.

../../_images/radius.png

Para establecer un canal seguro de comunicación sobre el que discurra el proceso de autenticación y autorización se utiliza EAP, que más que un protocolo es un framework para crear protocolos concretos. Los más comunes son EAP/TLS, que requiere autenticación con certificados tanto del lado del servidor como del cliente, y PEAP, que sólo requiere certificado en la parte del servidor.

Ver también

Para consultar los principales protocolos creados con EAP puede consultar este artículo de Intel.

9.6.1. Configuración básica

Advertencia

Antes de empezar la configuración es indispensable cerciorarse de que el nombre de la máquina (el que se obtiene con hostname) es resoluble (p.e. porque se ha incluido en /etc/hosts).

Toda la configuración se encuentra en el directorio /etc/freeradius/3.0/ y es en él donde tenemos que empezarla. El archivo clients.conf contiene los controladores de acceso a los que se permite comunicar con el servidor para retransmitir las credenciales. Ya tiene definido uno:

client localhost {
   # [...]
   ipaddr = 127.0.0.1
   # [...]
   secret = testing123
}

que nos permitirá hacer comprobaciones más adelante. Lo interesante es que nos sirve de modelo para definir nuevos autenticadores: basta con indicar qué dirección IP tiene y establecer una palabra secreta arbitraria que habrá luego que trasladar a la configuración de éste:

client linksys {
   ipaddr = 192.168.0.10
   secret = clavesecreta
}

También es posible indicar una red completa:

client pas {
   ipaddr = 192.168.0.0/24
   secret = clavesecreta
}

La segunda parte de la configuración consiste en añadir las credenciales que permitirán el acceso a los solicitantes. Es posible enumerarlas en el archivo users simplemente añadiendo una línea por credencial:

usuario1     Cleartext-Password := "contraseña1"
usuario2     Cleartext-Password := "contraseña2"

pero para evitar el engorro de alterar el archivo, recurriremos a utilizar otro backend. El más sencillo es una base de datos SQLite, puesto que es probable que nuestro servidor mínimo ya tenga soporte para ellas[2]. esta opción requiere habilitar el módulo:

# cd /etc/freeradius/3.0/mods-enabled
# ln -s ../mods-available/sql

y debe editarse este archivo para hacer algunos cambios:

sql {
   dialect = "sqlite"

   #driver = "rlm_sql_null"
   driver = "rlm_sql_${dialect}"

   sqlite {
      filename = "/var/cache/radius/users-sqlite.db"
      # [...]
   }

   # [...]
}

Editado el archivo, es necesario preparar el directorio que albergará la base de datos:

# mkdir -m750 /var/cache/radius
# chown freerad:freerad /var/cache/radius

pero no necesitamos crearla, porque el servidor lo hará por nosotros cuando lo reiniciemos:

# invoke-rc.d freeradius restart

aunque, obviamente, no habrá credenciales almacenadas. Para ello debemos insertar registros en la tabla radcheck. Por ejemplo, esto:

# echo "INSERT INTO radcheck VALUES (NULL, 'cliente', 'Cleartext-Password', ':=', 'nolasabes');" \
   | sqlite3 /var/cache/radius/users-sqlite.db

crea una credenciales usuario/nolasabes. Para comprobar que ha ido bien la configuración basta con ejecutar:

# radtest cliente nolasabes localhost 10 testing123
Sent Access-Request Id 39 from 0.0.0.0:51538 to 127.0.0.1:1812 length 82
        User-Name = "cliente"
        User-Password = "nolasabes"
        NAS-IP-Address = 127.0.1.1
        NAS-Port = 0
        Message-Authenticator = 0x00
        Cleartext-Password = "nolasabes"
Received Access-Accept Id 39 from 127.0.0.1:1812 to 127.0.0.1:51538 length 20

La orden exige pasarle las credenciales (los dos primeros argumentos), el servidor (localhost porque estamos haciendo una consulta local), un número de puerto (que debe ser cualquier número entero positivo incluido el cero) y, por último, la palabra secreta para conectar al servidor (y que ya vimos que de forma predeterminada es testing123 para conexión local). Como las credenciales son válidas (las acabamos de introducir en la base de datos), el cliente debe recibir un Access-Accept.

Nota

Para depurar el funcionamiento, puede ejecutarse directamente el servicio con:

# freeradius -X

9.6.2. Autenticadores

Para que el punto de acceso actúe como autenticador de nuestro servidores, necesitamos configurar la seguridad de su red wireless del siguiente modo:

Parámetros de configuración

Modo

WPA2-Enterprise

Servidor radius

192.168.0.1

Puerto

1812

secreto

clavesecreta

donde hemos supuesto que nuestro servidor ocupa la IP 192.168.0.1.

9.6.3. Configuración adicional

Aparte de la configuración básica, pueden interesarnos otras funcionalidades.

9.6.3.1. Conexiones simultáneas

9.6.3.2. LDAP

9.6.3.3. PAM

Advertencia

La configuración propuesta es incompatible con cualquier otro backend para almacenar usuarios, por lo que, si usamos esta autenticación, deberemos renunciar a cualquier otro backend.

La autenticación con PAM, que no está recomendada por los desarrolladores exige:

  1. Que el usuario freeradius pertenezca al grupo shadow, lo cual ya previene la instalación del paquete.

  2. Que se incluya en users la línea:

    DEFAULT     Auth-Type=Pam
    
  3. Que habilitemos el módulo de modo semejante a como hicimos con sql:

    # cd /etc/freeradius/3.0/mods-enabled
    # ln -s ../mods-available/pam
    
  4. Que descomentemos en sites-enabled/default y sites-enabled/inner-tunnel la línea referente a PAM.

Para comprobar la autenticación freeradius usa el servicio de PAM radiusd que ya viene preparado en el paquete. Para cualquier modificación del comportamiento predefinido, deberemos tener conocimientos de cómo funciona PAM.

Notas al pie