.. Wiki Lesfourmisduweb documentation master file, created by sphinx-quickstart on Thu Apr 25 13:32:03 2019. You can adapt this file completely to your liking, but it should at least contain the root `toctree` directive. .. Reminder for header structure : Niveau 1 : ==================== Niveau 2 : -------------------- Niveau 3 : ++++++++++++++++++++ Niveau 4 : """""""""""""""""""" Niveau 5 : ^^^^^^^^^^^^^^^^^^^^ Projet authentification wifi et logging http/https ==================================================== Présentation -------------------- **Résultat Final du tuto:** .. raw:: html 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. 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** .. code-block:: bash # 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** .. code-block:: bash domain stemarie-aizenay.local search stemarie-aizenay.local nameserver 172.16.0.1 nameserver 8.8.8.8 Dans ce tutoriel j'utiliserais les variables suivantes : * Domaine dns : stemarie-aizenay.local * domaine NetBios : STEMARIE-AIZENAY * Serveur AD : serveur.stemarie-aizenay.local * 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 """""""""""""""""""""""""""""""""""""""""""""""""" .. code-block:: bash #/etc/krb5.conf [libdefaults] default_realm = STEMARIE-AIZENAY.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] STEMARIE-AIZENAY.LAN = { kdc = Serveur.stemarie-aizenay.local admin_server = Serveur.stemarie-aizenay.local default_domain = stemarie-aizenay.local } [domain_realm] .stemarie-aizenay.local = STEMARIE-AIZENAY.LAN stemarie-aizenay.local = STEMARIE-AIZENAY.LAN [login] krb4_convert = true krb4_get_tickets = false Initialisation Kerberos """""""""""""""""""""""""""""""""""""""" On récupère un ticket Kerberos avec un compte Administrateur AD .. code-block:: bash kinit Administrateur@stemarie-aizenay.local On doit ensuite vérifier si ce ticket est valide avec la commande klist, la réponse doit être la suivante : .. code-block:: bash klist Ticket cache: FILE:/tmp/krb5cc_0 Default principal: Administrateur@STEMARIE-AIZENAY.LOCAL Valid starting Expires Service principal 04/03/2016 14:23:51 05/03/2016 00:23:51 krbtgt/STEMARIE-AIZENAY.LOCAL@STEMARIE-AIZENAY.LOCAL 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 .. code-block:: bash 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) .. code-block:: bash #/etc/samba/smb.conf [global] workgroup = STEMARIE-AIZENAY 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 = STEMARIE-AIZENAY.LOCAL password server = Serveur.stemarie-aizenay.local 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 .. code-block:: bash service smbd restart Intégration du Serveur RADIUS dans Active Directory """""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""" Pour ajouter notre serveur dans Active Directory .. code-block:: bash net ads join -U Administrateur En théorie si tout se passe bien vous devriez obtenir le message suivant .. code-block:: console Enter Administrateur's password: Using short domain name -- STEMARIE-AIZENAY Joined 'RADIUS' to dns domain 'stemarie-aizenay.local' Notre serveur RADIUS fait maintenant partie du domaine, il faut redémarrer windbind qu'il récupère la liste des comptes .. code-block:: bash service winbind restart On vérifie que la connexion winbind s'effectue correctement : .. code-block:: bash wbinfo -t checking the trust secret for domain STEMARIE-AIZENAY via RPC calls succeeded Et enfin on affiche la liste des comptes accessibles .. code-block:: bash wbinfo -u STEMARIE-AIZENAY\administrateur STEMARIE-AIZENAY\invité STEMARIE-AIZENAY\krbtgt STEMARIE-AIZENAY\bernard STEMARIE-AIZENAY\michel STEMARIE-AIZENAY\christian On peut enfin tenter une connexion en clair qui échouera pour vérifier que la transaction est acceptée par l'annuaire .. code-block:: bash 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 .. code-block:: bash ntlm_auth --request-nt-key --domain=STEMARIE-AIZENAY --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 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 avec let's encrypt puis copier les fichier : cert.pem chain.pem fullchain.pem privkey.pem Présent dans le dossier : :file:`/etc/letsencrypt/archive/wifi.netfilter.stemarie-aizenay.fr/` (Trier les fichiers par date et prendre les dernier fichier générer a la date du jour) Puis les copier dans le dossier :file:`/etc/freeradius/certs/letsencrypt` (en supprimant les numéro) FreeRADIUS -------------- Installation FreeRADIUS ++++++++++++++++++++++++++++++++++++++++ .. code-block:: bash aptitude update && aptitude upgrade -y aptitude install freeradius freeradius-utils -y Configuration FreeRADIUS ++++++++++++++++++++++++++++++++++++++++ Il y'a 4 fichiers a modifier pour que cela fonctionne * :file:`/etc/freeradius/eap.conf` : il contient la configuration des méthodes EAP * :file:`/etc/freeradius/modules/mschap` : c’est ce module qui fera l’authentification sur l’AD * :file:`/etc/freeradius/proxy.conf` : sert à relayer les requêtes sur d’autres serveurs radius * :file:`/etc/freeradius/clients.conf` : c’est ici que sont déclarés les NAS autorisés à utiliser le radius Fichier eap.conf ++++++++++++++++++++ .. code-block:: bash 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 """""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""" :file:`/etc/freeradius/modules/mschap` .. code-block:: bash 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 """""""""""""""""""""""""" :file:`/etc/freeradius/proxy.conf` .. code-block:: bash proxy server { default_fallback = no } realm NULL { } realm LOCAL { } realm stemarie-aizenay.local { 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 :file:`/etc/freeradius/clients.conf` .. code-block:: bash 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. .. code-block:: bash chown root:freerad /var/lib/samba/winbindd_privileged/ Redémarrage du service """""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""" .. code-block:: bash service freeradius restart Test de connexion RADIUS ++++++++++++++++++++++++++++++++++++++++ On teste une connexion par le protocole mschap .. code-block:: bash radtest -t mschap bernard Password123@ 127.0.0.1 0 testing123 La réponse correcte doit être .. code-block:: bash 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 :file:`/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 : :file:`/var/log/radius.log` * Log des connexions réussies * Log des échecs de connexions .. code-block:: bash 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 : .. code-block:: bash Thu Mar 17 15:39:19 2016 : Auth: Login OK: [Gauvrit/] (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/] (from client unifi port 0 cli XX-XX-XX-XX-XX-XX) Authentification Radius OK Résalisation d'un portail Captif et wpad --------------------------------------------------- Nous allons maintenant réaliser un portail captif, celui va forcer les gens a configurer leur détection automatique de proxy. Je ne vais pas entrer dans le détail (désolée), car sinon l'article wiki serait beaucoup trop long. Mais vous devez monter un dhcp, dns, et squid et apache. DNS ++++++++++++++++++++ Le dns linux bind9 doit avoir une entrée wpad en direction du serveur apache2 qui héberge le wpad dans mon cas wpad.netwireless.stemarie-aizenay.fr .. code-block:: bash wifilter A 172.25.255.254 wpad CNAME wifilter.netwireless.stemarie-aizenay.Fr DHCP ++++++++++++++++++++ Ma zone dhcp sera : **172.25.0.0** Le dhcp linux doit avoir les options : .. code-block:: bash option wpad-url "http://wpad.netwireless.stemarie-aizenay.fr/wpad.dat option wpad-url code 252 = text; et l'option .. code-block:: bash option domain-name "netwireless.stemarie-aizenay.fr"; Correspondant a la zone dns du wifi (précédemment configurée) Apache2 ++++++++++++++++++++ Vous devez héberger votre :file:`wpad.dat` dans :file:`/var/www/html/` Puis l'activation du module ssl: .. code-block:: bash a2enmod ssl Puis éditer le fichier :file:`/etc/apache2/default.conf` comme ceci: .. code-block:: bash ServerAdmin webmaster@localhost DocumentRoot /var/www/html ErrorDocument 404 http://wifilter.netwireless.stemarie-aizenay.fr Options Indexes FollowSymLinks MultiViews AllowOverride None Order allow,deny allow from all ServerAdmin webmaster@localhost DocumentRoot /var/www/ Redirect temp / http://wifilter.netwireless.stemarie-aizenay.fr/ ErrorDocument 404 http://wifilter.netwireless.stemarie-aizenay.fr ServerAdmin webmaster@localhost Redirect temp / http://wifilter.netwireless.stemarie-aizenay.fr/ ErrorDocument 404 http:/wifilter.netwireless.stemarie-aizenay.fr/ SSLEngine on SSLCertificateFile /etc/ssl/certs/ssl-cert-snakeoil.pem SSLCertificateKeyFile /etc/ssl/private/ssl-cert-snakeoil.key Modifier le fichier :file:`/etc/apache2/ports.conf` Et ajouter : .. code-block:: bash Listen 1234 iptables ++++++++++++++++++++ Et enfin mon script iptable qui sera automatiquement lancée au démarrage: .. code-block:: bash iptables -F iptables -X iptables -t nat -A PREROUTING -d 172.25.255.254 -p tcp -m tcp --dport 443 -j DNAT --to-destination 172.25.255.254:443 iptables -t nat -A PREROUTING -d 172.25.255.254 -p tcp -m tcp --dport 80 -j DNAT --to-destination 172.25.255.254:80 iptables -t nat -A PREROUTING -s 172.25.0.0/255.255.0.0 -p tcp -m tcp --dport 80 -j DNAT --to-destination 172.25.255.254:1234 iptables -t nat -A PREROUTING -s 172.25.0.0/255.255.0.0 -p tcp -m tcp --dport 443 -j DNAT --to-destination 172.25.255.254:443 iptables -t nat -A PREROUTING -s 172.25.0.0/255.255.0.0 -p udp -m udp --dport 53 -j DNAT --to-destination 172.25.255.254:53 Proxy -------------------- J'utilise ici un couple proxy squid/squidguard Je ne vais pas expliquer comment monter un squid/squidguard, on trouve 30000 tuto sur internet. Je n'authentifie pas avec mon squid. J'ai juste fait une ACL sur 172.25.0.0 En revanche je log les adresse MAC des clients qui surf a ajoutant ceci a mon squid.conf: .. code-block:: bash eui_lookup on logformat squid %ts.%03tu %6tr %>eui %>a %Ss/%03>Hs %