# 🛡️ NixOS Workstations ### Déploiement industrialisé d'environnements de bureau NixOS sécurisés ![NixOS](https://img.shields.io/badge/NixOS-26.05-5277C3?style=for-the-badge&logo=nixos&logoColor=white) ![KDE Plasma](https://img.shields.io/badge/KDE_Plasma-6-1D99F3?style=for-the-badge&logo=kde&logoColor=white) ![Security](https://img.shields.io/badge/Sécurité-FIDO2%20%2F%20YubiKey-111111?style=for-the-badge) ![Deployment](https://img.shields.io/badge/Déploiement-Déclaratif-7EBAE4?style=for-the-badge&logo=nixos&logoColor=white) ![Git](https://img.shields.io/badge/Configuration-Git-F05032?style=for-the-badge&logo=git&logoColor=white) ![License](https://img.shields.io/badge/Licence-PolyForm_Noncommercial-F59E0B?style=for-the-badge) **Une base NixOS reproductible pour construire, sécuriser et maintenir un parc de postes de travail homogènes.**
--- ## 🎯 Objectif du projet **NixOS Workstations** a pour objectif d'industrialiser le déploiement de postes de travail NixOS en séparant clairement : - 🧩 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. ```text ┌─────────────────────────────┐ │ Dépôt Git │ │ nixos-workstations │ └──────────────┬──────────────┘ │ ┌───────────────┼────────────────┐ │ │ │ ▼ ▼ ▼ 📦 Logiciels 🔐 Sécurité 🖥️ Bureau KDE │ │ │ └───────────────┼────────────────┘ │ ▼ 💻 Poste NixOS │ 🔑 FIDO2 / YubiKey │ ▼ ✅ Poste opérationnel ``` --- ## ✨ Principes | | 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 | | 🧪 | **Validation progressive** | `build` → `dry-activate` → `test` → `switch` | | 🧰 | **Industrialisation** | Limiter les opérations spécifiques à chaque poste | --- ## 🏗️ Architecture du dépôt ```text nixos-workstations/ ├── configuration.nix ├── LICENSE ├── COMMERCIAL-LICENSE.md ├── u2f-mappings │ ├── first-login-ui/ │ ├── CMakeLists.txt │ ├── org.raspot.nixosfirstlogin.desktop │ └── src/ │ ├── CMakeLists.txt │ ├── main.cpp │ └── Main.qml │ └── modules/ ├── software.nix ├── users.nix ├── security.nix ├── yubikey-first-login.nix └── first-login-ui.nix ``` ### 💻 Matériel propre à chaque machine Le fichier matériel généré par NixOS **n'est pas stocké dans le dépôt commun** : ```text /etc/nixos/hardware-configuration.nix ``` La configuration du parc l'importe directement : ```nix imports = [ /etc/nixos/hardware-configuration.nix ./modules/software.nix ./modules/users.nix ./modules/security.nix ./modules/yubikey-first-login.nix ./modules/first-login-ui.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. --- ## 🧩 Modules principaux ### 📦 `software.nix` Décrit l'environnement logiciel commun : - 🌐 Chromium ; - 🦊 Firefox ESR ; - 📄 OnlyOffice ; - 💬 Teams ; - ✉️ Outlook Web ; - 🔧 Git et outils nécessaires au poste. ### 👤 `users.nix` Décrit les comptes locaux attendus et leurs rôles : - 🛠️ compte d'administration locale ; - 👩‍💻 comptes utilisateurs standards ; - 👥 appartenance aux groupes nécessaires ; - 🔐 mécanismes d'initialisation des secrets lorsque nécessaire. ### 🛡️ `security.nix` Centralise les paramètres d'authentification et les mappings FIDO2/U2F. ```text Utilisateur │ ├──── 🔐 mot de passe │ └──── 🔑 YubiKey / FIDO2 ``` ### 🔑 `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 Lors de la première utilisation, l'utilisateur dispose d'un assistant graphique intégré au bureau KDE.
### 👋 Bienvenue → 🔐 Mot de passe → 🔑 YubiKey → ✅ Poste prêt
L'objectif est de rendre les opérations de personnalisation simples et compréhensibles, sans exposer l'utilisateur aux outils système. ### 🔐 Mot de passe - 🔒 saisie masquée par défaut ; - 👁️ bouton pour afficher ou masquer les secrets ; - 📊 indicateur de robustesse ; - 💡 recommandations informatives ; - ✅ confirmation obligatoire ; - 🟢 un mot de passe faible n'est pas bloqué volontairement. ### 🔑 YubiKey - 🔢 saisie du PIN temporaire ; - 👁️ affichage/masquage du PIN ; - 🔁 choix et confirmation du nouveau PIN ; - ✅ validation avant la fin du parcours. ### ✅ Poste prêt L'écran final récapitule visuellement les opérations réalisées avant de rendre le poste à l'utilisateur. --- ## 🛡️ Sécurité
### 🔐 L'interface graphique ne doit pas réimplémenter les mécanismes de sécurité du système.
L'architecture sépare l'interface des opérations sensibles : ```text ┌────────────────────────────────┐ │ Qt Quick / QML │ │ Présentation et validation │ └───────────────┬────────────────┘ │ ▼ ┌────────────────────────────────┐ │ Backend contrôlé │ ├────────────────────────────────┤ │ 🔐 Mot de passe → passwd NixOS │ │ 🔑 PIN YubiKey → ykman │ └────────────────────────────────┘ ``` Principes retenus : - 🚫 pas de modification directe de `/etc/shadow` ; - 🚫 pas de réimplémentation artisanale de PAM ; - ✅ utilisation des mécanismes NixOS prévus pour les mots de passe ; - ✅ utilisation des outils FIDO2/YubiKey dédiés ; - ✅ séparation entre compte administrateur et utilisateur standard ; - ✅ validation des changements avant activation persistante. --- ## 🧪 Cycle de validation Une modification du dépôt n'est pas directement appliquée avec `switch`. ### 1️⃣ Construction ```bash sudo nixos-rebuild build \ -I nixos-config=/home/localadm/nixos-workstations/configuration.nix ``` > 🧱 Construit la nouvelle configuration sans l'activer. ### 2️⃣ Prévisualisation de l'activation ```bash sudo nixos-rebuild dry-activate \ -I nixos-config=/home/localadm/nixos-workstations/configuration.nix ``` > 🔎 Permet d'inspecter les changements d'activation prévus. ### 3️⃣ Test temporaire ```bash sudo nixos-rebuild test \ -I nixos-config=/home/localadm/nixos-workstations/configuration.nix ``` > 🧪 Active la configuration pour validation sans en faire la génération de démarrage par défaut. ### 4️⃣ Validation définitive ```bash sudo nixos-rebuild switch \ -I nixos-config=/home/localadm/nixos-workstations/configuration.nix ``` > ✅ Rend la configuration active et persistante pour les prochains démarrages. --- ## 🚀 Vision de déploiement L'objectif est de réduire progressivement la préparation d'un poste à une chaîne standardisée : ```text 💿 Installation NixOS │ ▼ 🧬 Génération du matériel local │ ▼ 📥 Récupération du dépôt Git │ ▼ 🧱 Construction de la configuration │ ▼ 🛡️ Application du socle de sécurité │ ▼ 👤 Affectation de l'utilisateur │ ▼ 🔑 Préparation FIDO2 / YubiKey │ ▼ ✨ Finalisation graphique │ ▼ ✅ Poste prêt ``` À terme, cette chaîne doit pouvoir être complétée par : - 🧰 installation automatisée ; - 🗂️ inventaire des machines ; - 🧩 profils matériels ; - 👥 affectation déclarative utilisateurs/postes ; - 🔄 mises à jour centralisées par Git ; - 📋 intégration avec les outils de gestion de parc. --- ## 🧰 Technologies

![Nix](https://img.shields.io/badge/Nix-Configuration_déclarative-5277C3?style=flat-square&logo=nixos&logoColor=white) ![NixOS](https://img.shields.io/badge/NixOS-Workstations-5277C3?style=flat-square&logo=nixos&logoColor=white) ![KDE](https://img.shields.io/badge/KDE_Plasma-Desktop-1D99F3?style=flat-square&logo=kde&logoColor=white) ![Qt](https://img.shields.io/badge/Qt_Quick-QML-41CD52?style=flat-square&logo=qt&logoColor=white) ![FIDO2](https://img.shields.io/badge/FIDO2-YubiKey-111111?style=flat-square) ![Git](https://img.shields.io/badge/Git-Source_of_truth-F05032?style=flat-square&logo=git&logoColor=white)

--- ## 📜 Licence ![Licence](https://img.shields.io/badge/SPDX-PolyForm--Noncommercial--1.0.0-F59E0B?style=flat-square) ![Commercial](https://img.shields.io/badge/Usage_commercial-Autorisation_requise-EF4444?style=flat-square) 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. ---
### 🛡️ NixOS Workstations **Déployer des postes homogènes, reproductibles et sécurisés sans transformer chaque machine en projet individuel.**