## authentification "<i class="fa fa-wikipedia-w" aria-hidden="true"></i> processus permettant à un système de s'assurer de la légitimité de la demande d'accès faite par une entité (être humain ou un autre système...) afin d'autoriser l'accès de cette entité à des ressources du système (systèmes, réseaux, applications…) conformément au paramétrage du contrôle d'accès ." ## 3 concepts * identification * **authentification** * ACL ## preuves * ce que je sais * mot de passe, numéro d'identification personnel * ce que je possède * carte d'identité, carte à puce, certificat électronique, Token, Token OTP, périphérique * ce que je suis * photo, caractéristique physique, voire biométrie * ce que je sais faire * geste, signature ## 2AF  https://www.google.com/landing/2step/ ## Yubikey [](https://www.yubico.com/) # quelques techniques ## du world wide web ### A base de login / mot de passe ## apache & .htaccess * [EnablingUseOfApacheHtaccessFiles](https://help.ubuntu.com/community/EnablingUseOfApacheHtaccessFiles) * surcharge du vhost courant (déconseillé) ``` $ sudo vi /etc/apache2/apache2.conf <Directory /var/www/> Options Indexes FollowSymLinks MultiViews AllowOverride All # None par défaut Order allow,deny allow from all </Directory> ``` Note: - potentiellement danegreux - php.ini surchargeable aussi - tems d'exec max - taille de fichier max - reporting d'erreur - configurable en cas de virtual hosting - à creuser ## auth basic .htaccess ``` $ vi /var/www/http-basic/.htaccess AuthType Basic AuthName "Big Basic Secret" AuthUserFile /var/www/http-basic/.htpasswd Require valid-user ``` [htpasswd](https://httpd.apache.org/docs/2.2/programs/htpasswd.html) outil de création des utilisateurs ``` $ htpasswd -c /var/www/http-basic/.htpasswd guest $ htpasswd /var/www/http-basic/.htpasswd otheruser ``` ## auth basic le client demande un contenu (protégé) ```http GET /http-basic/ HTTP/1.1 Host: go.od User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:31.0) Gecko/20100101 Firefox/31.0 Iceweasel/31.8.0 Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8 Accept-Language: en-US,en;q=0.5 Accept-Encoding: gzip, deflate Connection: keep-alive ``` ## auth basic le serveur répond que le contenu est protégé ```http HTTP/1.1 401 Authorization Required Date: Wed, 21 Oct 2015 13:26:29 GMT Server: Apache/2.2.22 (Debian) WWW-Authenticate: Basic realm="Big Basic Secret" Content-Length: 472 Content-Type: text/html; charset=iso-8859-1 <!DOCTYPE HTML PUBLIC "-//IETF//DTD HTML 2.0//EN"> <html><head> <title>401 Authorization Required</title> </head><body> <h1>Authorization Required</h1> </body> ``` ## auth basic  ## auth basic ```http GET /http-basic/ HTTP/1.1 Host: go.od User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:31.0) Gecko/20100101 Firefox/31.0 Iceweasel/31.8.0 Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8 Accept-Language: en-US,en;q=0.5 Accept-Encoding: gzip, deflate Connection: keep-alive Pragma: no-cache Cache-Control: no-cache Authorization: Basic b3dhc3A6cGFzc3dvcmQ= ``` [base64](https://fr.wikipedia.org/wiki/Base64)(username:password) ## auth digest * Même schéma que la version Basic excepeté * algorithme de hashage [MD5](https://fr.wikipedia.org/wiki/MD5) plutôt qu'un simple encodage [base64](https://fr.wikipedia.org/wiki/Base64) * ajout d'un [nonce](http://fr.wikipedia.org/wiki/Nonce_cryptographique), rattacher à la session de communication, pour éviter les [attaques "par rejeu"](https://fr.wikipedia.org/wiki/Attaque_par_rejeu) ``` $ sudo a2enmod auth_digest $ sudo service apache2 reload ``` ## auth digest  ## auth digest .htaccess ``` $ vi /var/www/http-digest/.htaccess AuthType Digest AuthName "authdigest" AuthDigestDomain "/" AuthDigestProvider file AuthUserFile "/var/www/http-digest/.htdigest" Require valid-user ``` [htdigest](https://httpd.apache.org/docs/2.2/fr/programs/htdigest.html) outil de création des utilisateurs ``` htdigest -c /var/www/http-basic/.htdigest "authdigest" guest htdigest /var/www/http-basic/.htdigest "authdigest" otheruser ``` ## auth digest * le client demande un contenu (protégé) * le serveur répond que le contenu est protégé ```http HTTP/1.1 401 Unauthorized WWW-Authenticate: Digest realm="OwaspSample", nonce="Ny8yLzIwMDIgMzoyNjoyNCBQTQ", opaque="0000000000000000", \ stale=false, algorithm=MD5, qop="auth" ``` ## auth digest  ## auth digest ```http GET /example/owasp/test.asmx HTTP/1.1 Accept: */* Authorization: Digest username="owasp", realm="OwaspSample", qop="auth", algorithm="MD5", uri="/example/owasp/test.asmx", nonce="Ny8yLzIwMDIgMzoyNjoyNCBQTQ", nc=00000001, cnonce="c51b5139556f939768f770dab8e5277a", opaque="0000000000000000", response="2275a9ca7b2dadf252afc79923cd3823" ``` Note: - haché plus réversible même si MD5 ca craint un peu - le nonce evite le rejeu - le serveur connait les nonce qu'il a émis - il sait qu'ils ne sont valables qu'une fois - http://slideplayer.fr/slide/1622495/ -> slide 30 - le cnonce agit comme un salt - évite le cassage du mot de passe par dictionnaire - toujours pas de lockout - attaque man in the middle - demande de nonce au serveur et l'envoie au client et renvoie le resultat du cacul au serveur - pas de blocage testable à l'infini ## authentification par formulaire le plus courant ``` <form method="POST" action="login"> <input type="text" name="username"> <input type="password" name="password"> </form> ``` ## authentification par formulaire * le mot de passe est transmis en clair au serveur * https :) * stocker les mots de passe en clair sur le serveur est un mauvaise idée * [Rockyou.com en 2010](http://commedansdubeurre.ch/?story=162-piratage-de-32-millions-de-comptes-utilisateurs-chez-rockyou-recours-collectif-depose) * stocker les hashés est une bonne pratique * saler les hashés est encore mieux ## oAuth  ## oAuth | Version | SSL | Token | Technique | | ------- | ----------- | --------------- | ------------------------ | | 1.0 | optionel | sans expiration | mise en place compliquée | | 2.0 | obligatoire | révocable | simple et plus léger | * 1.0 incompatible avec 2.0 * <i class="fa fa-newspaper-o"></i> [How to Secure Your REST API using Proven Best Practices](https://stormpath.com/blog/secure-your-rest-api-right-way) Note: - authentification simple (instagram) - souvent autorisations partielles attribuées à l'app - le token évite de rejouer l'auth - oAuth 1.0 en clair lire le token - pas de consensus sur la version 1 ou 2 sur Internet - confiance dans consumer (l'app qui demande l'autorisation) ## SSO * [CAS](http://www.apereo.org/cas) *"Identity providers (IdPs) supply user information, while service providers (SPs) consume this information and give access to secure content"* * [SAML](https://fr.wikipedia.org/wiki/SAML) [Shibboleth](images/authentication/Shibboleth.png) * [OpenID](https://openid.net/) * [lemonldap-ng](https://lemonldap-ng.org/welcome/) ## JWT [<!-- .element style="width: 80%" -->](https://blog.ippon.fr/2017/10/12/preuve-dauthentification-avec-jwt/) ## force brute * par dictionnaires * liste d'utilisateurs + liste de mots de passe * optimisable avec * de la probabilité * [des dictionnaires au hasard](https://dazzlepod.com/site_media/txt/passwords.txt) * de l'ingénieurie sociale * du flaire etc ... ## force brute * par recherche * combinatoire * hybride * décliner via des règles les propositions d'un dictionnaire * leetspeakation automatique * [John the Ripper](http://www.openwall.com/john/) permet de générer des mots de passes dérivant de parties du username ## [THC Hydra](http://www.thc.org/thc-hydra/) * multi-protocole: IMAP, SMB, HTTP, VNC, MS-SQL MySQL, SMTP, SSH, VNC, Asterisk, ... * [RTFM](https://github.com/vanhauser-thc/thc-hydra) * [liste de usernames](https://raw.githubusercontent.com/maryrosecook/commonusernames/master/usernames.txt) * [liste de mots de passe](https://wiki.skullsecurity.org/index.php?title=Passwords) ## [THC Hydra](http://www.thc.org/thc-hydra/) ```shell hydra 192.168.1.26 ssh2 -s 22 -P pass.txt -L users.txt -e nrs -t 10 ``` * attaque du protocole ssh sur le port 22 * 10 threads à la fois * essaie toutes les combinaisons possibles entre les username de users.txt et les mots de passe de pass.txt * + mot de passe vide * + mot de passe = username * + mot de passe = username à l'envers * [OWASP - Testing for Brute Force](https://www.owasp.org/index.php/Testing_for_Brute_Force_%28OWASP-AT-004%29) Note: - Burp Suite - Patator ## attaques offline * Dépend de la puissance de calcul * Non furtive * Reproductible ## attaques offline * [OPHCRACK (the time-memory-trade-off-cracker)](http://lasecwww.epfl.ch/~oechslin/projects/ophcrack/) * monde windows * fichiers SAM * fonctionne avec des [dictionnaires](http://ophcrack.sourceforge.net/tables.php) * <i class="fa fa-gift"></i> <a href="http://www.newbiecontest.org/index.php?page=epreuve&no=224">obtenir le pass d'un compte windows en moins de 10 minutes</a> * [Password Cracking: Lesson 2](http://www.computersecuritystudent.com/SECURITY_TOOLS/PASSWORD_CRACKING/lesson2/) ## attaques offline * [John the Ripper](http://www.openwall.com/john/) * monde UNIX/BSD * fichier /etc/passwd + /etc/shadow * mangling rules: leet speak, custom ... ```shell unshadow /etc/passwd /etc/shadow > mypasswd ``` * [Checking Password Complexity with John the Ripper](http://www.admin-magazine.com/Articles/John-the-Ripper) ## attaques par tables arc-en-ciel * [CrackStation](https://crackstation.net/) * avec la signature de smithy dans la table user ```shell 5f4dcc3b5aa765d61d8327deb882cf99 ``` ## <i class="fa fa-medkit"></i> Se protéger * bien choisir son système d'authentification * bien implémenter son système d'authentification * [ESAPI (The OWASP Enterprise Security API)](https://www.owasp.org/index.php/Category:OWASP_Enterprise_Security_API) * libs & bundles éprouvés * mettre un nombre d'essais maximum consécutifs * plugin anti brute force * wordpress * drupal * compléter par des restrictions par IP, voir par blocs d'IPs ## <i class="fa fa-medkit"></i> Se protéger * instaurer des règles de durcissement au moment du choix du mot de passe * pas contournable côté client ;) * sensibilisez vos utilisateurs * [<i class="fa fa-desktop"></i> Se protéger avec de bons mots de passe](http://doc.m4z3.me/_/bpu/se_proteger_avec_de_bons_mots_de_passe.htm#/cover) * [<i class="fa fa-video-camera"></i> Se protéger avec de bons mots de passe](http://webtv.u-clermont1.fr/media-MEDIA150410174414391) * mettre en place en deuxième facteur d'authentification * utiliser la crypto asymétrique