Aller au contenu principal

VPN WireGuard

Le backoffice admin de BeePass contient des outils puissants : gestion des utilisateurs, acces a la base de donnees, configuration serveur, etc. Si un attaquant parvenait a y acceder, les consequences seraient graves. Un simple mot de passe, meme fort, ne suffit pas a proteger un tel acces --- il peut etre vole par phishing, devine par force brute, ou compromis dans une fuite de donnees.

C'est pourquoi l'acces au backoffice admin (admin.beepass.io) est protege par un VPN WireGuard en complement de l'authentification TOTP 2FA. Le VPN cree un reseau prive entre l'ordinateur de l'administrateur et le serveur : meme si quelqu'un connait le mot de passe admin, il ne peut pas atteindre la page de connexion s'il n'est pas connecte au VPN. C'est l'equivalent d'une cle physique pour entrer dans l'immeuble avant d'arriver a la porte de l'appartement.

Page : /backoffice/wireguard | Sidebar : Section "SECURITE" (rouge) > VPN WireGuard


Architecture

Le schema ci-dessous montre le chemin qu'emprunte une connexion admin. L'administrateur se connecte d'abord au VPN (qui lui attribue une adresse IP dans le reseau prive 10.0.0.x), puis sa requete passe par Traefik qui verifie que l'adresse IP est bien dans le sous-reseau autorise :

[Admin PC]                [Serveur Hetzner]              [Traefik]
10.0.0.2 --VPN UDP--> 10.0.0.1 (wg0) --interne-> admin.beepass.io
51820 46.225.91.59 ipallowlist 10.0.0.0/24

L'acces a admin.beepass.io est restreint au reseau WireGuard (10.0.0.0/24). Sans VPN actif, Traefik retourne 403 Forbidden --- la page n'est tout simplement pas accessible.

Flux de securite (4 couches)

L'acces admin est protege par 4 couches independantes. Chacune doit etre franchie pour acceder au backoffice --- si une couche est compromise, les trois autres restent en place :

CoucheProtectionDescription
1. ReseauWireGuard VPNSeules les IP du subnet 10.0.0.0/24 (les machines connectees au VPN) peuvent atteindre admin.beepass.io
2. Reverse proxyTraefik ipallowlistMiddleware Traefik qui rejette toute requete dont l'IP source n'est pas dans le subnet WireGuard
3. ApplicationTOTP 2FA obligatoireCode a 6 chiffres genere par une application (Google Authenticator, Authy, etc.), change toutes les 30 secondes
4. SessionCookie HMACJWT signe HS256 (jose), HttpOnly, Secure, SameSite=Lax, TTL 8h, domain .beepass.io
Acces sans VPN

Sans connexion WireGuard active, toute tentative d'acces a admin.beepass.io est bloquee par Traefik avec une erreur 403 Forbidden, meme si les identifiants admin sont valides. Il faut d'abord activer le VPN, puis se connecter.

Cloudflare proxy et ipallowlist

