Oeris

Shopping Cart: 0.00 0 items

Le blog

Utiliser un backend mysql avec Freeradius

Ce troisième tutoriel donnera les clefs pour interfacer un démon Freeradius avec un serveur mysql. En effet Freeradius utilise de base des fichiers textes pour stocker les logins/mot de passe et de manière générale tous les attributs qu’il doit renvoyer. Ce mode de fonctionnement atteint rapidement ses limites lorsqu’on souhaite gérer plusieurs centaines de compte différents. La base de donnée devient alors le concept adéquat pour ce faire. Freeradius peut utiliser plusieurs type de bases de données pour : – Stocker les informations d’authentification – Enregistrer les logs – Enregistrer les informations d’accounting Les bases de données supportées par Freeradius sont : – Mysql – Oracle – Postgre – SQL Server (Microsoft)  

Structure des fichiers de configuration

L’interfaçage avec les bases de données SQL est géré par des modules, après avoir lu le premier tutoriel, on s’attend à ce que les fichiers de configuration soient localisés dans raddb/modules, mais ces modules étant un peu particulier, les fichiers de configuration sont stocké directement dans raddb/sql. (Dans la version 3.x, cette particularité a été gommée et les fichiers de configurations se trouvent dans raddb/mods-config/sql) le fichier sql.conf qui se situe dans raddb précise les caractéristiques de la base de données (adresse IP, login, mot de passe, type de base). Mais c’est aussi avec ce fichier que l’on peut gérer de la redondance (définition de plusieurs bases, ou plusieurs tables), les performances (nombre maximum de requetes par seconde).  

