Le « durcisseur » d’Ubuntu qui gagne des adeptes : comment fonctionne le script de Konstruktoïd pour sécuriser les systèmes systemd de haut en bas

La sécurité dans les infrastructures critiques

À une époque où une VM ou une instance cloud se déploie en minutes et est accessible sur Internet dès le premier boot, l’intérêt pour des outils d’endurecimiento automatisé qui appliquent les meilleures pratiques sans laisser de failles s’est accru. Parmi les plus cités ces derniers mois dans la communauté figure le dépôt konstruktoid/hardening: un script d’endurecimiento pour Ubuntu (systemd) qui exécute, dans un ordre précis, une dizaines de contrôles sur kernel, réseau, systemd, fstab, SSH, logging, paquets et plus encore, assurant que le système adopte un profil de sécurité élevé et cohérent.

Ce projet ne se limite pas à “un bash qui fait tout sans explication”. Au contraire : il répertorie toutes les fonctions (préfixe f_) dans l’ordre d’exécution, détaille les modifications apportées par chacune, et prévient des consequences opérationnelles (par exemple, désactiver usb-storage bloque l’utilisation des clés USB à moins d’utiliser USBGuard). L’objectif : fournir des référentiels de contrôle (beaucoup alignés avec les recommandations CIS, Ubuntu, Mozilla) pour des admins souhaitant automatiser leur baseline sans entrer dans des cadres de conformité complexes.


Une symphonie en plusieurs mouvements : du kernel à systemd, du réseau à l’utilisateur

Le script suit un ordre logique qui minimise les risques et résout les dépendances entre blocs. La séquence, grosso modo, est la suivante :

1) Pré-contrôle : permissions et apt

La fonction pre fixe des flags pour APT et vérifie les permissions de base. Sans ces fondations, certaines étapes ultérieures (installation, nettoyage, configuration noexec en /tmp) pourraient échouer.

2) Kernel et réseau : firewall et modules superflus

  • firewall: si UFW est installé, il est configuré. Permet SSH depuis les adresses de $FW_ADMIN vers $SSH_PORT (variable du script), active la journalisation et fixe IPT_SYSCTL=/etc/sysctl.conf.
  • disablenet: désactive les modules réseau moins courants (dccp, sctp, rds, tipc).
  • disablefs: désactive les systèmes de fichiers peu utilisés en production (cramfs, freevxfs, jffs2, ksmbd, hfs, hfsplus, udf).
  • disablemod: désactive les modules risqués ou inutile (bluetooth, firewire, pcspkr, uvcvideo, usb-storage, etc.). Attention : désactiver usb-storage empêche l’utilisation de disques USB ; si des médias externes sont nécessaires, le script prévoit plus tard USBGuard.

3) systemd: cohérence et limites par défaut

  • systemdconf: fixe CrashShell=no, DumpCore=no et des limites conservatrices pour fichiers et processus (par défaut, DefaultLimitNOFILE=1024, DefaultLimitNPROC=1024, DefaultLimitCORE=0) aussi bien dans system.conf global que dans user.conf.
  • resolvedconf: configure systemd-resolved avec des DNS tirés de /etc/resolv.conf, active le DNS over TLS en mode opportunistic, active DNSSEC en allow-downgrade et définit un FallbackDNS à 1.0.0.1.
  • logindconf: renforce la gestion des sessions : IdleAction=lock après 15 minutes, KillUserProcesses=1, RemoveIPC=yes, en excluant root.
  • journalctl: assure la persistance du journal (Storage=persistent), le comprime et le redirige vers syslog. Si le fichier de rsyslog est modifiable, fixe $FileCreateMode 0600 pour assurer les permissions.

4) Temps et fichiers : timesyncd et fstab avec options sécurisées

  • timesyncd: définit serveurs NTP (jusqu’à quatre avec < 50 ms de latence) et RootDistanceMaxSec=1.
  • fstab: ajoute ou ajuste les montages avec nosuid,nodev,noexec là où c’est pertinent :
    • /boot et /home avec nosuid,nodev s’ils existent.
    • /var/log, /var/log/audit et /var/tmp avec nosuid,nodev,noexec si présents.
    • Monte /run/shm et /dev/shm en tmpfs avec rw,noexec,nosuid,nodev.
    • Monte /proc avec nosuid,nodev,noexec,relatime,hidepid=2 (limite la visibilité des processus aux utilisateurs) – classique en hardening.
    • Remplace /tmp dans fstab par un montage tmpfs via systemd.