Le DNS admin.beepass.io pointe vers le serveur avec le proxy Cloudflare ON (nuage orange) car le certificat SSL est un Cloudflare Origin Certificate (les navigateurs ne font pas confiance aux Origin Certs directement --- Cloudflare doit servir d'intermediaire SSL). Consequence technique : l'ipallowlist Traefik ne voit pas l'IP reelle du client mais celle de Cloudflare. La protection VPN repose donc en pratique sur le fait que l'URL admin.beepass.io n'est connue que des admins et n'est pas indexee par les moteurs de recherche.


Prerequis serveur

Installation WireGuard

WireGuard est un protocole VPN moderne, repute pour sa simplicite et ses performances. L'installation sur le serveur se fait en une seule commande :

ssh -i ~/.ssh/beepass_key root@<SERVER_IP>
cd /opt/beepass
bash scripts/setup-wireguard.sh

Le script automatise toute la configuration :

  • Installe WireGuard + qrencode (pour generer des QR codes de configuration)
  • Genere les cles serveur et client (paire de cles cryptographiques)
  • Configure l'interface wg0 (10.0.0.1/24, port 51820)
  • Affiche la config client + QR code (a scanner dans l'app mobile)

Firewall Hetzner

Pour que les clients VPN puissent se connecter, il faut autoriser le port UDP 51820 dans le firewall Hetzner. Ajouter dans la console Hetzner Cloud > Firewalls :

DirectionProtocolPortSource
InboundUDP518200.0.0.0/0
InboundUDP51820::/0

DNS Cloudflare

Un enregistrement DNS doit pointer admin.beepass.io vers le serveur :

TypeNomContenuProxy
Aadmin<SERVER_IP>ON

Page admin backoffice

Plutot que de gerer les peers VPN en ligne de commande (ce qui est source d'erreurs et peu pratique), une page dediee dans le backoffice permet de tout gerer depuis l'interface web : /backoffice/wireguard (sidebar SECURITE > VPN WireGuard).

Fonctionnalites

  • Stat cards : peers connectes (actuellement en ligne), total peers (comptes configures), interface up/down
  • Table peers : nom, IP VPN, cle publique, dernier handshake (echange de cles), transfert RX/TX, statut connecte/deconnecte
  • Ajouter un peer : genere automatiquement les cles + la configuration client (download .conf ou copie clipboard)
  • Revoquer un peer : supprime du serveur immediatement (AlertDialog de confirmation pour eviter les suppressions accidentelles)
  • Config serveur : section expandable avec les informations de l'interface WireGuard

Tableau des peers

ColonneDescription
NomNom attribue au peer (convention # name=xxx dans wg0.conf)
IPAdresse IP attribuee dans le subnet 10.0.0.0/24
Cle publiqueCle publique du peer (tronquee pour lisibilite --- la cle complete fait 44 caracteres)
Dernier handshakeDate et heure du dernier echange de cles reussi (preuve que la connexion fonctionne)
Donnees transfereesVolume RX/TX envoye et recu par ce peer
StatutConnecte (handshake < 2min) ou Deconnecte
Handshake et activite

Un handshake (echange de cles) recent (< 2 minutes) indique un peer actuellement connecte. WireGuard maintient le tunnel actif par des keepalive periodiques (PersistentKeepalive = 25 --- un signal envoye toutes les 25 secondes). Un handshake ancien (> 5 minutes) signifie que le peer est probablement deconnecte ou que son application WireGuard est fermee.

Route API

/api/admin/wireguard (cookie admin HMAC requis) :

MethodeActionDescription
GETListeListe peers + stats via wg show all dump (commande WireGuard qui retourne l'etat de tous les peers)
POSTadd_peerGenere cles, ajoute peer a chaud (sans redemarrer le VPN), retourne config client
POSTremove_peerSupprime peer + cles du serveur
POSTget_configRegenere config client pour peer existant (utile si le fichier est perdu)

Audit

Toutes les actions VPN sont tracees dans le journal d'audit auth_audit_log, pour pouvoir retracer qui a ajoute ou supprime un acces :

  • vpn_peer_add : ajout d'un nouveau peer
  • vpn_peer_remove : revocation d'un peer

Gestion des peers

Un "peer" est un appareil (ordinateur, telephone) autorise a se connecter au VPN. Chaque peer recoit une adresse IP unique dans le reseau prive et une paire de cles cryptographiques.

Ajouter un peer (methode recommandee : page admin)

La methode la plus simple et la moins sujette aux erreurs :

  1. Ouvrir /backoffice/wireguard
  2. Cliquer "Ajouter un peer"
  3. Saisir le nom du peer et l'IP souhaitee (ex: 10.0.0.3)
  4. Le systeme genere automatiquement les cles et la configuration
  5. Telecharger le fichier .conf ou copier dans le clipboard
  6. Importer dans l'application WireGuard du client

Ajouter un peer (methode manuelle : serveur)

Pour les cas ou le backoffice n'est pas accessible (premier peer, panne du site) :

# Generer les cles (une paire privee/publique)
CLIENT_NAME="alice"
CLIENT_IP="10.0.0.3"
wg genkey | tee /etc/wireguard/client_${CLIENT_NAME}_private.key | \
wg pubkey > /etc/wireguard/client_${CLIENT_NAME}_public.key

# Ajouter le peer (a chaud, sans redemarrer le VPN)
wg set wg0 peer $(cat /etc/wireguard/client_${CLIENT_NAME}_public.key) \
allowed-ips ${CLIENT_IP}/32

# Sauvegarder la config (pour que le peer survive a un redemarrage du serveur)
wg-quick save wg0

Revoquer un peer

Quand un administrateur quitte l'equipe ou qu'un appareil est perdu/compromis, il faut revoquer son acces VPN immediatement.

Via la page admin (recommande) :

  1. Ouvrir /backoffice/wireguard
  2. Cliquer le bouton de suppression sur le peer a revoquer
  3. Confirmer dans la modale AlertDialog
  4. Le peer est supprime immediatement du serveur

Via le serveur (manuel) :

wg set wg0 peer <CLE_PUBLIQUE_PEER> remove
wg-quick save wg0

Le peer revoque perd immediatement l'acces au reseau prive et donc a admin.beepass.io --- la revocation est instantanee, sans delai.

IPs attribuees

ClientIP VPN
Serveur10.0.0.1
Mathieu10.0.0.2

Configuration client

Clients supportes

WireGuard est disponible sur toutes les plateformes courantes. L'application est legere (quelques Mo) et ne necessite aucune configuration complexe :

PlateformeInstallation
Windowshttps://www.wireguard.com/install/ > Windows Installer
macOSApp Store > "WireGuard"
Linuxsudo apt install wireguard (Debian/Ubuntu)
AndroidGoogle Play Store > "WireGuard"
iOSApp Store > "WireGuard"

Fichier de configuration

Le fichier .conf contient tous les parametres necessaires pour etablir la connexion VPN. Il est genere automatiquement par la page admin ou le script serveur :

[Interface]
PrivateKey = <VOTRE_CLE_PRIVEE>
Address = 10.0.0.x/24
DNS = 1.1.1.1

[Peer]
PublicKey = <CLE_PUBLIQUE_SERVEUR>
Endpoint = <SERVER_IP>:51820
AllowedIPs = 10.0.0.0/24
PersistentKeepalive = 25
ParametreDescription
PrivateKeyCle privee du peer --- a ne jamais partager ni commiter (c'est l'equivalent de votre mot de passe VPN)
AddressIP attribuee au peer dans le reseau WireGuard (unique par peer)
DNSServeur DNS utilise lorsque le VPN est actif (ici Cloudflare DNS)
PublicKeyCle publique du serveur WireGuard (permet au client de verifier qu'il parle bien au bon serveur)
EndpointAdresse IP publique du serveur + port UDP 51820 (le point de connexion)
AllowedIPs10.0.0.0/24 = split tunnel --- seul le trafic destine au reseau VPN passe par le tunnel. Le reste du trafic Internet continue d'utiliser la connexion normale (pas de ralentissement pour la navigation web)
PersistentKeepaliveIntervalle en secondes pour maintenir le tunnel actif. Indispensable derriere un NAT (la plupart des box Internet) qui fermerait sinon la connexion apres quelques minutes d'inactivite

Installation et connexion

Desktop (macOS/Windows/Linux) :

  1. Ouvrir WireGuard
  2. "Importer tunnel(s) depuis un fichier" ou "Add tunnel"
  3. Selectionner le fichier .conf
  4. Activer le tunnel (toggle ON)

Mobile (Android/iOS) :

  1. Ouvrir WireGuard
  2. "+" > "Scanner un QR code"
  3. Scanner le QR code affiche par le script serveur ou la page admin
  4. Nommer le tunnel "BeePass Admin"
  5. Activer

Verification

Apres avoir configure le VPN, voici comment verifier que tout fonctionne correctement :

# 1. Verifier que le VPN est actif (le serveur repond dans le reseau prive)
ping 10.0.0.1
# Reponse attendue: 64 bytes from 10.0.0.1

# 2. Acceder a l'admin (avec VPN actif)
curl -I https://admin.beepass.io
# Reponse attendue: HTTP/2 302 --> /backoffice (redirection vers la page de login)

# 3. Verifier que le backoffice est bloque sur le domaine principal (sans sous-domaine admin)
curl -I https://beepass.io/backoffice
# Reponse attendue: 404 (le middleware bloque /backoffice sur beepass.io)

Depannage

Problemes de connexion

Les problemes VPN sont souvent lies a des firewalls, des cles incorrectes ou des configurations DNS. Voici les scenarios les plus courants et leurs solutions :

SymptomeCause probableSolution
Handshake timeoutPort UDP 51820 bloque par un firewallVerifier le firewall Hetzner (UDP 51820 inbound) et le firewall local (antivirus, box Internet)
Handshake timeoutCles peer/serveur ne correspondent pasVerifier la cle publique serveur dans le .conf client
Pas de handshakeServeur WireGuard arreteVerifier : wg show sur le serveur
DNS admin.beepass.io ne resout pasPropagation DNS en coursAttendre 5-30 minutes apres creation de l'enregistrement DNS
403 sur admin.beepass.io avec VPN actifIP VPN incorrecte (hors du subnet 10.0.0.0/24)Verifier IP tunnel : wg show cote client
Handshake mais pas de traficIP forwarding desactive sur le serveurVerifier : sysctl net.ipv4.ip_forward doit etre 1
Connexion etablie mais pas d'accesDNS mal configure dans le .conf clientVerifier les DNS dans le .conf. Tester nslookup admin.beepass.io
Deconnexions frequentesNAT agressive (box Internet qui coupe les connexions inactives)Reduire PersistentKeepalive a 15 secondes

Impossible d'acceder a admin.beepass.io

Si le tunnel WireGuard est actif mais admin.beepass.io reste inaccessible, verifier dans cet ordre :

  1. Verifier l'IP assignee : l'adresse doit etre dans le range 10.0.0.0/24
  2. Verifier la configuration Traefik : le middleware ipallowlist doit inclure le subnet 10.0.0.0/24
  3. Verifier le routing : AllowedIPs dans le .conf client doit inclure 10.0.0.0/24
  4. Tester la connectivite : ping 10.0.0.1 (IP du serveur WireGuard)

Resolution de hostname derriere Traefik

Hostname dans le middleware Next.js

Derriere Traefik, request.nextUrl.hostname peut retourner le hostname interne Docker (un identifiant genere par Docker) au lieu du hostname public (admin.beepass.io). Le middleware Next.js de BeePass utilise une cascade de resolution pour contourner ce probleme :

  1. Header X-Forwarded-Host (injecte par Traefik --- contient le vrai hostname)
  2. Header Host
  3. request.nextUrl.hostname (fallback --- peut etre incorrect)

Ne jamais se fier uniquement a request.nextUrl.hostname pour les decisions de routage basees sur le domaine.


Commandes WireGuard serveur

Ces commandes sont utiles pour diagnostiquer et gerer le VPN directement depuis le serveur :

# Statut interface + peers connectes (vue lisible)
wg show

# Dump machine-readable (utilise par l'API admin /api/admin/wireguard)
wg show all dump

# Redemarrer interface (si probleme, les peers se reconnectent automatiquement)
wg-quick down wg0 && wg-quick up wg0

# Ajouter un peer manuellement
wg genkey | tee /etc/wireguard/client_NAME_private.key | \
wg pubkey > /etc/wireguard/client_NAME_public.key
wg set wg0 peer $(cat /etc/wireguard/client_NAME_public.key) \
allowed-ips 10.0.0.N/32
wg-quick save wg0

# Verifier IP forwarding (doit etre active pour que le VPN fonctionne)
sysctl net.ipv4.ip_forward
# Doit retourner : net.ipv4.ip_forward = 1

Securite

La securite du VPN repose sur la confidentialite des cles privees et la tracabilite des acces :

PointDetail
Cles priveesNe doivent jamais etre partagees ou commitees dans Git --- si une cle fuite, l'attaquant peut usurper l'identite du peer
wg0.confFichier en chmod 600 (lecture/ecriture root uniquement) --- protege contre les lectures non autorisees
Port ouvertSeul le port 51820 UDP est ouvert en supplement des ports 80/443
Double protectionVPN = 1ere couche. L'admin doit aussi s'authentifier (HMAC cookie + TOTP 2FA) --- meme avec un acces VPN, il faut les identifiants
Convention nommageCommentaire # name=xxx apres la ligne [Peer] dans wg0.conf (utilise par l'API admin pour afficher des noms lisibles au lieu de cles publiques)
Audit logActions vpn_peer_add et vpn_peer_remove logees dans auth_audit_log --- tracabilite complete des acces accordes et revoques
Securite des cles privees

Les cles privees WireGuard ne doivent jamais etre partagees, envoyees par email ou commitees dans un depot Git. L'historique Git conserve tout, meme les fichiers supprimes ensuite. Si une cle est compromise, revoquer immediatement le peer et generer une nouvelle paire de cles.


Voir aussi : Centre de securite | Rapports de securite | Vue d'ensemble