Pourquoi un runbook formalisé change tout pour une agence
Un développeur isolé peut appliquer mentalement cinq commandes après chaque livraison. Une agence ne le peut pas : plusieurs techniciens, des dizaines de VPS clients, des nuits de garde tournantes. Quand un client signale un accès suspect six mois après la mise en production, la question n'est pas « est-ce que vous avez sécurisé le serveur ? » mais « pouvez-vous le prouver ? »
La traçabilité est devenue une exigence contractuelle et réglementaire. La directive NIS2 (transposition en droit national en cours) et le RGPD imposent aux prestataires qui traitent des données de personnes physiques de documenter les mesures de sécurité mises en œuvre. Sans runbook versionné et sans journal auditd, votre agence ne dispose d'aucune pièce opposable.
Ce guide ne redécrit pas l'installation de fail2ban ou d'UFW — les articles Protéger un VPS avec fail2ban et Pare-feu UFW sur VPS le font en détail. Il part du niveau supérieur : comment standardiser, déléguer et tracer ces gestes à l'échelle d'un portefeuille clients.
Ce que ce runbook apporte à votre agence
- Reproductibilité : chaque technicien exécute exactement les mêmes étapes, dans le même ordre, sur chaque nouveau VPS client.
- Traçabilité :
auditdenregistre qui a fait quoi, quand, sur quelle commande — preuve conservable en cas d'incident ou d'audit client. - Délégation sans risque : un junior peut livrer un serveur durci sans avoir à improviser, parce que le runbook contient les décisions à sa place.
- Défense contractuelle : une clause de sécurité dans votre contrat de maintenance n'est défendable qu'avec un journal d'exécution daté.
- Réduction de la surface d'attaque : la checklist élimine les oublis classiques — root SSH laissé ouvert, auditd non activé — qui sont les points d'entrée les plus exploités.
- Cohérence inter-clients : même base sécurisée pour tous, différences uniquement là où le cahier des charges client l'exige.
Prérequis et périmètre de la checklist
Cette checklist cible Ubuntu 24.04 LTS et Debian 12 (Bookworm), les deux distributions les plus courantes sur VPS en 2026. Les commandes ont été vérifiées sur ces systèmes ; sur AlmaLinux ou Rocky Linux, les noms de paquets et les chemins de service diffèrent.
Prérequis minimaux du VPS : 1 vCPU, 1 Go de RAM (2 Go recommandés si fail2ban et auditd tournent ensemble), 20 Go SSD. ServOrbit livre chaque VPS avec accès root SSH immédiat et console KVM incluse, ce qui permet d'appliquer ce runbook dès la première minute — sans passer par un ticket d'accès intermédiaire à l'hébergeur.
La checklist est organisée en sept blocs, dans l'ordre d'application. Elle s'arrête au périmètre système de base : la sécurisation des applications (backoffice exposé, surfaces d'attaque applicatives) est traitée séparément dans Backoffice exposé : les surfaces d'attaque oubliées sur VPS.
Bloc 1 — Mises à jour et inventaire initial
Mise à jour du système et inventaire
La première action après connexion root est d'amener le système à son niveau de correctifs courant.
apt update && apt upgrade -y
apt install -y auditd audispd-plugins curl gnupg2 ufw fail2banNotez dans votre runbook : la date, la version du noyau (uname -r), et la liste des paquets installés (dpkg -l > /root/inventory-$(date +%F).txt). Ce fichier d'inventaire constitue la baseline du serveur à la livraison — c'est la pièce que vous produirez si un client conteste l'état initial de sa machine.
Référence CIS Benchmark : contrôle CIS 1.1 (Ubuntu Linux 24.04 LTS Benchmark, section « Initial Setup »).
Activer les mises à jour automatiques de sécurité
apt install -y unattended-upgrades
dpkg-reconfigure --priority=low unattended-upgradesVérifiez que la ligne Unattended-Upgrade::Allowed-Origins inclut bien ${distro_id}:${distro_codename}-security. Pour un parc clients, activez les mises à jour automatiques et planifiez une revue mensuelle des mises à jour non-sécurité — elles demandent une validation humaine.
Référence CIS : contrôle CIS 1.9 (Ensure updates, patches, and additional security software are installed).
Bloc 2 — Utilisateur sudo et verrouillage root
Créer un utilisateur dédié à l'administration
Ne jamais utiliser root pour les tâches courantes. Créez un compte nominatif par technicien ou un compte de service agence :
useradd -m -s /bin/bash adminagence
usermod -aG sudo adminagence
passwd adminagenceConseil agence : utilisez un nom de compte identifiable dans les logs (jean.dupont ou agency-admin), pas un générique admin. Quand auditd trace une action, le compte exécutant est enregistré — un nom générique rend l'audit inutilisable.
Désactiver le login root par SSH
sed -i 's/^#\?PermitRootLogin.*/PermitRootLogin no/' /etc/ssh/sshd_config
grep PermitRootLogin /etc/ssh/sshd_configAttention : ne rechargez sshd qu'après avoir vérifié que votre utilisateur sudo peut se connecter et exécuter sudo su. Sinon vous vous bloquez hors du serveur.
Référence CIS : contrôle CIS 5.2.8 (Ensure SSH root login is disabled).
Bloc 3 — Authentification par clé SSH
Déployer la clé publique de l'agence
mkdir -p /home/adminagence/.ssh
chmod 700 /home/adminagence/.ssh
echo "<CLE_PUBLIQUE_AGENCE>" >> /home/adminagence/.ssh/authorized_keys
chmod 600 /home/adminagence/.ssh/authorized_keys
chown -R adminagence:adminagence /home/adminagence/.sshConseil agence : maintenez un dépôt de clés publiques versionné (un fichier par technicien, rotation annuelle). Toute clé déployée sur un VPS client doit être référencée dans ce dépôt — c'est ce qui vous permet de révoquer un accès quand un collaborateur quitte l'équipe.
Désactiver l'authentification par mot de passe
Une fois la clé vérifiée (testez depuis un autre terminal avant de valider) :
sed -i 's/^#\?PasswordAuthentication.*/PasswordAuthentication no/' /etc/ssh/sshd_config
sed -i 's/^#\?ChallengeResponseAuthentication.*/ChallengeResponseAuthentication no/' /etc/ssh/sshd_config
systemctl reload sshdRéférence CIS : contrôle CIS 5.2.11 (Ensure only approved MAC algorithms are used) et CIS 5.2.19 (Ensure SSH PasswordAuthentication is disabled).
Bloc 4 — Pare-feu UFW
Configurer UFW avec une politique de refus par défaut
ufw default deny incoming
ufw default allow outgoing
ufw allow 22/tcp comment 'SSH agence'
ufw allow 80/tcp comment 'HTTP'
ufw allow 443/tcp comment 'HTTPS'
ufw --force enable
ufw status verboseN'ouvrez que les ports réellement utilisés par le projet client. Si l'application du client n'utilise pas de port email direct, ne l'ouvrez pas.
Pour l'installation de fail2ban et les options avancées d'UFW, consultez les guides dédiés : Protéger un VPS avec fail2ban et Pare-feu UFW sur VPS.
Référence CIS : contrôle CIS 3.5.1 (Ensure a firewall package is installed).
Bloc 5 — fail2ban
Activer fail2ban avec la jail SSH
cp /etc/fail2ban/jail.conf /etc/fail2ban/jail.localÉditez /etc/fail2ban/jail.local et ajustez la section [sshd] :
[sshd]
enabled = true
maxretry = 5
findtime = 600
bantime = 3600systemctl enable fail2ban
systemctl start fail2ban
fail2ban-client status sshdPour un parc clients, envisagez CrowdSec en remplacement ou en complément : sa blocklist communautaire mutualise l'intelligence de milliers de serveurs.
Bloc 6 — auditd : le journal de traçabilité
Activer auditd et configurer les règles minimales
auditd est le composant que les agences oublient le plus souvent — et pourtant c'est lui qui fournit la preuve opposable en cas d'incident.
systemctl enable auditd
systemctl start auditdCréez un fichier de règles agence dans /etc/audit/rules.d/agency.rules :
# Tracer toutes les élévations de privilèges
-w /etc/sudoers -p wa -k sudoers_changes
-w /etc/sudoers.d/ -p wa -k sudoers_changes
# Tracer les connexions SSH
-w /var/log/auth.log -p wa -k auth_log
# Tracer les modifications de fichiers de configuration système
-w /etc/ssh/sshd_config -p wa -k sshd_config
-w /etc/passwd -p wa -k passwd_changes
-w /etc/shadow -p wa -k shadow_changes
# Tracer les commandes exécutées en root
-a always,exit -F arch=b64 -S execve -F euid=0 -k root_commandsaugenrules --load
auditctl -lRéférence CIS : contrôle CIS 4.1.1 (Ensure auditing is enabled) et CIS 4.1.3 (Ensure events that modify date and time information are collected).
Exporter et conserver les logs auditd
Les logs auditd doivent être conservés hors du serveur pour être opposables. Configurez un export vers votre système centralisé (rsyslog, Loki, ou un simple rsync quotidien vers un stockage agence) :
# Exemple : export rsyslog vers collecteur agence
echo ':programname, isequal, "auditd" @<IP_COLLECTEUR_AGENCE>:514' \
>> /etc/rsyslog.d/99-auditd-remote.conf
systemctl restart rsyslogConservez au minimum 90 jours de logs. Le RGPD ne fixe pas de durée minimale pour les logs de sécurité, mais les référentiels comme le CIS Controls v8 (contrôle 8.3) recommandent au moins 90 jours sur site et 1 an en archive froide.
Bloc 7 — Vérification finale et fiche de livraison
Une fois les six blocs précédents exécutés, auditez l'état du serveur avant de remettre les accès au client :
# Vérifier les services actifs
systemctl is-active ufw fail2ban auditd sshd
# Vérifier que root ne peut pas se connecter en SSH
grep PermitRootLogin /etc/ssh/sshd_config
# Vérifier les règles UFW
ufw status verbose
# Vérifier les règles auditd chargées
auditctl -l
# Vérifier les dernières connexions
last -n 10Produisez une fiche de livraison datée et signée (même par email) qui liste les mesures appliquées, les versions des paquets de sécurité installés, et l'emplacement du collecteur de logs. C'est ce document que votre client signe et qui constitue la preuve contractuelle de la configuration initiale.
La fiche de livraison n'est pas une formalité : un client victime d'une intrusion deux ans après la mise en production demandera à votre agence de justifier l'état du serveur à la livraison. Sans ce document, la charge de la preuve se retourne.
Runbook agence vs configuration au jugé : ce que ça change
| Critère | Configuration au jugé | Runbook standardisé |
|---|---|---|
| Reproductibilité | Dépend du technicien présent | Identique à chaque livraison |
| Traçabilité auditd | Rarement activée, config variable | Activée et configurée systématiquement |
| Preuve en cas d'incident | Aucune pièce opposable | Fiche de livraison datée + logs centralisés |
| Délégation à un junior | Risquée (oublis possibles) | Possible avec le runbook comme guide |
| Rotation de clé SSH | Manuelle et oubliée | Procédure écrite, dépôt versionné |
| Conformité NIS2 / RGPD | Non documentée | Documentée et reproductible |
Conseil d'audit mensuel. Une fois par mois, rejouez les vérifications finales du Bloc 7 sur chaque VPS client actif et archivez la sortie. Un diff entre deux audits consécutifs révèle immédiatement une modification non autorisée : un port ouvert en plus, un service fail2ban stoppé, une règle auditd manquante. Cet audit prend moins de cinq minutes par serveur quand les commandes sont dans un script.
Dépannage : erreurs fréquentes lors de l'application du runbook
Erreur 1 — sshd refuse de démarrer après modification de sshd_config
Message : sshd: /etc/ssh/sshd_config line 42: unsupported option
Cause : une directive dépréciée ou mal syntaxée. Vérifiez avec sshd -t avant de recharger le service. Sur Ubuntu 24.04, ChallengeResponseAuthentication est remplacée par KbdInteractiveAuthentication.
sshd -t && systemctl reload sshdErreur 2 — UFW bloque votre propre connexion SSH
Message : la session SSH se fige après ufw enable.
Cause : la règle SSH n'a pas été ajoutée avant l'activation. Passez par la console KVM ServOrbit pour accéder au serveur sans SSH, puis exécutez ufw allow 22/tcp et ufw reload.
Erreur 3 — auditd démarre mais auditctl -l retourne une liste vide
Message : List of rules: suivi de rien.
Cause : le fichier de règles n'est pas chargé. Vérifiez que votre fichier .rules est bien dans /etc/audit/rules.d/ et exécutez augenrules --load.
Erreur 4 — fail2ban ne banne pas malgré plusieurs tentatives échouées
Message : fail2ban-client status sshd montre Currently banned: 0 après 10 tentatives.
Cause : le chemin du journal SSH a changé. Sur Debian 12 et Ubuntu 24.04 avec journald, le backend de fail2ban doit être systemd dans jail.local : backend = systemd.
Erreur 5 — unattended-upgrades redémarre des services en cours de production
Cause : la configuration par défaut redémarre automatiquement les services après mise à jour. Pour un VPS client en production, désactivez le redémarrage automatique et planifiez une fenêtre de maintenance :
# Dans /etc/apt/apt.conf.d/50unattended-upgrades
Unattended-Upgrade::Automatic-Reboot "false";Aller plus loin : bastionnage et surveillance continue
Cette checklist couvre le niveau 1 du durcissement système. Pour un parc clients qui exige un niveau de sécurité supérieur :
- Bastion SSH : centralisez tous les accès via un point d'entrée unique durci — voir Bastion Host sur VPS.
- CrowdSec : détection comportementale et blocklist communautaire en complément ou remplacement de fail2ban — voir Sécuriser votre VPS avec CrowdSec.
- Sauvegardes : la configuration de sécurité ne protège pas contre la perte de données — voir Sauvegardes avec BorgBackup sur VPS.
- Correctifs applicatifs : le durcissement système est inutile si les applications self-hosted ne sont pas maintenues — voir Routine de correctifs pour apps self-hosted.
- Certificats SSL : HTTPS est prérequis avant toute exposition publique — voir Certificats SSL avec Let's Encrypt sur VPS.