Table des matières
Configuration FreeRADIUS 3.0.X et 3.2.Y
Si vous procédez à une montée de version majeure, par exemple le passage de FreeRADIUS 2 à FreeRADIUS 3, ne reprenez pas vos anciens fichiers de configs tels quels, utilisez les nouveaux fichiers fournis par défaut avec la nouvelle version comme base de configuration.
README v2023/02/23
Configurations testées avec FreeRADIUS des versions 3.0.19 à 3.0.26 et de 3.2.0 à 3.2.2 dans le contexte suivant :
Rôles : SP + IdP
Accounting : local, pas de relai aux proxies nationaux
EAP : PEAP/MSCHAPv2 (défaut) et TTLS/PAP
Ajout de l'attribut Operator-Name.
Annuaire : Absent, à configurer pour votre site dans mods-enable/<annuaire> et à appeler dans la section 'authorize' du serveur virtuel responsable de l'authentification EAP (edoroam-inner-tunnel dans cet exemple).
Remplacer :
- Vos secrets
- MONREALM : votre realm
- ETABLISSEMENT.TLD : peut être le même que MONREALM ou à défaut votre domaine DNS
- Dans eap.conf : certificats du serveur et de l'AC utilisée
clients.conf
# eduroam.fr
client rad1.eduroam.fr {
ipaddr = 194.57.7.15
netmask = 32
secret =
shortname = rad1.eduroam.fr
nastype = other
virtual_server = eduroam
require_message_authenticator = yes
}
client rad2.eduroam.fr {
ipaddr = 194.57.7.78
netmask = 32
secret =
shortname = rad2.eduroam.fr
nastype = other
virtual_server = eduroam
require_message_authenticator = yes
}
# Mon site
client AP01.ETABLISSEMENT.TLD {
ipaddr = xx.xx.xx.xx
netmask = 32
secret =
shortname = Borne-AP01
nastype = other
virtual_server = eduroam
require_message_authenticator = yes
Operator-Name = 1ETABLISSEMENT.TLD # A déclarer uniquement pour les clients
# locaux (borne, contrôleur) offrant le
# service Wi-Fi. Doit commencer par '1'
}
client WLC01.ETABLISSEMENT.TLD {
ipaddr = xx.xx.xx.xx
netmask = 32
secret =
shortname = Controleur-WLC01
nastype = other
virtual_server = eduroam
require_message_authenticator = yes
Operator-Name = 1ETABLISSEMENT.TLD # A déclarer uniquement pour les clients
# locaux (borne, contrôleur) offrant le
# service Wi-Fi. Doit commencer par '1'
}
proxy.conf
proxy server {
default_fallback = no
}
home_server rad1.eduroam.fr {
type = auth
ipaddr = 194.57.7.15
port = 1812
secret =
response_window = 20
zombie_period = 40
status_check = status-server
check_interval = 20
num_answers_to_alive = 3
}
home_server rad2.eduroam.fr {
type = auth
ipaddr = 194.57.7.78
port = 1812
secret =
response_window = 20
zombie_period = 40
status_check = status-server
check_interval = 20
num_answers_to_alive = 3
}
home_server_pool pool-eduroam-fr {
type = fail-over
home_server = rad1.eduroam.fr
home_server = rad2.eduroam.fr
}
realm MONREALM {
nostrip
}
realm NULL {
}
realm "~.+$" {
auth_pool = pool-eduroam-fr
nostrip
}
serveur virtuel par défaut : sites-available/eduroam
server eduroam {
listen {
type = "auth"
ipaddr = *
port = 0
}
listen {
type = "acct"
ipaddr = *
port = 0
}
authorize {
# Force le format de l'attribut calling_station_id (CSI) pour avoir la même
# syntaxe des @MAC quelque soit le NAS (ou client) envoyant la requête
rewrite_calling_station_id
# Quelques filtres sanitaire sur le User-Name : pas d'espace, pas @ multiples,...
filter_username
# Ajout de l'attribut Operator-Name pour toute requête provenant d'un client
# ayant la variable 'Operator-Name' déclarée (voir clients.conf)
operator-name
auth_log
suffix
# Rejet des authentifications sans realm
if (Realm == "NULL") {
update request {
&Module-Failure-Message += 'Rejected: Realm is NULL'
}
reject
}
# On accepte uniquement EAP. ie: les demandes d'authentifications en RADIUS simple
# (PAP, CHAP, MSCHAP) ne sont pas acceptées
eap
}
authenticate {
# Uniquement le module eap
eap
}
preacct {
suffix
}
accounting {
}
post-auth {
reply_log
Post-Auth-Type REJECT {
reply_log
}
}
pre-proxy {
pre_proxy_log
if("%{Packet-Type}" != "Accounting-Request") {
attr_filter.pre-proxy
}
}
post-proxy {
post_proxy_log
attr_filter.post-proxy
}
}
serveur virtuel responsable de l'authentification EAP : sites-available/eduroam-inner-tunnel
server eduroam-inner-tunnel {
authorize {
auth_log
eap
files # pour le compte de test eduroam.fr s'il est déclaré dans le fichier local users
mschap
pap
}
authenticate {
Auth-Type PAP {
pap
}
Auth-Type MS-CHAP {
mschap
}
eap
}
post-auth {
reply_log
Post-Auth-Type REJECT {
reply_log
update outer.session-state {
&Module-Failure-Message := &request:Module-Failure-Message
}
}
}
}
Rendez accessibles ces 2 serveurs virtuels. Si votre service FreeRADIUS est dédié à eduroam, supprimez les autres serveurs virtuels présents dans le répertoire sites-enabled. Sinon, adaptez votre configuration : dans la section <listen> le couple formé par @IP + port UDP d'écoute (0 dans cet exemple signifie le port par défaut: 1812 pour les authentifications, 1813 pour l'accounting) doit être unique, il ne peut pas apparaître dans plusieurs serveurs virtuels.
Pour activer ces serveurs virtuels :
cd sites-enabled; ln -s ../sites-available/eduroam; ln -s ../sites-available/eduroam-inner-tunnel
Module EAP : mods-available/eap
eap {
# Informations générales communes aux méthodes EAP utilisées
default_eap_type = peap # Méthode EAP par défaut
timer_expire = 60
ignore_unknown_eap_types = no
cisco_accounting_username_bug = no
max_sessions = ${max_requests}
tls-config tls-common {
# La clée privée de votre certificat
private_key_file = ${certdir}/<CERTIF>.key
# Votre certificat
certificate_file = ${certdir}/<CERTIF>.crt
# La chaîne de certification de l'autorité de certification (AC) ayant signée votre
# certificat. svp lire https://www.eduroam.fr/certifs
# Exemple avec l'AC TCS Sectigo version courte qui a 1 certificat intermédiaire et
# 1 certificat racine.
# La chaîne de certification "<CA>.crt" est alors constituée du certificat intermédiaire :
# C = NL, O = GEANT Vereniging, CN = GEANT OV RSA CA 4
#
# Coté supplicant, on déploie le certificat racine sur tous les terminaux :
# C = US, ST = New Jersey, L = Jersey City, O = The USERTRUST Network,
# CN = USERTrust RSA Certification Authority
#
ca_file = ${cadir}/<CA>.crt
# Si OpenSSL >= 1.1.0, le paramètre dh_file est inutile, sinon décommenter la ligne suivante
#dh_file = ${certdir}/dh
ca_path = ${cadir}
# La liste des suites de chiffrement utilisables entre OpenSSL et le supplicant.
# Cette liste est variable en fonction des distributions, on se base sur
# la liste DEFAULT que l'on peut limiter en excluant certaines suites
# comme SSLv3 et celles de type 'Pre-Shared Key' (PSK) par exemple :
# cipher_list = "DEFAULT !SSLv3 !PSK"
# Vous pouvez comparer ces listes avec les commandes : openssl ciphers -v '<LISTE>'
#
# Note : Si vous acceptez TLS < 1.2 (voir + bas) alors, avec une version d'OS récente,
# il faudra peut être préciser à OpenSSL d'utiliser une liste moins restrictive :
# cipher_list = "DEFAULT@SECLEVEL=1" pour OpenSSL < 3.x
# cipher_list = "DEFAULT@SECLEVEL=0" pour OpenSSL >= 3.x
#
cipher_list = "DEFAULT !SSLv3 !PSK"
# On laisse OpenSSL gérer les courbes elliptiques utilisées
ecdh_curve = ""
# Si votre serveur utilise OpenSSL >= 1.1.0 alors il faut définir les paramètres
# tls_min_version et tls_max_version.
# Les choix possibles sont : 1.0, 1.1, 1.2 et 1.3 (1.3 à partir de freeRADIUS >= 3.0.19).
#
# Il est fortement recommandé d'utiliser TLS version 1.2
#
# Sachez cependant que certains périphériques anciens utilisent encore la version 1.0 pour
# leur supplicant EAP (même s'il ne l'utilise plus pour du https par exemple).
# tls_min_version est donc à adapter à votre parc de clients.
#
# tls_max_version doit être à 1.2 (TLS 1.3 est uniquement supporté par certains supplicants pour
# EAP-TLS (certificats personnels), pas encore pour les autres méthodes EAP).
# Sans la définition de ce paramètre, freeRADIUS utilisera la version TLS la plus
# haute proposée par la librairie OpenSSL : 1.3 avec OpenSSL >= 1.1.1
#
# Exemple pour accepter uniquement les méthodes EAP avec TLS en version 1.2 :
tls_min_version = "1.2"
tls_max_version = "1.2"
# Vous pouvez valider le cache si vous souhaitez avoir des re-authentifications EAP
# plus rapides (voir doc freeRADIUS à ce sujet), il est désactivé dans cet exemple.
cache {
enable = no
}
verify {
}
ocsp {
enable = no
}
}
# Déclaration des méthodes EAP utilisées, dans cet exemple : TTLS/PAP et PEAP/MSCHAPv2.
# Surtout ne pas indiquer d'autres méthodes EAP inutilisées et/ou pas configurées, en particulier
# les méthodes obsolètes comme LEAP (retirée de freeRADIUS depuis la version 3.0.22) et MD5 ne
# doivent pas être listées.
ttls {
tls = tls-common
default_eap_type = pap # Dans cet exemple on fait du PAP dans TTLS
copy_request_to_tunnel = yes
use_tunneled_reply = yes
virtual_server = "eduroam-inner-tunnel"
}
peap {
tls = tls-common
default_eap_type = mschapv2 # Dans cet exemple on fait du MSCHAPv2 dans PEAP
copy_request_to_tunnel = yes
use_tunneled_reply = yes
virtual_server = "eduroam-inner-tunnel"
}
mschapv2 {
}
}
Attributs
Dans mods-config/attr_filter/pre-proxy, assurez vous que les attributs suivants sont bien présents :
DEFAULT
...
User-Name =* ANY,
EAP-Message =* ANY,
Message-Authenticator =* ANY,
NAS-IP-Address =* ANY,
NAS-Identifier =* ANY,
State =* ANY,
Proxy-State =* ANY,
Calling-Station-Id =* ANY,
Called-Station-Id =* ANY,
Operator-Name =* ANY,
Chargeable-User-Identity =* ANY,
...
Dans mods-config/attr_filter/post-proxy, assurez vous que les attributs suivants sont bien présents :
DEFAULT
...
User-Name =* ANY,
Chargeable-User-Identity =* ANY,
...
radiusd.conf
Très peu de modifications sont nécessaires dans ce fichier, on ajoute juste des traces pour les authentifications car elles peuvent contenir des infos intéressantes.
Assurez vous aussi que le paramètre status_server est bien activé, c'est normalement le cas par défaut. Les requêtes status-server sont utilisées par les proxies nationaux pour déterminer l'état de votre serveur.
log {
...
auth = yes
}
security {
...
status_server = yes
}
Traces (section optionnelle)
Si vous voulez des traces supplémentaires, c'est à dire avec des attributs spécifiques comme par exemple l'attribut Operator-Name, il faut explicitement les demander avec le module linelog, on ne peut pas modifier les informations tracées par défaut.
Exemple pour un site fournisseur d'identité eduroam : tracer l'attribut Operator-Name, @MAC du supplicant, l'identité interne de l'utilisateur et savoir si l'authentification a réussie ou pas.
Créer le fichier mods-available/eduroam_logging avec :
linelog eduroam_inner_log {
# syslog
filename = ${logdir}/eduroam.log
permissions = 0640
format = ""
reference = "inner_auth_log.%{%{reply:Packet-Type}:-format}"
inner_auth_log {
Access-Accept = "%t : eduroam-inner-auth (%n) #VISINST=%{request:Operator-Name}#USER=%{User-Name}#CSI=%{%{Calling-Station-Id}:-Unknown Caller Id}#RESULT=OK#"
Access-Reject = "%t : eduroam-inner-auth (%n) #VISINST=%{request:Operator-Name}#USER=%{User-Name}#CSI=%{%{Calling-Station-Id}:-Unknown Caller Id}#RESULT=FAIL#"
}
}
# <filename> : doit être différent du fichier de logs par défaut pour éviter des pbs d'accès concurrent
# %t : horodatage de la trace
# %n : numéro de requête, il sera identique à celui contenu dans les logs par défaut
Activer ce module :
cd mods-enabled; ln -s ../mods-available/eduroam_logging
Enfin il faut appeler le module, puisque dans cet exemple on veut l'identité interne de l'utilisateur, on peut le faire dans la section post-auth du serveur virtuel interne (eduroam-inner-tunnel) :
post-auth {
...
eduroam_inner_log
...
Post-Auth-Type REJECT {
...
eduroam_inner_log
...
}
...
}
Chargeable-User-Identity
Configuration pour cet attribut.
