Durcissement Sécuritaire d'un Système CentOS 7

Durcissement Sécuritaire d'un Système CentOS 7

Ce guide fournit une série de configurations essentielles pour renforcer la sécurité d'un serveur CentOS 7. Il couvre les aspects cruciaux tels que la gestion des comptes utilisateurs, les politiques de mots de passe, le contrôle d'accès réseau, la sécuristaion des services système et l'audit des journaux d'activité.

  1. Vérifications Préliminaires du Système

Avant de procéder à toute modification de sécurité, il est judicieux de confirmer la version et les informations du système d'exploitation en cours d'exécution :


# cat /proc/version
# cat /etc/centos-release
   
  1. Sécurité des Comptes Utilisateurs et des Mots de Passe

2.1 Identification des Comptes Vulnérables

Comptes avec Mots de Passe Vides

Un compte sans mot de passe représente une faille de sécurité majeure. Identifiez ces comptes pour y remédier immédiatement :


# awk -F: '($2 == ""){print $1}' /etc/shadow
   

Comptes Possédant les Privilèges Root

Vérifiez quels comptes utilisateurs, en dehors de l'utilisateur root standard, ont un identifiant utilisateur (UID) de 0, leur conférant des privilèges administratifs complets :


# awk -F: '($3==0){print $1}' /etc/passwd
   

2.2 Application des Politiques de Mots de Passe

Configuration de la Durée de Vie des Mots de Passe

Définissez des politiques de durée de vie et de longueur minimale pour les mots de passe globaux dans le fichier /etc/login.defs. Adaptez ces valeurs aux exigences de sécurité de votre organisation :


# vi /etc/login.defs
PASS_MAX_DAYS   90      # Durée de validité maximale d'un mot de passe en jours (ex: 90 jours)
PASS_MIN_LEN    8       # Longueur minimale requise pour un nouveau mot de passe (>= 8 caractères)
   

Pour une gestion plus granulaire, vous pouvez forcer un utilisateur à changer son mot de passe après un certain délai ou à sa prochaine connexion :


# chage -M 30 monutilisateur    # Force monutilisateur à changer son mot de passe après 30 jours
# chage -d 0 monautreutilisateur # Force monautreutilisateur à changer son mot de passe à sa prochaine connexion
   

Exigences de Complexité des Mots de Passe via PAM

Le module PAM pam_pwquality.so permet d'imposer des règles de complexité. Modifiez le fichier de configuration PAM principal, généralement /etc/pam.d/system-auth ou /etc/pam.d/password-auth :


# vi /etc/pam.d/system-auth
# Repérez la ligne concernant 'password requisite pam_pwquality.so' et ajustez-la :
password    requisite     pam_pwquality.so try_first_pass local_users_only \
   authtok_type=           retry=3     minlen=10   dcredit=-1  ucredit=-1  lcredit=-1  ocredit=-1 \
   enforce_for_root
   

Explication des paramètres clés :

  • minlen=10 : La longueur minimale du mot de passe doit être de 10 caractères.
  • dcredit=-1 : Exige la présence d'au moins un chiffre.
  • ucredit=-1 : Exige la présence d'au moins une lettre majuscule.
  • lcredit=-1 : Exige la présence d'au moins une lettre minuscule.
  • ocredit=-1 : Exige la présence d'au moins un caractère spécial.
  • enforce_for_root : Applique ces règles de complexité même si le compte root définit le mot de passe d'un autre utilisateur.

2.3 Verrouillage des Comptes après Tentatives de Connexion Échouées

Pour se protéger contre les attaques par force brute, configurez le verrouillage temporaire des comptes. Pour les connexions SSH, modifiez le fichier /etc/pam.d/sshd :


# vi /etc/pam.d/sshd
# Insérez la ligne suivante au début de la section 'auth', après les commentaires :
auth        required      pam_tally2.so deny=3 unlock_time=300 even_deny_root root_unlock_time=60
   

Détails de la configuration :

  • deny=3 : Verrouille le compte après 3 échecs de connexion consécutifs.
  • unlock_time=300 : Déverrouille automatiquement les comptes utilisateurs standards après 300 secondes (5 minutes).
  • even_deny_root : Applique cette politique de verrouillage même à l'utilisateur root.
  • root_unlock_time=60 : Déverrouille le compte root après 60 secondes.

