Aller au contenu principal

Hardening Linux - Bonnes pratiques

Ce guide présente les meilleures pratiques pour sécuriser un serveur Linux.

1. Gestion des utilisateurs

Créer un utilisateur non-root

# Créer un utilisateur
adduser admin

# Lui donner les droits sudo
usermod -aG sudo admin

Désactiver le login root

Une fois l'utilisateur admin configuré :

sudo nano /etc/ssh/sshd_config
PermitRootLogin no
sudo systemctl restart sshd

Politique de mots de passe

Installer et configurer libpam-pwquality :

sudo apt install libpam-pwquality
sudo nano /etc/security/pwquality.conf
# Longueur minimale
minlen = 12
# Au moins 1 majuscule
ucredit = -1
# Au moins 1 minuscule
lcredit = -1
# Au moins 1 chiffre
dcredit = -1
# Au moins 1 caractère spécial
ocredit = -1
# Pas de répétition de caractères
maxrepeat = 3

Expiration des mots de passe

# Forcer le changement tous les 90 jours
sudo chage -M 90 admin

# Voir la politique d'un utilisateur
sudo chage -l admin

2. Configuration SSH sécurisée

Fichier /etc/ssh/sshd_config recommandé :

# Port non standard
Port 2222

# Protocole 2 uniquement (par défaut sur les systèmes modernes)
Protocol 2

# Désactiver le login root
PermitRootLogin no

# Authentification par clé uniquement
PubkeyAuthentication yes
PasswordAuthentication no
PermitEmptyPasswords no

# Désactiver les méthodes non utilisées
ChallengeResponseAuthentication no
KerberosAuthentication no
GSSAPIAuthentication no

# Limiter les utilisateurs autorisés
AllowUsers admin deployer

# Timeout et limites
ClientAliveInterval 300
ClientAliveCountMax 2
MaxAuthTries 3
MaxSessions 3
LoginGraceTime 60

# Désactiver les fonctionnalités inutiles
X11Forwarding no
AllowTcpForwarding no
AllowAgentForwarding no
PermitTunnel no

# Logging
LogLevel VERBOSE

# Bannière de connexion
Banner /etc/ssh/banner

Créer une bannière d'avertissement :

sudo nano /etc/ssh/banner
*******************************************************************
* ACCES RESERVE AUX PERSONNES AUTORISEES *
* Toute activite est enregistree et surveillee. *
*******************************************************************

3. Firewall UFW

Configuration de base

# Politique par défaut
sudo ufw default deny incoming
sudo ufw default allow outgoing

# SSH (votre port)
sudo ufw allow 2222/tcp

# HTTP/HTTPS (si serveur web)
sudo ufw allow 80/tcp
sudo ufw allow 443/tcp

# Activer
sudo ufw enable

Limiter les connexions (rate limiting)

# Limite SSH : 6 connexions en 30 secondes
sudo ufw limit 2222/tcp

Autoriser uniquement certaines IP

# SSH depuis une IP spécifique
sudo ufw allow from 203.0.113.50 to any port 2222

# Bloquer une IP
sudo ufw deny from 192.168.1.100

4. Mises à jour automatiques

Activer les mises à jour de sécurité automatiques

sudo apt install unattended-upgrades
sudo dpkg-reconfigure -plow unattended-upgrades

Configuration avancée

sudo nano /etc/apt/apt.conf.d/50unattended-upgrades
Unattended-Upgrade::Allowed-Origins {
"${distro_id}:${distro_codename}";
"${distro_id}:${distro_codename}-security";
"${distro_id}ESMApps:${distro_codename}-apps-security";
"${distro_id}ESM:${distro_codename}-infra-security";
};

// Redémarrer automatiquement si nécessaire
Unattended-Upgrade::Automatic-Reboot "true";
Unattended-Upgrade::Automatic-Reboot-Time "03:00";

// Notification par email
Unattended-Upgrade::Mail "admin@votredomaine.com";
Unattended-Upgrade::MailReport "on-change";

5. Sécurisation du kernel (sysctl)

sudo nano /etc/sysctl.d/99-security.conf
# Protection contre les attaques SYN flood
net.ipv4.tcp_syncookies = 1
net.ipv4.tcp_max_syn_backlog = 2048
net.ipv4.tcp_synack_retries = 2

# Désactiver les redirections ICMP
net.ipv4.conf.all.accept_redirects = 0
net.ipv4.conf.default.accept_redirects = 0
net.ipv4.conf.all.send_redirects = 0
net.ipv6.conf.all.accept_redirects = 0