5) Gestion des paquets et nettoyage des binaires

  • prelink: annule le positionnement préalable des binaires (+ désinstallation de prelink) pour éviter toute altération de signature et assurer l’intégrité.
  • aptget_configure: configure APT pour renforcer la sécurité : interdiction des dépôts non sécurisés, désactivation des recommandations/suggestions, activation de seccomp sandbox, nettoyage automatique hebdomadaire, suppression automatique, etc.
  • aptget: met à jour le système avec les dernières versions disponibles.

6) Bannières, permissions et accès hôtes

  • hosts : configure /etc/hosts.allow et /etc/hosts.deny (TCP Wrappers) pour permettre SSH à certains, en refusant le reste (ALL: ALL), tout en autorisant sshd : ALL : ALLOW.
  • issue : écrit des messages de bienvenue ou d’usage autorisé dans /etc/issue, /etc/issue.net et /etc/motd, en supprimant le script dynamique pour éviter la fuite d’informations en message d’accueil.

7) Utilisateurs, PAM et mots de passe

  • sudo : limite su aux membres du groupe sudo, avec pam_wheel et paramètres (use_pty, logfile, timeout, etc.) pour renforcer la sécurité.
  • logindefs : renforce /etc/login.defs (umask, durée minimale/maximale de mot de passe, méthode d’encryption, etc.).
  • limitsconf : définit les limites de sessions, mémoire, processus dans /etc/security/limits.conf.
  • adduser, useradd : durcissent les paramètres par défaut (droits, shell, inactivité).
  • password : incorpore un fichier /etc/security/pwquality.conf pour imposer une politique de mots de passe robuste, et supprime le PAM nullok pour éviter les mots de passe vides.
  • users : supprime ou désactive les comptes systèmes non essentiels.
  • lockroot : verrouille le compte root si nécessaire.

8) SSH sur le serveur : une configuration moderne et agressive

  • sshconfig / sshdconfig: la configuration est exportée dans /etc/ssh/sshd_config.d/hardening.conf ou modifie le principal si inclusion. Parmi les paramètres :
    • Chiffrement / KEX / MACs : spécification forte (ex : aes256-ctr, hmac-sha2-512, eccd-sha2). [email protected]
    • Accès : désactivation de l’authentification par mot de passe, désactivation de login root, autorisation de membres sudo, port personnalisé.
    • Canaux : désactivation du forwarding TCP, agent, X11, compression.
    • Contrôles : temporisation, tentatives maximales, sessions maximum, intervalle de keepalive.
    • Audit : niveau VERBOSE, bannière dans /etc/issue.net.
    • Hygiène : modes stricts, désactivation DNS, utilisation de PAM, etc.

9) Journaux et audit : journal, rsyslog, AIDE, rkhunter

  • Le journal est configuré en persistance, compression et envoi vers syslog. /etc/rsyslog.conf est ajusté si modifiable.
  • aide : exclut Docker et LXCFS, crée une base initiale et planifie une vérification périodique via systemd.
  • rkhunter : activé en cron quotidien, auto-génère des rapports et alertes.
  • Les autres outils de vérification d’intégrité (aide_post, aide_timer) complètent le processus.

10) Courriel et gestion des core dumps

  • postfix : installe et configure avec inet_interfaces=loopback-only et autres restrictions de sécurité, pour des alertes locales possibles.
  • coredump : désactive le stockage des coredumps (Storage=none) pour éviter la fuite de données sensibles.

11) USBGuard, AppArmor, PATH, umask

  • usbguard: installe et active des règles pour contrôler les dispositifs USB autorisés.
  • aa_enforce: met en mode enforce les profils AppArmor disponibles.
  • path et umask: fixe umask 077 et définit des chemins sécurisés pour root et autres utilisateurs.

12) Paquets : installer ce qui protège, retirer ce qui gêne

  • package_install: installe des outils de sécurité tels que aid, aide-common, cracklib-runtime, debsums, gnupg2, haveged, libpam-pwquality, etc.
  • package_remove: désinstalle les logiciels non essentiels ou risqués, comme apport, autofs, avahi, beep, git (si non nécessaire), etc.
  • restrictcompilers: limite les droits des compilateurs en réglant leur mode à 0750.

