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 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:
|
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
Salut
Joli tuto J’aimerai savoir si les clients LDAP ont des mots de passe chiffrés et qu’ils pourront se connecter à un point d’accès mode wpa entreprise et radius défini.?
Bonjour,
Les mots de passe dépendent des serveurs d’authent. Le Freeradius est juste une interface entre le serveur et le client