Información blog

Linux, tutoriales, noticias, sistemas, redes y seguridad informática, entre otras cosas.

jueves, 6 de octubre de 2016

Creando un servidor RADIUS con FreeRadius

Las redes inalámbricas se han convertido en unos elementos indispensables en nuestro día a día gracias a la gran flexibilidad que nos ofrecen... Sin cables, sin estar atados a un lugar en concreto, estamos rodeados de dichas redes sin apenas darnos cuenta de ello, haciendo que la seguridad de éstas sea un elemento muy a tener en cuenta. Anteriormente ya he hablado sobre los peligros de conectarse a una red wifi sin contraseña pero... ¿Qué pasa con aquellas redes en las que hayamos puesto una contraseña cifrada? Existen numerosas medidas de seguridad para asegurarnos que no se conectan personajes indeseados tales como el uso de un cifrado robusto (actualmente el más seguro sería WPA2/AES), el filtrado de direcciones MAC, el ocultamiento del SSID... La combinación de estas medidas nos ofrece un buen nivel de seguridad pero si deseásemos ir un paso más allá y tener una seguridad todavía más robusta, la mejor opción de todas sería el optar por un servidor RADIUS, del cual voy a hablar hoy.

free_radius

RADIUS (Remote Authentication Dial In User Service) es un protocolo que sirve para autenticar y autorizar el acceso a una red. Dicho protocolo puede ser usado en cualquier entorno de red, pero es especialmente recomendando para redes wifi. Al usar dicho protocolo estaríamos enviando un usuario y contraseña a un servidor RADIUS, que tras comprobar si efectivamente las credenciales son correctas, nos autorizaría el acceso a la red y posibilitaría la obtención de IP, máscara de red, puerta de enlace, etc... Esto plasmado gráficamente sería algo como lo siguiente:

Diagrama_RADIUS

Esto ofrece como desventaja el hecho de que requiere un dispositivo que esté permanentemente encendido y conectado a la red, cosa que en un entorno empresarial puede ser sencillo, pero que en entornos domésticos no lo puede ser tanto y que lo que más se puede acercar sería una raspberry pi. Aún así, un dispositivo de tan reducidas dimensiones y características nos podría servir perfectamente como servidor RADIUS con lo que al ser una opción económica y viable, me centraré en instalar un servidor RADIUS en dicho dispositivo; en concreto en una Raspberry pi con Raspian 8 instalado; dicha instalación sería perfectamente válida en sistemas equiparables tales como Debian 8, con lo que en caso de no disponer de una raspberry, podéis probar este concepto sobre una Debian "corriente".

Para empezar es necesario tener instalado un entorno LAMP, pues para que este servidor funcione necesitaremos tener un servidor MySQL y ciertas librerías dependientes de LAMP... No haría falta tenerlo siquiera configurado, únicamente con tener instalados las paquetes sería necesario con lo que lo primero que habría que hacer antes de nada sería:

  1. apt-get update
  2. apt-get install apache2  mysql-server php5

Con los requisitos cumplidos, pasaríamos a instalar la herramienta que convertirá nuestra raspberry en un servidor RADIUS; herramienta que en este caso será FreeRadius. Además, para que FreeRadius se pueda comunicar con la base de datos MySQL, necesitaremos instalar el complemento freeradius-mysql, pues en caso contrario no podrá haber comunicación entre ambos y no podremos configurar el servidor RADIUS correctamente. Esto es tan sencillo como hacer:

  1. apt-get -y install freeradius && service freeradius start
  2. apt-get -y install freeradius-mysql

Con esto tendríamos los componentes instalados, pero ni mucho menos están configurados... Aquí veréis que a cada pequeño paso que vaya haciendo iré haciendo comprobaciones, esto se debe a que es muy fácil equivocarse, y en caso de ir comprobando poco a poco podremos encontrar mucho mejor la causa del problema, ya que si comprobamos que efectivamente funciona tras configurar todo, tendremos que revisar absolutamente todo punto por punto.

Lo primero que haremos será crear un pequeño usuario de prueba que usaremos para ver que, por lo menos podemos realizar la comprobación más básica; una comprobación a nivel local que hará que comprobemos que freeradius es capaz de funcionar con la configuración mínima. Para ello tendremos que editar el fichero /etc/freeradius/users y veremos que hay un usuario cuya información está completamente comentada (es decir que no existe dicho usuario). Simplemente habría que descomentar el nombre de usuario y su contraseña, además de cambiar dichos datos a nuestro gusto tal y como muestro en el siguiente ejemplo:

user_radius

Con esto hecho, tendríamos que reiniciar el servicio freeradius para aplicar los cambios:

service freeradius restart

Ahora llegaría el turno de hacer la primera prueba, que sería la más básica y la que menos probabilidades tiene de fallar; toda prueba se realizará mediante el comando radest que siempre tendría la siguiente estructura:

