Mar 09 2007
Déconnectez vos Users Radius avec le Packet of Disconnect
Mon but ici est de redémarrer automatiquement la session d’un client pour qui les paramètres Radius ont changé. Ceci est particulièrement intéressant après une mise en restriction ou une déconnexion pour usage intensif. Je suis assez surpris de trouver très peu d’information sur le « Packet Of Disconnect » en tapant « Radius » dans un moteur de recherche. J’ai écrit un script en langage Expect qui se loggue sur le routeur et redémarre une connexion en se basant sur le nom d’utilisateur.
Même si cela fonctionne, je pense que la méthode n’est pas vraiment adéquate. J’ai l’impression d’émuler un robot qui fait quelque chose qui devrait être manuel. C’est aussi difficile de gérer les erreurs puiqu’on est censé savoir à quelles réponses s’attendre. Quoiqu’il en soit, voici une solution bien meilleure: le « Packet Of Disconnect » Radius que nous allons utiliser avec une base utilisateurs Freeradius.
Packet Of Disconnect
Je ne devrais pas à avoir à trop détailler. Toutes les informations sont sur le wiki Freeradius. Je pense que ce n’est pas si évident à trouver, même en étant sur le wiki.
Quelques commentaires:
- Vous n’avez pas à envoyer tous les attributs pour redémarrer une connexion. Le username est suffisant mais je pense qu’il est plus sécurisant d’y ajouter le session id.
- Le Network Access Server (NAS) doit écouter sur le port 1700. Vérifiez dans la section suivante pour l’activer sur un routeur Cisco.
Configuration du Routeur / NAS
Le NAS doit écouter les requêtes sur le port UDP 1700. Il peut être changé bien sûr mais ceci est le port standard. Une fois de plus, cet exemple est spécifique à Cisco, lisez votre documentation si vous avez un autre type d’équipement sur votre réseau. Vous devez exécuter la commande aaa pod pour activer le port packet of disconnect Radius
aaa pod server clients your-server auth-type any server-key your-shared-secret
Remplacez your-server par l’IP de votre serveur qui hébergera votre script reset.
J’ai fixé ‘auth-type’ à ‘any’ puisque je n’envoie que les paramètres username et session id. Ils ne sont pas tous requis niveau sécurité. Vous pouvez obtenir plus d’information à ce sujet dans la référence des commandes Cisco.
Script de Déconnexion
La documentation sur le wiki Freeradius devrait être suffisante mais je voudrais mentionner un moyen rapide de récupérer le NAS and le session id relatif à un utilisateur donné. Une simple ligne de SQL fera l’affaire si vous avez configuré une base de données telle que Mysql ou Postgresql pour enregistrer l’accounting (Recommandé, c’est tellement plus facile pour chercher des données!)
SELECT Username, AcctSessionId, NASIPAddress
FROM radacct
WHERE username='username'
AND acctstoptime = 0
ORDER BY acctstarttime DESC limit 1;
Si aucune réponse n’est renvoyée, l’utilisateur n’est pas connecté et sa session n’a donc pas besoin d’être redémarrée.
Ayant toutes les informations requises, on peut faire un reset de la connexion Radius très simplement:
$ echo "Acct-Session-Id=D91XXXXXXXXX097" > packet.txt
$ echo "User-Name=username" >> packet.txt
$ echo "NAS-IP-Address=nasIPaddress" >> packet.txt
$ cat packet.txt | radclient -x nasIPaddrress:1700 disconnect ''secret''
C’est vrai, il n’y a pas beaucoup d’informations à ce sujet. On peut procéder ainsi avec un script shell :
#!/bin/sh
# Param1 = ‘NAS-IP-Address=192.168.0.254, User-Name=test,
# Framed- IP-Address=192.168.1.253, Acct-Session-Id=
# Param2 = 192.168.0.254:1700
# Param3 = ‘passwordpartageradius’
echo $1 > /usr/local/www/apache22/sites/exec/logparams.txt
echo $2 >> /usr/local/www/apache22/sites/exec/logparams.txt
echo $3 >> /usr/local/www/apache22/sites/exec/logparams.txt
result=`echo « $1 » | /usr/local/bin/radclient $2 disconnect $3`
echo $result > /usr/local/www/apache22/sites/exec/logexec.txt
return 0
ceci permet de déconnecter l’utilisateur actif du NAS.