Politiques de mots de passe et détection des attaques sous Linux

CybersécuritéBeginner
Pratiquer maintenant

Introduction

Dans ce laboratoire, vous apprendrez des techniques essentielles pour renforcer la sécurité d’un système Linux en mettant en place et en appliquant des politiques de mots de passe robustes. Vous configurerez des règles valables pour l’ensemble du système afin d’imposer une certaine complexité, notamment une longueur minimale et l’utilisation combinée de différents types de caractères, comme des majuscules, des minuscules et des chiffres. Vous mettrez également en place des règles d’expiration afin de garantir le renouvellement régulier des identifiants et de réduire les risques liés aux mots de passe compromis, en modifiant les principaux fichiers de configuration du système.

Après avoir défini la politique, vous vérifierez que ces exigences renforcées s’appliquent bien aux nouveaux comptes utilisateurs. Le laboratoire passe ensuite de mesures de sécurité préventives à une démarche de détection, en vous apprenant à surveiller les journaux d’authentification du système. Leur analyse vous permettra d’identifier des activités suspectes, telles que des tentatives de connexion échouées à répétition, qui peuvent signaler une attaque par force brute ou d’autres tentatives d’accès non autorisées.

Configurer la complexité et l’expiration de la politique locale des mots de passe Linux

Dans cette étape, vous apprendrez à renforcer la sécurité d’un système Linux en configurant une politique de mots de passe robuste. Une politique efficace repose sur deux aspects essentiels : la complexité et l’expiration. Les règles de complexité empêchent l’utilisation de mots de passe faciles à deviner en imposant différents types de caractères, tandis que les règles d’expiration obligent les utilisateurs à modifier régulièrement leur mot de passe, ce qui limite les risques liés à des identifiants compromis. Vous utiliserez les outils Linux standard pour modifier les fichiers de configuration globaux et appliquer ces règles.

Commençons par la complexité des mots de passe. Sur les systèmes modernes fondés sur Debian, comme Ubuntu, la qualité des mots de passe est gérée par le module pam_pwquality. Sa configuration se trouve dans le fichier /etc/security/pwquality.conf.

Commençons par examiner les paramètres par défaut. Utilisez la commande cat pour afficher le contenu du fichier de configuration. Nous utiliserons grep afin d’exclure les lignes commentées et les lignes vides, pour obtenir un affichage plus lisible.

grep -vE '^#|^$' /etc/security/pwquality.conf

Vous verrez peut-être certains paramètres par défaut, ou bien le fichier ne contiendra aucune configuration active. Nous allons maintenant appliquer une politique plus stricte. Comme il faut modifier ce fichier avec les privilèges administrateur, nous utiliserons sudo avec l’éditeur nano.

sudo nano /etc/security/pwquality.conf

Ajoutez les lignes suivantes au fichier afin d’appliquer notre nouvelle politique. Ces paramètres imposent un mot de passe d’au moins 10 caractères, contenant au moins un chiffre, une lettre majuscule et une lettre minuscule. Ils appliquent également les contrôles lorsqu’un administrateur définit le mot de passe d’un autre utilisateur.

minlen = 10
dcredit = -1
ucredit = -1
lcredit = -1
enforce_for_root

Voici la signification de ces options :

  • minlen = 10 : définit à 10 caractères la longueur minimale acceptable du mot de passe.
  • dcredit = -1 : exige au moins un chiffre. La valeur négative signifie « au moins un ».
  • ucredit = -1 : exige au moins une lettre majuscule.
  • lcredit = -1 : exige au moins une lettre minuscule.
  • enforce_for_root : empêche un administrateur de contourner un contrôle de qualité échoué. Cette option est nécessaire, car sudo adduser définit le mot de passe du nouvel utilisateur avec les privilèges de root.

Après avoir ajouté ces lignes, enregistrez le fichier et quittez nano en appuyant sur Ctrl+X, puis sur Y et enfin sur Enter.

Passons maintenant à la configuration de l’expiration des mots de passe. Ces paramètres définissent les durées de validité minimale et maximale d’un mot de passe. Les valeurs par défaut appliquées aux nouveaux comptes sont stockées dans /etc/login.defs.

