[Linux] Mise en place d’un serveur FreeRADIUS

 

Mise en place d’un serveur FreeRADIUS sur Linux
Article original Publié le : 21 novembre 2020
Mise a jour le :

 

Pour les besoins de faire de l’authent sur un serveur proxy Opnsense et des switchs, voici un simple tuto pour la mise en place de FreeRADIUS sur une Centos 7.x et sa configuration pour pouvoir l’utiliser en tant qu’interface vers un serveur FreeIPA

 

Ce tuto est dans la continuité de ces articles

https://it.izero.fr/freeipa-installation-du-serveur-et-premiers-pas/

https://it.izero.fr/proxy-mise-en-place-dopnsense (prochainement)

l’IP du serveur FreeRADIUS est 192.168.3.203
l’IP du serveur FreeIPA est 192.168.3.225
l’IP du serveur Opnsense est 192.168.3.202

Basé sur la doc FreeIPA avec quelques ajustements

 

 

  • Préparation de l’environnement
  • Ajout des règles sur firewalld
  • Configuration de Freeradius
  • Test du FreeRadius interfacé avec FreeIPA
  • Démarrage du service
  • Référentiel et doc

 

 

I. Préparation de l’environnement

  • Mise a jour du système
$ sudo yum update
  • Installation des paquets nécessaires
$ sudo yum install freeradius freeradius-utils freeradius-ldap freeradius-krb5
  • Installer les paquets utiles

/!\ pwgen n’est pas natif dans les repo centos, il faut installer le repo epel

$ sudo yum install https://dl.fedoraproject.org/pub/epel/epel-release-latest-7.noarch.rpm
$ sudo yum install vim telnet pwgen

 

 

II. Ajout des règles sur firewalld

Si utilisé, prévoir l’ouverture des ports 1812/1813 en udp puis recharger la conf

$ sudo firewall-cmd --zone=public --add-port=1812/udp --add-port=1813/udp
$ sudo firewall-cmd --zone=public --add-port=1812/udp --add-port=1813/udp --permanent
$ sudo firewall-cmd --reload

 

 

III. Configuration de Freeradius

Différents fichiers de configuration doivent être modifiés

Pour commencer générer le secret partagé avec pwgen

$ pwgen 29 1
LSoU7S6Bxs6GfJKhrpz2ToQCnwtEd

 

Éditer le fichier clients.conf et ajouter le champs ci dessous en spécifiant le subnet et le secret partagé

$ sudo vim /etc/raddb/clients.conf
client freeipa_range {
        ipaddr = 192.168.3.0/24
        proto = *
        secret = LSoU7S6Bxs6GfJKhrpz2ToQCnwtEd
        limit {
                max_connections = 16
                lifetime = 0
                idle_timeout = 30
        }
}

 

Éditer le vhost default

$ sudo vim /etc/raddb/sites-available/default

Rechercher et remplacer le champs

        #
        #  The ldap module reads passwords from the LDAP database.
        -ldap

Par

        #
        #  The ldap module reads passwords from the LDAP database.
        ldap
        if ((ok || updated) && User-Password) {
            update {
                control:Auth-Type := ldap
            }
        }

Et dé-commenter les lignes suivantes

#       Auth-Type LDAP {
#               ldap
#       }

 

Apporter les mêmes modifications au fichier inner-tunnel

$ sudo vim /etc/raddb/sites-enabled/inner-tunnel

Rechercher et remplacer le champs

        #
        #  The ldap module reads passwords from the LDAP database.
        -ldap

Par

        #
        #  The ldap module reads passwords from the LDAP database.
        ldap
        if ((ok || updated) && User-Password) {
            update {
                control:Auth-Type := ldap
            }
        }

Et dé-commenter les lignes suivantes

#       Auth-Type LDAP {
#               ldap
#       }

 

Éditer le fichier ldap et remplacer le serveur et les valeurs de son domaine FreeIPA
Ce n’est pas indiqué dans la doc officiel mais il faut ajouter le cn=users,cn=accounts au base_dn sinon cela ne match pas

$ sudo vim /etc/raddb/mods-available/ldap
        server = 'localhost'

par

        server = 'freeipa.izero.lan'

et

        base_dn = 'dc=example,dc=org'

par

        base_dn = 'cn=users,cn=accounts,dc=izero,dc=lan'

 

Puis faire un lien symbolique

$ sudo ln -s /etc/raddb/mods-available/ldap /etc/raddb/mods-enabled/

 

Faire un test avec telnet (389 ou 636) pour vérifier la connexion avec le serveur Freeipa

$ telnet freeipa.izero.lan 389
Trying 192.168.3.225...
Connected to freeipa.izero.lan.
Escape character is '^]'.

 

Le serveur est normalement opérationnel, faire un test, cela renverra toute la conf brut mais ne doit pas renvoyer d’erreur

$ sudo radiusd -XC
Configuration appears to be OK

 

 

IV. Test du FreeRadius interfacé avec FreeIPA

Pour faire le test, lancer la commande radtest avec les credentials d’un compte sous FreeIPA, le nom ou l’ip du serveur, le port et la clé partagé.
Puis dans un second terminal, lancer un process freeradius en mode debug pour vérifier en live la connectivité dans les logs

