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 :
- Une configuration de base stockant les utilisateurs directement dans les fichiers de FreeRADIUS.
- Une configuration permettant de stocker les utilisateurs dans une base MariaDB.
- Une configuration s'appuyant sur OpenLDAP pour stocker les utilisateurs.
- Une configuration s'appuyant sur OpenLDAP pour affecter automatiquement des équipements à un VLAN par rapport à leur adresse MAC.
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 :
#!/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"