Faire fonctionner FreeRadius avec Active Directory

Suite au plantage de mon NAS XPenology (2 HDD morts sur un volume RAID5, ça ne pardonne pas) qui me servait entre autres fonctions de RADIUS, je me suis mis en quête d’un serveur RADIUS performant et simple à configurer.
Je suis tombé sur Zentyal qui est superbe, mais leur RADIUS ne fonctionne plus depuis la version 3.4 et ils l’ont même supprimé sur la version 4.0.
C’est alors que je me suis résigné à utiliser Freeradius et à utiliser mes compétences de linuxien. Mais comment faire pour permettre à Freeradius de dialoguer avec mon Active Directory sans m’arracher les cheveux ? J’ai trouvé plein de tutoriels sur le web, mais aucun ne s’accordait … J’ai donc fait un mix de tout cela, ça fonctionne à merveille et je vous le partage si ça peut vous aider.
Ma configuration :
- VM Ubuntu Server 14.04.2 sous Hyper-V 2012
- Freeradius 2 et Samba 4
- 2 points d’accès Ubiquiti Unifi AP
- 1 point d’accès Ubiquiti Unifi AP Outdoor
- DC sous Windows Server 2012r2
1. Préparation
Utilisez une installation fraîche d’Ubuntu Server 14.04 sur une VM et installez les paquets ssh, samba, freeradius et krb5-user ainsi que leurs dépendances.
Installez PuTTy sur votre machine Windows pour plus de simplicité et effectuez les modifications en étant connecté en SSH.
J’utilise vim mais vous pouvez utiliser nano, à chacun son éditeur préféré.
Modifiez les valeurs correspondant à ma configuration réseau / domaine par les vôtres !!!
J’utilise Freeradius 2, les chemins d’accès peuvent différer si vous utilisez Freeradius 3.
2. Configuration initiale du serveur
A. Configurer une adresse IP fixe
Connectez-vous sur la VM depuis le gestionnaire Hyper-V.
Ouvrez un terminal (CTRL + ALT + T).
sudo vi /etc/network/interfaces
Modifiez le fichier de façon à configurer une IP fixe sur l’interface réseau qui sera utilisée.
auto eth0 iface eth0 inet static address 192.168.1.250 netmask 255.255.255.0 gateway 192.168.1.254 dns-nameservers 192.168.1.5 dns-search superfloup.intranet
Enregistrez et quittez vi.
Déconnectez-vous de la VM mais ne pas l’éteindre.
B. Corriger les bugs
Connectez-vous en SSH sur la VM.
sudo pam-auh-update (optionnel)
Désactivez “SMB password synchronisation” pour éviter le bug de fuite mémoire #8449 en attendant que le patch soit poussé sur nos machines.
sudo vi /etc/hosts
Modifiez la ligne localhost :
127.0.0.1 radius.superfloup.intranet RADIUS localhost
Enregistrez et quittez vi.
sudo vi /etc/init/winbind.conf
Modifiez le fichier, pour corriger le bug #1330220.
pre-start script test -x /usr/sbin/winbindd || exit 0 mkdir -p /var/run/samba/winbindd_privileged chgrp winbindd_priv /var/run/samba/winbindd_privileged chmod 0750 /var/run/samba/winbindd_privileged end script
En
pre-start script test -x /usr/sbin/winbindd || exit 0 mkdir -p /var/lib/samba/winbindd_privileged chgrp winbindd_priv /var/lib/samba/winbindd_privileged chmod 0750 /var/lib/samba/winbindd_privileged end script
Enregistrez et quittez vi.
adduser freerad winbindd_priv
Redémarrez la VM et prenez un snapshot, nous avons là une bonne base fonctionnelle.
3. Créer la configuration des clients
Connectez-vous en SSH.
sudo /etc/freeradius/clients.conf
Ajoutez à la fin du fichier :
client 192.168.1.251 { secret = sharedsecret shortname = ap-superfloup-3 }
client 192.168.1.252 { secret = sharedsecret shortname = ap-superfloup-2 }
client 192.168.1.253 { secret = sharedsecret shortname = ap-superfloup-1 }
Enregistrez et quittez vi.
4. Configurer PAP pour tester Freeradius
Créez un utilisateur factice qui va nous servir pour tester.
sudo vi /etc/freeradius/users
Ajoutez en haut du fichier
test Cleartext-Password := “hello”
Enregistrez et quittez vi.
Arrêtez le service freeradius.
sudo service freeradius stop
Ou si ça ne fonctionne pas
sudo killall freeradius
Démarrez freeradius en mode debugging.
sudo freeradius -X
Si tout s’est bien passé, la console doit vous renvoyer le message Ready to process requests. Si un message d’erreur apparaît, essayer la deuxième méthode pour arrêter le service freeradius.
Ouvrez une deuxième session SSH vers votre VM.
Testez le bon fonctionnement de l’authentification PAP en tapant :
radtest test hello localhost 0 testing123
Si tout se passe bien, vous devriez voir apparaître sur le premier SSH (freeradius -X) le message Access-Accept et sur le second terminal (radtest) rad_recv: Access-Accept packet from host 127.0.0.1 port 1812, length=20.
Cela signifie que tout s’est passé correctement et que vous pouvez passer à la suite.
5. Configurer l’authentification avec Active Directory
Commencez par supprimer l’utilisateur factice que nous avons créé.
sudo vi /etc/freeradius/users
Supprimez la ligne.
test Cleartext-Password := “hello”
Enregistrez et quittez vi.
Vous allez configurer Samba pour qu’il utilise votre Active Directory comme une authentification Oracle et non comme une base LDAP.
Sauvegardez le fichier smb.conf.
sudo cp /etc/samba/smb.conf /etc/samba/smb.conf.bak
Effacez le fichier smb.conf.
sudo rm /etc/samba/smb.conf
Modifiez le fichier smb.conf pour qu’il pointe vers votre domaine.
sudo vi /etc/samba/smb.conf
Ajoutez le contenu suivant :
# workgroup = NT-Domain-Name workgroup = SUPERFLOUP ... # Security mode. Most people will want user level security. See # security_level.txt for details. security = ads
# Use password server option only with security = server password server = dc.superfloup.intranet ...
realm = superfloup.intranet
# Symbol used to separate DOMAIN and user/group winbind separator = /
Enregistrez et quittez vi.
Sauvegardez le fichier krb5.conf.
sudo cp /etc/krb5.conf /etc/krb5.conf.bak
Effacez le fichier krb5.conf.
sudo rm /etc/krb5.conf
Modifiez le fichier krb5.conf pour qu’il pointe vers votre domaine.
sudo vi /etc/krb5.conf
Ajoutez le contenu suivant :
[libdefaults] default_realm = superfloup.intranet
v4_instance_resolve = false v4_name_convert = { host = { rcmd = host ftp = ftp } plain = { something = something-else } } fcc-mit-ticketflags = true
[realms] SUPERFLOUP = { kdc = dc.superfloup.intranet admin_server = dc.superfloup.intranet default_domain = dc.superfloup.intranet }
Enregistrez et quittez vi.
Maintenant, vous allez joindre votre radius au domaine. Si ce n’est pas encore fait, créez un compte ordinateur pour votre radius dans votre Active Directory.
Redémarrez les services.
sudo service winbind restart
sudo service smbd restart
sudo service nmbd restart
Joignez le radius à votre domaine à l’aide d’un compte administrateur du domaine.
sudo net join -U compte_admin
Entrez le mot de passe lorsqu’il vous sera demandé.
Si tout a bien été configuré précédemment, vous obtiendrez le message Joined ‘RADIUS’ to realm ‘superfloup.intranet’. Dans le cas contraire, vérifiez bien les étapes précédentes.
Vérifiez qu’un utilisateur du domaine puisse être authentifié.
wbinfo -a user%password
Vous devriez recevoir le message Authentication succeeded.
Vérifiez que l’authentification fonctionne avec ntlm_auth qui sera utilisé par Freeradius.
ntlm_auth --request-nt-key --domain=SUPERFLOUP --username=user --password=password
La console vous renverra le message de succès NT_STATUS_OK suivi de la NT_KEY nécessaire pour effectuer l’authentification MS-CHAP par Freeradius.
6. Configurer Freeradius pour l’utilisation de ntlm_auth
Vous avez vérifié que Samba est installé correctement et fonctionne et que ntlm_auth fonctionne aussi. Vous allez maintenant mettre en place l’utilisation de ntlm_auth par Freeradius. Pour les besoins des tests, vous utiliserez le module Exec.
Modifiez le fichier ntlm_auth.
sudo vi /etc/freeradius/modules/ntlm_auth
Modifiez le fichier comme ceci :
exec ntlm_auth { wait = yes program = "/usr/bin/ntlm_auth --request-nt-key --domain=SUPERFLOUP --username=%{mschap:User-Name} --password=%{User-Password}" }
Enregistrez et quittez vi.
Cette configuration demande au serveur d’utiliser le programme ntlm_auth avec l’identifiant et le mot de passe saisis lors de l’Access-Request.
Vous devez maintenant ajouter ntlm_auth comme méthode d’authentification dans les fichiers /etc/freeradius/sites-enabled/default et /etc/freeradius/sites-enabled/inner-tunnel.
sudo vi /etc/freeradius/sites-enabled/default
Ajoutez ces lignes dans la partie Authenticate :
Auth-Type ntlm_auth{ ntlm_auth }
Enregistrez et quittez vi.
sudo vi /etc/freeradius/sites-enabled/inner-tunnel
Ajoutez ces lignes dans la partie Authenticate :
Auth-Type ntlm_auth{ ntlm_auth }
Enregistrez et quittez vi.
Pour pouvoir tester le bon fonctionnement, vous allez modifier le fichier users.
sudo vi /etc/freeradius/users
Ajoutez tout en haut du fichier :
DEFAULT Auth-Type = ntlm_auth
Enregistrez et quittez vi.
Cette ligne force l’authentification ntlm_auth pour tous les utilisateurs et ne doit être utilisée que pour les tests. Pensez donc bien à la supprimer une fois le test terminé.
Arrêtez le service freeradius.
sudo service freeradius stop
ou si ça ne fonctionne pas
sudo killall freeradius
Démarrez freeradius en mode debugging.
sudo freeradius -X
Si tout s’est bien passé, la console doit vous renvoyer le message Ready to process requests. Si un message d’erreur apparaît, essayer la deuxième méthode pour arrêter le service freeradius.
Ouvrez une deuxième session SSH vers votre VM.
Testez le bon fonctionnement de l’authentification ntlm_auth en tapant :
radtest username password localhost 0 testing123
Si tout se passe bien, vous devriez voir apparaître sur le premier SSH (freeradius -X) le message Access-Accept et sur le second terminal (radtest) rad_recv: Access-Accept packet from host 127.0.0.1 port 1812, length=20.
Cela signifie que tout s’est passé correctement et que vous pouvez passer à la suite.
7. Configurer Freeradius pour l’utilisation de ntlm_auth avec MS-CHAP
Avant toute chose, supprimez la ligne que nous avons ajouté dans le fichier users.
sudo vi /etc/freeradius/users
Supprimez la ligne :
DEFAULT Auth-Type = ntlm_auth
Enregistrez et quittez vi.
Maintenant que tout est configuré correctement, mettre en place l’identification MS-CHAP est très facile, vous n’avez que le fichier mschap à modifier.
sudo vi /etc/freeradius/modules/mschap
Cherchez la ligne commençant par ntlm_auth = et modifiez la comme suit :
ntlm_auth = "/usr/bin/ntlm_auth --request-nt-key --username=%{mschap:User-Name:-None} --domain=%{%{mschap:NT-Domain}:-SUPERFLOUP} --challenge=%{mschap:Challenge:-00} --nt-response=%{mschap:NT-Response:-00} --require-membership-of=SUPERFLOUP/Wifi"
Enregistrez et quittez vi.
Attention !!! Le paramètre –require-membership-of=SUPERFLOUP/Wifi vérifie l’appartenance de l’utilisateur saisi lors de l’Access-Request à un groupe de votre domaine. Pensez donc bien à faire de votre compte de test un membre du groupe désigné ici.
Testez maintenant le bon fonctionnement grâce à la commande radtest.
Arrêtez le service freeradius.
sudo service freeradius stop
ou si ça ne fonctionne pas
sudo killall freeradius
Démarrez freeradius en mode debugging.
sudo freeradius -X
Si tout s’est bien passé, la console doit vous renvoyer le message Ready to process requests. Si un message d’erreur apparaît, essayer la deuxième méthode pour arrêter le service freeradius.
Ouvrez une deuxième session SSH vers votre VM.
Testez le bon fonctionnement de l’authentification MS-CHAP en tapant :
radtest -t mschap username password localhost 0 testing123
Si tout se passe bien, vous devriez voir apparaître sur le premier SSH (freeradius -X) le message Access-Accept et sur le second terminal (radtest) rad_recv: Access-Accept packet from host 127.0.0.1 port 1812, length=20.
Cela signifie que tout s’est passé correctement et que votre RADIUS est prêt à être mis en production. Félicitations !
Redémarrez le service freeradius.
sudo freeradius
Vous pouvez fermer vos consoles SSH.
8. Configurer vos AP
Rendez-vous sur l’interface de gestion de vos AP. Le gros avantages de mes AP Unifi, est que j’ai une interface de gestion unifiée qui me fait gagner beaucoup de temps.
Paramétrez maintenant vos AP en utilisant la configuration créée au tout début de ce tutoriel dans la partie “Créer la configuration des clients”.
Sources :
Deploying radius : Configuring Authentication with Active Directory
FreeRADIUS : Active Directory Integration HOWTO
FreeRADIUS 3.0.3 on Ubuntu 14.04 LTS with Active Directory for eduroam