FreeRADIUS

De Justine's wiki
Aller à la navigation Aller à la recherche

Mise en place d'un point d'accès wifi 802.1X, en utilisant un serveur freeradius couplé à un annuaire LDAP, ainsi qu'une base de données SQL pour l'accounting.

 

Matériel / Logiciels utilisés:

-Une machine virtuelle sous Debian Stretch disposant d'une IP fixe;

-Un point d'accès wifi HP Procurve 420 disposant également d'une adresse fixe;

-Un poste client pour les tests (le supplicant)

-Un serveur LDAP (non LDAPs) ainsi qu'un compte ayant accès à la lecture des mots de passe sur celui-ci.

-Les logiciels "freeradius" et "freeradius-ldap"; la version utilisée est la 3.0.12

-Une base de données SQL, en local ou sur le réseau

 

Vocabulaire

  • NAS : Il s'agit ici de Network Acces Server, soit en l'occurence le point d'accès WiFi (rien à voir avec Network Attached Storage).
  • Supplicant : Le supplicant désigne ici le client final, soit l'ordinateur de la personne qui cherchera à se connecter au réseau sans fil. On distingue ainsi le serveur (le serveur RADIUS), du "client" (le NAS), du supplicant.

 

 

1e - Mise en place du serveur freeradius

 apt-get install freeradius freeradius-ldap 

La configuration de freeradius lorsqu'il vient d'être installé convient à la plupart des usages; il est conseillé de s'en servir de base et de la modifier petit à petit. De plus, il est vivement conseillé de faire des copies de sauvegardes des fichiers que l'on modifie. Il faut également vérifier systématiquement que freeradius soit propriétaire des fichiers dont il a besoin.

 

Les fichiers dont nous auront besoin sont contenus dans  /etc/freeradius/3.0/ et sont les suivants:

  • radiusd.conf: c'est le fichier de configuration principal de freeradius; il contient des options générales et ne devrait en principe pas avoir besoin d'être modifié pour que le serveur fonctionne. Il peut en fonction des besoin être intéressant d'y modifier les limites de connexions simultanées (max-requests).
  • sites-available et sites-enabled: sites-available contient les fichiers de serveurs virtuels et sites-enabled contient des liens vers les fichiers que l'on souhaite mettre en place; le fonctionnement est similaire à celui d'apache. Les deux fichiers les plus importants sont default et inner-tunnel: default est le serveur par défaut convenant à la plupart des usages t inner-tunnel se charge des tunnels pour le protocole EAP-TTLS.
  • mods-available et mods-enabled: ces deux dossiers fonctionnent sur le même principe et contiennent les modules de freeradius.
  • certs: Ce dossier contient tout ce qui concerne SSL (clefs, certificats, scripts...).
  • clients.conf : ce fichier est là que l'on ajoute les clients du serveurs (en l'occurence, notre point d'accès wifi).
  • users : ce fichier sert à ajouter "en dur" des supplicants, c'est-à-dire des utilisateurs; il peut servir notamment pour effectuer des tests. 

 

Création du fichier de serveur virtuel

Créer dans le dossier sites-available un nouveau fichier de serveur virtuel (vous pouvez également modifier le fichier default; il est cependant fortement conseillé d'en faire une copie de sauvegarde) ayant le contenu suivant (l'explication de la fonction de chaque commande est disponible dans le fichier default):

######
#Serveur fonctionnant avec une authentification EAP-TTLS, un annuaire LDAP et un accounting en SQL
######


