Aller au contenu

Modules de sécurité

Mesures complémentaires transverses — Annexe A (C1–C12). (wip)

Ces mesures n’ont pas de numéro ANSSI mais sont essentielles à l’esprit du guide. Couverture des patches linux-hardened (C1), Lockdown LSM (C2), USBGuard (C3), nftables deny-by-default (C4), SSH durci (C5), LUKS2 (C6), NTP/NTS (C7), DNS sécurisé (C8), core dumps désactivés (C9), PAM anti brute-force (C10), bannières légales (C11) et restriction cron/at (C12).

  • enable bool Activer les mesures complémentaires ANSSI (C1–C12).
  • lockdownLevel enum [ "none" "integrity" "confidentiality" ] Niveau Lockdown LSM (C2)
  • lsmStack listOf str Ordre de la pile LSM (C2, R11, R20). Modifie boot.kernelParams lsm=…
  • ntpServers listOf str Serveurs NTP/NTS (C7).
  • useNts bool Activer NTS (Network Time Security) pour l’authentification NTP (C7).
  • sshBanner str Bannière SSH affichée avant l’authentification (C11).
  • cronAllowedUsers listOf str Utilisateurs autorisés à planifier des tâches cron (C12).
  • atAllowedUsers listOf str Utilisateurs autorisés à planifier des tâches at (C12). Reprend cronAllowedUsers par défaut.
  • egressAllowlist listOf str Adresses IPv4/IPv6 ou CIDR autorisées en sortie sous la politique de rejet par défaut renforcée C4. Une liste vide maintient la politique mais seul le trafic loopback et established/related passe (proxy requis).
darkone.security.complement = {
enable = false;
lockdownLevel = "integrity";
lsmStack = [ ];
ntpServers = [ ];
useNts = true;
sshBanner = ''
*** Access restricted to authorized personnel ***
All connections are logged and may be subject to prosecution.
'';
cronAllowedUsers = [ ];
atAllowedUsers = [ ];
egressAllowlist = [ ];
};

Partitionnement, arborescence et permissions des fichiers (R28–R29, R50–R57). (wip)

Couvre les options de montage sécurisées (R28), la restriction de /boot (R29), les permissions des fichiers sensibles (R50), les mots de passe exclus du store (R51), les sockets (R52), les fichiers orphelins (R53), le sticky bit (R54), les répertoires temporaires par utilisateur (R55) et setuid (R56, R57).

  • enable bool Active le durcissement du système de fichiers ANSSI (R28–R29, R50–R57).
  • allowedSetuid listOf str Liste blanche des binaires setuid/setgid autorisés (R56, R57).
  • extraMountHardening listOf str Points de montage à durcir avec nosuid,nodev,noexec (R28). Chaque chemin listé DOIT être une partition séparée déclarée ailleurs (hardware- configuration / disko) ; les options sont fusionnées dans son entrée fileSystems existante. Une liste explicite (plutôt qu’un flag global) évite de deviner le layout et ne crée jamais de montages fantômes. Ne pas lister /home si des utilisateurs y exécutent des scripts — noexec les casserait.
darkone.security.filesystem = {
enable = false;
allowedSetuid = [ ];
extraMountHardening = [ ];
};

Intégrité du système de fichiers — HIDS (R76–R77). (en cours)

Couvre le scellement et la vérification d’intégrité via AIDE (R76) et la protection de la base de données scellée avec signature GPG plus copie distante (R77).

  • enable bool Activer l’intégrité ANSSI HIDS — AIDE (R76–R77).
  • aideRemoteCopy nullOr ( submodule { options = { host = lib.mkOption { type = str; description = "Remote host for the AIDE database copy."; }; sshKeyFile = lib.mkOption { type = path; description = "Path to the private SSH key for the remote copy."; }; }; } ) Copie distante de la base de données AIDE signée par GPG (R77). null = désactivé.
    • host str Hôte distant pour la copie de la base de données AIDE.
    • sshKeyFile path Chemin vers la clé SSH privée pour la copie distante.
