freeradius-cui-3.0.x

Configuration FreeRADIUS 3.0.X avec attribut Chargeable-User-Identity (CUI)

README v2022/06/08

A partir de l'installation classique de FreeRADIUS 3.0.X avec l'attribut Operator-Name configuré:

Valider le module CUI

cd mods-enabled; ln -s ../mods-available/cui

Créer un module de traces

Par défaut le CUI n'est pas tracé, il faut utiliser le module 'linelog' de FreeRADIUS pour avoir des traces.
Les traces peuvent être envoyées à syslog ou écrites dans un fichier. Si vous choisissez un fichier et que votre processus principal FreeRADIUS utilise aussi un fichier pour écrire ses traces, il ne faut pas utiliser le même. FreeRADIUS s'attend à être le seul à écrire dedans et en partageant ce fichier vous risquez d'avoir des lignes tronquées, des lignes perdues, des pbs de verrou sur le fichier, etc.
Exemple avec le fichier mods-available/eduroam_cui_logging :

linelog eduroam_cui_log {
#    filename = syslog
    filename = ${logdir}/cui.log
    permissions = 0640
    format = ""
    reference = "auth_log.%{%{reply:Packet-Type}:-format}"
    auth_log {
        Access-Accept = "%t : eduroam-auth#ORG=%{request:Realm}#USER=%{User-Name}#CSI=%{%{Calling-Station-Id}:-Unknown Caller Id}#CUI=%{%{reply:Chargeable-User-Identity}:-Unknown}#MSG=%{%{EAP-Message}:-No EAP Message}#RESULT=OK#"
        Access-Reject = "%t : eduroam-auth#ORG=%{request:Realm}#USER=%{User-Name}#CSI=%{%{Calling-Station-Id}:-Unknown Caller Id}#CUI=%{%{reply:Chargeable-User-Identity}:-Unknown}#MSG=%{%{reply:Reply-Message}:-No Failure Reason}#RESULT=FAIL#"
    }
}

linelog eduroam_cui_inner_log {
#    filename = syslog
    filename = ${logdir}/cui.log
    permissions = 0640
    format = ""
    reference = "inner_auth_log.%{%{reply:Packet-Type}:-format}"
    inner_auth_log {
        Access-Accept = "%t : eduroam-inner-auth#VISINST=%{request:Operator-Name}#USER=%{User-Name}#CSI=%{%{Calling-Station-Id}:-Unknown Caller Id}#CUI=%{%{%{reply:Chargeable-User-Identity}:-%{outer.reply:Chargeable-User-Identity}}:-Local User}#RESULT=OK#"
        Access-Reject = "%t : eduroam-inner-auth#VISINST=%{request:Operator-Name}#USER=%{User-Name}#CSI=%{%{Calling-Station-Id}:-Unknown Caller Id}#CUI=%{%{%{reply:Chargeable-User-Identity}:-%{outer.reply:Chargeable-User-Identity}}:-Local User}#RESULT=FAIL#"
    }
}

Valider ce module de traces

cd mods-enabled; ln -s ../mods-available/eduroam_cui_logging

clients.conf

Ajoutez 'add_cui = yes' dans le paragraphe de définition vos clients wifi locaux. Exemple :

client AP1.ETABLISSEMENT.TLD {
    ipaddr                        = xx.xx.xx.xx
    netmask                       = 32
    secret                        =
    shortname                     = Borne-AP1
    nastype			  = other
    virtual_server                = eduroam
    require_message_authenticator = yes
    Operator-Name                 = 1ETABLISSEMENT.TLD          # Doit commencer par le chiffre '1'
    add_cui                       = yes
 }

policy.d/cui

Changez le 'cui_hash_key' (si vous avez plusieurs serveurs FreeRADIUS, utilisez la même clé de hachage) et passez 'cui_require_operator_name' à 'yes'

Filtrage du CUI

Optionnel, ne sert que si vous souhaitez effectuer une action spécifique sur un (ou des) CUI identifié(s). Par exemple pour le(s) rejeter.
Dans policy.d/filter rajouter une fonction de filtrage 'filter_cui'. Exemple :

# Filter the Chargeable-User-Identity attribute
filter_cui {
  if (&reply:Chargeable-User-Identity =~ /REMPLACER-PAR-LE-CUI-A-FILTRER/) {
                        update request {
                                &Module-Failure-Message += "Rejected: CUI matching '%{reply:Chargeable-User-Identity}'"
                        }
                        reject     # On le rejete
       }
}

sites-available/eduroam

Ajoutez 'cui' dans les sections authorize, post-auth, pre-proxy. 'eduroam_cui_log' et 'filter_cui' dans la section post-auth:

...

        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
                
                cui
                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
        }
        
...
        post-auth {
                reply_log
                cui
                eduroam_cui_log
                filter_cui         # Optionnel, ne sert que si vous avez configuré le filtrage par CUI
                Post-Auth-Type REJECT {
                        reply_log
                        eduroam_cui_log
                        }
        }
...
        pre-proxy {
                pre_proxy_log
                cui
                if("%{Packet-Type}" != "Accounting-Request") {
                        attr_filter.pre-proxy
                }
        }
...

sites-available/eduroam-inner-tunnel

Ajouter 'cui-inner' et 'eduroam_cui_inner_log' dans la section post-auth

...
post-auth {
        reply_log
        eduroam_cui_inner_log
        cui-inner
        Post-Auth-Type REJECT {
                reply_log
                eduroam_cui_inner_log
                update outer.session-state {
                        &Module-Failure-Message := &request:Module-Failure-Message
                }
        }
}
...

{tr:about_reveal}