Authentification et Gestion des Mots de Passe

Sommaire


Introduction:

L’authentification et la gestion des mots de passe sont des composantes essentielles de la sécurité informatique dans une entreprise. Cet article expliquera plusieurs directives pour renforcer ces deux aspects.


Bonnes pratiques:

1. Utilisation des services de sécurité standards Il est recommandé d’utiliser des services de sécurité standards, comme le WSSO (Web Single Sign-On) pour l’authentification web de l’intranet. Ces services sont conçus pour répondre aux exigences spécifiques des entreprises et ont déjà fait leurs preuves en termes de fiabilité et de sécurité.

2. Modification des mots de passe et identifiants par défaut Tous les mots de passe et identifiants fournis par défaut par les fournisseurs doivent être modifiés ou les comptes associés désactivés. Ces informations par défaut sont souvent connues des hackers, rendant les systèmes vulnérables à des attaques.

3. Ré-authentification pour les opérations critiques Pour les actions sensibles, il est recommandé d’utiliser une ré-authentification. Cela offre une couche de sécurité supplémentaire en vérifiant une deuxième fois l’identité de l’utilisateur avant d’exécuter une action critique.

4. Authentification à deux facteurs Pour les comptes traitant des transactions de grande valeur ou sensibles, l’authentification à deux facteurs est recommandée. Cette méthode nécessite deux formes de preuves d’identité, rendant l’accès non autorisé plus difficile.

5. Fonctionnalité de déconnexion Un bouton de déconnexion doit être accessible sur toutes les pages. Cette fonctionnalité est essentielle pour la sécurité de l’utilisateur, lui permettant de terminer sa session à tout moment.

6. Terminaison complète de la session après déconnexion La déconnexion doit entraîner la fin complète de la session ou de la connexion associée. Cela évite que des données résiduelles ne restent accessibles après la déconnexion de l’utilisateur.

7. Authentification non standard Si une authentification non standard est utilisée, plusieurs règles doivent être respectées. Tout d’abord, l’authentification doit être validée seulement après la saisie complète des données. Ensuite, les erreurs ne doivent pas indiquer quelle partie des données d’authentification est incorrecte. Enfin, seules les requêtes POST doivent être utilisées pour transmettre les données d’authentification.

8. Envoi des mots de passe uniquement sur une connexion cryptée Afin de protéger les mots de passe pendant leur transmission, ils doivent toujours être envoyés sur une connexion cryptée. Cela empêche les éventuels pirates de récupérer les mots de passe lors de la transmission.

9. Exigences de complexité des mots de passe Les mots de passe doivent respecter certaines règles de complexité. Ils doivent comprendre des caractères alphabétiques ainsi que des caractères numériques et/ou spéciaux. Cette diversité rend le mot de passe plus difficile à deviner.

10. Exigences de longueur des mots de passe Les mots de passe doivent être composés d’au moins huit caractères. Cette longueur minimum garantit une certaine complexité du mot de passe, le rendant plus difficile à craquer.

11. Obscurcissement des mots de passe à l’écran de l’utilisateur Pour une meilleure sécurité, les mots de passe doivent être obscurcis (par exemple, affichés sous forme de points ou d’étoiles) sur l’écran de l’utilisateur lors de la saisie. Cela évite que des personnes malveillantes ne puissent voir le mot de passe en surprenant l’écran.

12. Désactivation du compte après cinq tentatives de connexion infructueuses En cas de cinq tentatives infructueuses de connexion, le compte doit être désactivé pendant une période suffisante pour dissuader les attaques par force brute. Cela empêche un pirate informatique d’essayer différents mots de passe jusqu’à ce qu’il trouve le bon.

13. Processus de récupération et de changement de mot de passe Le processus de récupération de mot de passe doit être aussi sécurisé que la création de compte et l’authentification. Un e-mail de récupération ne doit être envoyé qu’à une adresse pré-enregistrée contenant un lien ou un mot de passe temporaire pour réinitialiser le mot de passe.

14. Durée de vie courte des liens et mots de passe temporaires Les liens et mots de passe temporaires doivent avoir une durée d’expiration courte. Cela réduit le risque qu’un attaquant ait le temps d’utiliser ces informations.

15. Questions de récupération de mot de passe Les réponses aux questions de récupération de mot de passe doivent être suffisamment aléatoires pour éviter qu’elles ne soient facilement devinables.