darkone.security.integrity = {
enable = false;
aideRemoteCopy = null;
aideRemoteCopy.host = null;
aideRemoteCopy.sshKeyFile = null;
};

Journalisation et auditd (R71–R73). (en cours)

Couvre la journalisation persistante avec forwarding TLS (R71), journaux dédiés par service (R72) et auditd avec règles ANSSI (R73).

  • enable bool Activer la journalisation ANSSI et auditd (R71–R73).
darkone.security.journaling.enable = false;

Configuration du noyau statique — nécessite recompilation (R15–R27). (en cours)

Ces règles nécessitent un noyau personnalisé via boot.kernelPackages. NixOS le permet via structuredExtraConfig. Toutes ces règles portent le tag kernel-recompile : elles sont ignorées si ce tag est dans excludes.

  • enable bool Activer le module de recompilation du noyau ANSSI (R15–R27).
darkone.security.kernel-build.enable = false;

Configuration dynamique du noyau : paramètres d’amorçage et sysctls (R8–R14). (en cours)

Règles applicables sans recompiler le noyau. Couvre les options mémoire (R8), les sysctls système (R9), la désactivation du chargement de modules (R10), Yama/ptrace (R11), les sysctls réseau IPv4 (R12), la désactivation d’IPv6 (R13), et les sysctls du système de fichiers (R14).

  • enable bool Activer les paramètres du noyau dynamiques ANSSI (R8–R14).
darkone.security.kernel-params.enable = false;

Contrôle d’accès obligatoire — MAC (R37, R45–R49). (en cours)

R37 est une méta-règle : valide si au moins R45 (AppArmor) ou R46 (SELinux) est active. SELinux (R46–R49) n’est pas supporté sur NixOS et est exclu par défaut via exceptions. AppArmor (R45) est partiellement supporté.

  • enable bool Activer le module MAC ANSSI — AppArmor/SELinux (R37, R45–R49).
darkone.security.mac.enable = false;

Gestion locale du courrier (R74–R75). (en cours)

Couvre l’MTA local durci à loopback-only (R74) et les alias mail acheminés vers l’adresse de l’administrateur (R75). Ces règles s’appliquent uniquement si un service MTA est actif (Postfix ou OpenSMTPD).

  • enable bool Activer le durcissement MTA ANSSI (R74–R75).
darkone.security.mta.enable = false;

Services réseau — isolation et supervision (R78–R80). (en cours)

Couvre l’isolation des services réseau (R78 : catégorie serveur), durcissement et monitoring des services exposés (R79 : fail2ban, en-têtes HTTP, TLS ANSSI) et réduction de la surface réseau (R80).

  • enable bool Activer le durcissement réseau ANSSI (R78–R80).
  • exposedServices listOf str Services publics pour lesquels fail2ban et supervision seront activés (R79).
  • publicListeners listOf str Services autorisés à écouter sur 0.0.0.0 / :: (R80).
  • httpsHeaders bool Ajoute les en-têtes de sécurité HTTP ANSSI dans Nginx/Caddy (R79).
  • tlsCiphers listOf str Suite de chiffrement TLS ANSSI pour Nginx (R79).
darkone.security.network = {
enable = false;
exposedServices = [ ];
publicListeners = [ ];
httpsHeaders = true;
tlsCiphers = [ ];
};

NSS — Bases de données utilisateurs distantes (R69–R70). (en cours)

Règles applicables uniquement si une NSS externe est active (SSSD, nslcd). Pas actuellement pertinent pour DNF ; voir ce qui peut être fait avec Kanidm + PAM.

Couvre le durcissement des bases de données distantes (R69 : TLS obligatoire) et la séparation des comptes système et annuaire (R70).

  • enable bool Activer le durcissement NSS ANSSI (R69–R70).
darkone.security.nss.enable = false;

Gestion des paquets et mises à jour (R58–R61). (wip)

