RADIUS

Procédure validée sur Debian 13

Présentation

RADIUS est un protocole client-serveur permettant de centraliser des données d'authentification.

FreeRADIUS est un serveur RADIUS libre permettant de s'authentifier. Le protocole RADIUS permet de se connecter via un échange de paquets UDP, généralement sur le port 1812. RADIUS intègre également un module d'accounting, permettant par exemple de la facturation. RADIUS permet de s'authentifier via divers moyens comme une authentification en clair, par adresse MAC, via base MySQL/PostgreSQL, protocole MSCHAPv1 et MSCHAPv2 ou encore annuaire LDAP.

Dans cette documentation, nous allons voir les configurations suivantes :

Installation de FreeRADIUS

Pour installer RADIUS et ses dépendances, taper la commande suivante :

apt install freeradius nftables

Pour une configuration se basant sur une base MariaDB, installer :

apt install freeradius-mysql mariadb-server

Pour une configuration utilisant un annuaire LDAP, installer :

apt install freeradius-ldap

Autoriser le trafic vers le serveur FreeRADIUS en modifiant le fichier /etc/nftables.conf. Adapter selon les autres services déjà installés :

Pensez à créer une règle pour SSH si vous utilisez ce service pour configurer votre serveur. Ne vous enfermez pas dehors !
#!/usr/sbin/nft -f

flush ruleset

table inet tableinet {
    chain input {
        type filter hook input priority filter; policy drop;
        iifname lo accept
        udp dport 1812 accept
        udp dport 1813 accept
        ct state {established,related} accept
    }
    chain forward {
        type filter hook forward priority filter;
    }
    chain output {
        type filter hook output priority filter;
    }
}

Activer et redémarrer nftables :

systemctl enable nftables.service
systemctl restart nftables.service

Définition des clients

Il est recommandé d'utiliser un compte individuel par usage pour cloisonner. La configuration des clients se fait dans le fichier /etc/freeradius/3.0/clients.conf

Tout d'abord, changeons le mot de passe du client par défaut. Remplacer la ligne suivante dans la section client localhost et client localhost_ipv6 par le mot de passe de votre choix :

secret = MonMotDePasseClient

Pour ajouter un nouveau client, ajouter la section suivante en ajustant les paramètres. Il est possible de définir un nom de domaine ou une adresse de réseau dans le champ ipaddr (par exemple 10.100.0.0/24) :

client switchs {
       ipaddr          = 10.100.0.1
       secret          = MonNouveauMotDePasse
}

Configuration de base

Nous allons décrire ici comment saisir manuellement des utilisateurs dans FreeRADUS, sans utiliser de base externe. Cette configuration est adaptée pour les petites infrastructures gérant un faible nombre d'utilisateurs (de l'ordre de la dizaine).

Ajoutons un utilisateur dans le fichier /etc/freeradius/3.0/users :

antoine		Cleartext-Password := "MotDePasseUtilisateur"

Redémarrer le service FreeRADIUS :

systemctl restart freeradius

Tester l'authentification :

radtest antoine MotDePasseUtilisateur localhost 1812 MonMotDePasseClient

Voici un exemple de réponse attendue :

Sent Access-Request Id 5 from 0.0.0.0:40330 to 127.0.0.1:1812 length 93
    User-Name = "antoine"
    User-Password = "MotDePasseUtilisateur"
    NAS-IP-Address = 127.0.1.1
    NAS-Port = 1812
    Message-Authenticator = 0x00
    Cleartext-Password = "MotDePasseUtilisateur"
Received Access-Accept Id 5 from 127.0.0.1:1812 to 127.0.0.1:40330 length 38
    Message-Authenticator = 0x30d116a7f1200bea993b48b186a4929e

Configuration avec MariaDB

Nous allons créer une base de données pour FreeRADIUS. Pour cela, se connecter à MariaDB :

mariadb -u root

Créer la base de données, l'utilisateur permettant à FreeRADIUS d'interroger la base et lui accorder les droits nécessaires :

CREATE DATABASE radius;
CREATE USER radius@localhost IDENTIFIED BY "MotDePasseRadiusSQL";
GRANT SELECT,INSERT,UPDATE ON radius.* TO radius@localhost;

Importer le schéma de base de données dans MariaDB :

cat /etc/freeradius/3.0/mods-config/sql/main/mysql/schema.sql | mariadb -u root radius

Ajouter un utilisateur dans la base de données :