Utilisez grep pour rechercher les paramètres concernés dans ce fichier.

grep -E 'PASS_MAX_DAYS|PASS_MIN_DAYS|PASS_WARN_AGE' /etc/login.defs

Vous verrez les valeurs par défaut, qui définissent souvent PASS_MAX_DAYS sur un nombre très élevé, désactivant ainsi l’expiration dans les faits.

##       PASS_MAX_DAYS   Maximum number of days a password may be used.
PASS_MAX_DAYS   99999
##       PASS_MIN_DAYS   Minimum number of days allowed between password changes.
PASS_MIN_DAYS   0
##       PASS_WARN_AGE   Number of days warning is given before a password expires.
PASS_WARN_AGE   7

Nous allons appliquer une durée maximale de validité de 9000 jours. Ouvrez le fichier avec sudo nano.

sudo nano /etc/login.defs

Recherchez la ligne PASS_MAX_DAYS et remplacez sa valeur de 99999 par 9000. Vous pouvez également définir PASS_MIN_DAYS sur 7 afin d’empêcher les utilisateurs de modifier leur mot de passe trop fréquemment.

##       PASS_MAX_DAYS   Maximum number of days a password may be used.
PASS_MAX_DAYS   9000
##       PASS_MIN_DAYS   Minimum number of days allowed between password changes.
PASS_MIN_DAYS   7
##       PASS_WARN_AGE   Number of days warning is given before a password expires.
PASS_WARN_AGE   14

Enregistrez le fichier et quittez nano. Les paramètres de /etc/login.defs s’appliquent aux utilisateurs créés après cette modification. Pour appliquer la politique à un utilisateur existant, comme notre utilisateur labex, nous utiliserons la commande chage.

Commencez par vérifier les informations actuelles d’expiration du compte labex.

sudo chage -l labex

La sortie indiquera que le mot de passe n’expire jamais.

Last password change                                    : Jul 22, 2023
Password expires                                        : never
Password inactive                                       : never
Account expires                                         : never
Minimum number of days between password change          : 0
Maximum number of days between password change          : 99999
Number of days of warning before password expires       : 7

Utilisez maintenant chage avec l’option -M pour définir à 9000 le nombre maximal de jours pour l’utilisateur labex.

sudo chage -M 9000 labex

Vérifiez la modification en consultant à nouveau les informations d’expiration du compte.

sudo chage -l labex

Vous constaterez que la date affichée à la ligne Password expires a été mise à jour et que le nombre maximal de jours est désormais fixé à 9000. La politique d’expiration est donc correctement appliquée.

Last password change                                    : Jul 22, 2023
Password expires                                        : Jan 01, 2048
Password inactive                                       : never
Account expires                                         : never
Minimum number of days between password change          : 0
Maximum number of days between password change          : 9000
Number of days of warning before password expires       : 7

Vous avez maintenant configuré avec succès les politiques de complexité et d’expiration des mots de passe sur votre système Linux.

Appliquer des mots de passe robustes aux nouveaux comptes utilisateurs

Dans cette étape, vous vérifierez que les politiques de complexité et d’expiration configurées précédemment sont bien appliquées aux nouveaux comptes. La meilleure manière de le tester consiste à créer un utilisateur, puis à tenter de lui attribuer un mot de passe qui ne respecte pas les règles. Vous verrez ainsi comment le module pam_pwquality et les paramètres par défaut du système contribuent à sécuriser les nouveaux comptes dès leur création.

Nous utiliserons la commande adduser, un script interactif et convivial permettant de créer des utilisateurs sur les systèmes fondés sur Debian. Créons un utilisateur nommé testuser.

sudo adduser testuser

Le système vous demandera immédiatement de définir un mot de passe pour ce nouvel utilisateur. C’est à ce moment que notre politique sera mise à l’épreuve.

Commençons par saisir un mot de passe simple et faible, qui enfreint notre politique. Lorsque le système demande le nouveau mot de passe, saisissez password, puis appuyez sur Enter.

