Projet authentification wifi et logging http/https : Différence entre versions

De WIKI Les fourmis du libre
Aller à : navigation, rechercher
(Génération d'un certificat let's encrypt)
(Log des connexions)
Ligne 390 : Ligne 390 :
 
   msg_goodpass = "Authentification Radius OK"
 
   msg_goodpass = "Authentification Radius OK"
 
   msg_badpass = "Tentative de Connexion - Bad Password"
 
   msg_badpass = "Tentative de Connexion - Bad Password"
}
+
}
  
  
Le resultat dans le fichier de logs :
+
Le resultat dans le fichier de logs :
  
  

Version du 7 avril 2016 à 21:29

Présentation

FreeRADIUS est un logiciel libre et gratuit, version libre du protocole RADIUS (Remote Authentication Dial-In User Service) service d'authentification réseau interfaçable avec plusieurs sources d'identité (LDAP/SQL entre autres).

C'est un service utilisé notamment par les FAI pour identifier leurs clients. Dans notre cas il va nous être utile pour identifier les utilisateurs sur le réseau quand ils veulent accéder a Internet au travers d'un proxy ou se connecter au réseau WiFi.

Schéma descriptif du fonctionnement de FreeRadius

Voici un schéma représentatif d'une architecture réseau sans-fil avec un contrôleur de borne (dans notre cas Unifi) qui s'interface avec le serveur FreeRadius pour demander l'authentification 802.1x, serveur Radius qui contrôle l'identité auprès de l'Active Directory. Tout ce cheminement amène enfin à l’autorisation du client par le contrôleur et lui donner l'accès au réseau sans-fil.

Schema-radius.png

Petit glossaire

Certains termes techniques pour la suite du tutoriel qui pourrait porter a question ou confusion :

  • NAS - Network Access Server : Boitier distant d'accès, un client RADIUS
  • PAP : Protocole de mot de passe en clair, a éviter donc
  • CHAP : Protocole d'echage basé sur un hachage, c'est déjà mieux
  • MS-CHAP et MS-CHAPv2 : Variante Microsoft du protocole CHAP
  • EAP - Extensible Authentication Protocol : Ensemble de protocoles extensibles d'authentification et ses variantes (EAP-TLS - EAP-TTLS/MSCHAPv2 - PEAPv0/EAP-MS-CHAPv2 - PEAPv1/EAP-GTC - EAP-SIM)

De ce que j'ai pu lire/comprendre le protocole qu'on pourrait utiliser notamment pour les réseaux WiFi est EAP-TTLS/MSCHAPv2

Pré-requis

  • Machine virtuelle Debian 8 + Utilitaires de base du système (SSH, Vim, coloration syntaxique, etc)
  • Paramétrage fixe IP/Mask/Gateway de la VM serveur RADIUS
  • Synchronisation NTP avec openntpd : /etc/openntpd/ntpd.conf
# Choose servers announced from Debian NTP Pool
server 0.fr.pool.ntp.org
server 1.fr.pool.ntp.org
server 2.fr.pool.ntp.org
server 3.fr.pool.ntp.org
  • Configuration DNS en accord avec le domain : /etc/resolv.conf
domain syrius.lan
search syrius.lan
nameserver 172.16.0.1
nameserver 8.8.8.8


Dans ce tutoriel j'utiliserais les variables suivantes :

  • Domaine dns : syrius.lan
  • domaine NetBios : SYRIUS
  • Serveur AD : serveur.syrius.lan
  • Serveur DNS AD : 172.16.0.1
  • Serveur RADIUS : 172.16.0.200

Samba

Dans un premier temps il nous faut les outils nécessaires afin d'intégrer le domaine Active Directory donc Samba/windbind/Kerberos

Installation Samba

aptitude update && aptitude upgrade -y
aptitude install samba winbind samba-common-bin krb5-user -y


Configuration Samba

Modification de la configuration Kerberos

  1. /etc/krb5.conf
