Table des matières

Radius

RADIUS est un protocole AAA qui réalise 3 fonctions: l'authentification, l'autorisation, la traçabilité des membres d'un réseau. À MiNET, nous devons être en mesure de savoir qui se cache derrière une adresse IP, c'est pourquoi il est primordial d'authentifier chaque utilisateur par le biais de leurs appareils. Nous devons également vérifier la date de départ et le blocage de certain adhérents, la section d'autorisation est faite pour.

RADIUS supporte différents standard d'authentification comme PAP et EAP. Ça nous permet d'authentifier des appareils filaires (avec 802.1X qui implémente PEAP) et des appareils sans fil en passant par un WLAN Controller. Les appareils réseaux directement connectés à l'utilisateur final s'appellent des NAS (Network Access System, à ne pas confondre avec les Network Attached Storage). Les NAS partagent un secret avec le serveur RADIUS pour protéger les échanges de données personnelles sur le réseau d'administration.

Historique à MiNET

A MiNET, nous avons utilisé dans un premier temps un serveur freeradius patché pour utiliser une base de donnée distante d'utilisateur (via REST et ADH5). Le schéma était un peu complexe malgré la beauté du patch:

Le patch fait par Guillaume Rose est disponible ici : https://github.com/guillaumerose/radius-http-json

Minet possédait deux serveurs freeradius : pour le filaire et le wifi. Nous avons voulu améliorer cette architecture.

Installation de FreeRadius avec Patch

Voici un description succincte des étapes que j'ai réalisées

Installation de FreeRadius avec rlm_python

Freeradius 3 est intégré dans Debian stretch. Il suffit de sourcer les dépots correspondants.

Fonctionnement interne de FreeRadius

FreeRadius est extensible un peu à la manière de Apache : il a des sites et des modules pour les différentes utilisation du logiciel. La documentation est disponible sur le site : http://freeradius.org/

FreeRadius 2 ne permettait pas d'être flexible poour la méthode de stockage des informations des utilisateurs. La version 3 apporte une bonne extensibilité : LDAP, MySQL, Local, REST. Les modules rlm_rest et rlm_python sont particulièrement intéressants.

Actuellement, nous utilisons les modules suivants :

Concernant les sites :

Haute disponibilité

Les serveurs radius et radius2 sont en haute disponibilité.

Sur les WLANC, il est possible de référencer plusieurs serveurs pour l'authentification. Les WLANC utilisent une politique de failover.

Sur les switch, cette fonctionnalité est également activée. Les switchs peuvent faire du load-balancing. http://www.cisco.com/c/en/us/products/collateral/ios-nx-os-software/identity-based-networking-services/whitepaper_C11-731907.html

Nouvel outil utilisant Radius: ex Wlan Controller

Lors de l'achat d'un nouveau WLC ou en général lorsqu'un équipement veut utiliser radius, il faut l'ajouter dans le /etc/freeradius/clients.conf en suivant la syntaxe déjà utilisé précédemment.

Schéma de base de donnée

Freeradius utilise une base de donnée distante 'radius' initialisée avec les utilitaires d'initialisation de bdd packagés avec freeradius. Cependant, pour procéder à l'authentification des adhérents (mschapv2), il est nécessaire de pointer vers les données enregistrés dans la base de données d'ADH5. Pour ce faire, on créé 4 vues (similaire à kea) : login_authorize, login_to_macf, login_to_macw, radcheck.

NB : On utilise une vue des tables de la base de donnée adh5 pour la base de donnée radius, il s'agit donc de vue externe à une base de donnée.

NB2: Il peut être nécessaire de réaliser un drop table sur certaines tables créés par le script automatique de freeradius. (ex: radcheck)

Création de la vue login_authorize:

CREATE ALGORITHM=UNDEFINED DEFINER=`thunder`@`%` SQL SECURITY DEFINER VIEW `login_authorize` AS select `adh5-prod`.`adherents`.`id` AS `id`,`adh5-prod`.`adherents`.`login` AS `login`,`adh5-prod`.`vlans`.`numero` AS `vlan_nb`,`adh5-prod`.`adherents`.`date_de_depart` AS `date_de_depart`,`adh5-prod`.`adherents`.`mode_association` AS `mode_association` from ((`adh5-prod`.`adherents` join `adh5-prod`.`chambres`) join `adh5-prod`.`vlans`) where ((`adh5-prod`.`adherents`.`chambre_id` = `adh5-prod`.`chambres`.`id`) and (`adh5-prod`.`chambres`.`vlan_id` = `adh5-prod`.`vlans`.`id`));

Création de la vue login_to_macf:

CREATE ALGORITHM=UNDEFINED DEFINER=`thunder`@`%` SQL SECURITY DEFINER VIEW `login_to_macf` AS select `A`.`login` AS `login`,`O`.`mac` AS `mac` from (`adh5-prod`.`adherents` `A` join `adh5-prod`.`ordinateurs` `O`) where (`A`.`id` = `O`.`adherent_id`);

Création de la vue login_to_macw:

CREATE ALGORITHM=UNDEFINED DEFINER=`thunder`@`%` SQL SECURITY DEFINER VIEW `login_to_macw` AS select `adh5-prod`.`adherents`.`login` AS `login`,`adh5-prod`.`portables`.`mac` AS `mac` from (`adh5-prod`.`portables` join `adh5-prod`.`adherents`) where (`adh5-prod`.`portables`.`adherent_id` = `adh5-prod`.`adherents`.`id`);

Création de la vue radcheck:

CREATE ALGORITHM=UNDEFINED DEFINER=`thunder`@`%` SQL SECURITY DEFINER VIEW `radcheck` AS select `adh5-prod`.`adherents`.`id` AS `id`,`adh5-prod`.`adherents`.`login` AS `username`,'NT-Password' AS `attribute`,':=' AS `op`,`adh5-prod`.`adherents`.`password` AS `value` from `adh5-prod`.`adherents`;