# Ignorer les pings broadcast
net.ipv4.icmp_echo_ignore_broadcasts = 1

# Ignorer les réponses ICMP bogus
net.ipv4.icmp_ignore_bogus_error_responses = 1

# Activer la protection contre le spoofing
net.ipv4.conf.all.rp_filter = 1
net.ipv4.conf.default.rp_filter = 1

# Désactiver le routage IP (sauf si routeur)
net.ipv4.ip_forward = 0
net.ipv6.conf.all.forwarding = 0

# Logger les paquets suspects
net.ipv4.conf.all.log_martians = 1

# Protection contre les buffer overflows
kernel.randomize_va_space = 2

# Restreindre l'accès aux logs kernel
kernel.dmesg_restrict = 1

# Restreindre ptrace (debug)
kernel.yama.ptrace_scope = 1

Appliquer :

sudo sysctl -p /etc/sysctl.d/99-security.conf

6. Permissions des fichiers

Fichiers sensibles

# Permissions restrictives sur /etc/shadow
sudo chmod 640 /etc/shadow

# Permissions sur les clés SSH
chmod 700 ~/.ssh
chmod 600 ~/.ssh/authorized_keys
chmod 600 ~/.ssh/id_*
chmod 644 ~/.ssh/id_*.pub

# Fichier sudoers
sudo chmod 440 /etc/sudoers

Trouver les fichiers à risque

# Fichiers SUID (s'exécutent avec les droits du propriétaire)
sudo find / -perm -4000 -type f 2>/dev/null

# Fichiers SGID
sudo find / -perm -2000 -type f 2>/dev/null

# Fichiers world-writable
sudo find / -perm -0002 -type f ! -path "/proc/*" ! -path "/sys/*" 2>/dev/null

# Fichiers sans propriétaire
sudo find / -nouser -o -nogroup 2>/dev/null

Supprimer les SUID inutiles

# Exemple : supprimer le SUID de /usr/bin/chsh si non utilisé
sudo chmod u-s /usr/bin/chsh

7. Services et ports

Désactiver les services inutiles

# Lister les services actifs
systemctl list-units --type=service --state=running

# Désactiver un service
sudo systemctl disable cups
sudo systemctl stop cups

# Services souvent inutiles sur un serveur
sudo systemctl disable bluetooth
sudo systemctl disable avahi-daemon

Vérifier les ports en écoute

sudo ss -tlnp

Seuls les ports nécessaires doivent être ouverts.

8. Logs et audit

Configurer la rotation des logs

sudo nano /etc/logrotate.d/custom
/var/log/auth.log {
weekly
rotate 12
compress
delaycompress
missingok
notifempty
}

Centraliser les logs (rsyslog)

sudo nano /etc/rsyslog.d/50-auth.conf
auth,authpriv.*    /var/log/auth.log

Installer auditd

sudo apt install auditd

# Règles d'audit pour les fichiers sensibles
sudo auditctl -w /etc/passwd -p wa -k passwd_changes
sudo auditctl -w /etc/shadow -p wa -k shadow_changes
sudo auditctl -w /etc/sudoers -p wa -k sudoers_changes

# Voir les logs d'audit
sudo ausearch -k passwd_changes

9. Outils de sécurité supplémentaires

Fail2ban

sudo apt install fail2ban
sudo systemctl enable fail2ban

Voir le guide Configuration Fail2ban avancée.

RKHunter (détection de rootkits)

sudo apt install rkhunter

# Mettre à jour la base
sudo rkhunter --update

# Scanner le système
sudo rkhunter --check

Lynis (audit de sécurité)

sudo apt install lynis

# Audit complet
sudo lynis audit system

ClamAV (antivirus)

sudo apt install clamav clamav-daemon

# Mettre à jour les signatures
sudo freshclam

# Scanner
sudo clamscan -r /home

10. Checklist finale

Système

  • Mises à jour automatiques activées
  • Services inutiles désactivés
  • Sysctl sécurisé

Accès

  • Utilisateur non-root créé
  • Login root SSH désactivé
  • Authentification par clé SSH
  • Fail2ban configuré

Réseau

  • Firewall UFW actif
  • Seuls les ports nécessaires ouverts
  • Rate limiting sur SSH

Monitoring

  • Logs configurés et en rotation
  • Auditd installé (optionnel)
  • Alertes configurées
Important

Testez toujours vos modifications sur un environnement de test avant de les appliquer en production. Gardez une session SSH ouverte lors des modifications de configuration SSH.

Conseil

Après avoir sécurisé votre serveur, utilisez Lynis pour vérifier que vous n'avez rien oublié.