mariadb -u root radius
INSERT INTO radcheck (id, username, attribute, op, value) VALUES (NULL , 'antoine', 'SHA2-Password', ':=', SHA2('MotDePasseUtilisateur', 512));

Paramétrer FreeRADIUS pour interroger la base MariaDB en modifiant le fichier /etc/freeradius/3.0/mods-available/sql :

sql {
    dialect = "mysql"
    driver = "rlm_sql_${dialect}"

    mysql {
        #tls {
        #       ca_file = "/etc/ssl/certs/my_ca.crt"
        #       ca_path = "/etc/ssl/certs/"
        #       certificate_file = "/etc/ssl/certs/private/client.crt"
        #       private_key_file = "/etc/ssl/certs/private/client.key"
        #       cipher = "DHE-RSA-AES256-SHA:AES128-SHA"

        #       tls_required = yes
        #       tls_check_cert = no
        #       tls_check_cert_cn = no
        #}

        warnings = auto
    }

    server = "localhost"
    port = 3306
    login = "radius"
    password = "MotDePasseRadiusSQL"
    radius_db = "radius"
}

Activer la configuration de la base SQL :

ln -s /etc/freeradius/3.0/mods-available/sql /etc/freeradius/3.0/mods-enabled/sql

Ajouter la base SQL comme source dans le site par défaut en modifiant les lignes suivantes dans le fichier /etc/freeradius/3.0/sites-available/default :

authorize {
    sql
}

accounting {
    sql
}

session {
    sql
}

post-auth {
    sql
}

Redémarrer le service FreeRADIUS :

systemctl restart freeradius

Tester l'authentification.

Il est possible de voir l'historique des connexions avec la table radpostauth.

Configuration avec OpenLDAP

Pour la création d'un annuaire OpenLDAP, reportez-vous à la documentation spécifique : Installation d'OpenLDAP, PAM-LDAP et NFS.

Ajouter les schémas FreeRADIUS à l'annuaire OpenLDAP :

zcat /usr/share/doc/freeradius/schemas/ldap/openldap/freeradius.ldif.gz > /tmp/freeradius.ldif
ldapadd -Q -Y EXTERNAL -H ldapi:/// -f /tmp/freeradius.ldif
ldapadd -Q -Y EXTERNAL -H ldapi:/// -f /usr/share/doc/freeradius/schemas/ldap/openldap/freeradius-clients.ldif

Modifier la configuration LDAP en éditant le fichier /etc/freeradius/3.0/mods-available/ldap :

ldap {
    server = 'localhost'
    identity = 'cn=radius,dc=mondomaine,dc=local'
    password = 'MotDePasseRadiusLDAP'
    base_dn = 'dc=mondomaine,dc=local'
    update {
        control:Password-With-Header    += 'userPassword'
    }
    user_dn = "LDAP-UserDn"
    user {
        base_dn = "ou=Utilisateurs,dc=mondomaine,dc=local"
        filter = "(uid=%{%{Stripped-User-Name}:-%{User-Name}})"
    }
    group {
        base_dn = "ou=Groupes,dc=mondomaine,dc=local"
        filter = '(objectClass=posixGroup)'
    }
}

Activer la configuration de l'annuaire LDAP :

ln -s /etc/freeradius/3.0/mods-available/ldap /etc/freeradius/3.0/mods-enabled/ldap

Ajouter l'annuaire LDAP comme source dans le site par défaut en modifiant les lignes suivantes dans le fichier /etc/freeradius/3.0/sites-available/default :

authorize {
    ldap
}

Redémarrer le service FreeRADIUS :

systemctl restart freeradius

Tester l'authentification.

Définition des clients dans l'annuaire LDAP

Il est possible d'enregistrer la configuration des clients FreeRADIUS dans l'annuaire LDAP. Pour cela, nous allons créer un objet pour un client en créant le fichier LDIF clientRADIUS.ldif :

dn: ou=Clients-RADIUS,dc=mondomaine,dc=local
objectClass: organizationalUnit
ou: Clients-RADIUS

dn: radiusClientIdentifier=10.100.0.1,ou=Clients-RADIUS,dc=mondomaine,dc=local
objectClass: top
objectClass: radiusClient
radiusClientIdentifier: 10.100.0.1
radiusClientSecret: MotDePasseClientLDAP

Peupler l'annuaire avec la commande suivante :

ldapadd -x -D "cn=admin,dc=mondomaine,dc=local" -f clientRADIUS.ldif -W

