Tutoriel

Audit sécurité mensuel d'un VPS client : checklist en 45 min

Sécurité & Monitoring10 min de lecture13 étapes

Un client ne demande pas si son VPS est sûr, il demande depuis quand vous le savez. Une agence qui n'a pas de routine ne peut répondre ni le jour d'une faille ni à la question du renouvellement de contrat. Cette checklist déroule en 45 minutes, par VPS, sept contrôles en lecture seule : mises à jour en attente, noyau, comptes et clés SSH, ports ouverts, certificats, sauvegardes restaurées, journaux d'authentification. Elle se termine par un rapport d'une page, daté, que vous remettez au client et que vous comparez d'un mois à l'autre.

Sommaire· Vérifier un état, pas le reconstruire1/14
  1. 01Vérifier un état, pas le reconstruire
  2. 02Poser le périmètre avant le premier audit
  3. 03À préparer une seule fois, avant d'auditer
  4. 04Les sept contrôles, avec leur budget de temps
  5. 05Le budget de 45 minutes par VPS
  6. 06Un script de collecte plutôt que sept sessions à la main
  7. 07Archiver et comparer : c'est là que les dérives se voient
  8. 08Le rapport d'une page remis au client
  9. 09Notez l'écart, ne le corrigez pas dans la foulée
  10. 10Quand une sortie ne dit pas ce qu'elle semble dire
  11. 11L'objection du temps : 45 minutes par client, chaque mois
  12. 12Quand le portefeuille grandit
  13. 13Pour aller plus loin
  14. 14La documentation officielle

Vérifier un état, pas le reconstruire

Le durcissement initial d'un VPS se fait une fois, à la livraison : clés SSH, pare-feu, fail2ban, mises à jour automatiques. Notre checklist de durcissement le détaille déjà. Ici, on part du principe que tout cela existe et on se demande s'il tient encore. Un paquet resté en attente, un compte créé pour un prestataire et jamais supprimé, un port ouvert pour un test, un certificat dont le renouvellement échoue en silence : rien de cela ne se voit tant qu'on ne regarde pas. L'audit mensuel est donc une routine de contrôle, pas de configuration. Chaque contrôle produit une sortie, que vous archivez, et un statut vert, orange ou rouge dans le rapport du client. Un écart est noté, jamais corrigé sans accord.

Poser le périmètre avant le premier audit

Avant la première commande, fixez par écrit qui est responsable de quoi. Le VPS appartient-il au client ou à l'agence ? Qui détient le compte root, qui reçoit les alertes, qui décide d'un redémarrage ? Sans réponse, le premier écart trouvé devient un différend : l'agence a-t-elle le droit de corriger, le client a-t-il été prévenu ? Reprenez cinq points dans votre contrat ou votre bon de commande : les VPS couverts, la fréquence de l'audit, les accès accordés en lecture seule, le délai de réponse en cas d'écart rouge, et la liste des actions que l'agence peut faire seule, comme appliquer une mise à jour de sécurité, par opposition à celles qui exigent une validation du client, comme un redémarrage ou une suppression de compte.

À préparer une seule fois, avant d'auditer

  • Un compte d'audit dédié — un utilisateur nominatif avec sudo limité à la lecture des journaux et à l'inspection réseau, plutôt que root partagé.
  • Une liste attendue par VPS — ports qui doivent écouter, comptes autorisés, domaines servis, outil de sauvegarde et dépôt. Sans référence, un écart ne se distingue pas d'un fonctionnement normal.
  • Un script de collecte en lecture seule — il enchaîne les commandes de la checklist et écrit tout dans un fichier daté, pour ne taper chaque commande qu'une fois.
  • Un dossier d'archives par client — un sous-dossier par mois, conservé hors du VPS audité, pour pouvoir comparer les mois entre eux.
  • Un modèle de rapport — le même gabarit pour tous les clients, rempli depuis les sorties collectées.
  • Un calendrier — un jour fixe du mois par client, noté dans l'agenda de l'équipe, sinon l'audit saute dès le premier mois chargé.