[libdefaults]
default_realm = SYRIUS.LAN
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]
SYRIUS.LAN = {
               kdc = Serveur.syrius.lan
               admin_server = Serveur.syrius.lan
               default_domain = syrius.lan
       }
[domain_realm]
.syrius.lan = SYRIUS.LAN
syrius.lan = SYRIUS.LAN
[login]
krb4_convert = true
krb4_get_tickets = false


Initialisation Kerberos

On récupère un ticket Kerberos avec un compte Administrateur AD

kinit Administrateur@syrius.lan


On doit ensuite vérifier si ce ticket est valide avec la commande klist, la réponse doit être la suivante :

klist
Ticket cache: FILE:/tmp/krb5cc_0
Default principal: Administrateur@SYRIUS.LAN
Valid starting       Expires              Service principal
04/03/2016 14:23:51  05/03/2016 00:23:51  krbtgt/SYRIUS.LAN@SYRIUS.LAN
        renew until 05/03/2016 14:23:48


C'est terminé pour cette partie

Modification de la configuration Samba

Faites une copie du fichier de configuration de base de Samba on va lui coller un fichier raccourci/optimisé plus simple

mv /etc/samba/smb.conf /etc/samba/smb.conf.bak
touch /etc/samba/smb.conf


On modifie le fichier /etc/samba/smb.conf en conséquence (voir lignes surlignés)

  1. /etc/samba/smb.conf
[global]
workgroup = SYRIUS
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 = SYRIUS.LAN
password server = Serveur.syrius.lan
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


Il ne reste plus qu'a redémarrer Samba

service smbd restart


Intégration du Serveur RADIUS dans Active Directory

Pour ajouter notre serveur dans Active Directory

net ads join -U Administrateur


En théorie si tout se passe bien vous devriez obtenir le message suivant

Enter Administrateur's password:
Using short domain name -- SYRIUS
Joined 'RADIUS' to dns domain 'syrius.lan'


Notre serveur RADIUS fait maintenant partie du domaine, il faut redémarrer windbind qu'il récupère la liste des comptes

service winbind restart


On vérifie que la connexion winbind s'effectue correctement :


wbinfo -t
checking the trust secret for domain SYRIUS via RPC calls succeeded


Et enfin on affiche la liste des comptes accessibles

wbinfo -u
SYRIUS\administrateur
SYRIUS\invité
SYRIUS\krbtgt
SYRIUS\bernard
SYRIUS\michel
SYRIUS\christian


On peut enfin tenter une connexion en clair qui échouera pour vérifier que la transaction est acceptée par l'annuaire

wbinfo -a bernard%Password123@
Could not authenticate user bernard%Password123@ with plaintext password
challenge/response password authentication succeeded


On peut par contre tester une authentification NTLM qui devrait fonctionner

ntlm_auth --request-nt-key --domain=SYRIUS --username=michel
Password:
NT_STATUS_OK: Success (0x0)

Génération d'un certificat let's encrypt

Pour éviter d'avoir a installer un ca root sur les client, nous allons utiliser un certificat signé par let's encrypt (ou autre certificat reconnue). Lors de la connexion depuis un windows, un message d'avertissement informera l'utilisateur que le ca root DST Root CA X3 ne fait pas partie des certificats validée pour la connexion.

Il faudra cliquer sur OK

Avertissement radius2.jpg

Il informe aussi du nom du serveur radius.

Pour que l'utilisateur soit sur d'être sur la bonne connexion il faut que le nom du certificat termine par stemarie-aizenay.fr En effet, seul le propriétaire du domaine peut avoir réussi a récupérer un certificat validée par les ca root embarquée windows.

Ce message ne doit pas apparaître par la suite. En effet, windows, enregistre le nom du serveur radius. Donc même lors du renouvellement du certificat, windows n'affichera pas d’avertissement. Il a enregistrer les paramètres de connexion.

Si l'avertissement survient a nouveau, c'est soit que le nom a changée, (ce qui est inquiétant), soit que le certificat n'est plus valide.

Il vous faut donc générer ce certificat sur votre dmz puis copier les certificat dans

FreeRADIUS

Installation FreeRADIUS

