freeradius-3.0.x

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.


{tr:about_reveal}