Ce que vous saurez faire à la fin
- Exécuter 10 commandes d’audit indispensables en moins de 5 minutes
- Détecter tentatives SSH, processus suspects, fichiers modifiés
- Comparer l’état actuel du système à une baseline saine
- Générer un rapport d’audit automatique quotidien
- Alerter en temps réel sur les anomalies
Durée : 45 minutes. Pré-requis : serveur Linux Ubuntu/Debian/CentOS, accès root ou sudo.
1. Détecter les connexions sortantes suspectes
ss -tunp state established | awk 'NR>1 {print $5}' | sort -u
# Cross-check avec les processus
sudo lsof -i -n -P | grep ESTABLISHED
- Comparez les IPs distantes aux plages connues (AWS, OVH, vos CDN).
- Une IP résidentielle inconnue = à investiguer immédiatement.
2. Identifier les processus qui écoutent
sudo ss -tulpn | grep LISTEN
# Format: Netid State Recv-Q Send-Q Local-Addr:Port Peer-Addr:Port users:(("process",pid=1234,fd=3))
# Vérifier les services actifs
systemctl list-units --type=service --state=running | head -30
- Chaque port en écoute = surface d’attaque. Seuls les services attendus doivent apparaître (SSH 22, HTTPS 443, etc.).
- Un port inattendu (ex: 31337) = alerte haute.
3. Vérifier les dernières connexions SSH
# Connexions réussies avec IP
last -i | head -30
# Tentatives échouées
sudo lastb -i | head -30
# Top IPs qui ont échoué (7 derniers jours)
sudo journalctl -u ssh --since "7 days ago" \
| grep -oP '(?<=Failed password for ).*from \K[0-9.]+' \
| sort | uniq -c | sort -rn | head -20
- IPs avec > 100 tentatives d’échec : bloquer via fail2ban ou firewall.
4. Chercher les fichiers SUID/SGID suspects
# Liste complète des SUID root
sudo find / -perm -4000 -type f -printf '%M %u %p\n' 2>/dev/null
# Nouveaux SUID apparus ces 30 derniers jours
sudo find / -perm -4000 -type f -mtime -30 2>/dev/null
# SGID
sudo find / -perm -2000 -type f -mtime -30 2>/dev/null
- Les binaires SUID permettent de s’exécuter en tant que le propriétaire. Un SUID récent inattendu = backdoor potentielle.
- Baseline saine : liste à comparer, stockée hors ligne.
5. Fichiers modifiés récemment dans /etc
sudo find /etc -type f -mtime -7 -printf '%TY-%Tm-%Td %p\n' | sort
# Diff avec la version précédente (si git init fait)
sudo git -C /etc diff HEAD~1 -- passwd shadow sudoers
Astuce pro : au premier audit, initialisez /etc en dépôt git :
sudo git -C /etc init
sudo git -C /etc add -A
sudo git -C /etc commit -m "baseline initiale"
# Chaque semaine, automatiquement:
sudo git -C /etc diff
sudo git -C /etc add -A && sudo git -C /etc commit -m "hebdo $(date +%F)"
6. Contrôler les crontabs de TOUS les utilisateurs
for u in $(cut -f1 -d: /etc/passwd); do
crontab_u=$(sudo crontab -u "$u" -l 2>/dev/null)
if [ -n "$crontab_u" ]; then
echo "=== $u ==="
echo "$crontab_u"
fi
done
# Crontabs système
ls -la /etc/cron.d/ /etc/cron.daily/ /etc/cron.hourly/ /etc/cron.weekly/
cat /etc/cron.d/*
- Cron est un vecteur classique de persistance. Tout cron non documenté = à investiguer.
7. Inspecter les utilisateurs privilégiés (UID 0)
awk -F: '$3==0 {print $1}' /etc/passwd
# Doit retourner UNIQUEMENT: root
# Tout autre utilisateur UID 0 = backdoor confirmée
8. Journal des commandes sudo
sudo journalctl -u sudo --since "30 days ago" | grep -v "session opened\|session closed"
sudo grep sudo /var/log/auth.log | tail -50
# Qui a utilisé sudo et pour quelle commande ?
sudo grep "COMMAND=" /var/log/auth.log | awk -F'TTY=' '{print $2}' | head -30
9. Détecter les rootkits
sudo apt install -y rkhunter chkrootkit
# RKHunter
sudo rkhunter --update
sudo rkhunter --check --skip-keypress --report-warnings-only
# Chkrootkit
sudo chkrootkit -q
- Exécutez 1x/semaine. Toute alerte non identifiée = investigation manuelle.
- Ne garantit pas une détection 100 % (les rootkits récents échappent), mais écarte 90 % des variantes connues.
10. Intégrité des binaires système (debsums)
sudo apt install -y debsums
# Vérifie les hash de tous les binaires installés par paquets
sudo debsums -c 2>/dev/null
- Affiche uniquement les fichiers dont le hash ne correspond PAS au .deb d’origine.
- Peut indiquer une modification légitime (compilation custom) ou une compromission.
Script d’audit quotidien automatisé
#!/usr/bin/env bash
# /usr/local/bin/audit-quotidien.sh
set -euo pipefail
RAPPORT=/var/log/audit-$(date +%F).txt
{
echo "=== Audit sécurité $(hostname) - $(date) ==="
echo
echo "== Connexions SSH échouées (24h) =="
sudo journalctl -u ssh --since "1 day ago" | grep -c "Failed password" || true
echo
echo "== Nouveaux SUID (24h) =="
sudo find / -perm -4000 -type f -mtime -1 2>/dev/null || true
echo
echo "== Processus écoutant =="
sudo ss -tulpn | grep LISTEN
echo
echo "== Utilisateurs UID 0 =="
awk -F: '$3==0 {print $1}' /etc/passwd
echo
echo "== Espace disque =="
df -h | awk '$5+0 > 85 {print "ALERT saturated:", $0}'
echo
echo "== Charge système =="
uptime
} > "$RAPPORT" 2>&1
# Envoi email si anomalie
if grep -qE "ALERT|backdoor|RKH" "$RAPPORT"; then
mail -s "[ALERTE] Audit $(hostname)" secu@example.sn < "$RAPPORT"
fi
# Rendre exécutable et planifier
sudo chmod +x /usr/local/bin/audit-quotidien.sh
echo "0 6 * * * root /usr/local/bin/audit-quotidien.sh" | sudo tee /etc/cron.d/audit
Alerting en temps réel avec auditd
sudo apt install -y auditd
sudo systemctl enable --now auditd
# Règles de surveillance critique
sudo tee /etc/audit/rules.d/itsc.rules <<'EOF'
-w /etc/passwd -p wa -k passwd_changes
-w /etc/shadow -p wa -k shadow_changes
-w /etc/sudoers -p wa -k sudoers_changes
-w /etc/ssh/sshd_config -p wa -k ssh_config
-a always,exit -F arch=b64 -S execve -F euid=0 -k root_exec
EOF
sudo augenrules --load
sudo systemctl restart auditd
# Consulter les événements
sudo ausearch -k sudoers_changes
sudo ausearch -k root_exec --start today
Checklist hebdomadaire
✓ Commandes 1-10 exécutées et logs archivés
✓ Aucun nouvel UID 0
✓ SUID list comparée à baseline
✓ /etc diff inspecté avec git
✓ rkhunter + chkrootkit sans alerte
✓ IPs brute-force bloquées (fail2ban)
✓ Mises à jour sécurité appliquées (unattended-upgrades)
✓ Baselines à jour dans le wiki interne
Solution d’hébergement pour ce tutoriel
Hostinger accueille un site WordPress, un VPS Linux ou une boutique en ligne sans configuration complexe.
Lien d affiliation. Si vous achetez via ce lien, le blog reçoit une petite commission sans surcoût pour vous.
Étape 1 : préparer l’environnement d’audit
Avant de lancer la moindre commande sur un serveur de production basé à Dakar, Abidjan ou Lomé, ouvrez une session SSH avec un utilisateur sudo et créez un répertoire dédié aux logs d’audit. Tous les outputs seront archivés pour la traçabilité.
# Préparer le dossier d'audit horodaté
sudo mkdir -p /root/audit/$(date +%Y-%m-%d)
cd /root/audit/$(date +%Y-%m-%d)
# Vérifier la version OS
cat /etc/os-release | grep PRETTY_NAME
La sortie attendue affiche Ubuntu 24.04 LTS, Debian 12, ou AlmaLinux 9. Si l’OS est en fin de vie (Ubuntu 18.04, CentOS 7), considérez la migration comme priorité avant tout audit — un système non patché reste vulnérable.
Étape 2 : commande 1 — auditer les utilisateurs et sessions actives
Le premier réflexe consiste à identifier qui est connecté et qui peut se connecter. Une session inattendue à 03h00 GMT est un signal d’alerte fort, surtout sur un serveur exposé en Afrique de l’Ouest.
# Sessions actives et historique
who -a
last -F | head -30
# Comptes avec un shell de connexion
awk -F: '$7 !~ /(nologin|false)/ {print $1}' /etc/passwd
Une ligne still logged in sur un compte que vous ne reconnaissez pas justifie un blocage immédiat avec sudo passwd -l user. La liste des shells valides ne devrait contenir que root et vos administrateurs identifiés.
Étape 3 : commande 2 — vérifier les sudoers et privilèges escaladés
Une mauvaise configuration sudoers est la cause numéro un d’élévation de privilèges en production. Auditez le fichier principal et les drop-ins dans /etc/sudoers.d/.
# Lister tous les sudoers actifs
sudo cat /etc/sudoers /etc/sudoers.d/*
# Vérifier la syntaxe avant toute modification
sudo visudo -c
Repérez les lignes NOPASSWD: ALL qui sont rarement justifiées. Sur un serveur web public, seul un utilisateur de déploiement CI peut éventuellement avoir un sudo passwordless, et uniquement sur une commande précise.
Étape 4 : commande 3 — détecter les processus suspects
Un cryptominer ou un reverse shell se cache souvent derrière un nom de processus innocent comme kworker ou systemd-helper. Croisez la consommation CPU avec le binaire réel.
# Top 10 des processus par CPU
ps aux --sort=-%cpu | head -11
# Vérifier le binaire d'un PID suspect
sudo ls -la /proc/PID/exe
sudo ls -la /proc/PID/cwd
Un processus dont le binaire pointe vers /tmp, /dev/shm ou /var/tmp est presque toujours malveillant. Tuez-le avec sudo kill -9 puis investiguez la chaîne d’infection avant de redémarrer le service légitime.
Étape 5 : commande 4 — auditer les ports ouverts et services exposés
Tout port ouvert vers Internet doit être justifié. Sur un serveur applicatif derrière un reverse proxy Nginx, seuls 22, 80 et 443 devraient être accessibles publiquement.
# Sockets en écoute (TCP/UDP)
sudo ss -tulnp
# Vérifier le pare-feu UFW
sudo ufw status verbose
# Vérifier nftables / iptables
sudo nft list ruleset | head -50
Un Redis exposé sur 0.0.0.0:6379 est un cas classique de fuite — passez-le sur 127.0.0.1 ou activez l’authentification. Un PostgreSQL ou MySQL en écoute publique doit être immédiatement réservé au localhost ou à un VPN WireGuard.
Étape 6 : commande 5 — analyser les logs d’authentification SSH
Les tentatives de bruteforce SSH représentent 80 % du bruit en production. Identifiez les IP attaquantes et les comptes ciblés pour ajuster fail2ban ou bannir les pays inutiles.
# Échecs de connexion SSH (Debian/Ubuntu)
sudo grep "Failed password" /var/log/auth.log | tail -50
# Top 10 IP attaquantes
sudo grep "Failed password" /var/log/auth.log \
| awk '{print $11}' | sort | uniq -c | sort -nr | head
Si une IP cumule plus de 100 échecs, ajoutez-la définitivement à votre pare-feu. Pour un serveur ne servant que l’Afrique de l’Ouest, bloquer les ranges asiatiques connus pour leur activité offensive réduit le bruit de 90 %.
Étape 7 : commande 6 — vérifier l’intégrité des fichiers critiques
Un attaquant persiste souvent en modifiant /etc/passwd, /etc/shadow, ou les binaires /bin/ls et /usr/sbin/sshd. Comparez les hashes avec ceux du paquet officiel.
# Vérifier l'intégrité des paquets installés (Debian/Ubuntu)
sudo apt install debsums
sudo debsums -c
# RHEL / AlmaLinux
sudo rpm -Va | grep -v "^.{8}c"
Toute différence sur un binaire système exige une investigation immédiate. Une modification légitime arrive uniquement après apt upgrade et est tracée dans /var/log/dpkg.log. Sinon, c’est un rootkit potentiel.
Étape 8 : commande 7 — auditer les tâches cron et systemd timers
La persistance malveillante passe souvent par un cron caché ou un timer systemd. Listez exhaustivement toutes les planifications utilisateur et système.
# Crons utilisateur (tous les utilisateurs)
for u in $(cut -f1 -d: /etc/passwd); do
sudo crontab -u $u -l 2>/dev/null && echo "user: $u"
done
# Timers systemd actifs
systemctl list-timers --all
Un cron qui télécharge un script depuis raw.githubusercontent.com ou pastebin.com à intervalle régulier est typiquement un downloader de malware. Supprimez-le et investiguez le compte utilisateur compromis.
Étape 9 : commande 8 — détecter les binaires SUID/SGID suspects
Les binaires avec bit SUID s’exécutent avec les privilèges de leur propriétaire. Un nouveau SUID sur le système est souvent une porte dérobée.
# Lister tous les SUID/SGID
sudo find / -type f \( -perm -4000 -o -perm -2000 \) \
-exec ls -la {} \; 2>/dev/null > suid-actuels.txt
# Comparer à un baseline antérieur
diff suid-baseline.txt suid-actuels.txt
Conservez un baseline de référence après installation propre. Toute apparition de /tmp/.x ou /usr/local/bin/inconnu avec SUID root est un signal d’alarme rouge — isolez immédiatement le serveur du réseau.
Étape 10 : commande 9 — vérifier les paquets non patchés
Une vulnérabilité non patchée comme une CVE Linux kernel récente offre une élévation locale immédiate. Auditez régulièrement les paquets en retard de mise à jour.
# Debian/Ubuntu : lister les paquets de sécurité disponibles
sudo apt update
sudo apt list --upgradable 2>/dev/null | grep -i security
# RHEL/AlmaLinux
sudo dnf updateinfo list security
Sur un serveur de production, planifiez les apt upgrade de sécurité hebdomadairement. Un délai de patch supérieur à 30 jours expose à des exploits publics largement diffusés sur Telegram et les forums underground.
Étape 11 : commande 10 — auditer les modules kernel et rootkits
Un rootkit kernel moderne se cache des outils utilisateur classiques. Utilisez chkrootkit et rkhunter en complément de vos audits manuels.
# Installer et lancer rkhunter
sudo apt install rkhunter chkrootkit
sudo rkhunter --update
sudo rkhunter --check --skip-keypress
sudo chkrootkit | grep -v "not found\|nothing detected"
Une détection positive ne signifie pas toujours infection (faux positifs fréquents), mais doit toujours être investiguée manuellement. En cas de doute sérieux, redémarrez depuis un live USB et montez le disque en lecture seule pour analyse forensique.
Étape 12 : automatiser l’audit avec un script hebdomadaire
Pour un parc de plusieurs serveurs, automatisez l’exécution des 10 commandes et envoyez le rapport par email ou dans un canal Slack dédié.
# /usr/local/bin/audit-weekly.sh
#!/bin/bash
LOG=/var/log/audit-$(date +%Y%m%d).log
{
echo "=== Sessions ==="; who -a
echo "=== Sudoers ==="; cat /etc/sudoers.d/*
echo "=== Top CPU ==="; ps aux --sort=-%cpu | head -5
echo "=== Ports ==="; ss -tulnp
echo "=== SSH fails ==="; grep "Failed" /var/log/auth.log | wc -l
} > $LOG
mail -s "Audit hebdo" admin@exemple.io < $LOG
Planifiez ce script via cron chaque lundi à 06h00 GMT. Le rapport arrive avant la prise de poste à Dakar et permet une revue rapide en moins de 10 minutes.
Pour approfondir, consultez notre guide pour durcir SSH en production et le tutoriel configurer fail2ban sur Ubuntu et Debian.