13) Cron, at, hôtes et accès à la console

  • cron: désactive atd et ne permet la programmation que pour root.
  • rhosts : supprime les fichiers hosts.equiv et autres .rhosts.
  • rootaccess : restreint l’accès à la console via /etc/security/access.conf et /etc/securetty.

14) Nettoyage et vérifications finales

  • aptget_noexec: ajoute des hooks à APT pour éviter les échecs lors des mises à jour avec /tmp en noexec.
  • aptget_clean: effectue un nettoyage et une suppression automatique des paquets inutiles.
  • systemddelta et post: réalisent de la maintenance et des sauvegardes.
  • checkreboot: avertit si un redémarrage est nécessaire.

Avantages : ordre, cohérence et avertissements “ce qui peut casser”

La force du script réside dans sa capacité à réaliser beaucoup de vérifications dans le bon ordre et à laisser une traces claire. Exemples typiques :

  • Un fstab sécurisé sans casser /tmp : il passe à tmpfs géré par systemd et ajoute les hooks APT pour éviter que dpkg ne échoue à cause de noexec.
  • USB : bloque usb-storage mais installe USBGuard pour autoriser certains périphériques si besoin.
  • SSH : déplace le hardening dans /etc/ssh/sshd_config.d/ si possibilité, évitant d’écraser des configs locales ; la documentation précise où sont écrits les changements.
  • Loggins : consolide journalctl avec persistance, compression et redirection vers syslog, tout en protégeant les fichiers permis par rsyslog.

Ce n’est pas de la “magie” : dans des environnements complexes, il est conseillé de relire chaque fonction, d’adapter les whitelists, groupes et ports, et de faire des tests sur des machines de test ou des snapshots avant déploiement en production.


Pour qui et pourquoi l’utiliser plutôt que manuellement ?

Destiné aux administrateurs et équipes cherchant un baseline robuste sur Ubuntu, sans réécrire toute la politique de sécurité. Comparé à une approche manuelle, il apporte :

  • Idempotence (si l’ordre et les variables sont respectés),
  • Cohérence (les blocs sont conçus comme un tout cohérent),
  • Gain de temps (installation, configuration, nettoyage et vérification en une seule étape).

Il ne remplace pas les CIS Benchmarks ni d’autres cadres, mais rapproche considérablement l’état de la machine de ces recommandations.


Questions fréquentes

Ce hardening peut-il casser mon serveur en production ?
Toute démarche hardening agressive comporte un risque de régressions si certaines dépendances ou configurations spécifiques ne sont pas anticipées (ex : usb-storage si vous utilisez des disques USB, ou noexec dans /tmp si vous avez besoin d’écrire dans ce répertoire). La méthode sûre consiste à faire un snapshot, tester en environnement de staging, examiner les variables (IP d’administration, $SSH_PORT, groupes, services) et déployer par étapes.

Puis-je choisir quelles fonctions exécuter ou pas ?
Oui. La documentation liste la séquence dans l’ordre. Vous pouvez commenter ou invoker sélectivement chaque fonction (toutes débutent par f_). Veillez à respecter leur ordre relatif (par exemple, ne pas configurer fstab en dernier si elle dépend du montage tmpfs en amont).

Ce script remplace-t-il les CIS Benchmarks ou des outils comme Ansible ?
Non. Il s’agit d’un outil pratique d’endurecimiento pour Ubuntu systemd. Pour la conformité (CIS, ISO 27001, etc.), il faudra faire un mapping des contrôles ou envelopper ces fonctions dans des outils d’automatisation comme Ansible ou Terraform, avec des inventaires et tests.

Quels sont les changements les plus “sensibles” ?
Les montages (noexec/nosuid/nodev) en /tmp, /proc et autres répertoires système, la désactivation de modules (notamment usb-storage), la configuration SSH stricte (sans mot de passe, bannière, ports non standards, forwardings désactivés), et la gestion des paquets (par exemple, suppression de rsync si non utilisé). Adaptez selon votre contexte.


Sources

Note : Tous les détails présentés s’appuient sur la documentation du dépôt lié (description des fonctions, paramètres, avertissements). Il est fortement conseillé de consulter le README et les fichiers de configuration (config/*) avant de déployer dans des environnements critiques.

le dernier