Les sept contrôles, avec leur budget de temps

  1. Mises à jour en attente (6 min)

    sudo apt update
    apt list --upgradable 2>/dev/null
    apt list --upgradable 2>/dev/null | grep -i security
    Isolez les paquets dont l'origine finit par -security : ils partent en priorité. Les autres passent par une validation humaine, car une montée de version majeure peut casser une application. Sur AlmaLinux ou RHEL, sudo dnf check-update --security joue le même rôle. Même avec les mises à jour automatiques activées, ce contrôle montre ce qui reste bloqué.

  2. Noyau et redémarrage en attente (4 min)

    uname -r
    ls /boot/vmlinuz-*
    ls /var/run/reboot-required
    sudo needrestart -b -r l
    Si le noyau installé le plus récent diffère de uname -r, ou si /var/run/reboot-required existe, un redémarrage est dû. Dans la sortie de needrestart, la ligne NEEDRESTART-KSTA dit si le noyau chargé est à jour, et la liste indique les services qui utilisent encore d'anciennes bibliothèques. Le redémarrage n'est jamais fait seul : il se planifie avec le client.

  3. Comptes et clés SSH (8 min)

    awk -F: '$3>=1000' /etc/passwd
    getent group sudo
    sudo ssh-keygen -lf /home/<compte>/.ssh/authorized_keys
    lastlog | grep -v 'Never logged in'
    last -n 20
    Chaque compte humain doit correspondre à une personne connue du client ou de l'agence. Chaque empreinte de clé doit appartenir à quelqu'un qui travaille encore sur le projet. Un compte jamais connecté depuis des mois, ou une clé inconnue, passe en orange et part au client pour validation.

  4. Ports ouverts (5 min)

    sudo ss -tlnp
    sudo ss -ulnp
    sudo ufw status verbose
    Rapprochez la liste de celle attendue pour ce VPS. Une base de données qui écoute sur toutes les interfaces au lieu de la boucle locale, un port de test oublié, un service inconnu : chaque écart est noté avec le processus qui l'ouvre, sans fermeture immédiate, car un service peut dépendre de ce port.

  5. Certificats (4 min)

    openssl s_client -connect mondomaine.com:443 -servername mondomaine.com </dev/null 2>/dev/null | openssl x509 -noout -enddate
    Lisez la date d'expiration sur le service réellement exposé, pas seulement la présence d'un timer de renouvellement : un timer actif peut échouer chaque nuit. Si le domaine passe par un CDN, cette commande lit le certificat du CDN. Pour l'origine, remplacez l'hôte de -connect par l'adresse IP du VPS en gardant -servername.

  6. Sauvegardes restaurées (10 min)

    restic snapshots
    restic restore latest --target /tmp/restauration-test --include /etc/nginx
    Notez la date du dernier point de restauration, puis restaurez réellement un fichier ou une base dans un répertoire temporaire, et ouvrez-le. Une sauvegarde jamais restaurée n'est pas une preuve, c'est une hypothèse. Supprimez le répertoire temporaire ensuite. Si le client utilise un autre outil, la logique est identique : liste des points, restauration partielle, vérification du contenu.

  7. Journaux d'authentification (8 min)

    sudo journalctl -u ssh --since '30 days ago' --no-pager | grep -c 'Failed password'
    sudo journalctl -u ssh --since '30 days ago' --no-pager | grep 'Accepted'
    sudo journalctl _COMM=sudo --since '30 days ago' --no-pager
    Comptez les échecs, listez les connexions réussies et cherchez celles qui viennent d'une adresse inconnue. Relisez les usages de sudo. Sur RHEL et dérivés, l'unité s'appelle sshd, pas ssh.

Le budget de 45 minutes par VPS

Faites défiler le tableau

ContrôleCommande cléTemps
Mises à jour en attente`apt list --upgradable`6 min
Noyau et redémarrage`needrestart -b -r l`4 min
Comptes et clés SSH`ssh-keygen -lf authorized_keys`8 min
Ports ouverts`ss -tlnp`5 min
Certificats`openssl s_client`4 min
Sauvegardes restaurées`restic restore`10 min
Journaux d'authentification`journalctl -u ssh`8 min

Un script de collecte plutôt que sept sessions à la main

La plus grande part des 45 minutes est de la lecture, pas de la frappe, à condition de ne pas retaper les commandes. Écrivez un script audit-vps qui lance les commandes des contrôles un à sept et redirige chaque sortie vers un fichier nommé d'après le client et la date, par exemple ~/audits/client-a/AAAA-MM/sortie-brute.txt. Il ne contient que des commandes de lecture : aucun apt upgrade, aucun systemctl restart, aucun rm. Lancez-le par SSH depuis votre poste, récupérez le fichier, puis lisez-le tranquillement. La restauration de sauvegarde reste la seule étape manuelle, parce qu'elle demande de juger si le contenu restauré est cohérent.

Archiver et comparer : c'est là que les dérives se voient

Un audit isolé donne une photographie, deux audits consécutifs donnent une tendance. Conservez la sortie brute de chaque mois, puis comparez-la à la précédente avec diff -u audit-precedent.txt audit-courant.txt. Un port qui apparaît, un compte en plus, un nombre d'échecs de connexion multiplié par dix, un point de restauration qui ne bouge plus : tous ces signaux ressortent en quelques lignes de différence, alors qu'ils sont invisibles dans une sortie lue seule. Archivez aussi le rapport remis au client. Le jour où celui-ci demande depuis quand un compte existait ou quand un correctif a été appliqué, la réponse est un fichier daté, pas un souvenir.

Le rapport d'une page remis au client

  1. L'en-tête

    Nom du client, identifiant du VPS, adresse IP, date de l'audit, nom de la personne qui l'a mené.

  2. Le tableau des sept contrôles

    Une ligne par contrôle avec un statut : vert si rien à signaler, orange si un écart demande une décision du client, rouge si une action urgente est nécessaire.

  3. Les écarts constatés

    Chaque écart en une phrase factuelle, avec la preuve : la ligne de sortie, le port, le compte concerné.

  4. Les actions faites

    Ce que l'agence a appliqué seule, dans le périmètre convenu, par exemple une mise à jour de sécurité.

  5. Les actions à valider par le client

    Redémarrage, suppression d'un compte, fermeture d'un port, avec le risque de ne rien faire.

  6. La prochaine échéance

    La date du prochain audit et, pour chaque écart orange ou rouge, une date limite de traitement.

