Ce que nous faisons et pourquoi
- Nous ne travaillons pas sous root – nous créons un administrateur avec sudo.
- La connexion s’effectue exclusivement via une clé SSH, les mots de passe sont désactivés.
- Nous activons UFW : « Tout est fermé, sauf ce qui est nécessaire. »
- Nous installons Fail2Ban : il bloque les adresses IP lors de la sélection d’un mot de passe/d’une clé.
Utilisateurs et groupes administrateurs
Nous créons un utilisateur et l’ajoutons à sudo + au groupe SSH restrictif :
sudo adduser admin
sudo usermod -aG sudo admin
sudo groupadd -f sshusers
sudo usermod -aG sshusers admin
id admin
Clé SSH : générer et ajouter
En local (Windows/macOS/Linux) :
ssh-keygen -t ed25519 -C "key-for-admin"
Sur le serveur en tant qu’administrateur root ou existant :
sudo -u admin -H bash -lc 'mkdir -p ~/.ssh && chmod 700 ~/.ssh'
sudo -u admin -H bash -lc 'cat >> ~/.ssh/authorized_keys' # insert content *.pub, затем Ctrl+D
sudo -u admin -H bash -lc 'chmod 600 ~/.ssh/authorized_keys'
Important : seule la clé publique .pub est envoyée au serveur. La clé privée est stockée localement.
Renforcer SSH (désactiver les mots de passe et la connexion root)
Ouvrez /etc/ssh/sshd_config et indiquez les éléments suivants :
PermitRootLogin no
PasswordAuthentication no
PubkeyAuthentication yes
AllowGroups sshusers
Redémarrer SSH :
sudo systemctl restart sshd
Vérifiez que les clés fonctionnent avant de désactiver les mots de passe, sinon vous perdrez l’accès.
UFW : « fermé par défaut »
sudo ufw default deny incoming
sudo ufw default allow outgoing
sudo ufw allow OpenSSH # port 22
sudo ufw allow 80,443/tcp # if you need a website
sudo ufw enable
sudo ufw status numbered
Avez-vous besoin de ports supplémentaires (par exemple 8080) ? Ajoutez une règle explicite : sudo ufw allow 8080/tcp.
Fail2Ban : installation et démarrage automatique
sudo apt -y install fail2ban
sudo systemctl enable --now fail2ban
sudo systemctl status fail2ban --no-pager
Configuration Fail2Ban : jail.local pour sshd
Créer/modifier
/etc/fail2ban/jail.local:
[DEFAULT]
bantime = 1h
findtime = 10m
maxretry = 5
backend = systemd
bantime.increment = true
[sshd]
enabled = true
port = ssh
filter = sshd
logpath = /var/log/auth.log
action = %(action_mwl)s
Redémarrage :
sudo systemctl restart fail2ban
%(action_mwl)s envoie un e-mail (si la messagerie est configurée) + un journal et bloque également l’adresse IP.
Intégration de Fail2Ban avec UFW (alternative)
Créez un fichier
/etc/fail2ban/jail.d/ufw-sshd.local:
[sshd]
enabled = true
action = ufw
maxretry = 5
findtime = 10m
bantime = 1h
Postuler :
sudo systemctl restart fail2ban
Vérification du fonctionnement et des protocoles
sudo fail2ban-client status
sudo fail2ban-client status sshd
sudo tail -n 200 /var/log/fail2ban.log
sudo journalctl -u ssh --since "today"
sudo ufw status verbose
Pour tester le verrouillage : effectuez 5 à 6 tentatives de connexion infructueuses à partir d’un autre nœud et vérifiez l’état de sshd : l’adresse IP apparaîtra dans la liste des adresses IP bloquées.
Bonus de sécurité (facultatif)
- Modifiez le port SSH (ce n’est pas une mesure de sécurité, mais cela réduit le bruit du scanner) : port 2222 dans sshd_config + ufw allow 2222/tcp.
- Limitez l’accès SFTP (chroot) pour le groupe.
- Activez la 2FA pour SSH : libpam-google-authenticator + configuration de /etc/pam.d/sshd et sshd_config (AuthenticationMethods publickey,keyboard-interactive).
- Limitez les tentatives Sudo : passwd -l root, sudo visudo avec timestamp_timeout=5.
Liste de contrôle de sécurité
- La connexion par clé fonctionne, les mots de passe et la connexion root sont désactivés.
- UFW : refuser les connexions entrantes/autoriser les connexions sortantes, seuls les ports nécessaires sont autorisés.
- Fail2Ban protège sshd (et en option nginx/postfix/…) ; les protocoles sont vérifiés.
- Un test de blocage est effectué, les règles et les accès sont documentés.