Téléverser les fichiers vers "/"

This commit is contained in:
2026-08-18 17:34:53 +02:00
parent e726882e6a
commit 94a10d654a
2 changed files with 227 additions and 204 deletions
+59
View File
@@ -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.
+163 -199
View File
@@ -2,51 +2,51 @@
# 🛡️ NixOS Workstations # 🛡️ NixOS Workstations
### Déploiement industrialisé d'environnements de bureau NixOS sécurisés ### Déploiement industrialisé de postes de travail NixOS sécurisés
![NixOS](https://img.shields.io/badge/NixOS-26.05-5277C3?style=for-the-badge&logo=nixos&logoColor=white) ![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) ![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) ![Security](https://img.shields.io/badge/Sécurité-FIDO2%20%2F%20YubiKey-111827?style=for-the-badge)
![Deployment](https://img.shields.io/badge/Déploiement-Déclaratif-7EBAE4?style=for-the-badge&logo=nixos&logoColor=white) ![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) ![Status](https://img.shields.io/badge/Statut-Candidat_Production-2563EB?style=for-the-badge)
![License](https://img.shields.io/badge/Licence-PolyForm_Noncommercial-F59E0B?style=for-the-badge) ![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.** **Une base déclarative et reproductible pour déployer, sécuriser et maintenir des environnements de bureau NixOS homogènes.**
</div> </div>
--- ---
## 🎯 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** ; - 🧬 une configuration déclarative versionnée dans Git ;
- 💻 la **détection matérielle propre à chaque poste** ; - 📦 un ensemble logiciel homogène ;
- 📦 les **logiciels et paramètres du bureau** ; - 🖥️ KDE Plasma 6 ;
- 👤 les **comptes utilisateurs** ; - 👤 des comptes locaux maîtrisés ;
- 🔐 les **mécanismes d'authentification** ; - 🔐 une authentification locale de secours ;
- 🔑 l'utilisation de **clés FIDO2 / YubiKey** ; - 🔑 FIDO2 / YubiKey ;
-l'expérience de **finalisation du poste à la première connexion**. -une finalisation graphique du poste lors de la première utilisation ;
- 💻 une séparation stricte entre configuration commune et matériel propre à chaque machine.
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 ```text
─────────────────────────────┐ ┌───────────────────────────┐
Dépôt Git │ Git
│ nixos-workstations │ │ nixos-workstations │
─────────────┬───────────── └─────────────┬─────────────┘
┌───────────────┼────────────────┐ ───────────────┼────────────────┐
│ │ │ │ │ │
▼ ▼ ▼ ▼ ▼ ▼
📦 Logiciels 🔐 Sécurité 🖥 Bureau KDE 📦 Logiciels 👤 Utilisateurs 🛡 Sécurité
│ │ │ │ │ │
└───────────────┼────────────────┘ ───────────────┼────────────────┘
💻 Poste NixOS 🖥️ NixOS + KDE Plasma
🔐 Mot de passe
🔑 FIDO2 / YubiKey 🔑 FIDO2 / YubiKey
@@ -59,51 +59,52 @@ L'idée est qu'un poste puisse être réinstallé puis reconstruit à partir du
| | Principe | Objectif | | | Principe | Objectif |
|---|---|---| |---|---|---|
| 🧬 | **Configuration déclarative** | Décrire l'état attendu du poste dans Git | | 🧬 | **Déclaratif** | Décrire l'état attendu du poste dans Git |
| ♻️ | **Reproductibilité** | Pouvoir reconstruire un poste de manière cohérente | | ♻️ | **Reproductible** | Reconstruire un poste de manière cohérente |
| 🧱 | **Modularité** | Séparer logiciels, utilisateurs, sécurité et UX | | 🧱 | **Modulaire** | Séparer logiciels, utilisateurs, sécurité et UX |
| 🔐 | **Sécurité native** | S'appuyer sur les mécanismes NixOS plutôt que les contourner | | 🔐 | **Natif NixOS** | Utiliser les mécanismes système plutôt que les contourner |
| 🔑 | **FIDO2 / YubiKey** | Fournir une authentification moderne aux utilisateurs | | 🔑 | **FIDO2** | Utiliser une clé de sécurité comme moyen d'authentification principal |
| 🖥️ | **Expérience utilisateur** | Fournir un bureau KDE Plasma cohérent et simple | | 🧰 | **Industrialisable** | Éviter les fichiers de configuration complets spécifiques à chaque poste |
| 🧪 | **Validation progressive** | `build``dry-activate``test``switch` | | 🧪 | **Validation progressive** | `build``dry-activate``test``switch` |
| 🧰 | **Industrialisation** | Limiter les opérations spécifiques à chaque poste |
--- ---
## 🏗️ Architecture du dépôt ## 🏗️ Architecture
```text ```text
nixos-workstations/ nixos-workstations/
├── configuration.nix ├── configuration.nix
├── u2f-mappings
├── LICENSE ├── LICENSE
├── COMMERCIAL-LICENSE.md ├── COMMERCIAL-LICENSE.md
├── u2f-mappings ├── PRODUCTION-CHECKLIST.md
├── first-login-ui/ ├── workstation-setup/
│ ├── CMakeLists.txt │ ├── CMakeLists.txt
│ ├── org.raspot.nixosfirstlogin.desktop │ ├── org.raspot.nixosworkstations.setup.desktop
│ └── src/ │ └── src/
│ ├── CMakeLists.txt │ ├── CMakeLists.txt
│ ├── main.cpp │ ├── main.cpp
── Main.qml ── Main.qml
│ ├── ProvisioningBackend.h
│ └── ProvisioningBackend.cpp
└── modules/ └── modules/
├── software.nix ├── software.nix
├── users.nix ├── users.nix
├── security.nix ├── security.nix
── yubikey-first-login.nix ── workstation-setup.nix
└── first-login-ui.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 ```text
/etc/nixos/hardware-configuration.nix /etc/nixos/hardware-configuration.nix
``` ```
La configuration du parc l'importe directement : Il n'est pas partagé dans le dépôt commun.
```nix ```nix
imports = [ imports = [
@@ -111,64 +112,56 @@ imports = [
./modules/software.nix ./modules/software.nix
./modules/users.nix ./modules/users.nix
./modules/security.nix ./modules/security.nix
./modules/yubikey-first-login.nix ./modules/workstation-setup.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. 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` ### 📦 `software.nix`
crit l'environnement logiciel commun : ploie l'environnement logiciel commun : Chromium, Firefox ESR, OnlyOffice, Teams, Outlook Web, Git et les outils FIDO2 nécessaires.
- 🌐 Chromium ;
- 🦊 Firefox ESR ;
- 📄 OnlyOffice ;
- 💬 Teams ;
- ✉️ Outlook Web ;
- 🔧 Git et outils nécessaires au poste.
### 👤 `users.nix` ### 👤 `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 ; Dans ce **lab**, le mot de passe temporaire d'`alice` est volontairement déclaré dans `users.nix` avec `initialHashedPassword`.
- 👩‍💻 comptes utilisateurs standards ;
- 👥 appartenance aux groupes nécessaires ; ```text
- 🔐 mécanismes d'initialisation des secrets lorsque nécessaire. 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` ### 🛡️ `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 ### ✨ `workstation-setup.nix`
Utilisateur
Déploie l'assistant plein écran de finalisation du poste et son lancement automatique pour l'utilisateur concerné.
├──── 🔐 mot de passe
Le nom de l'utilisateur n'est pas codé dans l'application : il est déclaré dans la configuration NixOS :
└──── 🔑 YubiKey / FIDO2
```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 :
<div align="center"> <div align="center">
@@ -176,197 +169,168 @@ Lors de la première utilisation, l'utilisateur dispose d'un assistant graphique
</div> </div>
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 local
### 🔐 Mot de passe - 👁️ affichage/masquage des champs ;
- 📊 indicateur de robustesse purement informatif ;
- ✅ mot de passe actuel obligatoire ;
- ✅ confirmation du nouveau mot de passe ;
- 🟢 aucun blocage UI lié à une robustesse jugée faible ;
- 🔒 changement réel effectué par `/run/wrappers/bin/passwd`.
- 🔒 saisie masquée par défaut ; ### 🔑 PIN YubiKey
- 👁️ 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 ; - 👁️ affichage/masquage du PIN ;
- 🔁 choix et confirmation du nouveau PIN ; - ✅ PIN temporaire obligatoire ;
-validation avant la fin du parcours. -choix et confirmation du nouveau PIN ;
- 🔐 changement réel effectué par `ykman fido access change-pin` ;
- ⚠️ aucune boucle automatique en cas de mauvais PIN.
### ✅ Poste prêt ### 🚪 Assistant obligatoire
L'écran final récapitule visuellement les opérations réalisées avant de rendre le poste à l'utilisateur. Tant que les deux opérations n'ont pas **réellement réussi** :
- le bouton final n'est pas disponible ;
- une fermeture classique de la fenêtre est refusée ;
- une minimisation est immédiatement ramenée en plein écran ;
- l'assistant sera reproposé à la prochaine ouverture de session si la configuration reste incomplète.
Les étapes ne sont considérées terminées qu'après création des marqueurs :
```text
~/.local/state/nixos-workstations/password-initialized
~/.local/state/nixos-workstations/yubikey-pin-initialized
```
--- ---
## 🛡️ Sécurité ## 🛡️ Traitement des secrets
<div align="center">
### 🔐 L'interface graphique ne doit pas réimplémenter les mécanismes de sécurité du système.
</div>
L'architecture sépare l'interface des opérations sensibles :
```text ```text
┌─────────────────────────────── ┌───────────────────────────────┐
│ Qt Quick / QML │ │ Qt Quick / QML │
Présentation et validation saisie utilisateur
└───────────────┬─────────────── └───────────────┬───────────────┘
pipe privé
┌─────────────────────────────── ┌───────────────────────────────┐
Backend contrôlé backend Qt contrôlé │
────────────────────────────────┤ ──────────────────────────────
│ 🔐 Mot de passe → passwd NixOS
│ 🔑 PIN YubiKey → ykman │ ┌────────┴────────┐
└────────────────────────────────┘ ▼ ▼
/run/wrappers/bin/ ykman FIDO2
passwd
│ │
▼ ▼
/etc/shadow YubiKey
``` ```
Principes retenus : Principes retenus :
- 🚫 pas de modification directe de `/etc/shadow` ; - 🚫 aucun mot de passe ou PIN dans les arguments de processus ;
- 🚫 pas de réimplémentation artisanale de PAM ; - 🚫 aucun **secret définitif utilisateur** écrit dans Git ;
- ✅ utilisation des mécanismes NixOS prévus pour les mots de passe ; - 🧪 le mot de passe temporaire du lab est volontairement versionné dans `users.nix` ;
- ✅ utilisation des outils FIDO2/YubiKey dédiés ; - 🚫 aucune modification directe de `/etc/shadow` ;
- ✅ séparation entre compte administrateur et utilisateur standard ; - 🚫 aucun module PAM artisanal ;
- ✅ validation des changements avant activation persistante. - 🚫 aucun reset automatique de YubiKey ;
- ✅ wrapper `passwd` fourni par NixOS ;
- ✅ outil Yubico officiel pour FIDO2 ;
- ✅ logs des helpers désactivés ;
- ✅ core dumps désactivés pendant le provisioning ;
- ✅ une seule tentative FIDO2 par validation utilisateur.
--- ---
## 🧪 Cycle de validation ## 🔐 Mot de passe temporaire du lab
Une modification du dépôt n'est pas directement appliquée avec `switch`. Le compte `alice` est créé avec un mot de passe temporaire connu pour faciliter les essais reproductibles :
### 1️⃣ Construction ```text
LaboTest@1980
```
Son hash est déclaré directement dans :
```text
modules/users.nix
```
L'assistant demande ensuite à l'utilisateur de remplacer ce mot de passe temporaire par son mot de passe personnel. Avec `users.mutableUsers = true`, le nouveau mot de passe est conservé lors des activations suivantes.
> Cette décision est volontaire pour le **lab**. Elle évite une étape locale supplémentaire avant chaque nouvelle installation de test.
---
## 🧪 Déploiement
### 1. Construction
```bash ```bash
sudo nixos-rebuild build \ sudo nixos-rebuild build \
-I nixos-config=/home/localadm/nixos-workstations/configuration.nix -I nixos-config=/home/localadm/nixos-workstations/configuration.nix
``` ```
> 🧱 Construit la nouvelle configuration sans l'activer. ### 2. Simulation d'activation
### 2️⃣ Prévisualisation de l'activation
```bash ```bash
sudo nixos-rebuild dry-activate \ sudo nixos-rebuild dry-activate \
-I nixos-config=/home/localadm/nixos-workstations/configuration.nix -I nixos-config=/home/localadm/nixos-workstations/configuration.nix
``` ```
> 🔎 Permet d'inspecter les changements d'activation prévus. ### 3. Test temporaire
### 3️⃣ Test temporaire
```bash ```bash
sudo nixos-rebuild test \ sudo nixos-rebuild test \
-I nixos-config=/home/localadm/nixos-workstations/configuration.nix -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. Activation persistante
### 4️⃣ Validation définitive Après validation complète de la checklist :
```bash ```bash
sudo nixos-rebuild switch \ sudo nixos-rebuild switch \
-I nixos-config=/home/localadm/nixos-workstations/configuration.nix -I nixos-config=/home/localadm/nixos-workstations/configuration.nix
``` ```
> ✅ Rend la configuration active et persistante pour les prochains démarrages. 👉 Voir [`PRODUCTION-CHECKLIST.md`](PRODUCTION-CHECKLIST.md) avant un `switch`.
--- ---
## 🚀 Vision de déploiement ## 🔭 Industrialisation future
L'objectif est de réduire progressivement la préparation d'un poste à une chaîne standardisée : Le socle est conçu pour évoluer vers :
```text ```text
💿 Installation NixOS Inventaire / GLPI / CSV
🧬 Génération du matériel local Utilisateur + poste + profil matériel
📥 Récupération du dépôt Git Configuration NixOS commune
🧱 Construction de la configuration Installation automatisée
🛡️ Application du socle de sécurité Finalisation utilisateur FIDO2
👤 Affectation de l'utilisateur
🔑 Préparation FIDO2 / YubiKey
✨ Finalisation graphique
✅ Poste prêt
``` ```
À terme, cette chaîne doit pouvoir être complétée par : Les prochaines briques possibles sont notamment Disko, un inventaire machines/utilisateurs et une installation unattended.
- 🧰 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 ## ⚖️ Licence
<p align="center"> Le projet est distribué sous **PolyForm Noncommercial 1.0.0**.
![Nix](https://img.shields.io/badge/Nix-Configuration_déclarative-5277C3?style=flat-square&logo=nixos&logoColor=white) ✅ utilisation et modification non commerciales selon les conditions de la licence ;
![NixOS](https://img.shields.io/badge/NixOS-Workstations-5277C3?style=flat-square&logo=nixos&logoColor=white) 🚫 exploitation commerciale sans autorisation ;
![KDE](https://img.shields.io/badge/KDE_Plasma-Desktop-1D99F3?style=flat-square&logo=kde&logoColor=white) 💼 une exploitation commerciale peut faire l'objet d'un accord séparé avec le titulaire des droits.
![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)
</p> Voir [`LICENSE`](LICENSE) et [`COMMERCIAL-LICENSE.md`](COMMERCIAL-LICENSE.md).
--- > Cette licence est *source-available non commerciale* ; elle n'est pas une licence Open Source au sens OSI.
## 📜 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.
---
<div align="center">
### 🛡️ NixOS Workstations
**Déployer des postes homogènes, reproductibles et sécurisés sans transformer chaque machine en projet individuel.**
</div>