$ radtest user_freeipa motdepasse_freeipa 192.168.3.203 1812 LSoU7S6Bxs6GfJKhrpz2ToQCnwtEd
Sent Access-Request Id 219 from 0.0.0.0:59476 to 192.168.3.203:1812 length 75
        User-Name = "user_freeipa"
        User-Password = "motdepasse_freeipa"
        NAS-IP-Address = 192.168.3.203
        NAS-Port = 1812
        Message-Authenticator = 0x00
        Cleartext-Password = "motdepasse_freeipa"
Received Access-Accept Id 219 from 192.168.3.203:1812 to 0.0.0.0:0 length 20

 

Sur le  second terminal lancer la commande suivie de son paramètre

$ radiusd -X

Voici dans l’exemple pour un compte et un secret valide ce que cela renverra

(0) ldap: Login attempt by "bef"
(0) ldap: Using user DN from request "uid=bef,cn=users,cn=accounts,dc=izero,dc=lan"
(0) ldap: Waiting for bind result...
(0) ldap: Bind successful
(0) ldap: Bind as user "uid=bef,cn=users,cn=accounts,dc=izero,dc=lan" was successful

 

Pour un mot de passe erroné

(1) ldap: Login attempt by "bef"
(1) ldap: Using user DN from request "uid=bef,cn=users,cn=accounts,dc=izero,dc=lan"
(1) ldap: Waiting for bind result...
(1) ldap: ERROR: Bind credentials incorrect: Invalid credentials

 

Pour un utilisateur inexistant

(2) pap: WARNING: No "known good" password found for the user.  Not setting Auth-Type
(2) pap: WARNING: Authentication will fail unless a "known good" password is available
(2)     [pap] = noop
(2)   } # authorize = ok
(2) ERROR: No Auth-Type found: rejecting the user via Post-Auth-Type = Reject
(2) Failed to authenticate the user
(2) Using Post-Auth-Type Reject

 

Pour un secret erroné

(4) ldap: Login attempt by "bef"
(4) ldap: Using user DN from request "uid=bef,cn=users,cn=accounts,dc=izero,dc=lan"
(4) ldap: Waiting for bind result...
(4) ldap: ERROR: Bind credentials incorrect: Invalid credentials
rlm_ldap (ldap): Released connection (9)
(4)     [ldap] = reject
(4)   } # Auth-Type LDAP = reject
(4) Failed to authenticate the user
(4) WARNING: Unprintable characters in the password.  Double-check the shared secret on the server and the NAS!
(4) Using Post-Auth-Type Reject

 

A garder en mémoire, quand ça match ça renvoi un code 2 (Access-Accept),
quand c’est en erreur cela renvoi un code 3 (Access-Reject)

Les codes sont définis dans la doc

RADIUS Codes (decimal) are assigned as follows:

  • 1 Access-Request
  • 2 Access-Accept
  • 3 Access-Reject
  • 4 Accounting-Request
  • 5 Accounting-Response
  • 11 Access-Challenge
  • 12 Status-Server (experimental)
  • 13 Status-Client (experimental)
  • 255 Reserved

 

Il existe un client sous Windows NTRadPing 1.5 RADIUS Test Utility qui est assez complet

 

 

V. Démarrage du service

Penser a stopper le process actif de debug puis démarrer et vérifier le status du process

$ sudo systemctl start radiusd
$ sudo # systemctl enable radiusd
Created symlink from /etc/systemd/system/multi-user.target.wants/radiusd.service to /usr/lib/systemd/system/radiusd.service.

 

$ sudo systemctl status radiusd
 radiusd.service - FreeRADIUS high performance RADIUS server.
   Loaded: loaded (/usr/lib/systemd/system/radiusd.service; disabled; vendor preset: disabled)
   Active: active (running) since Sun 2020-11-08 22:03:11 CET; 1s ago
  Process: 1379 ExecStart=/usr/sbin/radiusd -d /etc/raddb (code=exited, status=0/SUCCESS)
  Process: 1376 ExecStartPre=/usr/sbin/radiusd -C (code=exited, status=0/SUCCESS)
  Process: 1375 ExecStartPre=/bin/chown -R radiusd.radiusd /var/run/radiusd (code=exited, status=0/SUCCESS)
 Main PID: 1382 (radiusd)
   CGroup: /system.slice/radiusd.service
           └─1382 /usr/sbin/radiusd -d /etc/raddb

 

En cas de fail du service, vérifier la cause dans le fichier radius.log

$ sudo less /var/log/radius/radius.log

 

 

VI. Référentiel et doc

Doc officiel

https://freeradius.org/rfc/rfc2865.html

https://www.freeipa.org/page/Using_FreeIPA_and_FreeRadius_as_a_RADIUS_based_software_token_OTP_system_with_CentOS/RedHat_7

 

 

No votes yet.
Please wait...

Laisser un commentaire

Votre adresse de messagerie ne sera pas publiée. Les champs obligatoires sont indiqués avec *

Ce site utilise Akismet pour réduire les indésirables. En savoir plus sur comment les données de vos commentaires sont utilisées.