# Recommandation de niveau minimal Avant de mettre en place ces mesures, nous avons préalablement élaboré un script sur la machine pour évaluer notre score sans apporter aucune modification. ![image](https://hackmd.io/_uploads/rynrsnar6.png) Nous avons ainsi décidé de créer un script comprenant toutes les mesures désactivées figurant dans le rapport Lynis. ## Contenu du script bash : ```bash= #!/bin/bash # Dupliquer le fichier de configuration common-password sudo cp /etc/pam.d/common-password /etc/pam.d/common-password.save # Installer la dépendance nécessaire sudo apt install libpam-pwquality -y # Configurer les paramètres du mot de passe dans /etc/login.defs sudo sed -i 's/PASS_MAX_DAYS.*/PASS_MAX_DAYS 60/' /etc/login.defs sudo sed -i 's/PASS_MIN_DAYS.*/PASS_MIN_DAYS 1/' /etc/login.defs sudo sed -i 's/PASS_WARN_AGE.*/PASS_WARN_AGE 7/' /etc/login.defs # Configurer /etc/pam.d/common-password sudo sed -i 's/password[[:space:]]*requisite[[:space:]]*pam_unix.so.*/password requisite pam_unix.so obscure use_authtok try_first_pass sha512 remember=5/' /etc/pam.d/common-password # Configurer /etc/security/pwquality.conf sudo sed -i 's/# minlen.*/minlen = 8/' /etc/security/pwquality.conf #passe la taille minimum du mot de passe a 8 sudo sed -i 's/# minclass.*/minclass = 3/' /etc/security/pwquality.conf #permets de demander 3 caracteres speciaux dans le mot de passe # Activer le sticky bit sur le répertoire /tmp sudo chmod +t /tmp # Désactiver les bits setuid et setgid sur les fichiers sudo find / -type f -perm /4000 -exec chmod u-s {} + sudo find / -type f -perm /2000 -exec chmod g-s {} + # Protéger les mots de passe stockés sudo sed -i 's/password[[:space:]]*required[[:space:]]*pam_unix.so.*/password required pam_unix.so obscure sha512 rounds=65536/' /etc/pam.d/common-password sudo sed -i 's/^[[:space:]]*auth[[:space:]]*required[[:space:]]*pam_listfiles.so.*/auth required pam_listfiles.so onerr=succeed item=user sense=deny file=\/etc\/ssh\/deniedusers/' /etc/pam.d/sshd # Mettre à jour et patcher régulièrement (automatisable en taches recurente) sudo apt update && sudo apt upgrade -y # Redémarrer le service PAM pour appliquer les modifications sudo systemctl restart ssh # Activer le pare-feu (UFW) sudo apt install ufw -y sudo ufw default deny incoming # Définir la politique par défaut pour les connexions entrantes comme refusée sudo ufw default allow outgoing # Définir la politique par défaut pour les connexions sortantes comme autorisée sudo ufw enable # Activer le pare-feu UFW # Installer l'outil d'audit de paquets (debsecan) sudo apt install debsecan -y # Configurer les paramètres du mot de passe sudo sed -i 's/PASS_MAX_DAYS.*/PASS_MAX_DAYS 30/' /etc/login.defs # Limiter la durée maximale du mot de passe à 30 jours sudo sed -i 's/PASS_MIN_DAYS.*/PASS_MIN_DAYS 30/' /etc/login.defs # Définir la durée minimale avant changement de mot de passe à 30 jours sudo sed -i 's/PASS_MIN_LEN.*/PASS_MIN_LEN 8/' /etc/login.defs # Définir la longueur minimale du mot de passe à 8 caractères # Installer PAM Cracklib sudo apt install libpam-cracklib -y echo "password requisite pam_pwquality.so retry=3" | sudo tee -a /etc/pam.d/common-password # Configurer le module PAM pour la qualité du mot de passe # Installer un outil d'intégrité des fichiers (AIDE) sudo apt install aide -y # Activer le logging des échecs de connexion et installer fail2ban sudo apt install fail2ban -y sudo systemctl enable fail2ban # Activer fail2ban au démarrage sudo systemctl start fail2ban # Démarrer le service fail2ban # Mettre à jour Lynis sudo apt install lynis -y # Copier le fichier resolv.conf vers resolv.conf.backup comme sauvegarde. sudo cp /etc/resolv.conf /etc/resolv.conf.backup # Ajouter le DNS 1.1.1.1 dans le fichier resolv.conf echo "nameserver 1.1.1.1" | sudo tee /etc/resolv.conf # Installer debsums pour la vérification des paquets sudo apt install debsums -y # Installer apt-show-versions pour la gestion des correctifs sudo apt install apt-show-versions -y # Configurer SSH (à configurer manuellement) # (Port, AllowAgentForwarding, AllowTcpForwarding, ClientAliveCountMax, Compression, LogLevel, MaxAuthTries, MaxSessions, TCPKeepAlive, X11Forwarding) # Voici une configuration recommandée : sudo sed -i 's/#Port 22/Port 2222/' /etc/ssh/sshd_config # Changer le port SSH par défaut sudo sed -i 's/PermitRootLogin yes/PermitRootLogin no/' /etc/ssh/sshd_config # Désactiver la connexion directe en tant que root sudo sed -i 's/AllowAgentForwarding yes/AllowAgentForwarding no/' /etc/ssh/sshd_config # Désactiver la transmission d'agent SSH sudo sed -i 's/AllowTcpForwarding yes/AllowTcpForwarding no/' /etc/ssh/sshd_config # Désactiver la redirection de port TCP sudo sed -i 's/ClientAliveCountMax 3/ClientAliveCountMax 2/' /etc/ssh/sshd_config # Limiter le nombre d'essais avant la déconnexion sudo sed -i 's/Compression yes/Compression no/' /etc/ssh/sshd_config # Désactiver la compression SSH sudo sed -i 's/LogLevel INFO/LogLevel VERBOSE/' /etc/ssh/sshd_config # Augmenter le niveau de journalisation sudo sed -i 's/MaxAuthTries 6/MaxAuthTries 3/' /etc/ssh/sshd_config # Limiter le nombre d'essais d'authentification sudo sed -i 's/MaxSessions 10/MaxSessions 2/' /etc/ssh/sshd_config # Limiter le nombre de sessions simultanées sudo sed -i 's/#TCPKeepAlive yes/TCPKeepAlive no/' /etc/ssh/sshd_config # Désactiver les sondages TCP KeepAlive sudo sed -i 's/X11Forwarding yes/X11Forwarding no/' /etc/ssh/sshd_config # Désactiver le transfert X11 echo "Les mesures et recommandations de sécurité ont été appliquées avec succès." ``` Ensuite, nous avons procédé à l'exécution d'un scan Lynis pour observer d'éventuelles différences entre les deux états. ![image](https://hackmd.io/_uploads/SJTBza6Sp.png) ## Application des règles minimales manuellement : L'ensemble des comptes Debian disponible sur une Debian 12 de base : ![image](https://hackmd.io/_uploads/ByAtPPXEp.png) Ici, il y a que 2 comptes utilisateurs, root et thompson qui lui n'est pas root, aucun autre compte inactif (etc/passwd) On peut desativer un ou plusieurs compte avec cette commande : usermod -L -e 1 <USER> ## Utiliser des mots de passe robustes Nous allons creer un sorte de policies pour les mots de passe. On va dupliquer notre fichier de conf : sudo cp /etc/pam.d/common-password /etc/pam.d/common-password.save On installe une dependance necessaire : apt install libpam-pwquality On configure le fichier de conf pour ajouter nos policies : /etc/login.defs # line 160: set 60 for Password Expiration PASS_MAX_DAYS 60 # line 161: set 1 for Minimum number of days available PASS_MIN_DAYS 1 # line 162: set 7 for number of days for warnings PASS_WARN_AGE 7 On configure le fichier de conf pour appliquer la policies : /etc/pam.d/common-password #line 26: prohibit to use the same password for 5 generation in past password [success=1 default=ignore] pam_unix.so obscure use_authtok try_first_pass sha512 remember=5 On configure la taille minimum des mots de passe : /etc/security/pwquality.conf # line 11: uncomment and set minimum password length minlen = 8 root@dlp:~# vi /etc/security/pwquality.conf #line 34: uncomment and set minimum number of required classes of characters (3 for UpperCase / LowerCase / Digits) minclass = 3 On peut effectuer un redémarrage si les paramètres ne sont pas pris en compte, puis créer un nouveau compte utilisateur afin de vérifier si les politiques de mots de passe sont bien appliquées. adduser test_account Une autre option possible est d'effectuer les actions suivantes : Pour bloquer un compte pendant 5 minutes après 3 tentatives de mot de passe échouées, on peut effectuer les étapes suivantes : 1. Ouvrir le fichier de configuration "login" en utilisant la commande : ``` sudo nano /etc/pam.d/login ``` 2. Ajouter les lignes suivantes au fichier : ![image](https://hackmd.io/_uploads/Bk3BKq2Ea.png) - La ligne commence par le mot-clé "auth" qui indique qu'il s'agit d'une règle d'authentification. - "required" spécifie que cette règle est obligatoire pour que l'authentification réussisse. - "pam_tally.so" est le module PAM utilisé pour gérer le comptage des tentatives de connexion. - "deny=3" indique que le compte sera bloqué après 3 échecs de mot de passe. - "lock_time=300" définit la durée de blocage du compte en secondes (ici, 300 secondes soit 5 minutes). 3. Répéter les mêmes étapes pour le fichier de configuration "/etc/pam.d/sshd" : 4. Redémarrer le service PAM pour appliquer les modifications. Pour modifier les règles de complexité des mots de passe, on peut suivre ces étapes : 1. Ouvrir le fichier de configuration "/etc/pam.d/passwd" en utilisant la commande : sudo vim /etc/pam.d/passwd 2. Ajouter les lignes suivantes au fichier : ```bash= password required pam_cracklib.so minlen=12 minclass=3 \ dcredit=0 ucredit=0 lcredit=0 \ ocredit=0 maxrepeat=1 \ maxsequence=1 gecoscheck \ reject_username enforce_for_root ``` - "password" indique qu'il s'agit d'une règle appliquée lors du changement de mot de passe. - "required" spécifie que cette règle est obligatoire pour que le changement de mot de passe réussisse. - "pam_cracklib.so" est le module PAM utilisé pour vérifier la complexité du mot de passe. Les différentes options spécifiées après "pam_cracklib.so" sont utilisées pour définir les exigences de complexité du mot de passe, telles que : - "minlen=12" spécifie que la longueur minimale du mot de passe doit être de 12 caractères. - "minclass=3" indique qu'au moins 3 classes de caractères différentes (lettres minuscules, lettres majuscules, chiffres, symboles) doivent être présentes. - "dcredit=0", "ucredit=0", "lcredit=0", "ocredit=0" spécifient les exigences pour les classes de caractères spécifiques (d: chiffres, u: lettres en majuscules, l: lettres en minuscules, o: autres caractères). - "maxrepeat=1" limite le nombre maximum de caractères répétés consécutivement à 1. - "maxsequence=1" limite le nombre maximum de caractères consécutifs dans une séquence (par exemple, abcdef) à 1. - "gecoscheck" vérifie que le mot de passe ne contient pas le nom réel de l'utilisateur. - "reject_username" refuse les mots de passe qui sont identiques au nom d'utilisateur. - "enforce_for_root" applique également ces règles pour le compte root. Ces modifications permettront de renforcer les règles de complexité des mots de passe. ## Éviter les fichiers ou répertoires sans utilisateur ou sans groupe connu Pour appliquer cette mesure nous avons cette commande : sudo find / -nouser -o -nogroup -exec chown root:root {} + Elle cherche les fichiers et répertoires dans le système de fichiers qui n'ont pas d'utilisateur ou de groupe associé, puis les change pour les attribuer à l'utilisateur et au groupe root. ## Activer le sticky bit sur les répertoires inscriptibles Lorsque le "sticky bit" est activé sur un répertoire, les utilisateurs sont autorisés à créer, modifier ou supprimer des fichiers dans ce répertoire, mais ils ne sont autorisés à supprimer que les fichiers qu'ils ont créés. Les utilisateurs ne peuvent pas supprimer les fichiers d'autres utilisateurs, même s'ils ont les permissions de modification sur le répertoire. Ici je vais l'activer sur le dossier /tmp : Droits avant modification : ![image](https://hackmd.io/_uploads/SykqH5hVp.png) Droits apres modification : chmod +t /tmp ![image](https://hackmd.io/_uploads/rkQsB93Ea.png) On voit bien le t apparaitre a la fin. ## Éviter l’usage d’exécutables avec les droits spéciaux setuid et setgid # Trouver tous les fichiers setuid find / -type f -perm /4000 -exec chmod u-s {} + # Trouver tous les fichiers setgid find / -type f -perm /2000 -exec chmod g-s {} + Ces commandes aident à désactiver les bits setuid et setgid sur les fichiers, réduisant ainsi le risque associé à l'exécution d'exécutables avec des privilèges élevés. ## N’installer que les paquets strictement nécessaires Nous les avons selectionner lors de l'installation de notre Debian, nous avons installer OpenSSH Server et Gnome. L'environnement de bureau ici n'est pas actif. ![image](https://hackmd.io/_uploads/r1_7lOQST.png) ## Utiliser des dépôts de paquets de confiance Le fichier de cofiguration qui contient les depot est dans : /etc/apt/souces/list ![image](https://hackmd.io/_uploads/r1Z875hEp.png) Ici mon ficher contient le repo par default de debian qui est de confiance On peut egalement verifier la validité des clés GPG des paquets : sudo apt-key adv --recv-keys --keyserver keyserver.ubuntu.com <ID_CLÉ> #<ID_CLÉ> par l'ID de la clé GPG que vous souhaitez vérifier ## Effectuer des mises à jour régulières Le but du paquet **unattended-upgrades** est de garder l'environnement Debian à jour avec les dernières mises à jour de sécurité (et autres) automatiquement. ``` apt-get install unattended-upgrades ``` Nous pouvons creer un script très simple pour automatiser les mises à jour de paquets et les nettoyages de ceux obsolètes. ![image](https://hackmd.io/_uploads/B1xyb_7HT.png) Depuis Debian 9 (Stretch) les deux paquets unattended-upgrades et apt-listchanges sont installés par défaut ## Désactiver les services non nécessaires Le but de désactiver les services non nécessaires sur un système d'exploitation Debian est de réduire la surface d'attaque en minimisant les vulnérabilités potentielles. Cette mesure contribue à améliorer la sécurité globale du système en éliminant les points d'entrée inutiles pour les attaquants. La liste des services actifs sur l'OS par défaut : ![Service activé par défaut](https://hackmd.io/_uploads/ry5e3dn4T.png) Pour désactiver un service, on peut effectuer les étapes suivante : 1. Identifier les services en cours d'exécution * Utiliser la commande `systemctl list-units --type=service` pour lister tous les services actifs. * Examiner chaque service pour déterminer s'il est essentiel pour les fonctions critiques du système. 2. Désactiver les services non nécessaires : * Utiliser la commande `systemctl stop [nom_du_service]` pour arrêter un service en cours d'exécution. * Pour empêcher le service de démarrer au lancement du système, utiliser `systemctl disable [nom_du_service]`. ## Protéger les mots de passe stockés Chaque mot de passe doit être sécurisé en utilisant des mécanismes cryptographiques pour éviter de les exposer en clair à des attaquants qui pourraient récupérer leur base de données. Pour protéger les mots de passe stockés, on peut effectuer les étapes suivantes : 1. Ouvrir le fichier de configuration "/etc/pam.d/common-password" en utilisant la commande : ``` sudo nano /etc/pam.d/common-password ``` 2. Modifier la ligne suivante dans le fichier : ![1](https://hackmd.io/_uploads/HkYlJcnE6.png) Cette ligne indique l'utilisation du module "pam_unix.so" pour la gestion des mots de passe. - L'option "obscure" active les exigences de complexité des mots de passe. - "sha512" spécifie l'algorithme de hachage utilisé pour stocker les mots de passe. - "rounds=65536" définit le nombre de tours de calcul de hachage pour renforcer la sécurité. 3. Ensuite, modifier le fichier "/etc/login.defs" à la ligne 278 : ![2](https://hackmd.io/_uploads/H13Elc2Na.png) De plus, pour restreindre l'accès SSH à certains utilisateurs, on peut suivre ces étapes : 1. Ouvrir le fichier de configuration "/etc/pam.d/sshd" : ``` sudo nano /etc/pam.d/sshd ``` 2. Ajoutez la ligne suivante dans le fichier : auth required pam_listfiles.so onerr=succeed item=user sense=deny file=/etc/ssh/deniedusers Cette ligne utilise le module "pam_listfiles.so" pour vérifier si l'utilisateur est présent dans le fichier "/etc/ssh/deniedusers". Si l'utilisateur se trouve dans ce fichier, l'authentification sera refusée. 3. Créer ou éditer le fichier "/etc/ssh/deniedusers" ``` sudo nano /etc/ssh/deniedusers ``` 4. Ajouter les noms d'utilisateurs que l’on souhaite interdire d'accès SSH, par exemple, pour interdire l'accès à "root", on ajoute simplement "root" sur une ligne du fichier. 5. S’assurer que les permissions du fichier "/etc/ssh/deniedusers" sont correctement définies en utilisant la commande suivante : ``` sudo chmod 600 /etc/ssh/deniedusers ``` Ces mesures renforcent la sécurité des mots de passe stockés et permettent de restreindre l'accès SSH à certains utilisateurs spécifiques ## Réduire la surface d’attaque des services réseau Le but de la mesure consistant à réduire la surface d’attaque des services réseau est de renforcer la sécurité du système en minimisant les risques d'exploitation. Cette stratégie implique la fermeture des ports inutilisés, la désactivation des protocoles non sécurisés, et la limitation de l'accès aux services réseau indispensables. En réduisant le nombre de points vulnérables et en contrôlant strictement l'accès, cette mesure diminue la probabilité d'attaques réussies et facilite la surveillance et la réponse rapide aux incidents de sécurité. Pour réduire la surface d'attauqe des services réseau, on peut faire les actions suivante : 1. Audit des services réseau en cours d'exécution : * Utiliser des outils comme netstat ou `ss` pour identifier les services réseau actifs et les ports ouverts. * Examiner chaque service pour déterminer s'il est nécessaire et sécurisé. Pour notre cas nous avons utiliser la commande `ss -tu` pour lister les ports TCP / UDP ouvert sur la machine : ![Liste des ports en ecoute](https://hackmd.io/_uploads/B1Ji8FhV6.png) 2. Fermer les ports non nécessaires : * Utiliser un pare-feu comme ufw (Uncomplicated Firewall) sous Debian pour bloquer les ports inutilisés. * Configurer les règles du pare-feu pour autoriser uniquement le trafic nécessaire. Pour réaliser cette étape, il faut installer le paquet ufw et mettre en place les règles suivante pour autoriser uniquement les ports nécéssaire, dans notre cas le port SSH(22) : 1. Désactiver toutes les communications entrantes ![image](https://hackmd.io/_uploads/rJvoOK3Np.png) 2. Activer toutes les communications sortantes ![image](https://hackmd.io/_uploads/SJ-put2E6.png) 3. Autoriser le port SSH ![image](https://hackmd.io/_uploads/r1ORdYhVp.png) 4. Activer le firewall : ![image](https://hackmd.io/_uploads/SydeKK3E6.png) Liste des règles firewall locale mise en place : ![image](https://hackmd.io/_uploads/ByivdKnET.png) En résumé, avec la mise en place du pare-feu local, nous avons désactiver toutes les communications pouvant exister vers l'extérieur sauf pour le port SSH(22). 3. Désactiver les protocoles non sécurisés : * Désactiver les protocoles obsolètes ou non sécurisés (comme Telnet, FTP sans SSL/TLS) au profit de versions plus sécurisées (comme SSH, SFTP). Dans un premier temps, il faut identifier les Protocoles Non Sécurisés à l'aide de la commande `netstat -tuln` pour identifier les ports ouvert sur l'OS. ![Liste des ports ouvert](https://hackmd.io/_uploads/HJU4Kv4H6.png) Une fois les services non sécurisé identifié, nous pouvons les désactiver avec les commandes suivante `systemctl stop [nom_du_service]`et `systemctl disable [nom_du_service]`ou configurer les versions sécurisé des services. Par exemple : * Remplacez FTP par SFTP ou FTPS. * Remplacez Telnet par SSH. * Remplacez HTTP par HTTPS (en utilisant SSL/TLS). * Pour le courrier électronique, utilisez des protocoles sécurisés comme IMAPS ou POPS et SMTPS pour l'envoi. 5. Mettre à jour et patcher régulièrement : * S'assurer que tous les services réseau sont régulièrement mis à jour pour inclure les derniers correctifs de sécurité à l'aide des commandes `apt update` et `apt upgrade`. 6. Surveillance et journaux : * Mettre en place une surveillance active des services réseau et conserver des journaux détaillés pour détecter et répondre rapidement à toute activité suspecte. Pour mettre en place une journalisation sur Debian, il faut installé le paquet rsyslog et le configurer afin qu'il puisse journalisé les événements de notre choix ```shell= $ sudo apt-get update $ sudo apt-get install rsyslog ``` La configuration du système de journalisation : Par défaut rsyslog logs tous les évenements auth,authpriv,cron, user, mail, kern visualisable depuis le dossier `/var/log`. Afin de renforcer la surveillance, nous pouvons créer une configuration personnalisé pour logger les connexions et les activités SSH. Le fichier de configuration doit être créer dans le dossier `/etc/rsyslog.d/ssh-logging.conf` : ```bash= if $programname == 'sshd' and $syslogfacility-text == 'auth' then /var/log/ssh-activities.log ``` Ce programme va donc enregistrer tous les éléments du programme sshd dans le fichier ssh-activities présent dans le dossier `/var/log` Il faut ensuite créer le fichier qui va accuellir les logs : ```shell= touch /var/log/ssh-activities.log chmod 600 /var/log/ssh-activities.log ``` Et redémarrer le service `rsyslog ` ```shell= sudo systemctl restart rsyslog ``` # Rapport Lynis après la mise en place des mesures : À la suite de la mise en place des mesures du niveau minimal, nous pouvons voir le score lysis a bien augmenté. ##### Scan Lynis avant l'application desmesures : ![image](https://hackmd.io/_uploads/Bkiv76pH6.png) ##### Scan Lynis apres l'application des mesures : ![image](https://hackmd.io/_uploads/ByvR926H6.png)