16. Obligation de changer les mots de passe temporaires à la prochaine utilisation et interdiction de la réutilisation des mots de passe Un mot de passe temporaire doit être changé lors de la prochaine utilisation. De plus, il est important d’empêcher la réutilisation des mots de passe pour éviter qu’un ancien mot de passe compromis ne soit réutilisé.

17. Exigence de changement de mot de passe au moins tous les 180 jours Les mots de passe doivent être modifiés au moins tous les 180 jours. Les systèmes critiques peuvent nécessiter des changements plus fréquents. Cela minimise les risques si un mot de passe est compromis sans que l’utilisateur ou l’entreprise ne s’en rende compte.

18. Désactivation de la fonction « se souvenir de moi » pour les champs de mot de passe La fonction « se souvenir de moi » doit être désactivée pour les champs de mot de passe. Bien qu’elle soit pratique, elle peut poser un risque de sécurité si l’appareil de l’utilisateur est perdu ou volé.

19. Enregistrement de toutes les tentatives d’authentification infructueuses Toutes les tentatives d’authentification infructueuses doivent être consignées. Cela peut aider à identifier les tentatives d’attaque et à renforcer la sécurité en réponse.

20. Notification des tentatives de connexion infructueuses L’utilisateur doit être informé des tentatives de connexion infructueuses lors de sa prochaine connexion réussie. Cela permet à l’utilisateur de savoir si son compte a été la cible de tentatives d’accès non autorisées.

21. Notification de la dernière utilisation de l’identifiant de l’utilisateur L’utilisateur doit être informé de la dernière utilisation de son identifiant lors de sa prochaine connexion réussie. Cette mesure permet à l’utilisateur de vérifier que les dernières activités enregistrées sur son compte sont bien les siennes.

22. Séparation de la logique d’authentification et redirection lors de la connexion Il est important de séparer la logique d’authentification et d’utiliser la redirection lors de la connexion. Cela permet d’éviter que les éventuelles erreurs d’authentification ne soient visibles pour l’utilisateur, réduisant ainsi les informations disponibles pour un attaquant potentiel.

23. Mise en place d’un suivi pour identifier les attaques contre plusieurs comptes utilisateur La mise en place d’un système de suivi pour identifier les attaques utilisant le même mot de passe contre plusieurs comptes est recommandée. Ce type d’attaque est couramment utilisé pour contourner les blocages standard. Un tel suivi peut aider à détecter rapidement ces attaques et à prendre des mesures pour y remédier.

24. Exigence d’une ancienneté minimale des mots de passe avant modification Les mots de passe doivent avoir au moins un jour d’ancienneté avant de pouvoir être modifiés. Cela permet de prévenir les attaques qui chercheraient à modifier rapidement les mots de passe pour contourner les restrictions de réutilisation des mots de passe.


Exemples:

Prenons un exemple simple d’un système d’authentification écrit en PHP qui ne respecte pas plusieurs des directives mentionnées ci-dessus :

<?php
// connexion à la base de données
$db = new PDO('mysql:host=localhost;dbname=test', 'root', '');

if(isset($_GET['username']) && isset($_GET['password'])) {
    $username = $_GET['username'];
    $password = $_GET['password'];

    // requête SQL pour obtenir l'utilisateur
    $query = $db->prepare("SELECT * FROM users WHERE username = '$username' AND password = '$password'");
    $query->execute();

    if($query->rowCount() > 0) {
        echo 'Connexion réussie';
    } else {
        echo 'Nom d\'utilisateur ou mot de passe incorrect';
    }
}
?>

Ce code a plusieurs problèmes majeurs :

1. Transmission des identifiants par GET : Le code utilise la méthode GET pour transmettre les identifiants. C’est une violation directe de la directive qui stipule qu’il faut utiliser uniquement la méthode POST pour transmettre les informations d’authentification. La méthode GET inclut les informations dans l’URL, ce qui les rend visibles dans l’historique du navigateur, les journaux de serveur, etc.

2. Pas de cryptage : Le mot de passe est envoyé en clair, ce qui est une violation de la directive qui stipule que les mots de passe ne doivent être envoyés que sur une connexion cryptée. Si la connexion n’est pas sécurisée (HTTPS), un attaquant pourrait intercepter le mot de passe.

