Les adresses IP et noms de domaine de production ont été remplacés par des libellés génériques par mesure de sécurité.
Contexte
Projet transversal qui regroupe trois composantes fondamentales de la sécurité du homelab : la gestion des secrets (Vaultwarden), l’exposition sécurisée des services (NPM + SSL + DNS) et l’accès distant sans exposition publique (Tailscale VPN). L’ensemble forme une architecture cohérente où aucun secret ne transite en clair et aucun service n’est exposé directement sur Internet.
1 — Architecture DNS (AdGuard Home + DoT)
AdGuard Home est déployé en LXC sur PVE-02 (lxc-adguard-01, VLAN 10 MGMT). Il joue le rôle de résolveur DNS primaire pour tout le homelab :
Clients (tous VLANs) → AdGuard Home :53 (VLAN 10 MGMT)
│
┌───────────────┴──────────────────┐
│ │
Zone interne (Rewrites) DNS upstream (DoT)
*.[mon-domaine.fr] → [NPM] Cloudflare 1.1.1.1:853
*.homelab.lan → Unbound pfSense Quad9 9.9.9.9:853
Décisions clés :
- DNS over TLS (DoT) vers Cloudflare (
1.1.1.1:853) et Quad9 (9.9.9.9:853) : aucune requête DNS en clair vers Internet - Split-horizon : les FQDN
*.[mon-domaine.fr]pointent vers NPM en interne (pas de sortie WAN),*.homelab.lansont résolus par Unbound pfSense - Filtrage publicitaire : listes de blocage actives (EasyList, OISD)
- AdGuard est accessible uniquement depuis les interfaces internes VLAN 10
2 — Exposition HTTPS (NPM + Let’s Encrypt wildcard)
Nginx Proxy Manager (lxc-npm-01, VLAN 10 MGMT) est le reverse proxy de tous les services exposés. Il détient le certificat wildcard *.[mon-domaine.fr] émis par Let’s Encrypt via le challenge DNS-01 Cloudflare (sans exposition d’un port 80/443 entrant en permanence).
Navigateur → https://service.[mon-domaine.fr]
│
NPM (VLAN 10 MGMT :443)
│ Wildcard SSL *.[mon-domaine.fr]
│ Force SSL, HSTS
│ Access list : 172.16.0.0/16 + Tailscale CGNAT
▼
Service interne (HTTP) → réponse
Services exposés (extrait) :
| FQDN | Backend | Notes |
|---|---|---|
vaultwarden.[mon-domaine.fr] | Vaultwarden :8080 | Jamais exposé publiquement (NXDOMAIN public) |
grafana.[mon-domaine.fr] | Grafana :3000 | Accessible via Tailscale uniquement |
zabbix.[mon-domaine.fr] | Zabbix :80 | Port-forward NAT pfSense |
n8n.[mon-domaine.fr] | n8n :5678 | Accès interne uniquement |
3 — Vaultwarden (coffre-fort de mots de passe self-hosted)
Vaultwarden est une implémentation open-source du protocole Bitwarden déployée en LXC sur PVE-02 (lxc-vaultwarden-01, VLAN 10 MGMT), avec Docker-in-LXC et image épinglée.
Décisions de sécurité
| Décision | Justification |
|---|---|
| Tailscale-only | Pas de port-forward public ; NXDOMAIN sur DNS public → injoignable depuis Internet |
| Docker-in-LXC | Mises à jour CVE en une commande (docker pull du nouveau tag) |
| SQLite (pas MariaDB) | Un seul fichier à sauvegarder, restore trivial |
| Image épinglée | Pas de changement silencieux de version |
| Export KeePassXC mensuel | Backup offline chiffré (break-glass en cas d’indisponibilité) |
# Déploiement Docker
docker run -d \
--name vaultwarden \
--restart unless-stopped \
-e DOMAIN="https://vaultwarden.[mon-domaine.fr]" \
-e SIGNUPS_ALLOWED=false \
-v /opt/vaultwarden/data:/data \
-p 8080:80 \
vaultwarden/server:<version-épinglée>
SIGNUPS_ALLOWED=false: aucune création de compte possible sauf invitation explicite.
Fix critique — SameSite Cookie
Symptôme : login accepté mais retour en boucle sur la page de connexion.
Cause : cookie_samesite = none avec cookie_secure = false → combinaison interdite par les navigateurs modernes (SameSite=None exige Secure).
Fix : cookie_secure = true dans la config + connexion via HTTPS uniquement → résolu.
4 — Tailscale VPN (accès distant sans ouverture de port)
Tailscale est installé sur pfsense-vm (instance VM miroir de pfSense sur PVE-02). Il sert de subnet router pour le réseau VLAN 10 MGMT : tout appareil autorisé peut accéder aux services internes sans qu’aucun port ne soit ouvert en entrée sur la box Internet.
iPhone / MacBook (n'importe où dans le monde)
│ Tailscale (WireGuard sous-jacent)
▼
pfsense-vm — Tailscale subnet router (VLAN 10 MGMT)
│ subnet route 172.16.10.0/24
▼
Services VLAN 10 (Vaultwarden, Grafana, Zabbix, NPM…)
- Split-DNS Tailscale : les requêtes
*.[mon-domaine.fr]depuis les appareils Tailscale sont résolues par AdGuard interne → trafic reste interne, pas de boucle WAN - MagicDNS désactivé : géré manuellement pour conserver le contrôle total du DNS
- Authentification : compte personnel, clé d’autorisation périodique
Architecture globale
┌─────────────────────────────────────────────────────┐
│ INTERNET │
│ vaultwarden.[mon-domaine.fr] = NXDOMAIN public ✗ │
└──────────────┬──────────────────────────────────────┘
│ Tailscale uniquement
▼
iPhone / MacBook (Tailscale client)
│ WireGuard chiffré
▼
pfsense-vm (subnet router → VLAN 10 MGMT)
│
▼
AdGuard Home (VLAN 10) ── DNS split-horizon
↓ DoT *.[mon-domaine.fr] → NPM
Cloudflare 1.1.1.1:853 *.homelab.lan → Unbound
│
▼
NPM (VLAN 10) ── wildcard SSL *.[mon-domaine.fr]
│
▼
Vaultwarden (VLAN 10 :8080) ── SQLite, image épinglée
Compétences mobilisées
Cette réalisation couvre la protection des données personnelles et secrets (B3.1 — coffre-fort Vaultwarden, chiffrement de bout en bout Bitwarden), la préservation de l’identité numérique (B3.2 — accès VPN exclusif, NXDOMAIN public, authentification forte), la sécurisation des équipements (B3.3 — DNS over TLS, aucun secret en clair, NPM HSTS), la cybersécurité de l’infrastructure (B3.5 — Tailscale zero-trust, ACLs AdGuard), ainsi que le développement de la présence en ligne (B1.3 — FQDN wildcard *.[mon-domaine.fr], SSL automatique) et la mise à disposition de services (B1.5 — Vaultwarden, NPM, DNS disponibles H24 sans exposition publique).