radtest usuario contraseña_usuario ip_de_origen puerto_servidor contraseña_servidor

Para este caso en concreto el comando sería ejecutado localmente (es decir a nivel de localhost) y sería el siguiente:

radtest radius radius 127.0.0.1 1812 testing123

El puerto de escucha siempre sería el 1812, ya sea haciendo pruebas a nivel local (localhost) o remoto. La contraseña del servidor, sería la contraseña que usaría el servidor RADIUS para hacer las pruebas en local, contraseña que por defecto sería testing123 y que no sería necesario cambiar al ser únicamente usada para las pruebas en localhost. La prueba nos tendría que devolver el siguiente mensaje:

autenticar_radtest

Toda prueba que se realice exitosamente tiene que terminar con el mensaje rad_recv: Access-Accept; en caso de que hiciésemos algo incorrecto, dicho mensaje sería rad_recv: Access-Reject, con lo que es muy importante prestar atención al mensaje final, pues dictaminará el resultado de la prueba.

Con la primera prueba pasada exitosamente, tocaría empezar a interactuar con la base de datos a nivel local... De momento hemos hecho una prueba con un usuario de prueba, pero ahora habría que empezar a crear usuarios reales en nuestra base de datos MySQL y ver si la comunicación entre FreeRadius y ésta se realiza exitosamente y si es capaz de validar nuestros usuarios como debe ser. Para ello lo primero que tendremos que hacer será preparar nuestro servicio RADIUS para que sea capaz de comunicarse con la base de datos; esto se consigue editando primero el fichero /etc/freeradius/sites-available/default y descomentando dos líneas en concreto dentro de dicho fichero, dos líneas llamadas sql que van precedidas por el caracter #; carácter que habría que eliminar. Esas líneas se encuentran debajo de las líneas "Authoritation Queries" y "Accounting queries"; para que os situéis mejor os dejo debajo una pequeña unión de dos capturas que muestran tanto una ubicación aproximada como el cómo tendrían que quedar (como veis, sql no está precedida por el caracter #):

sql_enable_radius

Ahora modificaríamos el usuario y contraseña por defecto usada en las conexiones SQL con el fin de evitar que algún fortificar un poco la seguridad. Esto se logra editando los parámetros login y password dentro del fichero /etc/freeradius/sql.conf; en mi caso por ejemplo he puesto las siguientes credenciales:

login_radius

Estas credenciales son ficticias y pueden ser cualquier otras, pero lo realmente importante es cambiar las credenciales de acceso por defecto.

Bien, ahora que tenemos la comunicación con la base de datos preparada, faltaría crear dicha base de datos y llenarla con las tablas y datos correspondientes... Esto puede parecer muy complicado, pero la instalación de freeradius-mysql incluye una serie de SQLs que acelerarán en gran medida dicha tarea, pues dichos SQLs crearán las tablas correspondientes en nuestra base de datos; tablas vacías, pero tablas al fin y al cabo. Comencemos entrando a MySQL... Esto realmente sencillo pues el comando sería:

mysql -u root -p

La contraseña sería aquella que nos habrán pedido introducir durante la instalación de mysql-server, no aquella que hemos puesto ahora en sql.conf, pues son credenciales completamente distintas con diferentes propósitos. Dentro de MySQL, el primer paso e indispensable sería la creación de la base de datos en cuestión... freeradius apunta por defecto a la base de datos radius, con lo que nosotros crearemos una base de datos con dicho nombre:

create database radius

La base de datos está creada, pero necesitamos que freeradius pueda acceder a ésta... Es por eso que necesitamos crear un usuario; un usuario con las mismas credenciales que las puestas antes es sql.conf y que tenga permisos para manejar la base de datos a su antojo. Esto se logra mediante estos dos comandos:

  1. create user ivan@localhost identified by "ivan";
  2. grant all on radius.* to ivan@localhost;

Allí donde pone ivan@ deberíamos poner el usuario puesto en el apartado login de sql.conf y en la sección identified by habría que poner la contraseña puesta en el dicho fichero. Es muy importante que la contraseña se encuentre entre comillas tal y como he puesto en el ejemplo. Con todos los preparativos de la base de datos listos, llegaría el turno de usarla e insertarle las nuevas tablas que se obtiene de un sql llamado schema.sql, alojado dentro de /etc/freeradius/sql/mysql/, junto con otros sqls que contienen otras tablas. Todo esto se logra tal que así:

  1. use radius;
  2. source schema.sql;

Esto creará un buen número de tablas vacías que podemos ver mediante el comando:

show tables;

La tabla que nos interesaría a nosotros en concreto sería la tabla radcheck, pues contiene el listado de usuarios que puede acceder al servidor RADIUS. La mejor forma de saber qué añadir aquí, es conociendo primero que campos tiene esta tabla.

describe radcheck

radcheck

