Compare commits
3
Commits
8735b8336c
...
ec562a3655
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
ec562a3655 | ||
|
|
fddcca0e51 | ||
|
|
bfd7ed4eed |
+21
-56
@@ -4,65 +4,36 @@
|
|||||||
{
|
{
|
||||||
imports = [ ../../modules/anssi ];
|
imports = [ ../../modules/anssi ];
|
||||||
|
|
||||||
# Toutes les machines de la flotte portent le même nom : pas
|
# Nom uniforme, pas d'identification individuelle pour l'instant (voir
|
||||||
# d'identification individuelle pour l'instant (voir README du repo
|
# README). À revoir via le numéro de série DMI si le besoin apparaît.
|
||||||
# racine). À revoir plus tard via le numéro de série DMI si un vrai
|
|
||||||
# besoin d'identification apparaît.
|
|
||||||
networking.hostName = "Nixos_Fleet";
|
networking.hostName = "Nixos_Fleet";
|
||||||
networking.networkmanager.enable = true;
|
networking.networkmanager.enable = true;
|
||||||
|
|
||||||
# Firmware au maximum (wifi/Bluetooth/PCI en tout genre), pour coller à
|
# Couverture matérielle maximale (wifi/Bluetooth/PCI) sur un parc
|
||||||
# un parc de PC hétérogène et inconnu à l'avance -- même logique que
|
# hétérogène inconnu à l'avance. Inclut enableRedistributableFirmware.
|
||||||
# Linux Mint, qui embarque les firmwares non-libres par défaut plutôt
|
|
||||||
# que de s'en tenir au strict libre.
|
|
||||||
# enableAllFirmware inclut déjà enableRedistributableFirmware (son
|
|
||||||
# défaut est `config.hardware.enableAllFirmware`, vérifié dans le
|
|
||||||
# source nixpkgs : nixos/modules/hardware/all-firmware.nix), donc pas
|
|
||||||
# besoin de déclarer les deux. Ce que enableAllFirmware ajoute EN PLUS
|
|
||||||
# du strict redistribuable (même fichier source) :
|
|
||||||
# - broadcom-bt-firmware (Bluetooth Broadcom, très répandu)
|
|
||||||
# - b43Firmware (wifi Broadcom BCM43xx)
|
|
||||||
# - xone-dongle-firmware, facetimehd-firmware
|
|
||||||
# Nécessite nixpkgs.config.allowUnfree = true (déjà réglé plus bas).
|
|
||||||
# hardware.wirelessRegulatoryDatabase s'active automatiquement dès que
|
|
||||||
# l'un des deux est vrai (même fichier source) -- pas besoin de le
|
|
||||||
# régler à la main.
|
|
||||||
# mkDefault : un profil peut désactiver au cas par cas.
|
|
||||||
hardware.enableAllFirmware = lib.mkDefault true;
|
hardware.enableAllFirmware = lib.mkDefault true;
|
||||||
|
|
||||||
# Durcissement : reprend le module ANSSI de SécurixOS (modules/anssi/,
|
# Durcissement ANSSI (modules/anssi/, vendored depuis SécurixOS).
|
||||||
# vendored ci-dessus), qui remplace/couvre déjà tous les sysctls qui
|
# level "intermediary" : couvre déjà tout ce qui était réglé à la main
|
||||||
# étaient déclarés à la main sur le profil oreo (dmesg_restrict,
|
# sur le profil oreo (R9/R11/R12/R14). category "client" : postes de
|
||||||
# kptr_restrict, yama.ptrace_scope, rp_filter, tcp_syncookies,
|
# travail, pas des serveurs.
|
||||||
# protected_hardlinks/symlinks -- mêmes valeurs, vérifié règle par
|
|
||||||
# règle dans modules/anssi/kernel-options.nix : R9, R11, R12, R14).
|
|
||||||
# level "intermediary" : c'est le niveau que couvraient déjà TOUTES
|
|
||||||
# les valeurs qu'on avait mises à la main sur oreo -- rien de plus
|
|
||||||
# fort n'a été inventé ici. category "client" : ce sont des postes de
|
|
||||||
# travail, pas des serveurs (les règles actuellement implémentées sont
|
|
||||||
# toutes "category = base" donc ça ne change rien pour l'instant, mais
|
|
||||||
# c'est le bon réglage si Sécurix ajoute des règles catégorisées).
|
|
||||||
#
|
#
|
||||||
# ATTENTION : R12 force net.ipv4.ip_forward = 0. Sans impact ici (ce
|
# R12 force net.ipv4.ip_forward = 0 : sans impact sur des postes
|
||||||
# sont des postes clients), mais à ne SURTOUT PAS importer sur
|
# clients. Ne pas importer ce module sur pxe-server/configuration.nix
|
||||||
# pxe-server/configuration.nix, qui a besoin l'inverse (voir son
|
# (a besoin du forwarding inverse).
|
||||||
# networking.nat) -- pxe-server n'importe pas ce fichier, donc ok.
|
|
||||||
security.anssi = {
|
security.anssi = {
|
||||||
enable = true;
|
enable = true;
|
||||||
level = "intermediary";
|
level = "intermediary";
|
||||||
category = "client";
|
category = "client";
|
||||||
|
|
||||||
# R8 (mitigations CPU) désactive l'hyperthreading via "mds=full,nosmt"
|
# R8 (mitigations CPU) coupe l'hyperthreading via "mds=full,nosmt" :
|
||||||
# -- impact perf trop lourd sur le matériel bas de gamme du parc (PC
|
# trop coûteux sur le matériel bas de gamme du parc. Désactivé via
|
||||||
# à 4 Go de RAM). On désactive donc la règle via le mécanisme d'exception
|
# exception plutôt que contourné en silence ; réappliqué ci-dessous
|
||||||
# prévu par le module lui-même (modules/anssi/options.nix), PAS en la
|
# sans le "nosmt".
|
||||||
# contournant en silence.
|
exceptions.R8.rationale = "SMT conservé : impact perf trop lourd sur le parc (matériel bas de gamme, parfois 4 Go de RAM). Mitigations réappliquées ci-dessous sans 'nosmt'.";
|
||||||
exceptions.R8.rationale = "SMT (hyperthreading) volontairement conservé : impact perf trop lourd sur le parc (matériel bas de gamme, parfois 4 Go de RAM). Les autres mitigations de R8 sont réappliquées ci-dessous, à l'identique du texte source (modules/anssi/kernel-options.nix), sauf 'nosmt' remplacé par la valeur alternative documentée 'mds=full' (mitige MDS sans couper l'hyperthreading).";
|
|
||||||
};
|
};
|
||||||
|
|
||||||
# Reprise verbatim de modules/anssi/kernel-options.nix (règle R8), sauf
|
# R8 (modules/anssi/kernel-options.nix), sauf mds=full,nosmt -> mds=full.
|
||||||
# "mds=full,nosmt" -> "mds=full" (voir exception R8 ci-dessus). Toutes
|
|
||||||
# les autres valeurs viennent du texte source, aucune n'est inventée.
|
|
||||||
boot.kernelParams = [
|
boot.kernelParams = [
|
||||||
"l1tf=full,force"
|
"l1tf=full,force"
|
||||||
"page_poison=on"
|
"page_poison=on"
|
||||||
@@ -77,9 +48,8 @@
|
|||||||
"rng_core.default_quality=500"
|
"rng_core.default_quality=500"
|
||||||
];
|
];
|
||||||
|
|
||||||
# Pas (encore) couvert par le module ANSSI ci-dessus (R45 y est
|
# Pas couvert par le module ANSSI (R45 en exception : AppArmor
|
||||||
# explicitement listé en exception : "AppArmor is partially supported
|
# partiellement supporté sur NixOS).
|
||||||
# on NixOS", modules/anssi/base.nix) -- repris tel quel du profil oreo.
|
|
||||||
systemd.coredump.enable = false;
|
systemd.coredump.enable = false;
|
||||||
security.apparmor.packages = [ pkgs.apparmor-profiles ];
|
security.apparmor.packages = [ pkgs.apparmor-profiles ];
|
||||||
security.apparmor.enableCache = true;
|
security.apparmor.enableCache = true;
|
||||||
@@ -109,9 +79,7 @@
|
|||||||
services.openssh.enable = true;
|
services.openssh.enable = true;
|
||||||
networking.firewall.enable = true;
|
networking.firewall.enable = true;
|
||||||
|
|
||||||
# Certains PC du parc n'ont que 4 Go de RAM (Cinnamon + Firefox +
|
# Swap compressé en RAM : couvre le bas du parc (4 Go, desktop complet).
|
||||||
# LibreOffice + VLC peuvent solliciter la mémoire) — swap compressé en
|
|
||||||
# RAM, marche identiquement quelle que soit la machine.
|
|
||||||
zramSwap = {
|
zramSwap = {
|
||||||
enable = true;
|
enable = true;
|
||||||
memoryPercent = 50;
|
memoryPercent = 50;
|
||||||
@@ -129,10 +97,7 @@
|
|||||||
options = "--delete-older-than 30d";
|
options = "--delete-older-than 30d";
|
||||||
};
|
};
|
||||||
|
|
||||||
# Convergence : chaque machine de la flotte tire ses mises à jour du
|
# Convergence automatique depuis le repo public, sans netrc.
|
||||||
# même repo public, sans intervention humaine (pas de netrc nécessaire
|
|
||||||
# ici, contrairement au repo nixos_users). Voir README pour adapter
|
|
||||||
# l'URL réelle du repo.
|
|
||||||
system.autoUpgrade = {
|
system.autoUpgrade = {
|
||||||
enable = true;
|
enable = true;
|
||||||
dates = "daily";
|
dates = "daily";
|
||||||
|
|||||||
@@ -15,19 +15,16 @@
|
|||||||
warpinator
|
warpinator
|
||||||
];
|
];
|
||||||
|
|
||||||
# Fond d'écran par défaut (juste le logo NixOS, pas la galerie perso de
|
# Fond d'écran par défaut (logo NixOS, pas la galerie perso de
|
||||||
# nixos_cinnamon -- repo public, on n'y met que ce qui est nécessaire).
|
# nixos_cinnamon). Suppose la config installée sur /etc/nixos (voir
|
||||||
# Ce chemin (/etc/nixos) suppose la config installée là -- voir
|
# installer/install.sh).
|
||||||
# nixos_fleet/installer/install.sh (do_install copie le clone sur le
|
|
||||||
# disque cible après nixos-install).
|
|
||||||
environment.etc."dconf/db/local.d/00-background".text = ''
|
environment.etc."dconf/db/local.d/00-background".text = ''
|
||||||
[org/cinnamon/desktop/background]
|
[org/cinnamon/desktop/background]
|
||||||
picture-uri='file:///etc/nixos/hosts/common/wallpaper/Nix/13977413.png'
|
picture-uri='file:///etc/nixos/hosts/common/wallpaper/Nix/13977413.png'
|
||||||
'';
|
'';
|
||||||
system.activationScripts.dconfUpdate.text = "${pkgs.dconf}/bin/dconf update";
|
system.activationScripts.dconfUpdate.text = "${pkgs.dconf}/bin/dconf update";
|
||||||
|
|
||||||
# Réglages de confidentialité génériques (pas de SearXNG/DNS personnels
|
# Confidentialité générique (pas de SearXNG/DNS perso : repo public).
|
||||||
# comme sur le poste perso — cette config est destinée à être publique).
|
|
||||||
programs.firefox = {
|
programs.firefox = {
|
||||||
enable = true;
|
enable = true;
|
||||||
languagePacks = [ "fr" ];
|
languagePacks = [ "fr" ];
|
||||||
@@ -40,6 +37,9 @@
|
|||||||
"media.peerconnection.enabled" = false;
|
"media.peerconnection.enabled" = false;
|
||||||
"geo.enabled" = false;
|
"geo.enabled" = false;
|
||||||
"network.captive-portal-service.enabled" = false;
|
"network.captive-portal-service.enabled" = false;
|
||||||
|
# Do Not Track : plus d'UI depuis les versions récentes de Firefox,
|
||||||
|
# mais le pref existe encore et envoie bien l'en-tête DNT=1.
|
||||||
|
"privacy.donottrackheader.enabled" = true;
|
||||||
};
|
};
|
||||||
|
|
||||||
policies = {
|
policies = {
|
||||||
@@ -52,11 +52,27 @@
|
|||||||
Value = true;
|
Value = true;
|
||||||
Locked = true;
|
Locked = true;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
# DuckDuckGo est un moteur intégré à Firefox, pas besoin de l'Add.
|
||||||
|
SearchEngines.Default = "DuckDuckGo";
|
||||||
|
|
||||||
|
# Pubs/contenu sponsorisé sur le nouvel onglet et la barre d'adresse.
|
||||||
|
FirefoxHome = {
|
||||||
|
SponsoredTopSites = false;
|
||||||
|
SponsoredPocket = false;
|
||||||
|
Locked = true;
|
||||||
|
};
|
||||||
|
FirefoxSuggest.SponsoredSuggestions = false;
|
||||||
|
|
||||||
ExtensionSettings = {
|
ExtensionSettings = {
|
||||||
"uBlock0@raymondhill.net" = {
|
"uBlock0@raymondhill.net" = {
|
||||||
install_url = "https://addons.mozilla.org/firefox/downloads/latest/ublock-origin/latest.xpi";
|
install_url = "https://addons.mozilla.org/firefox/downloads/latest/ublock-origin/latest.xpi";
|
||||||
installation_mode = "force_installed";
|
installation_mode = "force_installed";
|
||||||
};
|
};
|
||||||
|
"jid1-MnnxcxisBPnSXQ@jetpack" = {
|
||||||
|
install_url = "https://addons.mozilla.org/firefox/downloads/latest/privacy-badger17/latest.xpi";
|
||||||
|
installation_mode = "force_installed";
|
||||||
|
};
|
||||||
};
|
};
|
||||||
};
|
};
|
||||||
};
|
};
|
||||||
|
|||||||
+47
-70
@@ -1,47 +1,37 @@
|
|||||||
# Pas de shebang ici : ce fichier est injecté comme corps de script par
|
# Injecté comme corps de script par pkgs.writeShellScriptBin
|
||||||
# pkgs.writeShellScriptBin dans installer-base.nix (qui ajoute juste
|
# (installer-base.nix) : pas de mode strict par défaut, d'où le `set`
|
||||||
# `#!...`, PAS de mode strict — d'où le `set` explicite ci-dessous : sans
|
# explicite ci-dessous.
|
||||||
# lui, une erreur (ex: DNS indisponible) n'arrête pas le script, qui
|
|
||||||
# continuait jusqu'au reboot final en masquant l'échec.
|
|
||||||
set -euo pipefail
|
set -euo pipefail
|
||||||
|
|
||||||
# Installeur unique pour les deux repos :
|
# Installeur unique pour les deux repos :
|
||||||
# - branche "flotte" -> nixos_fleet (public, jamais chiffré)
|
# - branche "flotte" -> nixos_fleet (public, jamais chiffré)
|
||||||
# - branche "utilisateur nommé" -> nixos_users (privé, chiffrement au choix)
|
# - branche "utilisateur nommé" -> nixos_users (privé, chiffrement au choix)
|
||||||
# Ce script ne contient aucun secret : le token du repo privé est saisi en
|
# Le token du repo privé est saisi en direct, jamais stocké dans ce
|
||||||
# direct, jamais stocké dans ce fichier ni dans un repo git.
|
# fichier ni dans un repo git.
|
||||||
|
|
||||||
FLEET_REPO="git+https://gitea.miniclic.net/Damien/Nixos_Fleet.git"
|
FLEET_REPO="git+https://gitea.miniclic.net/Damien/Nixos_Fleet.git"
|
||||||
USERS_REPO_HOST="gitea.miniclic.net"
|
USERS_REPO_HOST="gitea.miniclic.net"
|
||||||
USERS_REPO_PATH="Damien/Nixos_Users.git"
|
USERS_REPO_PATH="Damien/Nixos_Users.git"
|
||||||
|
|
||||||
# Le script se lance dès le login (autologin), potentiellement avant que
|
# Le script se lance dès le login (autologin), potentiellement avant que
|
||||||
# NetworkManager ait fini de négocier le DHCP. On attend une route par
|
# NetworkManager ait fini de négocier le DHCP.
|
||||||
# défaut avant de continuer (jusqu'à 30s), plutôt que d'échouer trop tôt.
|
|
||||||
echo "Attente du réseau..."
|
echo "Attente du réseau..."
|
||||||
for _ in $(seq 1 30); do
|
for _ in $(seq 1 30); do
|
||||||
ip route | grep -q '^default' && break
|
ip route | grep -q '^default' && break
|
||||||
sleep 1
|
sleep 1
|
||||||
done
|
done
|
||||||
|
|
||||||
# Installe en 4 étapes séparées (clone -> partition -> swap sur le disque
|
# 4 étapes séparées (clone -> partition -> swap sur le disque cible ->
|
||||||
# cible -> vrai build) au lieu d'un seul `disko-install`. Raison : disko-
|
# build) plutôt qu'un seul `disko-install` : ce dernier construit tout
|
||||||
# install fait tout d'un coup dans le tmpfs RAM de l'environnement live,
|
# dans le tmpfs RAM de l'environnement live, qui sature sur les PC à
|
||||||
# qui sature sur les PC à peu de RAM (4 Go) avant même de toucher le
|
# 4 Go avant même de toucher le disque cible. Le swapfile posé sur /mnt
|
||||||
# disque cible. Un swapfile posé sur /mnt (une fois partitionné) donne
|
# donne accès au disque comme mémoire virtuelle pendant le build.
|
||||||
# accès aux ~200 Go du disque comme mémoire virtuelle pendant la vraie
|
|
||||||
# construction — méthode documentée officiellement pour RAM limitée
|
|
||||||
# (wiki.nixos.org/wiki/Swap, manuel NixOS section installation).
|
|
||||||
#
|
#
|
||||||
# Le clone local est nécessaire car la commande `disko` seule (contrairement
|
# Le clone local est nécessaire : `disko` seul (contrairement à
|
||||||
# à `disko-install`) n'a AUCUN mécanisme de substitution de disque nommé
|
# `disko-install`) n'a aucun mécanisme de substitution de disque nommé.
|
||||||
# (`--disk`/diskMappings n'existe que dans install-cli.nix, utilisé
|
# On substitue donc le vrai disque dans une copie locale du fichier
|
||||||
# uniquement par disko-install — vérifié dans le code source de
|
# disko (sed), puis `disko` et `nixos-install` pointent tous les deux
|
||||||
# nix-community/disko : fichiers disko, disko-install, cli.nix). On substitue
|
# sur ce même clone.
|
||||||
# donc le vrai disque directement dans une copie locale du fichier disko
|
|
||||||
# avec sed, puis on pointe `disko` ET `nixos-install` sur ce même clone
|
|
||||||
# (chemin local, pas l'URL distante) pour que le partitionnement et le
|
|
||||||
# système construit restent cohérents entre eux.
|
|
||||||
do_install() {
|
do_install() {
|
||||||
local remote_url="$1" # URL flake (git+https://...), pour cloner
|
local remote_url="$1" # URL flake (git+https://...), pour cloner
|
||||||
local attr="$2"
|
local attr="$2"
|
||||||
@@ -58,21 +48,16 @@ do_install() {
|
|||||||
sed -i "s#/dev/placeholder#$DEVICE#" "$repo_dir/$disko_rel_path"
|
sed -i "s#/dev/placeholder#$DEVICE#" "$repo_dir/$disko_rel_path"
|
||||||
|
|
||||||
echo "Partitionnement de $DEVICE..."
|
echo "Partitionnement de $DEVICE..."
|
||||||
# --yes-wipe-all-disks : évite la confirmation interactive "type yes to
|
# --yes-wipe-all-disks : évite la confirmation interactive, un install
|
||||||
# continue" (vu dans le code source de la commande disko) — un install
|
# de flotte ne doit dépendre de personne au clavier.
|
||||||
# de flotte ne doit pas dépendre de quelqu'un présent au clavier pour
|
|
||||||
# confirmer, l'effacement est le but assumé de ce script.
|
|
||||||
nix run --no-write-lock-file --refresh 'github:nix-community/disko' -- \
|
nix run --no-write-lock-file --refresh 'github:nix-community/disko' -- \
|
||||||
--mode destroy,format,mount \
|
--mode destroy,format,mount \
|
||||||
--yes-wipe-all-disks \
|
--yes-wipe-all-disks \
|
||||||
"$repo_dir/$disko_rel_path"
|
"$repo_dir/$disko_rel_path"
|
||||||
|
|
||||||
echo "Swap temporaire sur le disque cible (RAM limitée sur certains PC du parc)..."
|
echo "Swap temporaire sur le disque cible (RAM limitée sur certains PC du parc)..."
|
||||||
# Sur btrfs (notre système de fichiers), le CoW doit être désactivé
|
# btrfs : chattr +C (NOCOW) doit précéder toute écriture dans le
|
||||||
# (chattr +C) AVANT toute écriture de données dans le fichier, sinon
|
# fichier, sinon swapon échoue avec "Invalid argument".
|
||||||
# swapon échoue avec "Invalid argument" (source : btrfs.readthedocs.io/
|
|
||||||
# en/latest/Swapfile.html — chattr +C sur un fichier déjà écrit ne
|
|
||||||
# s'applique pas rétroactivement).
|
|
||||||
truncate -s 0 /mnt/.install-swapfile
|
truncate -s 0 /mnt/.install-swapfile
|
||||||
chattr +C /mnt/.install-swapfile
|
chattr +C /mnt/.install-swapfile
|
||||||
fallocate -l 4G /mnt/.install-swapfile
|
fallocate -l 4G /mnt/.install-swapfile
|
||||||
@@ -81,41 +66,36 @@ do_install() {
|
|||||||
swapon /mnt/.install-swapfile
|
swapon /mnt/.install-swapfile
|
||||||
|
|
||||||
echo "Construction et installation du système (peut prendre plusieurs minutes)..."
|
echo "Construction et installation du système (peut prendre plusieurs minutes)..."
|
||||||
# --no-channel-copy, --no-root-passwd : confirmés dans le man nixos-install
|
# --no-root-passwd : le mot de passe root est déjà déclaré
|
||||||
# (mankier.com/8/nixos-install, miroir du manuel officiel). Le mot de
|
# (initialPassword) côté cible, on évite juste un prompt interactif.
|
||||||
# passe root est de toute façon déjà déclaré (initialPassword) dans la
|
# --flake pointe sur le clone local (disque déjà substitué).
|
||||||
# config cible, --no-root-passwd évite juste tout risque de prompt
|
|
||||||
# interactif qui bloquerait un install non surveillé. --flake pointe sur
|
|
||||||
# le clone local (avec le disque déjà substitué), pas l'URL distante,
|
|
||||||
# pour rester cohérent avec ce qui a été partitionné.
|
|
||||||
nixos-install --root /mnt --flake "${repo_dir}#${attr}" --no-channel-copy --no-root-passwd
|
nixos-install --root /mnt --flake "${repo_dir}#${attr}" --no-channel-copy --no-root-passwd
|
||||||
|
|
||||||
swapoff /mnt/.install-swapfile
|
swapoff /mnt/.install-swapfile
|
||||||
rm -f /mnt/.install-swapfile
|
rm -f /mnt/.install-swapfile
|
||||||
|
|
||||||
# Sans cette étape, la machine installée n'a AUCUNE config sur son
|
# Persiste la config sur le disque cible : sans ça, le clone ne vit
|
||||||
# disque : le clone ci-dessus vit dans /tmp de l'environnement live, en
|
# que dans /tmp du live (RAM), effacé au reboot -- plus rien à éditer
|
||||||
# RAM, effacé au reboot. La convergence auto (system.autoUpgrade, voir
|
# ni à `git pull` ensuite. system.autoUpgrade continue de fonctionner
|
||||||
# hosts/common/base.nix) continue de fonctionner sans ça (elle pointe
|
# sans ça (il pointe sur l'URL distante), mais un technicien n'a alors
|
||||||
# sur l'URL distante), mais un technicien qui arrive sur la machine
|
# aucun accès local.
|
||||||
# après coup n'a alors ni /etc/nixos, ni moyen d'ajouter/enlever un
|
|
||||||
# paquet à la main. On installe donc le même clone (déjà substitué avec
|
|
||||||
# le vrai disque) à l'emplacement standard NixOS, en conservant .git
|
|
||||||
# pour que `git pull`/`git log` marchent dessus normalement ensuite.
|
|
||||||
echo "Installation de la configuration dans /mnt/etc/nixos..."
|
echo "Installation de la configuration dans /mnt/etc/nixos..."
|
||||||
rm -rf /mnt/etc/nixos
|
rm -rf /mnt/etc/nixos
|
||||||
mkdir -p /mnt/etc
|
mkdir -p /mnt/etc
|
||||||
cp -a "$repo_dir" /mnt/etc/nixos
|
cp -a "$repo_dir" /mnt/etc/nixos
|
||||||
|
|
||||||
# Le disque cible a été substitué localement (sed plus haut) : ce fichier
|
# installer/ (script d'install, obsolète une fois fait) et
|
||||||
# diffère donc de ce qui est sur git (placeholder). On le committe en
|
# pxe-server/ (config d'un autre host) ne servent à rien sur un poste
|
||||||
# local (jamais poussé) pour que `git status` reste propre sur la
|
# client -- ne concerne que nixos_fleet, ces rm sont des no-op côté
|
||||||
# machine installée -- sinon chaque `git pull` ultérieur affiche un
|
# nixos_users.
|
||||||
# fichier modifié, source de confusion pour un technicien.
|
rm -rf /mnt/etc/nixos/installer /mnt/etc/nixos/pxe-server
|
||||||
|
|
||||||
|
# Committé en local (jamais poussé) pour que `git status` reste propre
|
||||||
|
# sur la machine installée.
|
||||||
git -C /mnt/etc/nixos \
|
git -C /mnt/etc/nixos \
|
||||||
-c user.name="Installeur Nixos_Fleet" \
|
-c user.name="Installeur Nixos_Fleet" \
|
||||||
-c user.email="installeur@nixos-fleet.local" \
|
-c user.email="installeur@nixos-fleet.local" \
|
||||||
commit -aqm "Substitution locale du disque cible ($DEVICE)"
|
commit -aqm "Config locale : disque substitué ($DEVICE), installer/pxe-server retirés (inutiles sur ce poste)"
|
||||||
|
|
||||||
INSTALLED_ATTR="$attr"
|
INSTALLED_ATTR="$attr"
|
||||||
}
|
}
|
||||||
@@ -126,9 +106,8 @@ echo "2) Poste utilisateur nommé"
|
|||||||
read -rp "Choix [1/2] : " CHOICE
|
read -rp "Choix [1/2] : " CHOICE
|
||||||
|
|
||||||
# --- Détection automatique du disque cible -------------------------------
|
# --- Détection automatique du disque cible -------------------------------
|
||||||
# On exclut les disques amovibles (la clé USB de boot elle-même) et les
|
# Exclut les disques amovibles (la clé USB de boot) et les loop/rom.
|
||||||
# loop/rom. S'il en reste plusieurs (rare), on prend le plus gros et on le
|
# S'il en reste plusieurs, on prend le plus gros et on le signale.
|
||||||
# signale clairement dans les logs plutôt que de bloquer sur un menu.
|
|
||||||
echo
|
echo
|
||||||
echo "Détection du disque cible..."
|
echo "Détection du disque cible..."
|
||||||
mapfile -t CANDIDATES < <(
|
mapfile -t CANDIDATES < <(
|
||||||
@@ -152,14 +131,12 @@ fi
|
|||||||
|
|
||||||
case "$CHOICE" in
|
case "$CHOICE" in
|
||||||
1)
|
1)
|
||||||
# --- Branche flotte : rien d'autre à saisir -----------------------
|
|
||||||
echo
|
echo
|
||||||
echo "Installation du profil générique 'usagers' sur $DEVICE..."
|
echo "Installation du profil générique 'usagers' sur $DEVICE..."
|
||||||
do_install "$FLEET_REPO" "usagers" "diskos/plain.nix"
|
do_install "$FLEET_REPO" "usagers" "diskos/plain.nix"
|
||||||
;;
|
;;
|
||||||
|
|
||||||
2)
|
2)
|
||||||
# --- Branche utilisateur nommé -------------------------------------
|
|
||||||
read -rp "Utilisateur (thomas/clara/jade/oreo) : " USER_PROFILE
|
read -rp "Utilisateur (thomas/clara/jade/oreo) : " USER_PROFILE
|
||||||
USER_PROFILE=$(echo "$USER_PROFILE" | tr '[:upper:]' '[:lower:]' | xargs)
|
USER_PROFILE=$(echo "$USER_PROFILE" | tr '[:upper:]' '[:lower:]' | xargs)
|
||||||
case "$USER_PROFILE" in
|
case "$USER_PROFILE" in
|
||||||
@@ -179,8 +156,8 @@ case "$CHOICE" in
|
|||||||
read -rsp "Token Gitea (repo privé Nixos_Users) : " TOKEN
|
read -rsp "Token Gitea (repo privé Nixos_Users) : " TOKEN
|
||||||
echo
|
echo
|
||||||
|
|
||||||
# Le token n'est utilisé qu'en mémoire/ligne de commande pour ce fetch
|
# Utilisé seulement en mémoire/ligne de commande pour ce fetch
|
||||||
# ponctuel : il n'est jamais écrit dans un fichier suivi par git.
|
# ponctuel, jamais écrit dans un fichier suivi par git.
|
||||||
AUTHED_URL="git+https://${TOKEN}@${USERS_REPO_HOST}/${USERS_REPO_PATH}"
|
AUTHED_URL="git+https://${TOKEN}@${USERS_REPO_HOST}/${USERS_REPO_PATH}"
|
||||||
|
|
||||||
echo
|
echo
|
||||||
@@ -192,13 +169,13 @@ case "$CHOICE" in
|
|||||||
fi
|
fi
|
||||||
do_install "$AUTHED_URL" "$ATTR" "$DISKO_REL_PATH"
|
do_install "$AUTHED_URL" "$ATTR" "$DISKO_REL_PATH"
|
||||||
|
|
||||||
# Le système installé doit pouvoir continuer à tirer ses mises à jour
|
# Netrc laissé pour que le système installé continue de tirer ses
|
||||||
# du repo privé tout seul : on lui laisse un netrc, jamais commité,
|
# mises à jour du repo privé tout seul (nix.settings.netrc-file
|
||||||
# jamais dans le Nix store (nix.settings.netrc-file dans le repo
|
# pointe vers ce même chemin côté nixos_users). Jamais commité,
|
||||||
# nixos_users pointe vers ce même chemin).
|
# jamais dans le Nix store.
|
||||||
#
|
#
|
||||||
# ATTENTION : le format exact attendu par Gitea (login=token vs
|
# ATTENTION : le format exact attendu par Gitea (login=token vs
|
||||||
# login+password séparés) dépend de la version/config du serveur —
|
# login+password séparés) dépend de la version/config du serveur --
|
||||||
# à vérifier sur l'instance réelle avant le déploiement pilote.
|
# à vérifier sur l'instance réelle avant le déploiement pilote.
|
||||||
mkdir -p /mnt/etc/nix
|
mkdir -p /mnt/etc/nix
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -1,7 +1,7 @@
|
|||||||
# Environnement live commun aux deux formes d'image (PXE netboot / ISO
|
# Environnement live commun aux deux formes d'image (PXE netboot / ISO
|
||||||
# USB). Contient juste de quoi partitionner et lancer disko-install ; la
|
# USB). Contient juste de quoi partitionner et installer ; la config
|
||||||
# vraie configuration cible est toujours récupérée depuis git au moment
|
# cible est toujours récupérée depuis git au moment de l'install (repo
|
||||||
# de l'install (repo public nixos_fleet ou repo privé nixos_users).
|
# public nixos_fleet ou repo privé nixos_users).
|
||||||
{ pkgs, lib, ... }:
|
{ pkgs, lib, ... }:
|
||||||
|
|
||||||
let
|
let
|
||||||
@@ -13,22 +13,13 @@ in
|
|||||||
"flakes"
|
"flakes"
|
||||||
];
|
];
|
||||||
|
|
||||||
# netboot.nix définit DEUX tmpfs distincts, ni l'un ni l'autre avec une
|
# netboot.nix définit "/" et "/nix/.rw-store" (overlay où atterrissent
|
||||||
# taille explicite -> plafonnés à 50% de la RAM chacun par défaut :
|
# les paquets téléchargés/construits pendant l'install) sans taille
|
||||||
# - "/" : la racine du système live lui-même (petite)
|
# explicite -> 50% de la RAM chacun par défaut. .rw-store sature en
|
||||||
# - "/nix/.rw-store" : la vraie zone où atterrissent tous les nouveaux
|
# premier sur un système complet (Cinnamon + Firefox + LibreOffice +
|
||||||
# paquets téléchargés/construits pendant l'install
|
# VLC), pas "/". mkForce nécessaire : netboot.nix utilise
|
||||||
# (overlay au-dessus du squashfs .ro-store en
|
# mkImageMediaOverride (priorité 60), une assignation simple (100) est
|
||||||
# lecture seule). C'est CELLE-LÀ qui sature en
|
# ignorée ; mkForce remplace toute la liste, d'où mode=0755 remis ici.
|
||||||
# premier sur un système complet (Cinnamon +
|
|
||||||
# Firefox + LibreOffice + VLC...), pas "/".
|
|
||||||
#
|
|
||||||
# netboot.nix définit ces deux options via mkImageMediaOverride, qui vaut
|
|
||||||
# mkOverride 60 — une simple assignation ici (priorité 100 par défaut)
|
|
||||||
# est donc entièrement ignorée, pas fusionnée (constaté : le premier
|
|
||||||
# essai n'a eu aucun effet). Il faut lib.mkForce (priorité 50, plus
|
|
||||||
# fort que 60) pour vraiment gagner — et comme mkForce REMPLACE toute la
|
|
||||||
# liste plutôt que de la compléter, on remet mode=0755 dedans aussi.
|
|
||||||
fileSystems."/".options = lib.mkForce [
|
fileSystems."/".options = lib.mkForce [
|
||||||
"mode=0755"
|
"mode=0755"
|
||||||
"size=20%"
|
"size=20%"
|
||||||
@@ -38,11 +29,9 @@ in
|
|||||||
"size=90%"
|
"size=90%"
|
||||||
];
|
];
|
||||||
|
|
||||||
# Certains PC du parc n'ont que 4 Go de RAM. Le disque cible ne peut pas
|
# Certains PC du parc n'ont que 4 Go de RAM. Le disque cible ne peut
|
||||||
# servir de secours (disko-install l'efface entièrement en une seule
|
# pas servir de secours ici (pas encore partitionné à ce stade) : swap
|
||||||
# opération, un swap posé dessus avant serait détruit en cours de
|
# compressé en RAM (zram), identique en PXE et en USB.
|
||||||
# route) : on utilise du swap compressé en RAM (zram) à la place, qui
|
|
||||||
# marche pareil en PXE et en USB sans dépendre d'un périphérique externe.
|
|
||||||
zramSwap = {
|
zramSwap = {
|
||||||
enable = true;
|
enable = true;
|
||||||
memoryPercent = 100; # jusqu'à 1x la RAM en swap compressé (~2-3x effectif)
|
memoryPercent = 100; # jusqu'à 1x la RAM en swap compressé (~2-3x effectif)
|
||||||
@@ -57,22 +46,14 @@ in
|
|||||||
installScript
|
installScript
|
||||||
];
|
];
|
||||||
|
|
||||||
# disko-install n'est pas préinstallé : install.sh l'invoque via
|
|
||||||
# `nix run github:nix-community/disko#disko-install`, ce qui évite de
|
|
||||||
# dépendre d'un nom de paquet nixpkgs précis (pas de package `disko`
|
|
||||||
# garanti tel quel côté nixpkgs) et reste conforme à l'usage documenté
|
|
||||||
# du projet.
|
|
||||||
|
|
||||||
networking.networkmanager.enable = true;
|
networking.networkmanager.enable = true;
|
||||||
services.xserver.xkb.layout = "fr";
|
services.xserver.xkb.layout = "fr";
|
||||||
console.keyMap = "fr";
|
console.keyMap = "fr";
|
||||||
|
|
||||||
# Root autologin sur tty1, l'installeur se lance automatiquement au
|
# Root autologin sur tty1, l'installeur se lance automatiquement au
|
||||||
# login. S'il échoue ou qu'on le quitte, on retombe sur un shell root
|
# login. Échec ou sortie -> shell root normal pour dépanner.
|
||||||
# normal pour dépanner à la main — pas de piège sans issue.
|
|
||||||
# mkForce : le profil installeur officiel (installation-device.nix)
|
# mkForce : le profil installeur officiel (installation-device.nix)
|
||||||
# définit aussi cette option (autologin "nixos"), même priorité que la
|
# définit aussi cette option, même priorité -> conflit sinon.
|
||||||
# nôtre sans mkForce -> conflit sinon.
|
|
||||||
services.getty.autologinUser = lib.mkForce "root";
|
services.getty.autologinUser = lib.mkForce "root";
|
||||||
users.users.root.password = lib.mkForce "";
|
users.users.root.password = lib.mkForce "";
|
||||||
|
|
||||||
|
|||||||
@@ -9,7 +9,6 @@ SPDX-License-Identifier: MIT
|
|||||||
This is a self-contained NixOS implementation of <https://messervices.cyber.gouv.fr/guides/recommandations-de-securite-relatives-un-systeme-gnulinux>.
|
This is a self-contained NixOS implementation of <https://messervices.cyber.gouv.fr/guides/recommandations-de-securite-relatives-un-systeme-gnulinux>.
|
||||||
It can be copy-pasted outside of Sécurix for your own needs.
|
It can be copy-pasted outside of Sécurix for your own needs.
|
||||||
|
|
||||||
> Vendored verbatim depuis [SécurixOS](https://github.com/cloud-gouv/securix)
|
> Vendored depuis [SécurixOS](https://github.com/cloud-gouv/securix)
|
||||||
> (`modules/anssi/`, alpha) le 2026-09-09, tel que suggéré par ce README
|
> (`modules/anssi/`, alpha), 2026-09-09. Ne pas éditer directement --
|
||||||
> ("can be copy-pasted outside of Sécurix"). Ne pas éditer ces fichiers
|
> reprendre depuis Sécurix en cas de correctif.
|
||||||
> directement : en cas de correctif, le reprendre depuis Sécurix.
|
|
||||||
|
|||||||
Reference in New Issue
Block a user