3. Injection SQL : Le code est vulnérable à une attaque par injection SQL. En effet, les variables $username et $password sont insérées directement dans la requête SQL sans être préalablement échappées ou préparées. Un utilisateur malveillant pourrait donc injecter du code SQL dans le champ d’authentification, ce qui pourrait entraîner la divulgation de données, la modification de données ou même la suppression de toutes les données.

4. Stockage en clair des mots de passe : Ce code semble suggérer que les mots de passe sont stockés en clair dans la base de données (comparaison directe du mot de passe entré avec celui dans la base de données). Les mots de passe doivent toujours être stockés de manière sécurisée, généralement en utilisant un hachage et un sel.

5. Messages d’erreur révélateurs : Les messages d’erreur indiquent explicitement quand le nom d’utilisateur ou le mot de passe est incorrect. Cela donne des informations à un attaquant sur ce qui ne va pas dans les données qu’il a soumises, ce qui peut aider l’attaquant à affiner ses tentatives de connexion frauduleuse.

Ce code présente de nombreuses failles de sécurité qui pourraient être exploitées par un attaquant. Pour se protéger, il est important de suivre les directives mentionnées précédemment lors de la création d’un système d’authentification.

Pour corriger les failles du code initial, nous allons mettre en œuvre plusieurs mesures pour respecter les directives de gestion des mots de passe et d’authentification.

Commençons par un exemple de code corrigé en PHP :

<?php
// Récupération des informations de connexion à la base de données
$dbHost = getenv('DB_HOST');
$dbName = getenv('DB_NAME');
$dbUser = getenv('DB_USER');
$dbPass = getenv('DB_PASSWORD');

// connexion à la base de données
$db = new PDO("mysql:host=$dbHost;dbname=$dbName", $dbUser, $dbPass);
$db->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);

if(isset($_POST['username']) && isset($_POST['password'])) {
    $username = $_POST['username'];
    $password = $_POST['password'];

    try {
        // requête SQL préparée pour éviter l'injection SQL
        $query = $db->prepare("SELECT password FROM users WHERE username = :username");
        $query->bindParam(':username', $username);
        $query->execute();

        $row = $query->fetch(PDO::FETCH_ASSOC);

        if($row && password_verify($password, $row['password'])) {
            echo 'Connexion réussie';
        } else {
            echo 'Identifiants incorrects';
        }
    } catch (PDOException $e) {
        echo 'Erreur dans la requête SQL';
    }
}
?>

Maintenant, expliquons comment ce code amélioré résout les failles du code précédent :

1. Stockage sécurisé des informations de connexion à la base de données : Les informations de connexion à la base de données sont maintenant stockées de manière sécurisée en dehors du code source, dans des variables d’environnement. Cela respecte la directive de changer tous les mots de passe et identifiants par défaut fournis par le vendeur, et de les stocker de manière sécurisée.

2. Utilisation de POST pour transmettre les identifiants : Le code utilise la méthode POST pour transmettre les informations d’authentification, ce qui respecte la directive de n’utiliser que la méthode POST pour transmettre ces informations, afin de garantir leur confidentialité.

3. Utilisation de password_verify pour la vérification du mot de passe : Le code utilise la fonction PHP password_verify pour vérifier le mot de passe. Cette fonction compare le mot de passe saisi avec la version hachée stockée dans la base de données, respectant ainsi les directives de stockage sécurisé des mots de passe.

4. Prévention de l’injection SQL : Grâce à l’utilisation des requêtes SQL préparées, le code est maintenant protégé contre l’injection SQL. Les données de l’utilisateur sont liées à la requête SQL de manière sûre, empêchant leur utilisation pour injecter du code SQL malveillant.

5. Messages d’erreur non révélateurs : Les messages d’erreur ont été rendus génériques pour ne pas révéler si le nom d’utilisateur est incorrect ou si le mot de passe ne correspond pas, conformément aux directives.


Conclusion:

L’authentification et la gestion des mots de passe doivent être traitées avec une attention particulière et une rigueur technique pour garantir une sécurité optimale. En appliquant les directives présentées dans cet article, il est possible d’instaurer un environnement numérique sécurisé et de minimiser les risques associés aux attaques malveillantes. Cependant, la sécurité étant un processus constant et évolutif, il est crucial de rester vigilant, de suivre les dernières tendances en matière de sécurité et d’adapter continuellement les pratiques de l’entreprise en conséquence.

Laisser un commentaire

Votre adresse e-mail ne sera pas publiée. Les champs obligatoires sont indiqués avec *