Cet article montre les étapes nécessaires à l’utilisation de Freeradius sur une Debian Wheezy pour authentifier les utilisateurs sur un serveur ActiveDirectory (Windows Server 2012).
Les requêtes EAP seront encapsulées en TTLS ou en PEAP, l’authentification sera effectuée via un challenge EAP MSCHAP v2.
La partie proxy sera aussi configurée pour permettre l’authentification via d’autres serveurs radius disposant de leurs propres bases d’utilisateurs.
Informations générales
- domaine DNS : test.example.org
- domaine NetBios : TEST
- nom du serveur AD : ad.test.example.org
- adresse du DNS de l’AD : 10.0.0.1
Une parfaite résolution DNS est essentielle à tout système, en particulier quand il y a un annuaire ActiveDirectory. On modifie donc les paramètres DNS de la Debian pour utiliser le DNS de l’AD.
#/etc/hosts
127.0.0.1 radius.test.example.org localhost radius
#/etc/resolv.conf
domain test.example.org
search test.example.org
nameserver 10.0.0.1
De même une synchronisation horaire précise est essentielle. On modifie donc la configuration NTP pour utiliser le serveur AD comme source de temps. Ici j’utilise openntp :
#/etc/openntpd/ntpd.conf
servers test.example.org
J’utilise le nom du domaine de l’AD pour profiter du RR DNS.
On redémarre le serveur pour bien prendre en compte les modifications.
Intégration du serveur dans l’ActiveDirectory
Installation des paquets
aptitude install samba winbind samba-common-bin krb5-user
Kerberos
L’utilisation de Kerberos n’est pas indispensable pour joindre une machine à l’AD, mais elle est recommandée.
Configuration
La casse est importante dans le protocole Kerberos, par convention on utilise le nom DNS en majuscule pour les royaumes.
#/etc/krb5.conf
[libdefaults]
default_realm = TEST.EXAMPLE.ORG
krb4_config = /etc/krb.conf
krb4_realms = /etc/krb.realms
kdc_timesync = 1
ccache_type = 4
forwardable = true
proxiable = true
v4_instance_resolve = false
v4_name_convert = {
host = {
rcmd = host
ftp = ftp
}
plain = {
something = something-else
}
}
fcc-mit-ticketflags = true
[realms]
TEST.EXAMPLE.ORG = {
kdc = ad.test.example.org:88
admin_server = ad.test.example.org
default_domain = test.example.org
}
[domain_realm]
.test.example.org = TEST.EXAMPLE.ORG
test.example.org = TEST.EXAMPLE.ORG
[login]
krb4_convert = true
krb4_get_tickets = false
Récupération d’un ticket Kerberos
kinit administrator@TEST.EXAMPLE.ORG
Vérification du ticket
klist
Ticket cache: FILE:/tmp/krb5cc_0
Default principal: administrator@TEST.EXAMPLE.ORG
[...]
Samba
Configuration
#/etc/samba/smb.conf
[global]
workgroup = TEST
server string = %h server
dns proxy = no
log file = /var/log/samba/log.%m
max log size = 1000
syslog = 0
panic action = /usr/share/samba/panic-action %d
security = ads
realm = TEST.EXAMPLE.ORG
password server = ad.test.example.org
winbind use default domain = yes
domain master = no
local master = no
preferred master = no
winbind enum groups = yes
winbind enum users = yes
winbind use default domain = no
encrypt passwords = true
Redémarrage de Samba
service samba restart
Intégration dans l’AD
net ads join -U administrator
Si le ticket Kerberos est valide, vous devriez obtenir le message suivant :
Using short domain name -- TEST
Joined 'RADIUS' to realm 'test.example.org'
Dans le cas contraire, ou en l’absence de Kerberos, vous obtiendrez ceci :
Using short domain name -- TEST
Joined 'RADAD' to realm 'test.example.org'
DNS Update for radius.test.example.org failed: ERROR_DNS_GSS_ERROR
DNS update failed!
Les 2 dernières lignes indiquent que l’ajout du serveur dans le DNS de l’AD a échoué, cela n’a rien d’anormal si vous n’utilisez pas Kerberos ou si vos DNS n’acceptent pas la création dynamique d’objets, il vous suffit d’aller créer manuellement une entrée pour votre serveur Linux dans le DNS de l’AD.
Si vous obtenez autre chose, c’est probablement qu’il y a un problème de résolution de nom ou de configuration.
Redémarrage de WinBind
service winbind restart
Tests de la liaison avec l’annuaire
Test de la connexion RCP :
wbinfo -t
checking the trust secret for domain TEST via RPC calls succeeded
Lister les utilisateurs de l’annuaire (attention si vous avez un grand nombre de comptes) :
wbinfo -u
TESTadministrator
TESTguest
TESTkrbtgt
[...]
Test d’authentification :
wbinfo -a testuser%passtest
plaintext password authentication failed
Could not authenticate user testuser%passtest with plaintext password
challenge/response password authentication succeeded
Les 2 premières lignes indiquent que l’authentification en clair a échoué, ce qui est normal, c’est la dernière ligne qui est importante, elle indique que l’authentification par Challenge/Response est valide.
Freeradius
Installation des paquets
aptitude install freeradius freeradius-utils
Autorisation pour le ntlm
L’authentification sur l’annuaire est effectuée en NTLM, il faut donc que le service radius ait le droit d’utiliser winbind.
addgroup freerad winbindd_priv
Configuration de Freeradius
La configuration de Freeradius est très complexe car très complète. Elle couvre par défaut une très grande variété de cas d’utilisation. Il est donc recommandé de ne pas la modifier, mais juste de l’adapter.
Dans le cas présent, j’ai choisi de ne pas respecter cette recommandation pour éviter de poster plus de 5000 lignes de configuration, c’est environ le nombre de lignes des différents fichiers de configuration.
Il n’y a normalement que 4 fichiers à modifier :
- /etc/freeradius/eap.conf : il contient la configuration des méthodes EAP
- /etc/freeradius/modules/mschap : c’est ce module qui fera l’authentification sur l’AD
- /etc/freeradius/proxy.conf : sert à relayer les requêtes sur d’autres serveurs radius
- /etc/freeradius/clients.conf : c’est ici que sont déclarés les NAS autorisés à utiliser le radius
Configuration de l’EAP
#/etc/freeradius/eap.conf
eap {
default_eap_type = ttls
timer_expire = 60
ignore_unknown_eap_types = no
cisco_accounting_username_bug = no
max_sessions = 4096
tls {
certdir = ${confdir}/certs
cadir = ${confdir}/certs
private_key_password = whatever
private_key_file = ${certdir}/server.key
certificate_file = ${certdir}/server.pem
CA_file = ${cadir}/ca.pem
dh_file = ${certdir}/dh
random_file = /dev/urandom
CA_path = ${cadir}
cipher_list = "DEFAULT"
make_cert_command = "${certdir}/bootstrap"
ecdh_curve = "prime256v1"
cache {
enable = no
lifetime = 24 # hours
max_entries = 255
}
}
ttls {
default_eap_type = mschapv2
copy_request_to_tunnel = yes
use_tunneled_reply = yes
virtual_server = "inner-tunnel"
}
peap {
default_eap_type = mschapv2
copy_request_to_tunnel = yes
use_tunneled_reply = yes
virtual_server = "inner-tunnel"
}
mschapv2 {
}
}
Configuration du MS-CHAP v2
#/etc/freeradius/modules/mschap
mschap {
use_mppe=yes
require_encryption = yes
require_strong = yes
with_ntdomain_hack = yes
ntlm_auth = "/usr/bin/ntlm_auth --request-nt-key --username=%{%{Stripped-User-Name}:-%{%{User-Name}:-None}} --challenge=%{%{mschap:Challenge}:-00} --nt-response=%{%{mschap:NT-Response}:-00}"
}
Dans certaines configuration, il faudra ajouter votre nom de domaine à la commande ntlm_auth avec la directive suivante : –domain=TEST
Configuration du proxy radius
#/etc/freeradius/proxy.conf
proxy server {
default_fallback = no
}
realm NULL {
}
realm LOCAL {
}
realm example.org {
authhost = LOCAL
accthost = LOCAL
}
realm test.example.org {
authhost = LOCAL
accthost = LOCAL
}
realm DEFAULT {
type = radius
authhost = 1.1.1.1
accthost = 1.1.1.1
secret = proxysharedsecret
nostrip
}
Les requêtes des utilisateurs précisant un domaine d’authentification qui n’est pas le notre seront transmises à un autre serveur radius (1.1.1.1 dans l’exemple).
Déclaration des NAS
On déclare ici les NAS qui pourront interroger notre serveur radius
#/etc/freeradius/clients.conf
client 10.1.1.1/32 {
secret = secretnas1
shortname = nas1
}
client localhost {
ipaddr = 127.0.0.1
secret = testing123
require_message_authenticator = no
nastype = other
}
Redémarrage du service
service freeradius restart
Test local
radtest -t mschap testuser passtest 127.0.0.1 0 testing123
Sending Access-Request of id 83 to 127.0.0.1 port 1812
User-Name = "testuser"
NAS-IP-Address = 127.0.1.1
NAS-Port = 0
Message-Authenticator = 0x00000000000000000000000000000000
MS-CHAP-Challenge = 0xe44df59956405035
MS-CHAP-Response = 0x0001000000000000000000000000000000000000000000000000e7cb832715175c312efcb8a07922a1a23c82c715773e9216
rad_recv: Access-Accept packet from host 127.0.0.1 port 1812, id=83, length=84
MS-CHAP-MPPE-Keys = 0x0000000000000000490de11896511cd8de93afd472151ddd0000000000000000
MS-MPPE-Encryption-Policy = 0x00000002
MS-MPPE-Encryption-Types = 0x00000004
Conclusion
Je n’ai pas couvert le détail de la configuration, il s’agit encore une fois d’une prise de notes mise en forme.
Il faudrait compléter cette installation avec le paramétrage des journaux, l’accounting et la sécurisation de la configuration avant d’envisager une mise en production. Peut être dans un prochain article.