Pour administrer les verrous manuellement :


# pam_tally2 --user nom_utilisateur      # Affiche le statut de verrouillage d'un utilisateur
# pam_tally2 -r -u nom_utilisateur      # Réinitialise le compteur d'échecs et déverrouille un utilisateur
   

2.4 Gestion des Comptes Inactifs ou Indésirables

Il est impératif de désactiver ou de supprimer les comptes utilisateurs qui ne sont plus nécessaires ou qui sont inactifs.

Désactivation et Réactivation d'un Compte


# usermod -L utilisateur_test   # Désactive le compte en verrouillant son mot de passe
# usermod -U utilisateur_test   # Réactive le compte en déverrouillant son mot de passe
   

Suppression d'un Compte


# userdel utilisateur_test      # Supprime uniquement le compte utilisateur
# userdel -r utilisateur_test   # Supprime le compte utilisateur et son répertoire personnel (/home/utilisateur_test)
   

2.5 Restriction de la Réutilisation des Mots de Passe

Pour empêcher les utilisateurs de réutiliser un ancien mot de passe, modifiez /etc/pam.d/system-auth ou /etc/pam.d/password-auth et ajoutez l'option remember :


# vi /etc/pam.d/system-auth
# Dans la ligne 'password    sufficient    pam_unix.so ...', ajoutez 'remember=N' :
password    sufficient    pam_unix.so sha512 shadow nullok try_first_pass use_authtok remember=5
   

L'option remember=5 signifie que le système empêchera l'utilisateur de réutiliser l'un de ses 5 derniers mots de passe. Cette politique s'applique lors du changement de mot de passe par l'utilisateur.

  1. Contrôle d'Accès Réseau

3.1 Désactivation des Services Non Sécurisés

Les services utilisant des protocoles non chiffrés, comme Telnet, doivent être désactivés. Vérifiez leur état et désactivez-les :


# netstat -an | grep ":23"    # Vérifie si le service Telnet est actif sur le port 23
# systemctl disable telnet    # Empêche le démarrage du service Telnet au boot
# systemctl stop telnet       # Arrête immédiatement le service Telnet s'il est en cours d'exécution
   

3.2 Restriction d'Accès aux Services via TCP Wrappers

Les fichiers /etc/hosts.allow et /etc/hosts.deny permettent de contrôler l'accès aux services réseau au niveau du système, basés sur l'adresse IP source. Les règles dans hosts.allow ont priorité sur celles de hosts.deny.

Exemple de configuration dans /etc/hosts.allow :


sshd: 192.168.1.0/255.255.255.0 : ALLOW   # Autorise les connexions SSH depuis le réseau 192.168.1.0/24
ALL: 10.0.0.1 : ALLOW                   # Autorise tous les services depuis l'adresse IP 10.0.0.1
   

Exemple de configuration dans /etc/hosts.deny :


sshd: ALL : DENY                        # Bloque toutes les autres connexions SSH
ALL: 172.16.82.0/24 : DENY              # Bloque l'accès à tous les services depuis le réseau 172.16.82.0/24
   

Il est recommandé de définir des règles permissives dans hosts.allow pour les sources de confiance, puis une règle générique de refus dans hosts.deny pour bloquer tout le reste.

3.3 Déconnexion Automatique des Sessions Inactives

Pour empêcher l'accès non autorisé à des sessions laissées ouvertes, configurez une déconnexion automatique après une période d'inactivité. Ajoutez la ligne suivante au fichier /etc/profile :


# vi /etc/profile
export TMOUT=300    # Déconnecte la session shell après 300 secondes (5 minutes) d'inactivité
   

Pour appliquer cette modification immédiatement à la session en cours, exécutez source /etc/profile, ou reconnectez-vous.

  1. Gestion des Privilèges

4.1 Octroi de Privilèges Sudo

L'utilisation de sudo pour accorder des privilèges d'administrateur de manière granulaire est une pratique de sécurité essentielle. Utilisez la commande visudo pour éditer le fichier /etc/sudoers, ce qui assure une validation syntaxique :


# visudo
# Exemple d'octroi de droits sudo spécifiques à un utilisateur 'adminops' :
adminops ALL=(root) /usr/sbin/systemctl restart httpd, /usr/bin/tail -f /var/log/secure
   

