Modules de sécurité
🔑 darkone.security.complement
Section intitulée « 🔑 darkone.security.complement »Mesures complémentaires transversales — Annexe A (C1 à C12). (wip)
Ces mesures n’ont pas de numéro ANSSI mais sont essentielles à l’esprit du guide. Couvre les correctifs linux-hardened (C1), Lockdown LSM (C2), USBGuard (C3), nftables deny-by-default (C4), SSH renforcé (C5), LUKS2 (C6), NTP/NTS (C7), DNS sécurisé (C8), core dumps désactivés (C9), PAM anti force brute (C10), bannières légales (C11), et restriction cron/at (C12).
- enable
boolActiver les mesures complémentaires ANSSI (C1 à C12). - lockdownLevel
enum [ "none" "integrity" "confidentiality" ]Niveau Lockdown LSM (C2) - lsmStack
listOf strOrdre de la pile LSM (C2, R11, R20). Modifie boot.kernelParams lsm=… - ntpServers
listOf strServeurs NTP/NTS (C7). - useNts
boolActiver NTS (Network Time Security) pour l’authentification NTP (C7). - sshBanner
strBannière SSH affichée avant l’authentification (C11). - cronAllowedUsers
listOf strUtilisateurs autorisés à planifier des tâches cron (C12). - atAllowedUsers
listOf strUtilisateurs autorisés à planifier des tâches at (C12). Reflète cronAllowedUsers par défaut. - egressAllowlist
listOf strAdresses IPv4/IPv6 ou CIDRs autorisées en sortie sous la politique renforcée deny-by-default de C4. Liste vide conserve la politique mais seul le trafic loopback et établi/lié passe (proxy requis).
darkone.security.complement = { enable = false; lockdownLevel = "integrity"; lsmStack = [ ]; ntpServers = [ ]; useNts = true; sshBanner = '' ╔═════════════════════════════════════════════════════════╗ ║ DNF NETWORK NODE ║ ║ Restricted and monitored access. ║ ║ Unauthorized access may result in criminal prosecution ║ ║ under Articles 323-1 to 323-8 of the French Penal Code. ║ ╚═════════════════════════════════════════════════════════╝ ''; cronAllowedUsers = [ ]; atAllowedUsers = [ ]; egressAllowlist = [ ];};🔑 darkone.security.filesystem
Section intitulée « 🔑 darkone.security.filesystem »Partitionnement, arborescence de fichiers et permissions (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 magasin (R51), les sockets (R52), les fichiers orphelins (R53), le bit sticky (R54), les répertoires temporaires par utilisateur (R55) et le setuid (R56, R57).
- enable
boolActiver le renforcement ANSSI du système de fichiers (R28–R29, R50–R57). - allowedSetuid
listOf strListe blanche des binaires setuid/setgid tolérés (R56, R57). - tmpfs
boolIndique si R28 prend en charge/tmpen tant que tmpfs durci dimensionné surboot.tmp.tmpfsSize. Régler surfalsepour laisser/tmpsur le système de fichiers où il se trouve déjà — un hôte conservant plusieurs Go de brouillon persistant perd à la fois les données et la RAM qui iraient avec. - tmpNoexec
boolIndique si le/tmpde R28 portenoexec. Lenoexecbloque l’exécution directe etdlopen, il perturbe donc tout runtime décompressant des bibliothèques native sur place (Bun, Electron, outils d’agent) ainsi que tout ce qui compile puis s’exécute dansTMPDIR. N’est pertinent que lorsquetmpfsvauttrue. - extraMountHardening
listOf strPoints de montage à durcir avecnosuid,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 l’entréefileSystemsexistante. Une liste explicite (plutôt qu’un indicateur global) évite de deviner la disposition et ne crée jamais de montages fictifs. Ne pas lister/homesi les utilisateurs y exécutent des scripts —noexecles casserait.
darkone.security.filesystem = { enable = false; allowedSetuid = [ ]; tmpfs = true; tmpNoexec = true; extraMountHardening = [ ];};🔑 darkone.security.integrity
Section intitulée « 🔑 darkone.security.integrity »Intégrité du système de fichiers : HIDS (R76–R77). (wip)
Couvre le scellement et la vérification d’intégrité via AIDE (R76) et la protection de la base scellée par signature GPG plus copie distante (R77).
- enable
boolActive l’intégrité HIDS ANSSI — AIDE (R76–R77). - aideRemoteCopy
nullOr submoduleCopie distante de la base AIDE signée GPG (R77). null = désactivée.- host
strHôte distant pour la copie de la base AIDE. - sshKeyFile
pathChemin de la clé SSH privée pour la copie distante.
- host
darkone.security.integrity = { enable = false; aideRemoteCopy = null; aideRemoteCopy.host = null; aideRemoteCopy.sshKeyFile = null;};🔑 darkone.security.journaling
Section intitulée « 🔑 darkone.security.journaling »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
boolActiver la journalisation ANSSI et auditd (R71–R73).
darkone.security.journaling.enable = false;🔑 darkone.security.kernel-build
Section intitulée « 🔑 darkone.security.kernel-build »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
boolActiver le module de recompilation du noyau ANSSI (R15–R27).
darkone.security.kernel-build.enable = false;🔑 darkone.security.kernel-params
Section intitulée « 🔑 darkone.security.kernel-params »Configuration dynamique du noyau : paramètres de démarrage et sysctls (R8–R14). (wip)
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 des systèmes de fichiers (R14).
- enable
boolActiver les paramètres noyau dynamiques ANSSI (R8–R14). - restrictUserns
boolR9 : interdire les namespaces utilisateur non privilégiés (user.max_user_namespaces). Casse Flatpak, bubblewrap et Podman sans root, reste donc optionnel et convient aux serveurs qui n’en utilisent aucun. - disableSmt
boolR8 : désactiver l’hyperthreading. Trois paramètres le portent ;falseles ramène chacun à sa forme préservant le SMT et laisse les quatorze autres inchangés. À noter :l1tf=fullsupprime le SMT même sansforce— il ne laisse que le paramètre sysfs — le repli est doncflush. - memoryDebug
boolR8 : les extras de l’allocateur —slub_debug=FZP,page_poison=onetslab_nomerge=yes. Aucun des trois ne figure dans la liste ANSSI R8, etpage_poisonévinceinit_on_alloc/init_on_free, que l’ANSSI demande pourtant : le noyau le précise au démarrage et privilégie la fonctionnalité de débogage. La désactivation restaure l’effacement spécifié et rend 7 % d’une compilation (95 s à 88 s, ms-a2, SMT activé). - disableIpv6
boolR13 : désactiver complètement IPv6. Désactivé par défaut — l’ANSSI elle-même préfère durcir IPv6 plutôt que de le supprimer, et un hôte public en a généralement besoin.
darkone.security.kernel-params = { enable = false; restrictUserns = false; disableSmt = true; memoryDebug = true; disableIpv6 = false;};🔑 darkone.security.mac
Section intitulée « 🔑 darkone.security.mac »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
boolActiver le module MAC ANSSI — AppArmor/SELinux (R37, R45–R49).
darkone.security.mac.enable = false;🔑 darkone.security.mta
Section intitulée « 🔑 darkone.security.mta »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
boolActiver le durcissement MTA ANSSI (R74–R75).
darkone.security.mta.enable = false;🔑 darkone.security.network
Section intitulée « 🔑 darkone.security.network »Services réseau — isolation et supervision (R78–R80). (wip)
Couvre l’isolation des services réseau (R78 : catégorie serveur), le durcissement et la surveillance des services exposés (R79 : fail2ban, en-têtes HTTP, TLS ANSSI) et la réduction de la surface réseau (R80).
- enable
boolActiver le durcissement réseau ANSSI (R78–R80). - exposedServices
listOf strServices publics à mettre en prison avec fail2ban (R79). Chaque entrée DOIT résoudre vers un filtre — celui fourni par fail2ban, ou celui déclaré dansfilters— sinon l’assertion refuse le build. - filters
attrsFiltres utilisables dansexposedServices, en plus de ceux fournis par fail2ban. Caddy, Synapse et Kanidm nécessitent que les leurs soient rédigés contre de vraies sorties journal — les déclarer ici une fois les motifs confirmés.- journalmatch
strCorrespondance journal pour la prison (fail2ban fonctionne avec le backend systemd). - failregex
strMotif d’échec, écrit dansfilter.d/<name>.conf. Vide lorsque fourni par fail2ban et que seule la correspondance manque.
- journalmatch
- publicListeners
listOf strServices autorisés à écouter sur 0.0.0.0 / :: (R80). - httpsHeaders
boolAjoute les en-têtes de sécurité HTTP ANSSI dans Nginx/Caddy (R79). - tlsCiphers
listOf strSuite de cipher TLS ANSSI pour Nginx (R79).
darkone.security.network = { enable = false; exposedServices = [ ]; filters.journalmatch = "_SYSTEMD_UNIT=forgejo.service"; filters.failregex = ""; publicListeners = [ ]; httpsHeaders = true; tlsCiphers = [ ];};🔑 darkone.security.nss
Section intitulée « 🔑 darkone.security.nss »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
boolActiver le durcissement NSS ANSSI (R69–R70).
darkone.security.nss.enable = false;🔑 darkone.security.packages
Section intitulée « 🔑 darkone.security.packages »Gestion des paquets et mises à jour (R58–R61). (wip)
Couvre l’installation de ce qui est strictement nécessaire (R58), les dépôts de confiance (R59), les dépôts durcis (R60 : linux_hardened), et les mises à jour régulières (R61).
- enable
boolActive la gestion ANSSI des paquets (R58–R61). - trustedSubstituters
listOf strAllowlist des caches binaires Nix autorisés (R59). - trustedPublicKeys
listOf strClés publiques des caches binaires autorisés (R59). - allowedUris
listOf strAllowlist de préfixes d’URI fetchables pendant l’évaluation (R59). Restreint builtins.fetch* / les inputs de flake aux miroirs internes. Liste vide : restriction désactivée. - maxSystemPackages
nullOr intSeuil souple sur le nombre de paquets système (R58). Émet un avertissement d’évaluation quand il est dépassé ; null désactive la vérification.
darkone.security.packages = { enable = false; trustedSubstituters = [ ]; trustedPublicKeys = [ ]; allowedUris = [ ]; maxSystemPackages = 200;};🔑 darkone.security.pam
Section intitulée « 🔑 darkone.security.pam »PAM — Authentification et stockage des mots de passe (R67–R68). (wip)
Couvre l’authentification PAM distante sécurisée (R67 : SSSD, Kerberos, pam_faillock) et le stockage chiffré des mots de passe (R68 : yescrypt).
- enable
boolActiver le module ANSSI PAM — authentification et mots de passe (R67–R68). - faillock.deny
ints.positiveNombre d’échecs avant le verrouillage par pam_faillock (R67). - faillock.unlockTime
ints.positiveSecondes pendant lesquelles le compte reste verrouillé (R67). Déverrouiller plus tôt avecfaillock --reset.
darkone.security.pam = { enable = false; faillock.deny = 3; faillock.unlockTime = 900;};🔑 darkone.security.preboot
Section intitulée « 🔑 darkone.security.preboot »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
boolActiver le démarrage sécurisé ANSSI — Secure Boot, IOMMU (R1–R7).
darkone.security.preboot.enable = false;🔑 darkone.security.services
Section intitulée « 🔑 darkone.security.services »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
boolActive le durcissement ANSSI des services systemd (R62–R66). - rootServicesAllowed
listOf strServices systemd autorisés à tourner en root sans CapabilityBoundingSet (R64). - hardenedUnits
listOf strUnités systemd sur lesquelles la baseline de durcissement ANSSI est appliquée (R52 RuntimeDirectoryMode, R55 PrivateTmp, R63 sandbox complet viadnfLib.mkHardenedServiceConfig). Vide par défaut : un sandboxing général peut casser des services qui ont besoin d’accès en écriture ou de syscalls supplémentaires, donc les unités sont opt-in. Lister les unités propres au framework connues pour tolérer le confinement ; les overridesserviceConfigpar unité gagnent toujours.
darkone.security.services = { enable = false; rootServicesAllowed = [ ]; hardenedUnits = [ ];};🔑 darkone.security.sudo
Section intitulée « 🔑 darkone.security.sudo »Durcissement de sudo (R38–R44). (wip)
Couvre le groupe sudo dédié (R38), les directives sudo renforcées (R39), la restriction des cibles non-root (R40), la limitation NOEXEC (R41), l’interdiction des négations (R42), la spécification explicite des arguments (R43), et l’utilisation de sudoedit (R44).
- enable
boolActiver le durcissement ANSSI de sudo (R38–R44). - allowedRootRules
listOf strRègles sudo autorisées à cibler root (R40). Les autres doivent cibler un compte de service.
darkone.security.sudo = { enable = false; allowedRootRules = [ ];};🔑 darkone.security.users
Section intitulée « 🔑 darkone.security.users »Comptes utilisateurs et authentification (R30–R36). (wip)
Couvre les comptes inutilisés (R30), la politique de mots de passe (R31), le verrouillage par inactivité (R32), la redevabilité des administrateurs (R33), les comptes de service (R34), les comptes de service uniques (R35), et le umask (R36).
- enable
boolActiver la gestion ANSSI des comptes (R30–R36). - idleTimeout
ints.unsignedSecondes avant qu’un shell de connexion inactif ne se ferme (R32,TMOUT).0supprime entièrement le délai TTY ; le verrouillage d’inactivité GNOME n’est pas affecté. Les postes de travail conservant des terminaux à longue durée (ferme de build, outils d’agent) définissent0.
darkone.security.users = { enable = false; idleTimeout = 600;};