Notez l'écart, ne le corrigez pas dans la foulée

Le réflexe de fermer le port ou de supprimer le compte suspect pendant l'audit est le plus coûteux : un service client tombe, et l'agence l'a décidé seule. Le rôle de l'audit est de rendre l'écart visible et daté. La correction suit le circuit de validation convenu au départ, y compris pour ce qui paraît évident.

Quand une sortie ne dit pas ce qu'elle semble dire

  • needrestart introuvable — le paquet n'est pas installé par défaut partout. Installez-le une fois avec accord du client, ou comparez à la main uname -r et les noyaux présents dans /boot.
  • Aucun échec SSH dans les journaux — vérifiez le nom de l'unité avant de conclure. Selon la distribution, l'authentification est journalisée sous ssh, sshd ou, sur les versions récentes d'OpenSSH, sshd-session. Testez sudo journalctl _COMM=sshd-session --since '30 days ago'.
  • ss -tlnp n'affiche pas les processus — sans sudo, la colonne des processus reste vide pour les services des autres utilisateurs.
  • Un certificat valide alors que le site affiche une erreur — vous avez lu celui d'un CDN ou d'un autre vhost. Pointez l'adresse du VPS et passez le bon -servername.
  • restic demande un mot de passe — le dépôt est chiffré. Récupérez le secret auprès du client avant l'audit, et non pendant, faute de quoi le contrôle saute.

L'objection du temps : 45 minutes par client, chaque mois

Vingt clients font quinze heures par mois, et l'objection est légitime. Trois leviers la réduisent. D'abord, le temps se mesure par VPS, pas par client : un client à un seul serveur coûte 45 minutes, et moins dès le deuxième mois, car les références attendues sont posées. Ensuite, le script collecte tout, vous ne faites que lire, et le rapport se remplit depuis un modèle. Enfin, comparez au coût d'un incident non détecté : un accès oublié ou une sauvegarde inutilisable se découvrent le jour de la panne, avec un client mécontent et une facture de remise en état. La routine coûte moins qu'un seul incident évitable.

Quand le portefeuille grandit

À dix VPS, la checklist tient dans une journée. À cinquante, la difficulté devient d'organisation : savoir quel client a quoi, quelles échéances tombent ce mois-ci, qui a été audité. L'espace agence de ServOrbit.com regroupe services et échéances de chaque client dans une seule interface, ce qui évite de maintenir un tableur parallèle. Si l'agence ne souhaite pas porter elle-même le socle système, l'option administration VPS existe et s'étudie à part. Ce guide est fourni tel quel, sans prise en charge : l'exécution de l'audit et la responsabilité envers le client restent les vôtres.

Pour aller plus loin

  • Mettre en place le socle — /blog/linux-hardening-vps-checklist décrit le durcissement initial que cet audit vient vérifier.
  • Automatiser les correctifs — /blog/securite-vps-mises-a-jour-automatiques-debian-ubuntu explique unattended-upgrades, dont le premier contrôle mesure les restes.
  • Sauvegarder correctement — /blog/backup-vps-restic-s3-3-2-1 couvre la mise en place de Restic, dont le sixième contrôle vérifie la restauration.
  • Surveiller en continu — /blog/alertes-disque-ram-vps-monitoring-proactif complète l'audit mensuel par des alertes entre deux passages.
  • Inventorier les versions de PHP — /blog/inventaire-versions-php-parc-sites-clients-agence applique la même discipline au parc de sites.
  • Réagir à une faille — les guides de correctif de la catégorie Sécurité et monitoring du blog montrent ce qu'un inventaire à jour permet de faire le jour J.

La documentation officielle

Options de apt : https://manpages.debian.org/stable/apt/apt.8.en.html

Projet needrestart : https://github.com/liske/needrestart

Mise à jour automatique sous Debian : https://wiki.debian.org/UnattendedUpgrades

Commande ss : https://man7.org/linux/man-pages/man8/ss.8.html

Commande openssl s_client : https://docs.openssl.org/master/man1/openssl-s_client/

Commande journalctl : https://www.freedesktop.org/software/systemd/man/latest/journalctl.html

Démon sshd : https://man.openbsd.org/sshd.8

Commande last : https://man7.org/linux/man-pages/man1/last.1.html

Un portefeuille de VPS lisible d'un seul endroit

Auditer un parc à la main devient ingérable quand le portefeuille grandit. L'espace agence ServOrbit.com regroupe services et échéances de chaque client dans une seule interface, et l'option administration VPS permet de confier le socle système.

Besoin d'aide ?

Parcourez notre centre d'aide et notre FAQ, ou contactez notre équipe — rappel, WhatsApp ou e-mail. Support en français, anglais et arabe.

Écrire sur WhatsApps'ouvre dans un nouvel onglet