Adding user `testuser' ...
Adding new group `testuser' (1001) ...
Adding new user `testuser' (1001) with home directory `/home/testuser' ...
Copying files from `/etc/skel' ...
New password:

Comme password ne respecte pas nos règles — il est trop court et ne contient ni majuscule ni chiffre — le système le refusera. Le message exact peut varier, mais il commencera par BAD PASSWORD, puis le système vous demandera de saisir un nouveau mot de passe.

BAD PASSWORD: The password fails the dictionary check
New password:

Le mot de passe enfreint plusieurs règles, mais le système signale l’une des raisons du rejet avant de redemander une saisie.

Un simple avertissement ne constitue pas nécessairement un rejet : celui-ci est confirmé lorsque la commande demande de saisir à nouveau le mot de passe. Le paramètre enforce_for_root ajouté à l’étape 1 garantit que le processus privilégié adduser ne pourra pas accepter le mot de passe faible.

Conseil : si vous créez accidentellement un utilisateur, vous pouvez utiliser sudo deluser testuser pour le supprimer et recommencer.

Saisissez maintenant un mot de passe conforme à tous les critères. Lorsque le système vous le demande, entrez N7vQ2mR9xK4p, puis appuyez sur Enter. Vous devrez le saisir une seconde fois pour confirmation.

New password:
Retype new password:
passwd: password updated successfully

Bravo ! Le système a accepté le mot de passe robuste. Il vous demandera ensuite des informations supplémentaires sur l’utilisateur. Vous pouvez simplement appuyer sur Enter à chaque invite afin d’accepter les valeurs par défaut.

Changing the user information for testuser
Enter the new value, or press ENTER for the default
        Full Name []:
        Room Number []:
        Work Phone []:
        Home Phone []:
        Other []:
Is the information correct? [Y/n] Y

L’utilisateur testuser est maintenant créé. Vous pouvez vérifier son existence à l’aide de la commande id.

id testuser

La commande affichera l’identifiant de l’utilisateur, son identifiant de groupe ainsi que ses appartenances à des groupes.

uid=1001(testuser) gid=1001(testuser) groups=1001(testuser)

Vérifions ensuite que la politique d’expiration définie dans /etc/login.defs a été automatiquement appliquée à ce nouvel utilisateur. Utilisez la commande chage pour consulter les informations d’expiration de testuser.

sudo chage -l testuser

La sortie indiquera que le paramètre Maximum number of days between password change est défini sur 9000, conformément à notre configuration.

Last password change                                    : Jul 22, 2023
Password expires                                        : Jan 01, 2048
Password inactive                                       : never
Account expires                                         : never
Minimum number of days between password change          : 7
Maximum number of days between password change          : 9000
Number of days of warning before password expires       : 14

Enfin, pour conserver un système propre, supprimons l’utilisateur de test. La commande deluser supprimera son compte.

sudo deluser testuser

Le système confirmera la suppression de l’utilisateur.

Removing user `testuser' ...
Warning: group `testuser' has no more members.
Done.

Vous avez créé un nouvel utilisateur, testé l’application de la politique de mots de passe et vérifié que les règles d’expiration par défaut étaient bien appliquées.

Surveiller les journaux d’authentification pour détecter les échecs de connexion

Dans cette étape, vous apprendrez à surveiller les journaux d’authentification du système afin de détecter d’éventuelles menaces, comme les attaques par force brute. L’administration système exige notamment d’examiner régulièrement les journaux à la recherche d’activités suspectes. Les tentatives de connexion échouées constituent un indicateur important de tentatives d’accès non autorisées. Vous simulerez un échec de connexion, puis utiliserez des commandes Linux standard pour retrouver et analyser les entrées correspondantes.

Sur les systèmes fondés sur Debian, comme Ubuntu, les événements d’authentification, qu’ils soient réussis ou échoués, sont généralement enregistrés dans le fichier /var/log/auth.log. La lecture de ce fichier nécessite des privilèges administrateur.

Commençons par générer une tentative de connexion échouée. Pour cela, nous pouvons utiliser sans risque la commande su (changement d’utilisateur) afin de basculer vers notre propre compte labex, tout en fournissant volontairement un mot de passe incorrect.

su labex

Le système vous demandera un mot de passe. Saisissez un mot de passe incorrect, par exemple wrongpassword, puis appuyez sur Enter.

Password:
su: Authentication failure

Faisons-le une seconde fois afin de créer une série d’échecs.

su labex

Saisissez à nouveau un mot de passe incorrect. Maintenant que nous avons généré des données dans les journaux, examinons le fichier des journaux d’authentification. Nous utiliserons la commande tail avec sudo pour afficher les dernières lignes de /var/log/auth.log, où sont consignés les événements les plus récents.

sudo tail /var/log/auth.log

Vous verrez plusieurs nouvelles lignes correspondant à vos tentatives su échouées. La sortie ressemblera à ceci : elle indique l’horodatage, le processus (su) et le message d’échec.

Jul 22 16:45:01 labex-vm su[12345]: pam_unix(su:auth): authentication failure; logname=labex uid=1000 euid=0 tty=/dev/pts/0 ruser=labex rhost=  user=labex
Jul 22 16:45:01 labex-vm su[12345]: FAILED SU (to labex) labex on /dev/pts/0
Jul 22 16:45:15 labex-vm su[12346]: pam_unix(su:auth): authentication failure; logname=labex uid=1000 euid=0 tty=/dev/pts/0 ruser=labex rhost=  user=labex
Jul 22 16:45:15 labex-vm su[12346]: FAILED SU (to labex) labex on /dev/pts/0

La recherche manuelle dans les journaux peut prendre du temps. Une méthode plus efficace consiste à utiliser grep pour filtrer des mots-clés précis. Recherchons toutes les lignes contenant authentication failure.

sudo grep "authentication failure" /var/log/auth.log

Cette commande n’affichera que les lignes correspondant au motif recherché, ce qui permet d’identifier facilement les tentatives échouées que vous venez de générer.

Créons maintenant un simple script shell pour automatiser cette surveillance. Le script analysera le journal à la recherche d’échecs et affichera un récapitulatif. Dans votre répertoire ~/project, créez un fichier nommé log_monitor.sh à l’aide de nano.

nano log_monitor.sh

Saisissez le script Bash suivant dans l’éditeur. Il utilise grep avec l’option -c pour compter le nombre de tentatives de connexion échouées, puis affiche un message d’état.

#!/bin/bash

LOG_FILE="/var/log/auth.log"
FAILURE_COUNT=$(sudo grep -c "authentication failure" $LOG_FILE)

echo "--- Authentication Log Monitor ---"
if [ "$FAILURE_COUNT" -gt 0 ]; then
  echo "WARNING: Found $FAILURE_COUNT failed login attempts."
else
  echo "OK: No failed login attempts found."
fi
echo "--------------------------------"

Enregistrez le fichier et quittez nano en appuyant sur Ctrl+X, puis sur Y et enfin sur Enter.

Rendez ensuite votre nouveau script exécutable à l’aide de la commande chmod.

chmod +x log_monitor.sh

Enfin, exécutez le script de surveillance pour afficher le résultat.

./log_monitor.sh

Comme vous avez généré des échecs de connexion, le script les détectera et affichera un avertissement accompagné du nombre exact de tentatives.

--- Authentication Log Monitor ---
WARNING: Found 2 failed login attempts.
--------------------------------

Vous savez désormais simuler et détecter des tentatives d’authentification échouées, ainsi que créer un script simple pour les surveiller, une compétence essentielle pour maintenir la sécurité d’un système.

Résumé

Dans ce laboratoire, vous avez appris à renforcer la sécurité d’un système Linux en configurant une politique locale robuste pour les mots de passe. Vous avez modifié le fichier /etc/security/pwquality.conf afin d’imposer des règles de complexité à l’aide du module pam_pwquality. Cela comprenait la définition d’une longueur minimale et l’obligation d’utiliser au moins un chiffre, une lettre majuscule et une lettre minuscule, afin de mieux protéger le système contre les identifiants faciles à deviner.

Vous avez également étudié comment appliquer ces exigences renforcées lors de la création de nouveaux comptes utilisateurs. Enfin, le laboratoire vous a appris à surveiller les journaux d’authentification du système pour détecter et analyser des événements de sécurité, notamment des tentatives de connexion échouées à répétition, qui peuvent révéler une attaque potentielle.