aptitude update && aptitude upgrade -y
aptitude install freeradius freeradius-utils -y

Configuration FreeRADIUS

Il y'a 4 fichiers a modifier pour que cela fonctionne

  • /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

Fichier eap.conf

eap {
   default_eap_type = peap
   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_file = ${certdir}/letsencrypt/privkey.pem
       certificate_file = ${certdir}/letsencrypt/cert.pem
       CA_file = ${certdir}/letsencrypt/fullchain.pem
       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 {
   }
}

Fichier modules/mschap

  1. /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}"
}

Fichier proxy.conf

#/etc/freeradius/proxy.conf
proxy server {
   default_fallback = no
}
realm NULL {
}
realm LOCAL {
}
realm syrius.lan {
    authhost = LOCAL
    accthost = LOCAL
}

realm DEFAULT {
    type = radius
    authhost = LOCAL
    accthost = LOCAL
    secret = proxysharedsecret
    nostrip
}

Fichier clients.conf

Ce fichier contient vos clients RADIUS/NAS qui vont pouvoir demander au serveur des authentification.

Dans notre cas j'ai ajouté le serveur Unifi contrôleur des bornes Ubiquiti qui dispose du paramétrage RADIUS


#/etc/freeradius/clients.conf
client 172.16.0.214/21 {
   secret          = Password123!@$
   shortname       = unifi
}
client localhost {
   ipaddr = 127.0.0.1
   secret          = testing123
   require_message_authenticator = no
   nastype     = other
}

Changement du groupe sur un dossier Samba

J'ai du changer le groupe d'un dossier Samba pour que l'authentification RADIUS fonctionne.

chown root:freerad /var/lib/samba/winbindd_privileged/

Redémarrage du service

service freeradius restart

Test de connexion RADIUS

On teste une connexion par le protocole mschap

radtest -t mschap bernard Password123@ 127.0.0.1 0 testing123


La réponse correcte doit être

Sending Access-Request of id 237 to 127.0.0.1 port 1812
       User-Name = "bernard"
       NAS-IP-Address = 127.0.1.1
       NAS-Port = 0
       Message-Authenticator = 0x00000000000000000000000000000000
       MS-CHAP-Challenge = 0xb8201fd266435b59
       MS-CHAP-Response = 0x00010000000000000000000000000000000000000000000000007c5fcd6b544c28a727a4495f718daa00bf8d80d25895e3cd
rad_recv: Access-Accept packet from host 127.0.0.1 port 1812, id=237, length=84
       MS-CHAP-MPPE-Keys = 0x0000000000000000f98feb08ceddb78964978130258e020b0000000000000000
       MS-MPPE-Encryption-Policy = 0x00000002
       MS-MPPE-Encryption-Types = 0x00000004

Log des connexions

Afin de conserver toutes les authentifications qui passent pas RADIUS il faut modifier le fichier de configuration /etc/freeradius/radiusd.conf

Voici un exemple (sans la tonne de commentaires) de ce qui peut être mis en place :

  • Log des connexions dans un fichier : /var/log/radius.log
  • Log des connexions réussies
  • Log des échecs de connexions


log {

 destination = files
 file = /var/log/radius.log
 syslog_facility = daemon
 stripped_names = yes
 auth = yes
 auth_badpass = yes
 auth_goodpass = yes
 msg_goodpass = "Authentification Radius OK"
 msg_badpass = "Tentative de Connexion - Bad Password"
}


Le resultat dans le fichier de logs :


Thu Mar 17 15:39:19 2016 : Auth: Login OK: [Gauvrit/<via Auth-Type = EAP>] (from client unifi port 0 cli XX-XX-XX-XX-XX-XX via TLS tunnel) Authentification Radius OK
Thu Mar 17 15:39:19 2016 : Auth: Login OK: [Gauvrit/<via Auth-Type = EAP>] (from client unifi port 0 cli XX-XX-XX-XX-XX-XX) Authentification Radius OK

Sources

Voici les différentes sources qui nous ont aidé a élaborer cette documentation :