Es importante tener en cuenta el significado de cada campo:

  • id: Identificador único que no tenemos necesidad de introducir pues es un valor numérico  incremental (1,2,3...).
  • username: Nombre de usuario.
  • attribute: Este campo SIEMPRE tiene que tener el valor 'password'. 
  • op: Este campo SIEMPRE tiene que tener el valor '=='.
  • value: Contraseña.

Teniendo estos conceptos claros, podemos preparar una query de inserción que añada una nueva línea a la tabla con los datos del nuevo usuario; por ejemplo:

INSERT INTO radcheck(username,attribute,op,value) VALUES('admin','password','==','admin');

Si la inserción es exitosa solamente tendríamos que salir.

exit

Con todo esto realizado, al haber hecho también varios cambios en freeradius, reiniciaremos el servicio freeradius de nuevo.

service freeradius restart

Ahora llegaría el turno de la segunda prueba, esta prueba comprobará si el usuario que hemos creado se puede autenticar correctamente en freeradius; esta prueba se haría en local, con lo que la prueba se parecerá bastante a la anterior con excepción del usuario.

radtest admin admin 127.0.0.1 1812 testing123

En caso de habernos dado un resultado exitoso podríamos continuar; en caso contrario tendríamos que volver a revisar los pasos realizados y ver en qué nos hemos podido equivocar. Como veis la única diferencia es que en este caso estaríamos autenticándonos con un usuario que hemos almacenado dentro de la base de datos sql.

Ahora quedaría un último paso, y es que esta autenticación pueda realizarse por equipos remotos... De nada sirve que preparemos todo esto si únicamente podemos autenticarnos a nivel local... Es por eso que tenemos que preparar freeradius para que los clientes remotos puedan interactuar con éste. Para ello lo primero que habría que hacer sería habilitar la autenticación de clientes remotos en freeradius, lo cual se hace descomentando (eliminando la #) la línea readclients=yes dentro del fichero /etc/freeradius/sql.conf. He aquí una captura de dicha sección:

read_clients

Además, cuando habilitamos la autenticación de clientes remotos, hacemos que la base de datos tenga que consultar qué clientes remotos pueden autenticarse, clientes que consulta dentro de la tabla nas. Desgraciadamente carecemos de dicha tabla en nuestra base de datos, de momento, con lo que lo primero que tendremos que hacer será crearla para después introducir datos en ésta. Para ello tendremos que entrar en la base de datos radius que hemos creado antes:

mysql -u root -p radius

Dentro de la base de datos habría que "importar" dos nuevos sqls: nas.sql y ippool.sql.

  1. source ippool.sql;
  2. source nas.sql;

Con estos nuevos sources, ahora tendremos que consultar la tabla nas, tal y como hemos hecho antes con radcheck, con el fin de saber qué campos tiene la susodicha.

describe nas;

tabla_nas

Los campos que nos interesarían serían:

  • id: Identificador único que no tenemos necesidad de introducir pues es un valor numérico  incremental (1,2,3...).
  • nasname: IP/hostname del cliente que se va a conectar desde el exterior al servidor radius y a través del cual se enviarán las credenciales de autenticación enviadas desde los equipos que se conecten a la red wifi. Esto generalmente será la IP del router, si bien para probar que funciona tenemos que poner la ip de nuestra raspberry, pues si nos conectamos desde una ip que no esté presente en la tabla y que no sea localhost, freeradius nos denegará cualquier interacción con él.
  • shortname: Un nombre descriptivo del cliente radius.
  • type: Este valor SIEMPRE será other.
  • secret: Clave que el cliente RADIUS (generalmente el router) tendrá que usar para autenticarse con el servidor RADIUS y ser capaz de transmitirle las peticiones de autenticación de aquellos que se van a conectar a la red inalámbrica.
A sabiendas de esto, podemos usar usar esta query para insertar una nueva línea válida en la tabla:

INSERT INTO nas (nasname, shortname, type, secret) VALUES ('192.168.1.5','test','other','radius');

En caso de ser una sentencia válida, podriamos salir de MySQL mediante:

exit

Una vez más tocaría reiniciar freeradius para aplicar los cambios que hemos realizado antes en el fichero sql.conf:

service freeradius restart

Ahora llegaría el turno de la prueba final, con la cual ya verificaremos que nuestro servicio freeradius es plenamente funcional tanto para autenticaciones internas como externas; la prueba se haría una vez más con radtest, pero variando la ip de origen y la contraseña de acceso para el servidor radius:

radtest admin admin 192.168.1.5 1812 radius

En caso de ser exitoso, ya tendríamos el servidor RADIUS preparado para recibir autenticaciones desde el exterior; únicamente tendríamos que añadir una nueva línea en la tabla nas que hiciese referencia a la ip del autentico cliente RADIUS (router) y configurar dicho cliente para que apuntase al servidor RADIUS en las tareas de autenticación, cuyo procedimiento variaría dependiendo del modelo y marca del router.

Espero que os haya resultado útil.

Saludos.

No hay comentarios :

Publicar un comentario