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
1 |
$ sudo yum update |
- Installation des paquets nécessaires
1 |
$ 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
1 |
$ sudo yum install https://dl.fedoraproject.org/pub/epel/epel-release-latest-7.noarch.rpm |
1 |
$ 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
1 |
$ sudo firewall-cmd --zone=public --add-port=1812/udp --add-port=1813/udp |
1 |
$ sudo firewall-cmd --zone=public --add-port=1812/udp --add-port=1813/udp --permanent |
1 |
$ 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
1 |
$ pwgen 29 1 |
1 |
LSoU7S6Bxs6GfJKhrpz2ToQCnwtEd |
Éditer le fichier clients.conf et ajouter le champs ci dessous en spécifiant le subnet et le secret partagé
1 |
$ sudo vim /etc/raddb/clients.conf |
1 2 3 4 5 6 7 8 9 10 |
client <strong>freeipa_range</strong> { ipaddr = <strong>192.168.3.0/24</strong> proto = * secret = <strong>LSoU7S6Bxs6GfJKhrpz2ToQCnwtEd</strong> limit { max_connections = 16 lifetime = 0 idle_timeout = 30 } } |
Éditer le vhost default
1 |
$ sudo vim /etc/raddb/sites-available/default |
Rechercher et remplacer le champs
1 2 3 |
# # The ldap module reads passwords from the LDAP database. -ldap |
Par
1 2 3 4 5 6 7 8 |
# # 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
1 2 3 |
# Auth-Type LDAP { # ldap # } |
Apporter les mêmes modifications au fichier inner-tunnel
1 |
$ sudo vim /etc/raddb/sites-enabled/inner-tunnel |
Rechercher et remplacer le champs
1 2 3 |
# # The ldap module reads passwords from the LDAP database. -ldap |
Par
1 2 3 4 5 6 7 8 |
# # 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
1 2 3 |
# 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
1 |
$ sudo vim /etc/raddb/mods-available/ldap |
1 |
server = 'localhost' |
par
1 |
server = '<strong>freeipa.izero.lan</strong>' |
et
1 |
base_dn = 'dc=example,dc=org' |
par
1 |
base_dn = '<strong>cn=users,cn=accounts,dc=izero,dc=lan</strong>' |
Puis faire un lien symbolique
1 |
$ 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
1 |
$ telnet freeipa.izero.lan 389 |
1 2 3 |
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
1 |
$ sudo radiusd -XC |
1 |
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
1 |
$ radtest <strong>user_freeipa</strong> <strong>motdepasse_freeipa</strong> 192.168.3.203 1812 LSoU7S6Bxs6GfJKhrpz2ToQCnwtEd |
1 2 3 4 5 6 7 8 |
Sent Access-Request Id 219 from 0.0.0.0:59476 to 192.168.3.203:1812 length 75 User-Name = "<strong>user_freeipa</strong>" User-Password = "<strong>motdepasse_freeipa</strong>" NAS-IP-Address = 192.168.3.203 NAS-Port = 1812 Message-Authenticator = 0x00 Cleartext-Password = "<strong>motdepasse_freeipa</strong>" 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
1 |
$ radiusd -X |
Voici dans l’exemple pour un compte et un secret valide ce que cela renverra
1 2 3 4 5 |
(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 2 3 4 |
(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... <span style="color: #ff0000;">(1) ldap: ERROR: Bind credentials incorrect: Invalid credentials</span> |
Pour un utilisateur inexistant
1 2 3 4 5 6 7 |
<span style="color: #ffff00;">(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</span> (2) [pap] = noop (2) } # authorize = ok <span style="color: #ff0000;">(2) ERROR: No Auth-Type found: rejecting the user via Post-Auth-Type = Reject</span> (2) Failed to authenticate the user (2) Using Post-Auth-Type Reject |
Pour un secret erroné
1 2 3 4 5 6 7 8 9 10 |
(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... <span style="color: #ff0000;">(4) ldap: ERROR: Bind credentials incorrect: Invalid credentials</span> rlm_ldap (ldap): Released connection (9) (4) [ldap] = reject (4) } # Auth-Type LDAP = reject (4) Failed to authenticate the user <span style="color: #ffff00;">(4) WARNING: Unprintable characters in the password. Double-check the shared secret on the server and the NAS!</span> (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
1 |
$ sudo systemctl start radiusd |
1 |
$ sudo # systemctl enable radiusd |
1 |
Created symlink from /etc/systemd/system/multi-user.target.wants/radiusd.service to /usr/lib/systemd/system/radiusd.service. |
1 |
$ sudo systemctl status radiusd |
1 2 3 4 5 6 7 8 9 |
<span style="color: #00ff00;">●</span> radiusd.service - FreeRADIUS high performance RADIUS server. Loaded: loaded (/usr/lib/systemd/system/radiusd.service; disabled; vendor preset: disabled) Active: <span style="color: #00ff00;">active (running)</span> 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
1 |
$ 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