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é.
- 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
- 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.
- 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.
- 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.
- 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.