first commit
This commit is contained in:
@@ -0,0 +1,66 @@
|
||||
# 🏗️ Architecture détaillée
|
||||
|
||||
## Vue matérielle
|
||||
|
||||
```text
|
||||
┌─────────────────────────────────────────────────────────────┐
|
||||
│ Jonsbo N4 (boîtier) │
|
||||
│ │
|
||||
│ ┌───────────────┐ ┌───────────────┐ ┌─────────────────┐ │
|
||||
│ │ Ryzen 5 5600 │ │ 32 Go DDR4 │ │ TrueNAS Scale │ │
|
||||
│ │ (CPU) │ │ (RAM) │ │ (OS, ZFS) │ │
|
||||
│ └───────────────┘ └───────────────┘ └─────────────────┘ │
|
||||
│ │
|
||||
│ Stockage : │
|
||||
│ ┌───────────┐ ┌───────────────┐ ┌───────────────────────┐ │
|
||||
│ │ 256 Go NVMe│ │ 2× 500 Go SSD │ │ 2× 4 To HDD + 1× 8 To │ │
|
||||
│ │ → OS │ │ → Apps/Docker │ │ → Data / Médias │ │
|
||||
│ └───────────┘ └───────────────┘ └───────────────────────┘ │
|
||||
└─────────────────────────────────────────────────────────────┘
|
||||
```
|
||||
|
||||
## Logique de séparation
|
||||
|
||||
| Couche | Support | Contenu |
|
||||
| ---------------- | ------------------ | -------------------------------------- |
|
||||
| Système | NVMe 256 Go | TrueNAS Scale (boot pool) |
|
||||
| Applications | 2× SSD 500 Go | Conteneurs Docker, bases de données |
|
||||
| Données sensibles | 2× HDD 4 To (miroir) | Photos, vidéos, documents personnels |
|
||||
| Médias | 1× HDD 8 To | Bibliothèque multimédia (Jellyfin) |
|
||||
|
||||
Cette séparation permet :
|
||||
|
||||
- d'isoler les workloads (le système ne partage pas son support avec les données) ;
|
||||
- de dimensionner chaque pool selon son usage (performance pour les apps, capacité/redondance pour les données) ;
|
||||
- de limiter le rayon d'impact d'une panne disque à une seule couche.
|
||||
|
||||
## Vue logique des services
|
||||
|
||||
```text
|
||||
┌────────────────────┐
|
||||
│ Cloudflared │
|
||||
│ (tunnel sortant) │
|
||||
└─────────┬────────────┘
|
||||
│ HTTPS uniquement
|
||||
┌─────────▼────────────┐
|
||||
│ Nginx Proxy Manager │
|
||||
│ (reverse proxy + TLS) │
|
||||
└─────────┬────────────┘
|
||||
│
|
||||
┌──────────────┬──────────┼──────────┬──────────────┐
|
||||
│ │ │ │ │
|
||||
┌────▼───┐ ┌─────▼────┐ ┌───▼────┐ ┌────▼─────┐ ┌─────▼─────┐
|
||||
│Nextcloud│ │ Jellyfin │ │ Immich │ │Vaultwarden│ │ Gitea … │
|
||||
└────┬───┘ └──────────┘ └────────┘ └──────────┘ └───────────┘
|
||||
│
|
||||
┌────▼─────────────┐
|
||||
│ Authentik (SSO/MFA)│ ← contrôle d'accès transverse à tous les services
|
||||
└────────────────────┘
|
||||
```
|
||||
|
||||
## Principes directeurs
|
||||
|
||||
1. **Aucun service n'est exposé directement** : tout passe par le tunnel sortant Cloudflared puis le reverse proxy.
|
||||
2. **Authentification centralisée** : Authentik agit comme point de contrôle unique pour le SSO/MFA.
|
||||
3. **Isolation réseau interne** : les conteneurs communiquent sur des réseaux Docker dédiés, pas en mode `host`.
|
||||
4. **VPN dédié pour les flux sensibles** : Gluetun encapsule le trafic de téléchargement (Deluge) pour éviter toute fuite d'IP.
|
||||
@@ -0,0 +1,52 @@
|
||||
# 🔐 Politique de sécurité
|
||||
|
||||
## Principes appliqués
|
||||
|
||||
| Principe | Mise en œuvre |
|
||||
| ----------------------------- | ----------------------------------------------------------------------------- |
|
||||
| Exposition minimale | Aucun port ouvert sur le WAN — accès uniquement via tunnel sortant Cloudflared |
|
||||
| Chiffrement en transit | HTTPS natif sur l'ensemble des services, via Nginx Proxy Manager |
|
||||
| Authentification centralisée | Authentik (SSO + MFA) en frontal des services sensibles |
|
||||
| Moindre privilège | Comptes applicatifs dédiés, accès segmentés par service |
|
||||
| Isolation par conteneur | Chaque service dans son propre conteneur Docker, réseaux internes dédiés |
|
||||
| Cloisonnement des flux sensibles | VPN dédié (Gluetun) pour les conteneurs de téléchargement |
|
||||
| Gestion des secrets | Vaultwarden pour les mots de passe et identifiants de service |
|
||||
| Journalisation | Logs centralisés, conservés pour analyse en cas d'incident |
|
||||
| Mises à jour | Mises à jour régulières des conteneurs et de TrueNAS Scale |
|
||||
|
||||
## Accès distant
|
||||
|
||||
```text
|
||||
Internet
|
||||
│
|
||||
▼
|
||||
Cloudflare (réseau)
|
||||
│ tunnel sortant chiffré, initié depuis le NAS
|
||||
▼
|
||||
Cloudflared (conteneur, sur le NAS)
|
||||
│
|
||||
▼
|
||||
Nginx Proxy Manager (TLS, routage par sous-domaine)
|
||||
│
|
||||
▼
|
||||
Services internes (Nextcloud, Jellyfin, Immich, …)
|
||||
```
|
||||
|
||||
Aucune règle de NAT/port-forwarding n'est configurée sur la box Internet : le tunnel est **initié depuis le NAS vers Cloudflare**, jamais l'inverse. Cela élimine la quasi-totalité des risques liés au scan de ports et aux expositions involontaires.
|
||||
|
||||
## Authentification & identités
|
||||
|
||||
- **Authentik** centralise le SSO pour les services qui le supportent (OIDC/SAML/proxy forward-auth).
|
||||
- Le MFA est activé pour tous les comptes ayant un accès administrateur.
|
||||
- Les services ne supportant pas nativement le SSO sont placés derrière un forward-auth Authentik au niveau du reverse proxy lorsque c'est possible.
|
||||
|
||||
## Cycle de vie des accès
|
||||
|
||||
- Revue périodique des comptes et des accès actifs.
|
||||
- Rotation des mots de passe et clés sensibles stockées dans Vaultwarden.
|
||||
- Suppression des comptes/services inutilisés plutôt que leur désactivation simple.
|
||||
|
||||
## Limites connues / axes d'amélioration
|
||||
|
||||
- Pas de segmentation réseau par VLAN au niveau du NAS lui-même (la segmentation réseau plus fine est gérée côté infrastructure de virtualisation, voir le projet *pve-project*).
|
||||
- La supervision est actuellement manuelle (consultation des logs) ; une stack de monitoring/alerting (ex. Uptime Kuma, Grafana) est envisagée.
|
||||
@@ -0,0 +1,40 @@
|
||||
# 🗂️ Stratégie de stockage & sauvegarde
|
||||
|
||||
## Pools ZFS
|
||||
|
||||
| Pool | Disques | Usage | Redondance |
|
||||
| ----------- | ------------------------- | -------------------------------- | -------------------- |
|
||||
| `boot-pool` | 1× NVMe 256 Go | Système TrueNAS Scale | Aucune (réinstallable) |
|
||||
| `apps-pool` | 2× SSD 500 Go | Applications, bases Docker | Miroir |
|
||||
| `data-pool` | 2× HDD 4 To | Photos, vidéos, documents | Miroir |
|
||||
| `media-pool` | 1× HDD 8 To | Bibliothèque multimédia (Jellyfin)| Aucune (non critique) |
|
||||
|
||||
## Snapshots
|
||||
|
||||
- Fréquence : quotidienne sur `data-pool`, hebdomadaire sur `apps-pool`.
|
||||
- Politique de rétention : conservation glissante (ex. 7 jours / 4 semaines / 6 mois) à adapter selon l'espace disponible.
|
||||
- Objectif : pouvoir revenir en arrière en cas de suppression accidentelle ou de chiffrement par un ransomware, sans dépendre uniquement de la sauvegarde distante.
|
||||
|
||||
## Stratégie 3-2-1 (adaptée à un usage personnel)
|
||||
|
||||
```text
|
||||
3 copies des données
|
||||
│
|
||||
┌──────────┼──────────────┐
|
||||
│ │ │
|
||||
Original Snapshot ZFS Sauvegarde
|
||||
(data-pool) (local) cloud chiffrée
|
||||
(pCloud, 2 To)
|
||||
```
|
||||
|
||||
1. **Copie 1** — données originales sur `data-pool` (miroir ZFS).
|
||||
2. **Copie 2** — snapshots ZFS locaux (protection contre erreur humaine / ransomware récent).
|
||||
3. **Copie 3** — synchronisation chiffrée vers **pCloud** (2 To, abonnement à vie), hors-site, pour couvrir un sinistre matériel ou un vol.
|
||||
|
||||
> Les sauvegardes distantes sont versionnées : une compromission ou un chiffrement malveillant détecté tardivement n'écrase pas les versions précédentes.
|
||||
|
||||
## Points d'attention
|
||||
|
||||
- Le chiffrement vers le cloud est effectué **avant** l'envoi (chiffrement côté client), pCloud ne reçoit que des données déjà chiffrées.
|
||||
- Les identifiants de synchronisation sont stockés dans Vaultwarden, jamais en clair dans les scripts (voir [`configs/backup/pcloud-sync.sh.example`](../configs/backup/pcloud-sync.sh.example)).
|
||||
- Un test de restauration est effectué périodiquement pour valider que les sauvegardes sont exploitables (et pas seulement « présentes »).
|
||||
@@ -0,0 +1,25 @@
|
||||
# 🎯 Modèle de menace
|
||||
|
||||
## Risques considérés et mitigations
|
||||
|
||||
| # | Risque | Impact potentiel | Mitigation |
|
||||
| - | ----------------------------------------- | -------------------------------------------- | ----------------------------------------------------------------------------- |
|
||||
| 1 | Défaillance matérielle (disque, alim…) | Perte de données, indisponibilité de service | Pools ZFS redondés (miroir), pièces remplaçables à chaud sur la backplane |
|
||||
| 2 | Erreur humaine (suppression accidentelle) | Perte de fichiers/données | Snapshots ZFS réguliers, versioning |
|
||||
| 3 | Ransomware | Chiffrement des données locales et distantes | Snapshots locaux + sauvegarde cloud versionnée et chiffrée hors-site |
|
||||
| 4 | Exposition Internet involontaire | Accès non autorisé depuis l'extérieur | Zéro port ouvert, tunnel sortant exclusif (Cloudflared) |
|
||||
| 5 | Compromission d'identifiants | Accès non autorisé à un ou plusieurs services | SSO + MFA centralisés (Authentik), secrets dans Vaultwarden |
|
||||
| 6 | Fuite de données sensibles (réseau, logs) | Divulgation d'informations personnelles | Segmentation des conteneurs, VPN dédié pour les flux de téléchargement |
|
||||
| 7 | Compromission d'un conteneur applicatif | Mouvement latéral vers d'autres services | Isolation par conteneur, réseaux Docker dédiés, mises à jour régulières |
|
||||
|
||||
## Hypothèses
|
||||
|
||||
- L'attaquant n'a pas d'accès physique au matériel.
|
||||
- Le FAI/box Internet n'est pas considéré comme une frontière de confiance (d'où l'absence totale de port ouvert).
|
||||
- Les services tiers (Cloudflare, pCloud) sont traités comme des intermédiaires de transport/stockage chiffré, pas comme des tiers de confiance absolue : les données qui leur sont confiées sont chiffrées avant envoi lorsque c'est pertinent.
|
||||
|
||||
## Ce que ce modèle ne couvre pas (axes d'évolution)
|
||||
|
||||
- Attaque ciblée et sophistiquée sur la chaîne d'approvisionnement logicielle (images Docker compromises).
|
||||
- Défaillance simultanée de plusieurs disques au sein d'un même pool (au-delà de la tolérance du miroir).
|
||||
- Compromission du compte Cloudflare lui-même (atténuée par le MFA sur ce compte, hors périmètre du NAS).
|
||||
Reference in New Issue
Block a user