Modifier le fichier /etc/freeradius/3.0/mods-available/ldap comme suit :

ldap {
    client {
        base_dn = "ou=Clients-RADIUS,dc=mondomaine,dc=local"
        filter = '(objectClass=radiusClient)'
        attribute {
            ipaddr = 'radiusClientIdentifier'
            secret = 'radiusClientSecret'
        }
    }
    read_clients = yes
}

Redémarrer le service FreeRADIUS :

systemctl restart freeradius

Configuration avec OpenLDAP pour l'affectation de VLAN

Ajouter les schémas FreeRADIUS à l'annuaire OpenLDAP :

zcat /usr/share/doc/freeradius/schemas/ldap/openldap/freeradius.ldif.gz > /tmp/freeradius.ldif
ldapadd -Q -Y EXTERNAL -H ldapi:/// -f /tmp/freeradius.ldif
ldapadd -Q -Y EXTERNAL -H ldapi:/// -f /usr/share/doc/freeradius/schemas/ldap/openldap/freeradius-clients.ldif

Ajouter un hôte dans l'annuaire LDAP. Pour cela, créer le fichier hosts.ldif :

dn: ou=Hotes,dc=mondomaine,dc=local
objectClass: organizationalUnit
ou: Hotes

dn: cn=pc-antoine,ou=Hotes,dc=mondomaine,dc=local
objectClass: top
objectClass: device
objectClass: radiusprofile
objectClass: ieee802Device
objectClass: ipHost
cn: pc-antoine
ipHostNumber: 10.100.0.10
macAddress: 0123456789ab
manager: uid=antoine,ou=Utilisateurs,dc=mondomaine,dc=local
radiusServiceType: Framed-user
radiusTunnelMediumType: IEEE-802
radiusTunnelPrivateGroupId: 50
radiusTunnelType: VLAN

Peupler l'annuaire avec la commande suivante :

ldapadd -x -D "cn=admin,dc=mondomaine,dc=local" -f clientRADIUS.ldif -W

Modifier la configuration LDAP en éditant le fichier /etc/freeradius/3.0/mods-available/ldap :

ldap {
    server = 'localhost'
    identity = 'cn=radius,dc=mondomaine,dc=local'
    password = 'MotDePasseRadiusLDAP'
    base_dn = 'dc=mondomaine,dc=local'
    update {
        control:Password-With-Header     = 'macAddress'
        reply:Tunnel-Type		:= 'radiusTunnelType'
        reply:Tunnel-Medium-Type	:= 'radiusTunnelMediumType'
        reply:Tunnel-Private-Group-ID	:= 'radiusTunnelPrivategroupId'
        control:			+= 'radiusControlAttribute'
        request:			+= 'radiusRequestAttribute'
        reply:				+= 'radiusReplyAttribute'
    }
    user {
        base_dn = "ou=Hotes,dc=mondomaine,dc=local"
        filter = "(macAddress=%{%{Stripped-User-Name}:-%{User-Name}})"
    }
}

Activer la configuration de l'annuaire LDAP :

ln -s /etc/freeradius/3.0/mods-available/ldap /etc/freeradius/3.0/mods-enabled/ldap

Ajouter l'annuaire LDAP comme source dans le site par défaut en modifiant les lignes suivantes dans le fichier /etc/freeradius/3.0/sites-available/default :

authorize {
    ldap
}

Redémarrer le service FreeRADIUS :

systemctl restart freeradius

Tester l'authentification de l'hôte avec l'adresse MAC de la machine comme nom d'utilisateur et mot de passe :

radtest 0123456789ab 0123456789ab localhost 1812 MonMotDePasseClient

Voici un exemple de réponse attendue :

Sent Access-Request Id 142 from 0.0.0.0:51007 to 127.0.0.1:1812 length 82
    User-Name = "0123456789ab"
    User-Password = "0123456789ab"
    NAS-IP-Address = 127.0.1.1
    NAS-Port = 1812
    Message-Authenticator = 0x00
    Cleartext-Password = "0123456789ab"
Received Access-Accept Id 142 from 127.0.0.1:1812 to 127.0.0.1:51007 length 54
    Message-Authenticator = 0xac3cb27edfa6948b28aac407a395c638
    Tunnel-Type:0 = VLAN
    Tunnel-Medium-Type:0 = IEEE-802
    Tunnel-Private-Group-Id:0 = "50"