sql { database = « mysql » driver = « rlm_sql_${database} » server = « localhost » login = « radius » password = « changeme »# Database table configuration for everything except Oracle radius_db = « radius » # If you are using Oracle then use this instead # radius_db = « (DESCRIPTION=(ADDRESS=(PROTOCOL=TCP)(HOST=localhost)(PORT=1521))(CONNECT_DATA=(SID=your_sid))) »# If you want both stop and start records logged to the # same SQL table, leave this as is.  If you want them in # different tables, put the start table in acct_table1 # and stop table in acct_table2 acct_table1 = « radacct » acct_table2 = « radacct »# Allow for storing data after authentication postauth_table = « radpostauth » …… # Table to keep radius client info nas_table = « nas » # Read driver-specific configuration $INCLUDE sql/${database}/dialup.conf }

Puis on retrouve un répertoire pour chacun des modules SQL (en fonction des bases). Exemple raddb/sql/mysql. Ce répertoire contient : – Un fichier contenant le schéma de la base de donnée – Un fichier listant les requêtes SQL qu’exécutera le serveur Freeradius en fonction de la section dans laquelle est appelé le module sql. Exemple : un extrait du fichier dialup.conf  

        ####################################################################### #  Authorization Queries ####################################################################### #  These queries compare the check items for the user #  in ${authcheck_table} and setup the reply items in #  ${authreply_table}.  You can use any query/tables #  you want, but the return data for each row MUST #  be in the  following order: # #  0. Row ID (currently unused) #  1. UserName/GroupName #  2. Item Attr Name #  3. Item Attr Value #  4. Item Attr Operation ####################################################################### # Use these for case sensitive usernames. #       authorize_check_query = « SELECT id, username, attribute, value, op \ #         FROM ${authcheck_table} \ #         WHERE username = BINARY ‘%{SQL-User-Name}’ \ #         ORDER BY id » #       authorize_reply_query = « SELECT id, username, attribute, value, op \ #         FROM ${authreply_table} \ #         WHERE username = BINARY ‘%{SQL-User-Name}’ \ #         ORDER BY id »# The default queries are case insensitive. (for compatibility with # older versions of FreeRADIUS) authorize_check_query = « SELECT id, username, attribute, value, op \ FROM ${authcheck_table} \ WHERE username = ‘%{SQL-User-Name}’ \ ORDER BY id » authorize_reply_query = « SELECT id, username, attribute, value, op \ FROM ${authreply_table} \ WHERE username = ‘%{SQL-User-Name}’ \ ORDER BY id »

Description du schéma Mysql Le schéma fourni par les concepteurs de Freeradius contient plusieurs tables : – Une table permettant de stocker l’accounting  : radacct – Une table permettant de stocker les informations unitaires qui concernent l’authentification : radcheck – Une table permettant de stocker les informations de groupe qui concernent l’authentification : radgroupcheck – Une table permettant de stocker les informations unitaires qui concernent l’autorisation (et donc les attributs qui sont renvoyés) : radreply – Une table permettant de stocker les informations de groupe qui concernent l’autorisation : radgroupreply – Une table permettant de mettre les abonnés dans des groupes afin de pouvoir autoriser ou authentifier de manière « groupée » : radusergroup – Une table permettant de logguer les demandes d’authentifications : radpostauth Un exemple pour mieux illustrer comment sont stockées les informations :  

mysql> select * from radcheck; +—-+—————————+——————–+—-+———-+ | id | username                  | attribute          | op | value    | +—-+—————————+——————–+—-+———-+ |  1 | toto@example.com  | Cleartext-Password | := | test |mysql> select * from radreply; +—–+———————————————————————-+——————–+—-+—————–+ | id  | username                                                             | attribute          | op | value           | +—–+———————————————————————-+——————–+—-+—————–+ | 1 | toto@example.com                   | Framed-IP-Address  | =  | 1.1.1.1   | | 2 | toto@example.com                   | Framed-IP-Netmask  | =  | 255.255.255.248 |mysql> select * from radgroupreply; +—-+——————-+——————-+—-+——————————-+ | id | groupname         | attribute         | op | value                         | +—-+——————-+——————-+—-+——————————-+ |  1 | group-ppp-1       | Framed-Protocol   | =  | PPP                 |mysql> select * from radusergroup limit 0,30; +————————————————————————+——————-+———-+ | username                                                               | groupname         | priority | +————————————————————————+——————-+———-+ | toto@example.com                    | group-ppp-1       |        1 | mysql> select * from radacct limit 0 , 30; +———–+——————-+———————————-+——————+———–+——-+————–+———–+—————–+———————+———————+———————+————–+—————–+—————+————————+————————+—————–+——————+———————————-+——————-+——————–+————-+—————-+—————–+ | radacctid | acctsessionid     | acctuniqueid                     | username         | groupname | realm | nasipaddress | nasportid | nasporttype     | acctstarttime       | acctupdatetime      | acctstoptime        | acctinterval | acctsessiontime | acctauthentic | connectinfo_start      | connectinfo_stop       | acctinputoctets | acctoutputoctets | calledstationid                  | callingstationid  | acctterminatecause | servicetype | framedprotocol | framedipaddress | +———–+——————-+———————————-+——————+———–+——-+————–+———–+—————–+———————+———————+———————+————–+—————–+—————+————————+————————+—————–+——————+———————————-+——————-+——————–+————-+—————-+—————–+ |         1 | 516AE1C5-0000001D | b7e2e4141933578a88f9ce2bb60373dc |toto@example.com |           |       | 192.168.3.6  | 1         | Wireless-802.11 | 2013-10-18 00:30:45 | 2013-10-18 00:30:45 | 2013-10-18 00:31:58 |         NULL |              73 | RADIUS        | CONNECT 54Mbps 802.11g | CONNECT 54Mbps 802.11g |           23987 |            16448 | 74-44-01-8D-79-15:test | 68-96-7B-12-00-8C | User-Request       |             |                |                 |  

 

Comment comprendre les problèmes lors de la mise en place

De manière générale, il est important d’avoir lu le deuxième tutoriel sur les logs. De manière plus particulière il est important de contrôler qu’au démarrage le serveur se connecte bien à  la base de données :   – Extrait de log du serveur

Mon Sep 29 22:21:20 2014 : Info: rlm_sql_mysql: Starting connect to MySQL server for #0 Mon Sep 29 22:21:20 2014 : Info: rlm_sql (sql): Connected new DB handle, #0 Mon Sep 29 22:21:20 2014 : Info: rlm_sql (sql): Attempting to connect rlm_sql_mysql #1 Mon Sep 29 22:21:20 2014 : Info: rlm_sql_mysql: Starting connect to MySQL server for #1 Mon Sep 29 22:21:20 2014 : Info: rlm_sql (sql): Connected new DB handle, #1 Mon Sep 29 22:21:20 2014 : Info: rlm_sql (sql): Attempting to connect rlm_sql_mysql #2 Mon Sep 29 22:21:20 2014 : Info: rlm_sql_mysql: Starting connect to MySQL server for #2 Mon Sep 29 22:21:20 2014 : Info: rlm_sql (sql): Connected new DB handle, #2 Mon Sep 29 22:21:20 2014 : Info: rlm_sql (sql): Attempting to connect rlm_sql_mysql #3 Mon Sep 29 22:21:20 2014 : Info: rlm_sql_mysql: Starting connect to MySQL server for #3 Mon Sep 29 22:21:20 2014 : Info: rlm_sql (sql): Connected new DB handle, #3 Mon Sep 29 22:21:20 2014 : Info: rlm_sql (sql): Attempting to connect rlm_sql_mysql #4 Mon Sep 29 22:21:20 2014 : Info: rlm_sql_mysql: Starting connect to MySQL server for #4 Mon Sep 29 22:21:20 2014 : Info: rlm_sql (sql): Connected new DB handle, #4

puis lors qu’on reçoit une requête de vérifier que le module sql est correctement appellé et que la requête SQL correspond aux souhaits voulus.   – Extrait fichier de log freeradius en mode debug  

Mon May 28 09:21:09 2012 : Debug: [sql]      expand: %{User-Name} -> toto@example.com Mon May 28 09:21:09 2012 : Debug: [sql] sql_set_user escaped user –> ‘toto@example.com’ Mon May 28 09:21:09 2012 : Debug: [sql]      expand: SELECT id, username, attribute, value, op           FROM radcheck           WHERE username = ‘%{SQL-User-Name}’           ORDER BY id -> SELECT id, username, attribute, value, op           FROM radcheck           WHERE username = ‘toto@example.com’           ORDER BY id Mon May 28 09:21:09 2012 : Debug: [sql] User found in radcheck table Mon May 28 09:21:09 2012 : Debug: [sql]      expand: SELECT id, username, attribute, value, op           FROM radreply           WHERE username = ‘%{SQL-User-Name}’           ORDER BY id -> SELECT id, username, attribute, value, op           FROM radreply           WHERE username = ‘toto@example.com’           ORDER BY id Mon May 28 09:21:09 2012 : Debug: [sql]      expand: SELECT groupname           FROM radusergroup           WHERE username = ‘%{SQL-User-Name}’           ORDER BY priority -> SELECT groupname           FROM radusergroup           WHERE username = ‘toto@example.com           ORDER BY priority Mon May 28 09:21:09 2012 : Debug: [sql]      expand: SELECT id, groupname, attribute,           Value, op           FROM radgroupcheck           WHERE groupname = ‘%{Sql-Group}’           ORDER BY id -> SELECT id, groupname, attribute,           Value, op           FROM radgroupcheck           WHERE groupname = ‘group-ppp-1’           ORDER BY id Mon May 28 09:21:09 2012 : Debug: [sql] User found in group group-ppp-1 Mon May 28 09:21:09 2012 : Debug: [sql]      expand: SELECT id, groupname, attribute,           value, op           FROM radgroupreply           WHERE groupname = ‘%{Sql-Group}’           ORDER BY id -> SELECT id, groupname, attribute,           value, op           FROM radgroupreply           WHERE groupname = ‘groupe-ppp-1’           ORDER BY id Mon May 28 09:21:09 2012 : Debug: ++[sql] returns ok Mon May 28 09:21:09 2012 : Debug: [pap] WARNING: Auth-Type already set.  Not setting to PAP Mon May 28 09:21:09 2012 : Debug: ++[pap] returns noop Mon May 28 09:21:09 2012 : Debug: Found Auth-Type = CHAP

 

Étendre les fonctionnalités des modules sql

La compréhension des fichiers de configuration sql, ainsi que le schéma permettent ensuite de faire beaucoup de choses : – Rajouter des données non prévues dans le schéma de base – Faire des mises à jour de certains champs plutôt que de rajouter systématiquement de l’information (évite de se retrouver avec un million d’enregistrements dans un table d’acccounting) – Rajouter des tables pour stocker d’autres types d’information

Laisser un commentaire

Votre adresse de messagerie ne sera pas publiée. Les champs obligatoires sont indiqués avec *