WikiMiNET

La documentation technique et administrative

Outils pour utilisateurs

Outils du site


wiki:services:radius

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:

  • L'utilisateur contacte un NAS et envoie sa trame EAP
  • Le NAS contacte le serveur RADIUS avec les informations de l'utilisateur
  • Le serveur vérifie le type de requête. Si c'est une requête EAP MSCHAPv2, il fait une requête HTTP à ADH5 pour recevoir le hash du mot de passe de l'utilisateur et son VLAN
  • Si les informations sont correctes, RADIUS renvoie un message d'autorisation au NAS et demande au NAS de lui attribuer un port un VLAN (41 à 49 pour le filaire). C'est le VLAN Assignement.
  • Quand le port est dans le bon VLAN, l'utilisateur peut faire une requête DHCP et obtenir une adresse IP.

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 :

  • EAP avec Mschapv2 pour le type d'authentification
  • MySQL pour approvisionner le serveur avec les données utilisateurs
  • rlm_python pour faire l'autorisation de l'utilisateur : vérification de la date de départ, de l'adresse MAC et d'un éventuel blocage. Cette partie nous permet également de faire le mode association (en gros on est permissive pour l'adresse MAC, et on l'ajoute au profil de l'utilsateur).

Concernant les sites :

  • default est le site pour les requêtes filaires. Quand PEAP est utilisé, ce profil en appelle un autre : inner-tunnel
  • inner-tunnel a accès aux données du tunnel sécurisé PEAP. Il vérifie le login et mot de passe (avec MSCHAPv2) pour l'authentification, et utilise rlm_python pour l'autorisation.

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`;
wiki/services/radius.txt · Dernière modification: 2020/06/27 18:16 (modification externe)