FREERADIUS: 802.1x con MYSQL

En esta guía se muestra como instalar freeradius con mariadb para realizar una autenticación 802.1x en la red inalámbrica, utilizando PEAP-MSCHPv2

  • Partimos de la instalación de un contenedor con debian 9, primero actualizamos el sistema y creamos el usuario ugit
apt update && apt upgrade && apt dist-upgrade -y
adduser ugit
  • Con el password: CA2
  • Y lo agregamos al grupo root
adduser ugit root
  • Se configura la zona horaria
dpkg-reconfigure tzdata

Mariadb

  • Instalamos Mariadb
apt install mariadb-server -y
  • Configuramos Mariadb
mysql_secure_installation
  • Resultado:
OTE: RUNNING ALL PARTS OF THIS SCRIPT IS RECOMMENDED FOR ALL MariaDB
      SERVERS IN PRODUCTION USE!  PLEASE READ EACH STEP CAREFULLY!

In order to log into MariaDB to secure it, we'll need the current
password for the root user.  If you've just installed MariaDB, and
you haven't set the root password yet, the password will be blank,
so you should just press enter here.

Enter current password for root (enter for none): 
OK, successfully used password, moving on...

Setting the root password ensures that nobody can log into the MariaDB
root user without the proper authorisation.

Set root password? [Y/n] Y
New password: HB0
Re-enter new password: HB0
Password updated successfully!
Reloading privilege tables..
 ... Success!


By default, a MariaDB installation has an anonymous user, allowing anyone
to log into MariaDB without having to have a user account created for
them.  This is intended only for testing, and to make the installation
go a bit smoother.  You should remove them before moving into a
production environment.

Remove anonymous users? [Y/n] Y
 ... Success!

Normally, root should only be allowed to connect from 'localhost'.  This
ensures that someone cannot guess at the root password from the network.

Disallow root login remotely? [Y/n]  Y
 ... Success!

By default, MariaDB comes with a database named 'test' that anyone can
access.  This is also intended only for testing, and should be removed
before moving into a production environment.

Remove test database and access to it? [Y/n] Y
 - Dropping test database...
 ... Success!
 - Removing privileges on test database...
 ... Success!

Reloading the privilege tables will ensure that all changes made so far
will take effect immediately.

Reload privilege tables now? [Y/n] Y
 ... Success!

Cleaning up...

All done!  If you've completed all of the above steps, your MariaDB
installation should now be secure.

Thanks for using MariaDB!

freeradius

  • Instalamos freeradius
apt-get install freeradius freeradius-mysql freeradius-utils -y
  • Reiniciamos freeradius
/etc/init.d/freeradius restart
  • Resultado:
[ ok ] Restarting freeradius (via systemctl): freeradius.service.

MYSQL

  • Para esta configuración vamos a crear una base de datos local, pero el proceso para una base de datos remota es el mismo.
  • Ingresamos a la BD como usuario «root»
mysql -u root -p
  • Creamos una base de datos de nombre «radius»
create database radius;
  • Creamos un usuario para conectarnos a la BD de manera local y remota
  • User: remoto
  • Pass: RB0
grant all privileges on radius.* to remoto@localhost identified by 'RB0';
  • Recargamos los privilegios de la tablas para que los cambios tengan efecto
flush privileges;
  • Salimos de Mysql
quit
  • Ahora vamos a importar el esquema por defecto de radius a la base de datos que creamos en el paso anterior, el esquema se va importar a la ruta /etc/freeradius/3.0/mods-config/sql/main/mysql/schema.sql
mysql -u root -p radius < /etc/freeradius/3.0/mods-config/sql/main/mysql/schema.sql
  • Ahora habilitamos el modulo SQL, creando un enlace simbólico del modulo sql que se encuentra en /etc/freeradius/3.0/mods-available/ a /etc/freeradius/3.0/mods-enabled
ln -s /etc/freeradius/3.0/mods-available/sql /etc/freeradius/3.0/mods-enabled/
  • Ahora abrimos el modulo sql habilitado y configuramos la base de datos radius como se muestra a continuación, en este caso usaremos la base de datos local radius