Cette configuration permet à l'utilisateur adminops d'exécuter les commandes systemctl restart httpd et tail -f /var/log/secure en tant que root, sans avoir accès à toutes les commandes root.

Pour vérifier les privilèges sudo d'un compte utilisateur :


$ sudo -l
   

4.2 Interdiction de la Connexion Root Directe via SSH

Il est fortement conseillé de désactiver la connexion directe de l'utilisateur root via SSH. Connectez-vous avec un utilisateur standard, puis utilisez sudo pour les tâches administratives. Modifiez le fichier de configuration SSH :


# vi /etc/ssh/sshd_config
# Recherchez et modifiez la ligne suivante :
PermitRootLogin no
   

Après la modification, redémarrez le service SSH pour appliquer les changements : systemctl restart sshd.

  1. Audit et Journalisation

5.1 Activation du Service de Journalisation (rsyslog)

Assurez-vous que le service rsyslog, responsable de la collecte et du stockage des messages de journalisation du système, est actif et configuré pour démarrer au démarrage :


# systemctl enable rsyslog    # Active le service pour le démarrage automatique
# systemctl start rsyslog     # Démarre le service rsyslog immédiatement
   

Les journaux sont généralement stockés dans le répertoire /var/log/.

5.2 Activation et Utilisation du Service d'Audit (auditd)

Le système d'audit Linux (auditd) offre un enregistrement détaillé des événements liés à la sécurité. Activez-le pour une surveillance approfondie :


# systemctl enable auditd     # Active le service auditd pour le démarrage automatique
# systemctl start auditd      # Démarre le service auditd immédiatement
   

Les journaux d'audit sont conservés dans /var/log/audit/audit.log.

Exemple de recherche dans les journaux d'audit (par exemple, les connexions utilisateurs) :


# ausearch -m USER_LOGIN --interpret
   

5.3 Examen des Services au Démarrage

Passez en revue la liste des services configurés pour démarrer automatiquement afin d'identifier et de désactiver ceux qui sont inutiles, réduisant ainsi la surface d'attaque :


# systemctl list-unit-files --type=service | grep enabled
   

Pour désactiver un service inutile : systemctl disable nom_du_service (par exemple, systemctl disable bluetooth).

5.4 Configuration de la Rotation des Journaux (logrotate)

La rotation des journaux est cruciale pour gérer l'espace disque et protéger l'intégrité des informations. Configurez logrotate via /etc/logrotate.conf et les fichiers de configuration spécifiques aux applications dans /etc/logrotate.d/.


# vi /etc/logrotate.conf
# Exemple de configuration globale :
weekly                     # Rotation des journaux chaque semaine
rotate 4                   # Conserver les 4 dernières versions archivées
create                     # Créer un nouveau fichier journal vide après la rotation
dateext                    # Ajouter la date à l'extension du fichier journal archivé
# compress                 # Décommenter pour compresser les anciens journaux archivés
include /etc/logrotate.d   # Inclut les configurations spécifiques définies dans ce répertoire
   

Exemple de configuration spécifique pour /var/log/wtmp et /var/log/btmp :


/var/log/wtmp {
   monthly             # Rotation mensuelle (prioritaire sur la configuration globale)
   minsize 1M          # Rotation uniquement si la taille du fichier dépasse 1 Mo
   create 0664 root utmp # Définition des permissions, propriétaire et groupe pour le nouveau fichier
   rotate 1            # Conserver une seule ancienne copie archivée
}
/var/log/btmp {
   missingok           # Ne pas signaler d'erreur si le fichier journal est manquant
   monthly
   create 0600 root utmp
   rotate 1
}
   

5.5 Limitation de l'Historique des Commandes Bash

Limitez le nombre de commandes conservées dans l'historique Bash pour minimiser le risque de divulgation d'informations sensibles. Modifiez le fichier /etc/profile :


# vi /etc/profile
HISTSIZE=10     # Limite le nombre de commandes en mémoire à 10
HISTFILESIZE=10 # Limite la taille du fichier d'historique à 10 lignes
   

Pour que ces modifications prennent effet, les utilisateurs doivent se déconnecter et se reconnecter, ou exécuter source /etc/profile.

Étiquettes: CentOS Linux Sécurité Hardening PAM

Publié le 30 juillet à 14h49