diff --git a/PRODUCTION-CHECKLIST.md b/PRODUCTION-CHECKLIST.md new file mode 100644 index 0000000..25231b1 --- /dev/null +++ b/PRODUCTION-CHECKLIST.md @@ -0,0 +1,59 @@ +# Checklist de mise en production — NixOS Workstations + +## Avant activation + +```bash +cd ~/nixos-workstations + +sudo nixos-rebuild build \ + -I nixos-config=/home/localadm/nixos-workstations/configuration.nix + +sudo nixos-rebuild dry-activate \ + -I nixos-config=/home/localadm/nixos-workstations/configuration.nix +``` + +## Test contrôlé + +1. Vérifier que `localadm` se connecte toujours par mot de passe. +2. Vérifier que `/etc/nixos/hardware-configuration.nix` est bien le fichier local du poste. +3. Exécuter : + +```bash +sudo nixos-rebuild test \ + -I nixos-config=/home/localadm/nixos-workstations/configuration.nix +``` + +4. Fermer la session `localadm` et ouvrir la session `alice`. +5. Vérifier que l'assistant plein écran démarre automatiquement. +6. Tester avec le mot de passe temporaire du lab `LaboTest@1980` et le PIN temporaire réel de la YubiKey. +7. Vérifier qu'un mauvais PIN produit une erreur et **ne déclenche aucune tentative automatique supplémentaire**. +8. Vérifier qu'après succès les deux fichiers existent : + +```bash +ls -l ~/.local/state/nixos-workstations/ +``` + +Attendu : + +```text +password-initialized +yubikey-pin-initialized +``` + +9. Se déconnecter/reconnecter : l'assistant ne doit plus démarrer. +10. Tester l'authentification YubiKey + nouveau PIN, puis le mot de passe local de secours. + +## Passage persistant + +Uniquement après validation complète : + +```bash +sudo nixos-rebuild switch \ + -I nixos-config=/home/localadm/nixos-workstations/configuration.nix +``` + +## Important + +- Ne jamais supprimer/réinitialiser la YubiKey en cas d'erreur de PIN. +- Ne jamais modifier manuellement `/etc/shadow`. +- Le retour à une ancienne génération NixOS ne restaure pas les mots de passe mutables. diff --git a/README.md b/README.md index 91a14d8..08d83ba 100644 --- a/README.md +++ b/README.md @@ -2,51 +2,51 @@ # 🛡️ NixOS Workstations -### Déploiement industrialisé d'environnements de bureau NixOS sécurisés +### Déploiement industrialisé de postes de travail NixOS sécurisés   - +  - +  -**Une base NixOS reproductible pour construire, sécuriser et maintenir un parc de postes de travail homogènes.** +**Une base déclarative et reproductible pour déployer, sécuriser et maintenir des environnements de bureau NixOS homogènes.** --- -## 🎯 Objectif du projet +## 🎯 Objectif -**NixOS Workstations** a pour objectif d'industrialiser le déploiement de postes de travail NixOS en séparant clairement : +**NixOS Workstations** fournit un socle commun permettant de construire un parc de postes de travail NixOS avec : -- 🧩 la **configuration commune du parc** ; -- 💻 la **détection matérielle propre à chaque poste** ; -- 📦 les **logiciels et paramètres du bureau** ; -- 👤 les **comptes utilisateurs** ; -- 🔐 les **mécanismes d'authentification** ; -- 🔑 l'utilisation de **clés FIDO2 / YubiKey** ; -- ✨ l'expérience de **finalisation du poste à la première connexion**. - -L'idée est qu'un poste puisse être réinstallé puis reconstruit à partir du dépôt Git avec un minimum d'opérations manuelles. +- 🧬 une configuration déclarative versionnée dans Git ; +- 📦 un ensemble logiciel homogène ; +- 🖥️ KDE Plasma 6 ; +- 👤 des comptes locaux maîtrisés ; +- 🔐 une authentification locale de secours ; +- 🔑 FIDO2 / YubiKey ; +- ✨ une finalisation graphique du poste lors de la première utilisation ; +- 💻 une séparation stricte entre configuration commune et matériel propre à chaque machine. ```text - ┌─────────────────────────────┐ - │ Dépôt Git │ - │ nixos-workstations │ - └──────────────┬──────────────┘ + ┌───────────────────────────┐ + │ Git │ + │ nixos-workstations │ + └─────────────┬─────────────┘ │ - ┌───────────────┼────────────────┐ - │ │ │ - ▼ ▼ ▼ - 📦 Logiciels 🔐 Sécurité 🖥️ Bureau KDE - │ │ │ - └───────────────┼────────────────┘ + ┌────────────────┼────────────────┐ + │ │ │ + ▼ ▼ ▼ + 📦 Logiciels 👤 Utilisateurs 🛡️ Sécurité + │ │ │ + └────────────────┼────────────────┘ │ ▼ - 💻 Poste NixOS + 🖥️ NixOS + KDE Plasma │ + 🔐 Mot de passe 🔑 FIDO2 / YubiKey │ ▼ @@ -59,51 +59,52 @@ L'idée est qu'un poste puisse être réinstallé puis reconstruit à partir du | | Principe | Objectif | |---|---|---| -| 🧬 | **Configuration déclarative** | Décrire l'état attendu du poste dans Git | -| ♻️ | **Reproductibilité** | Pouvoir reconstruire un poste de manière cohérente | -| 🧱 | **Modularité** | Séparer logiciels, utilisateurs, sécurité et UX | -| 🔐 | **Sécurité native** | S'appuyer sur les mécanismes NixOS plutôt que les contourner | -| 🔑 | **FIDO2 / YubiKey** | Fournir une authentification moderne aux utilisateurs | -| 🖥️ | **Expérience utilisateur** | Fournir un bureau KDE Plasma cohérent et simple | +| 🧬 | **Déclaratif** | Décrire l'état attendu du poste dans Git | +| ♻️ | **Reproductible** | Reconstruire un poste de manière cohérente | +| 🧱 | **Modulaire** | Séparer logiciels, utilisateurs, sécurité et UX | +| 🔐 | **Natif NixOS** | Utiliser les mécanismes système plutôt que les contourner | +| 🔑 | **FIDO2** | Utiliser une clé de sécurité comme moyen d'authentification principal | +| 🧰 | **Industrialisable** | Éviter les fichiers de configuration complets spécifiques à chaque poste | | 🧪 | **Validation progressive** | `build` → `dry-activate` → `test` → `switch` | -| 🧰 | **Industrialisation** | Limiter les opérations spécifiques à chaque poste | --- -## 🏗️ Architecture du dépôt +## 🏗️ Architecture ```text nixos-workstations/ ├── configuration.nix +├── u2f-mappings ├── LICENSE ├── COMMERCIAL-LICENSE.md -├── u2f-mappings +├── PRODUCTION-CHECKLIST.md │ -├── first-login-ui/ +├── workstation-setup/ │ ├── CMakeLists.txt -│ ├── org.raspot.nixosfirstlogin.desktop +│ ├── org.raspot.nixosworkstations.setup.desktop │ └── src/ │ ├── CMakeLists.txt │ ├── main.cpp -│ └── Main.qml +│ ├── Main.qml +│ ├── ProvisioningBackend.h +│ └── ProvisioningBackend.cpp │ └── modules/ ├── software.nix ├── users.nix ├── security.nix - ├── yubikey-first-login.nix - └── first-login-ui.nix + └── workstation-setup.nix ``` -### 💻 Matériel propre à chaque machine +### 💻 Matériel propre à chaque poste -Le fichier matériel généré par NixOS **n'est pas stocké dans le dépôt commun** : +Le fichier généré lors de l'installation reste **local à la machine** : ```text /etc/nixos/hardware-configuration.nix ``` -La configuration du parc l'importe directement : +Il n'est pas partagé dans le dépôt commun. ```nix imports = [ @@ -111,64 +112,56 @@ imports = [ ./modules/software.nix ./modules/users.nix ./modules/security.nix - ./modules/yubikey-first-login.nix - ./modules/first-login-ui.nix + ./modules/workstation-setup.nix ]; ``` -Ainsi, les UUID, partitions et périphériques propres à une installation restent locaux tandis que les règles communes restent centralisées dans Git. +Les UUID de partitions et autres informations propres au matériel ne peuvent ainsi pas écraser la configuration d'un autre poste. --- -## 🧩 Modules principaux +## 🧩 Modules ### 📦 `software.nix` -Décrit l'environnement logiciel commun : - -- 🌐 Chromium ; -- 🦊 Firefox ESR ; -- 📄 OnlyOffice ; -- 💬 Teams ; -- ✉️ Outlook Web ; -- 🔧 Git et outils nécessaires au poste. +Déploie l'environnement logiciel commun : Chromium, Firefox ESR, OnlyOffice, Teams, Outlook Web, Git et les outils FIDO2 nécessaires. ### 👤 `users.nix` -Décrit les comptes locaux attendus et leurs rôles : +Décrit les comptes locaux et leurs rôles. Les mots de passe restent mutables afin que l'utilisateur puisse personnaliser son secret local avec `passwd`. -- 🛠️ compte d'administration locale ; -- 👩💻 comptes utilisateurs standards ; -- 👥 appartenance aux groupes nécessaires ; -- 🔐 mécanismes d'initialisation des secrets lorsque nécessaire. +Dans ce **lab**, le mot de passe temporaire d'`alice` est volontairement déclaré dans `users.nix` avec `initialHashedPassword`. + +```text +Mot de passe temporaire du lab : LaboTest@1980 +``` + +Avec `users.mutableUsers = true`, ce hash sert à la création initiale du compte. Une fois le mot de passe changé par l'utilisateur, les activations suivantes conservent le nouveau mot de passe local. + +> Pour un déploiement réel, le dépôt sera privé et la stratégie de secret initial pourra être adaptée au processus d'exploitation. ### 🛡️ `security.nix` -Centralise les paramètres d'authentification et les mappings FIDO2/U2F. +Déploie le mapping utilisateur ↔ YubiKey et configure l'authentification PAM U2F/FIDO2 utilisée par le poste. -```text -Utilisateur - │ - ├──── 🔐 mot de passe - │ - └──── 🔑 YubiKey / FIDO2 +### ✨ `workstation-setup.nix` + +Déploie l'assistant plein écran de finalisation du poste et son lancement automatique pour l'utilisateur concerné. + +Le nom de l'utilisateur n'est pas codé dans l'application : il est déclaré dans la configuration NixOS : + +```nix +nixosWorkstations.workstationSetup = { + enable = true; + user = "alice"; +}; ``` -### 🔑 `yubikey-first-login.nix` - -Gère le workflow de personnalisation initiale des secrets liés au poste et à la YubiKey. - -### ✨ `first-login-ui.nix` - -Installe l'interface graphique plein écran utilisée lors de la finalisation du poste. - -L'assistant graphique est **une composante du projet**, pas sa finalité. - --- -## ✨ Finalisation du poste utilisateur +## ✨ Finalisation du poste -Lors de la première utilisation, l'utilisateur dispose d'un assistant graphique intégré au bureau KDE. +Lors de la première ouverture de session de l'utilisateur :
+Le projet est distribué sous **PolyForm Noncommercial 1.0.0**. - - - - - - +✅ utilisation et modification non commerciales selon les conditions de la licence ; +🚫 exploitation commerciale sans autorisation ; +💼 une exploitation commerciale peut faire l'objet d'un accord séparé avec le titulaire des droits. -
+Voir [`LICENSE`](LICENSE) et [`COMMERCIAL-LICENSE.md`](COMMERCIAL-LICENSE.md). ---- - -## 📜 Licence - - - - -Le projet est distribué sous **PolyForm Noncommercial License 1.0.0**. - -### ✅ Autorisé - -- utilisation non commerciale ; -- étude du code ; -- modification ; -- partage dans les limites prévues par la licence. - -### 🚫 Exploitation commerciale - -Toute exploitation commerciale nécessite **une autorisation ou une licence commerciale distincte accordée par le titulaire des droits**. - -Voir : - -- [`LICENSE`](./LICENSE) -- [`COMMERCIAL-LICENSE.md`](./COMMERCIAL-LICENSE.md) - -> ℹ️ PolyForm Noncommercial est une licence **source-available non commerciale** et non une licence open source au sens OSI. - ---- - -