nano /etc/freeradius/3.0/mods-enabled/sql
  • Primero buscamos la linea driver = «rlm_sql_null», y remplazamos por driver = «rlm_sql_mysql»
  • Buscamos la linea dialec= «sqlite» para ubicarnos y hacemos los siguientes cambios
  • Si deseamos cargar los clientes desde la tabla «nas» de la base de datos, descomentamos la siguiente línea, la vamos a descomentar para guardar los datos del NAS (Network Acess Server) en la base de datos MYSQL,
  • Salvamos los cambios (Ctrl + o, en nano) y salimos del editor
  • Reiniciamos el servicio Radius
/etc/init.d/freeradius restart
  • Creamos un cliente NAS en la base de datos
  • Ingresamos a la base de datos como root
mysql -u root -p
  • Seleccionamos la base de datos radius
use radius
  • Agregamos el cliente NAS
INSERT INTO nas (nasname,shortname,type,secret,description) 
                      VALUES ('10.20.191.2','wcontroller','cisco','Adrian_ADM_0','Controladora de red inalambrica');
quit
  • Ahora cambiamos el usuario y el grupo dueño del modulo SQL habilitado (enlace simbólico) a freerad como se muestra a continuación
chown -h freerad.freerad /etc/freeradius/3.0/mods-enabled/sql
  • Luego reiniciamos el servidor, para que cargue los clientes NAS desde la base de datos
init 6

Primera prueba

  • Agregamos un cliente de manera local (Esto es solo si los clientes NAS serán leídos localmente y no desde la BD)
nano /etc/freeradius/3.0/clients.conf
  • Agregamos como cliente a la controladora inalámbrica
client "controlador" {
        ipaddr = 10.20.191.2
        proto = udp
        secret = 'Adrian_ADM_0'
        require_message_authenticator = no
        nas_type = cisco
        ### login = !root ###
        ### password = someadminpass ###
        limit {
                max_connections = 16
                lifetime = 0
                idle_timeout = 30
        }
}
  • Agregamos usuarios a la base de datos radius y les asignamos un grupo
  • Primero ingresamos a la base de datos como root
mysql -u root -p
  • Seleccionamos la base de datos radius
use radius
  • Vamos a crear los grupos estudiantes, administrativos y ugit, y vamos a incorporar los usuarios user1, user2, user3, user4, a los grupos creados
INSERT INTO radusergroup (username,groupname) VALUES ('user1', 'estudiantes');
INSERT INTO radusergroup (username,groupname) VALUES ('user2', 'estudiantes');
INSERT INTO radusergroup (username,groupname) VALUES ('user3', 'administrativos');
INSERT INTO radusergroup (username,groupname) VALUES ('user4', 'ugit');
  • Creamos los usuarios y las contraseñas por el momento en texto plano
INSERT INTO radcheck (username,attribute,op,value) 
                      VALUES ('user1','Cleartext-Password',':=','user1');
INSERT INTO radcheck (username,attribute,op,value) 
                      VALUES ('user2','Cleartext-Password',':=','user2');
INSERT INTO radcheck (username,attribute,op,value) 
                      VALUES ('user3','Cleartext-Password',':=','user3');
INSERT INTO radcheck (username,attribute,op,value) 
                      VALUES ('user4','Cleartext-Password',':=','user4');
quit
  • Reiniciamos el servicio freeradius
/etc/init.d/freeradius restart
  • En este punto ya se puede autenticar en la red inlambrica con los usuarios y contraseñas creadas en la base de datos
  • user1:user1
  • user2:user2
  • user3:user3
  • user4:user4

Asignación de VLAN a los usuarios por grupos

  • Ahora vamos a asignar a los usuarios un numero de vlan con base en el grupo al que pertenecen, para ello debemos definir 3 atributos para cada grupo en la base de datos radius
Tunnel-Type = 13,                 
Tunnel-Medium-Type = 6,
Tunnel-Private-Group-Id = "155"  

Tunnel-Type

  • Vamos a usar el valor 13=VLAN

Tunnel-Medium-Type

  • Vamos a usar el valor 6= IEEE-802

Tunnel-Private-Group-Id

  • Aquí asignamos la etiqueta de vlan que deseamos para cada grupo, 155 para estudiantes, 168 para administrativos y 190 para ugit.