########Partie Auth
server{
        listen{
                type = auth     #Ecoute toutes les demandes d'auth sur le port 1812
                port = 1812
                ipaddr = *
        }
        listen{
                ipaddr = *      #Ecoute toutes les demandes d'accounting sur le port
                ipv6addr = ::   #standard
                port = 0
                type = acct
                }


        authorize{
                filter_username #Filtre les usernames et password; certains vieux NAS
                filter_password #envoient parfois des zéros en trop

                preprocess      #Prendre en compte d'abord les hints et huntgroups
                eap             #Ma methode d'auth.
        }

        authenticate{
                eap

        Auth-Type eap {
                eap{
                        handled = 1
                }
                if (handled && (Response-Packet-Type == Access-Challenge)) {
                        attr_filter.access_challenge.post-auth
                        handled #Filtrer certains attributs incorrects emis par notre NAS
                }               #qui est un peu vieux; ceux-ci nous ralentissaient voire
                                #nous empechaient de nous connecter

               }

        }

##########Partie comptabilisation

        preacct {
                acct_unique     #Donne un identifiant semi-unique à chaque requête
                preprocess      #Evite des erreurs avec SQL
                }


        accounting {
                detail          #Ecrit un log en clair dans un fichier; ici les request
                unix            #Logue les users connectés à mon NAS dans radwtmp
                sql

                attr_filter.accounting_response         #Filtre les attributs dans les reponses
        }

        session {
                radutmp #Ecrit dans un fichier UNIX les connexions; utile aux commandes radwho et radlast
        }

###Partie post-auth


        post-auth {
        Post-Auth-Type REJECT {
                attr_filter.access_reject
                -sql
                }
        }
}
 

Une fois ceci fait, il faut d'abord en donner la propriété à freeradius avec un chown freerad:freerad mon_fichier. Vous pourrez ensuite créer un lien vers celui-ci dans le dossier sites-enabled , et supprimer si nécessaire le lien vers default.

 

Fichier inner-tunnel:

Le fichier inner-tunnel "de base" doit normalement fonctionner; il faut juste éventuellement s'assurer que la ligne "-ldap" apparaît bien dans la section authorize.

 

Configuration des modules LDAP et EAP

Dans le dossier mods-available:

  • Ouvrir dans un éditeur de texte le fichier ldap afin de décommenter et modifier les lignes suivantes :
#server = 'ldap.rrdns.example.org' 
#identity = 'cn=admin,dc=example,dc=org' 
#password = mypass 
base_dn = 'dc=example,dc=org'
 

Note : Selon la configuration de votre annuaire LDAP, vous aurez peut-être besoin de modifier la ligne filter = "(uid=%{%{Stripped-User-Name}:-%{User-Name}})", en replaçant par exemple uid par cn.

 

Sauvegarder le fichier, puis créer un lien vers celui-ci dans mods-enabled si il n'existe pas.

 
  • Ouvrir ensuite le fichier eap:
    • remplacer default_eap_type = gtc par default_eap_type = ttls (en début de fichier).
    • Note : Le serveur pourrait fonctionner ainsi, avec des certificats snakeoil. Cependant vous pourrez utiliser vos certificats et clefs privées en précisant leur emplacement et mots de passe dans le dans le bloc tls-config tls-common. Vous pouvez également décommenter la ligne require_client_cert = yes si vous souhaitez obliger le client à fournir un certificat dans le cadre de l'authentification par EAP-TTLS.
  • Sauvegarder le fichier, puis créer si besoin un lien vers celui-ci dans mods-enabled.
 

Modification du fichier clients:

  • Ouvrir le fichier clients.conf et ajouter un bloc pour votre point d'accès:
client test {                             #Le nom de mon client
       ipaddr=192.168.1.1                 #L'adresse IP du NAS
       proto = *                          #Permet d'écouter les paquets de tous types
       secret=testing123                  #Ce mot de passe est partagé par le serveur freeradius et le NAS
       shortname = radiustest             #Le SSID du NAS, qui sera affiché dans les logs de freeradius
       nas_type = other                   #Accepte quelques modèles de NAS  dont le nôtre ne fait pas partie. (cf. man clients.conf)

        limit {
               max_connections = 16       #Ce bloc est optionnel; il permet de limiter les connexions, ici 16 connexions maximum
               lifetime = 0               #Durée limite des connexions (0 = pas de limite)
               idle_timeout = 30          #Durée avant de quitter lorsque le NAS ne répond pas

       }
}

