linux-security-audit
Periodically audit Linux system security — local and remote (VPS) — with CIS-inspired checks, automatic scoring, Google Sheets logging, and auto-corrective actions. Covers quick (vitals-only), daily (full), and weekly (deep) scan modes.
Quand l'utiliser (Trigger)
User asks to set up periodic security scanning, audit a Linux system's security posture, harden a Debian/Ubuntu box, implement automated security monitoring, or create a security dashboard with logging.
Mode d'emploi (Usage)
Mode d'emploi standard via l'agent Hermès. Linux Security Audit — Diagnostic Périodique
Architecture
security-scanner.py ← wrapper scripts per mode ← Hermes cron jobs (no_agent)
│
├── local: subprocess.run()
└── VPS: SSH multiplexé (ControlMaster)
│
└── Output: Google Sheets dashboard (gspread)
Telegram alert (optionnel)
Modes de Scan
| Mode | Portée | Fréquence typique |
|---|---|---|
quick | Disque, RAM, CPU, uptime, connexions, ports, firewall, SSH, systemd | 6h (VPS) / 12h (local) |
daily | Tout quick + fail2ban, updates, antirootkit, NTP, processus suspects, Docker, gateways | Quotidien |
weekly | Tout daily + audit utilisateurs, comptes inactifs, sudoers, scan vulnérabilités | Hebdomadaire |
Seuils de Score
- ≥ 80/100 — OK, logging simple
- 60–79/100 — WARN, action manuelle conseillée
- < 60/100 — CRITICAL, notification + action corrective immédiate
SSH Multiplexing (VPS)
Pour éviter le overhead des handshakes SSH répétés (chaque check ouvre une connexion), utiliser ControlMaster :
# ~/.hermes/scripts/security-scanner.py
VPS_SOCKET = "/tmp/ssh-vps-scan.sock"
ssh_cmd = [
"ssh", "-i", VPS_KEY, "-p", VPS_PORT,
"-o", "ControlMaster=auto",
"-o", f"ControlPath={VPS_SOCKET}",
"-o", "ControlPersist=120",
f"{user}@{host}", cmd
]
Démarrer le canal maître au début du scan : ssh -N -f -o ControlMaster=auto ...
Cron Jobs (Hermes, no_agent)
Créer des wrappers shell par mode/machine :
#!/bin/bash
exec python3 ~/.hermes/scripts/security-scanner.py --mode=quick --vps 2>&1
Puis créer les cron jobs Hermes :
{
"script": "cron-vps-quick.sh",
"no_agent": true,
"deliver": "local",
"schedule": "0 */6 * * *"
}
Structure du Script Scanner
run(cmd)— interface unifiée : local → subprocess, VPS → ssh_vps()SecurityReport— accumulateur de checks avec score (démarre à 100, déduit pour chaque FAIL)- Chaque check est une fonction
check_xxx(report)qui appellereport.add_check()etreport.add_alert() - Logging via
gspread(authentication:~/.config/gspread/service_account.jsonou Google OAuth) - Destination sheet: le script écrit dans la feuille “Agent Logs” du spreadsheet. L’ancien script VPS (
sysguard.py) écrivait dans “🛡️ Security”. Si l’utilisateur signale que le dashboard n’est plus mis à jour, vérifier QUELLE feuille il regarde — voircron-job-maintenance/references/multi-sheet-dashboard-diagnostic.md. - Notification Telegram via
~/.hermes/scripts/notify.py
Pitfalls
-
SSH sans multiplexing = timeout en mode daily : 35+ connexions SSH individuelles en daily créent un overhead de handshake de 60-90s. Toujours activer ControlMaster.
-
sudoabsent sur la machine locale : checks commeufw statusetfail2ban-client statuséchouent sans privilèges. Le script doit gérer cela comme un WARN, pas un crash.- fail2ban-check nécessite sudo : la fonction
check_fail2ban()doit appelersudo fail2ban-client status sshdpasfail2ban-client status sshd. - Sans NOPASSWD,
sudo fail2ban-clientéchoue en non-interactif. - Solution : configurer
/etc/sudoers.d/security-scanneravecbf ALL=(root) NOPASSWD: /usr/bin/fail2ban-client
- fail2ban-check nécessite sudo : la fonction
-
apt list --upgradablelent sur VPS à forte charge : peut prendre 15-20s. Ne pas mettre timeout < 30s. Également, les dépôts tiers problématiques (UniFi, Warp, FreeDownloadManager) peuvent faire échouerapt updateet causer un FAIL sur les mises à jour. -
Google Sheets credentials : l’authentification
gspreadest locale. Pour les scans VPS, exécuter le script localement avec--vps(SSH) plutôt que de déployer le script sur le VPS. -
Nettoyage socket SSH : le socket ControlMaster reste dans
/tmp/après le scan. La configControlPersist=120le nettoie automatiquement après 120s d’inactivité. -
VPS sous-dimensionné : un VPS avec 11Go RAM dont 10Go utilisés + 4Go swap saturé → swap I/O = load élevé (46+). Cela ralentit l’exécution des commandes SSH et peut causer des timeouts. Le scanner le détecte comme CRITICAL sur la charge CPU.
-
Wrapper scripts doivent filtrer les exit codes 1 et 2 : le scanner quitte avec
sys.exit(1)pour les avertissements (warnings) etsys.exit(2)pour les erreurs mineures non-bloquantes. Quand le scanner est invoqué via un wrapperno_agent=truecron job, cron interprète tout exit non-zéro comme une erreur et marque le job comme “error”. Solution : dans le wrapper, traiter exit 1 et exit 2 comme des succès :#!/bin/bash python3 ~/.hermes/scripts/security-scanner.py --mode=daily --local 2>&1 rc=$? if [ $rc -eq 1 ] || [ $rc -eq 2 ]; then exit 0 # warnings et erreurs mineures ne sont pas des echecs cron fi exit $rc -
Transient SSH congestion peut causer des faux “error” cron : quand le VPS est sous charge (swap I/O, load élevé), les connexions SSH des cron jobs
no_agent=truepeuvent timeout. Le job est marqué “error” même si le script distant fonctionne parfaitement. Diagnostic :cronjob(action='run', job_id=...)pour exécuter manuellement — si le script s’exécute correctement, c’était un faux positif SSH. Solution : baisser la fréquence des jobs, ou ajouter une retry logic dans le wrapper. -
Préférer service_account.json à OAuth device flow pour les jobs cron : les tokens OAuth device flow expirent et nécessitent une ré-authentification manuelle tous les ~7 jours. Pour les cron automatisés, utiliser un compte de service Google avec
gspreadetCredentials.from_service_account_file()— les tokens de service account n’expirent pas. Si OAuth device flow est la seule option, prévoir un mécanisme de notification pour alerter l’utilisateur avant expiration.
Références
- CIS Benchmarks Debian 12
- NIST Cybersecurity Framework (CSF)
- Lynis hardening recommendations
- Debian Security Team advisories
Absorbed: Ubuntu Server Hardening
references/hardening-ubuntu.md — Complete hardening audit for Ubuntu servers: SSH config, fail2ban, UFW firewall, kernel parameters, and security baseline. Previously a standalone skill (ubuntu-server-security-hardening). Use this reference when the audit reveals hardening gaps that need remediation steps.