mysql -u root -p
  • Seleccionamos la BD radius
use radius
  • Agregamos los atributos a los grupos

Grupo estudiantes

INSERT INTO radgroupreply (groupname, attribute, value, op)
                           VALUES ('estudiantes', 'Tunnel-Type', '13', ':=');
INSERT INTO radgroupreply (groupname, attribute, value, op)
                           VALUES ('estudiantes', 'Tunnel-Medium-Type', '6', ':=');
INSERT INTO radgroupreply (groupname, attribute, value, op)
                           VALUES ('estudiantes', 'Tunnel-Private-Group-Id', '155', ':=');

Grupo administrativos

INSERT INTO radgroupreply (groupname, attribute, value, op)
                           VALUES ('administrativos', 'Tunnel-Type', '13', ':=');
INSERT INTO radgroupreply (groupname, attribute, value, op)
                           VALUES ('administrativos', 'Tunnel-Medium-Type', '6', ':=');
INSERT INTO radgroupreply (groupname, attribute, value, op)
                           VALUES ('administrativos', 'Tunnel-Private-Group-Id', '168', ':=');

Grupo ugit

INSERT INTO radgroupreply (groupname, attribute, value, op)
                           VALUES ('ugit', 'Tunnel-Type', '13', ':=');
INSERT INTO radgroupreply (groupname, attribute, value, op)
                           VALUES ('ugit', 'Tunnel-Medium-Type', '6', ':=');
INSERT INTO radgroupreply (groupname, attribute, value, op)
                           VALUES ('ugit', 'Tunnel-Private-Group-Id', '190', ':=');
quit
  • Ahora para que los atributos de los grupos se propagen a la respuesta final del radius Access-Accept a la controladora, debemos modificar el siguiente archivo
nano /etc/freeradius/3.0/sites-available/inner-tunnel
  • Lo descomentamos como se muestra en la siguiente imagen:
 #
        #  Instead of "use_tunneled_reply", uncomment the
        #  next two "update" blocks.
        #
        update {
                &outer.session-state: += &reply:
        }

        #
        #  These attributes are for the inner session only.
        #  They MUST NOT be sent in the outer reply.
        #
        #  If you uncomment the previous block and leave
        #  this one commented out, WiFi WILL NOT WORK,
        #  because the client will get two MS-MPPE-keys
        #
        update outer.session-state {
                MS-MPPE-Encryption-Policy !* ANY
                MS-MPPE-Encryption-Types !* ANY
                MS-MPPE-Send-Key !* ANY
                MS-MPPE-Recv-Key !* ANY
                Message-Authenticator !* ANY
                EAP-Message !* ANY
                Proxy-State !* ANY
        }
  • Ahora la asignación de VLAN debería funcionar.
  • Podemos verificar donde está escuchando el servidor
  • Lo reiniciamos por aquello que esté detenido el servicio y también lo recargamos.
/etc/init.d/freeradius restart
/etc/init.d/freeradius reload
  • Verificamos
ss -alun4 | grep -E '1812|1813'
  • Resultado
  • Para poner el servicio freeradius en modo depuración
  • Detenemos el servicio
systemctl stop freeradius
  • Entramos en modo depuración
freeradius -X

Crear acceso remoto a la base de datos

  • Necesitamos crear el acceso remoto a la Base de datos para poder accesarla desde otro host al freeradius
  • Editamos el archivo /etc/mysql/mariadb.conf.d/50-server.cnf
nano /etc/mysql/mariadb.conf.d/50-server.cnf
Cambiamos la linea bind-address = 127.0.0.1 x bind-address = 0.0.0.0
  • Nos logeamos en mysql
mysql -u root -p
  • Seleccionamos la base de datos
use radius
  • Damos permisos a remoto sobre la bd radius
GRANT ALL ON *.* TO 'remoto'@'%' IDENTIFIED BY 'Remoto_BAS_0';
quit
  • Reiniciamos los servicios
/etc/init.d/freeradius restart
service mysql restart
  • Ya nos podemos logear de manera remota a la BD de freeradius, con
  • Usuario: remoto
  • Paswd: Remoto_BAS_0