homelab

Infrastructure DNS, accès distant sécurisé et gestion des secrets

Infrastructure d'accès sécurisé : Vaultwarden coffre-fort, NPM wildcard SSL, AdGuard DoT, Tailscale VPN et DNS split-horizon pour le homelab.

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
   *.lab.example → Unbound pfSense    Quad9       9.9.9.9:853

Décisions clés :

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 : 10.0.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.

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 10.0.10.0/24
       ▼
Services VLAN 10 (Vaultwarden, Grafana, Zabbix, NPM…)

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    *.lab.example → 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).