Couverture de l’installation du strict nécessaire (R58), des dépôts de confiance (R59), des dépôts durcis (R60 : linux_hardened) et des mises à jour régulières (R61).

  • enable bool Activer la gestion des paquets ANSSI (R58–R61).
  • trustedSubstituters listOf str Liste blanche des caches binaires Nix autorisés (R59).
  • trustedPublicKeys listOf str Clés publiques des caches binaires autorisés (R59).
  • allowedUris listOf str Liste blanche de préfixes d’URI récupérables pendant l’évaluation (R59). Restreint builtins.fetch* / les entrées flake aux miroirs internes. Une liste vide désactive la restriction.
  • maxSystemPackages nullOr int Seuil indicatif sur le nombre de paquets système (R58). Émet un avertissement d’évaluation quand dépassé ; null désactive le contrôle.
darkone.security.packages = {
enable = false;
trustedSubstituters = [ ];
trustedPublicKeys = [ ];
allowedUris = [ ];
maxSystemPackages = 200;
};

PAM — Authentification et stockage des mots de passe (R67–R68). (en cours)

Couvre l’authentification PAM distante sécurisée (R67 : SSSD, Kerberos, pam_faillock) et le stockage des mots de passe chiffrés (R68 : yescrypt).

  • enable bool Activer le module PAM ANSSI — authentification et mots de passe (R67–R68).
darkone.security.pam.enable = false;

Configuration matérielle et démarrage sécurisé (R1–R7). (en cours)

Couvre UEFI Secure Boot (R3), lanzaboote, mot de passe du chargeur d’amorçage (R5), UKIs signés (R6) et IOMMU (R7). R1 et R2 (matériel/firmware) sont hors de la portée de NixOS et produisent uniquement une note dans le rapport.

  • enable bool Activer le démarrage sécurisé ANSSI — Secure Boot, IOMMU (R1–R7).
darkone.security.preboot.enable = false;

Durcissement des services systemd (R62–R66). (wip)

Couvre la désactivation des services inutiles (R62), la réduction des fonctionnalités via les options de sécurité systemd (R63), la restriction des privilèges (R64), l’isolation (R65) et le durcissement des composants de conteneurisation (R66).

  • enable bool Active le durcissement des services systemd ANSSI (R62–R66).
  • rootServicesAllowed listOf str services systemd autorisés à tourner en root sans CapabilityBoundingSet (R64).
  • hardenedUnits listOf str Unités systemd auxquelles la base de durcissement ANSSI est appliquée (R52 RuntimeDirectoryMode, R55 PrivateTmp, R63 sandbox complète via dnfLib.mkHardenedServiceConfig). Vide par défaut : le sandboxing généralisé peut casser les services nécessitant un accès en écriture ou des appels système supplémentaires, les unités sont donc opt-in. Listez les unités connues du framework qui tolèrent le confinement ; les surcharges serviceConfig par unité prévalent toujours.
darkone.security.services = {
enable = false;
rootServicesAllowed = [ ];
hardenedUnits = [ ];
};

Durcissement de sudo (R38–R44). (en cours)

Couvre le groupe sudo dédié (R38), les directives sudo durcies (R39), la restriction des cibles non-root (R40), la limitation NOEXEC (R41), l’interdiction des négations (R42), la spécification d’arguments explicite (R43), et l’utilisation de sudoedit (R44).

  • enable bool Activer le durcissement sudo ANSSI (R38–R44).
  • allowedRootRules listOf str règles sudo autorisées à cibler root (R40). D’autres doivent cibler un compte de service.
darkone.security.sudo = {
enable = false;
allowedRootRules = [ ];
};

Comptes utilisateurs et authentification (R30–R36). (en cours)

Couvre les comptes inutilisés (R30), la politique de mots de passe (R31), le verrouillage d’inactivité (R32), la responsabilité des administrateurs (R33), les comptes de service (R34), les comptes de service uniques (R35), et umask (R36).

  • enable bool Activer la gestion des comptes ANSSI (R30–R36).
darkone.security.users.enable = false;