A ce stade, le serveur serveur freeradius devrait être fonctionnel; vous pouvez tester celui-ci en le lancant avec freeradius -X (qui lance le serveur en mode debug, c'est-à-dire en mode verbeux). Un serveur fonctionnel affiche la ligne : Ready to process requests.

Attention cependant, la commande radtest (qui sert à tester normalement à tester le serveur en simulant une demande Access-Request) ne fonctionnera pas, ce qui est normal car celle-ci ne gère pas le protocole EAP. Cela est normalement faisable en utilisant la commande eapol_test qui fait partie du paquet wpasupplicant sur Debian. Cependant la compilation de eapol_test (qui n'est pas dans les dépôts) ne semble à priori pas possible sur Debian...

 

2e - SQL

L'accounting (comptabilisation) se fera à l'aide, notamment, d'une base de données MySql (que l'on pourra coupler à phpmyadmin pour plus de lisibilité). Le fichier de serveur virtuel fourni plus haut utilise également les commandes detail et radutmp afin d'effectuer plus d'accounting; elles ne sont pas obligatoires.

Si besoin, la source utilisée est la suivante : https://wiki.freeradius.org/guide/SQL-HOWTO-for-freeradius-3.x-on-Debian-Ubuntu#configuring-freeradius-to-use-sql

 

Marche à suivre :

  • Installer les paquets : apt-get install freeradius-mysql phpmyadmin
  • Nous allons ensuite créer une base de données pour radius :
mysql -uroot CREATE DATABASE radius;
exit
  • Pour ensuite y charger les schémas et configurations requises :
mysql -uroot -p radius < /etc/freeradius/3.0/mods-config/sql/main/mysql/schema.sql
mysql -uroot -p radius < /etc/freeradius/3.0/mods-config/sql/main/mysql/setup.sql
  • Le fichier setup.sql créée un utilisateur nommé radius avec pour mot de passe "radpass" ayant les droits sur la base de données "radius". Il est recommandé de changer ce mot de passe qui est standard, ainsi que de vérifier que cet utilisateur a bien les droits nécessaires.
  • Nous allons ensuite configurer le fichier sql contenu le fichier mods-available. Les lignes à modifier sont les suivantes :
driver = "rlm_sql_mysql"
[...]
dialect = "mysql"
[...]
server = "localhost"   #Adresse du serveur
port = 3306 # A vérifier
login = "radius" #Le compte créé plus tôt
password = "radpass" #avec son mot de passe
  • Le reste du fichier ne devrait pas avoir besoin d'être modifié; vous pouvez vérifier que la valeur sql est bien présente dans la partie accounting de votre fichier de serveur virtuel. Il faut bien entendu ne pas oublier de créer un lien vers sql dans le dossier mods-enabled.
  • Les informations d'accounting sont stockées dans la table "raddact".

NB : Si vous le souhaitez, vous pouvez décommenter la ligne logfile = ${logdir}/sqllog.sql dans le fichier de configuration du module sql. Celle-ci permet d'effectuer une copie des requêtes SQL effectuées dans un fichier texte situé dans le répertoire de logs de freeradius. Attention cependant, celui-ci peut contenir des mots de passe en clair malgré l'utilisation d'EAP-TTLS. De plus il peut être utile de vérifier le fichier inner-tunnel; notamment la partie post-auth-type REJECT. En effet, si vous laissez la mention "-sql" dans celle-ci, les tentatives de connexion ratées seront enregistrées dans la table "radpostauth" et contiendront entre autre les mots de passe utilisés lors de ces tentatives de connexions (en clair, là encore). Il faut également supprimer sql des sections authorize / authentication de celui-ci, afin d'éviter les erreurs de connexion.

3e Configuration du NAS

La configuration du NAS est assez simple : une fois son interface ethernet configurée, il suffit pour la partie sans-fil de mettre en place un SSID en WPA, auquel on précisera l'adresse IP du serveur RADIUS. Il faudra également activer les demandes d'accounting.

Sur le HP Procurve 420, les commandes utilisées sont les suivantes :

configure
radius-accounting-server address 192.168.1.1
radius-accounting-server key testing123
radius-accounting-server enable
interface wireless g
ssid index 2 #
ssid-name radiustest
security-suite 9 WPA/WPA2  #Cette commande correspond au choix du WPA auto-négocié
radius-authentication-server address 192.168.1.1
radius-authentication-server key testing123 #testing123 correspond au mot de passe présent dans mon fichier clients.conf

4e Configuration du supplicant

La configuration du supplicant est la suivante : Tunneled TLS - Pas de certificat CA - Inner Authentification : PAP

Le login et le mot de passe demandés doivent bien entendu être présents sur le serveur LDAP.