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 :
| Couche | Protection | Description |
|---|---|---|
| 1. Reseau | WireGuard VPN | Seules les IP du subnet 10.0.0.0/24 (les machines connectees au VPN) peuvent atteindre admin.beepass.io |
| 2. Reverse proxy | Traefik ipallowlist | Middleware Traefik qui rejette toute requete dont l'IP source n'est pas dans le subnet WireGuard |
| 3. Application | TOTP 2FA obligatoire | Code a 6 chiffres genere par une application (Google Authenticator, Authy, etc.), change toutes les 30 secondes |
| 4. Session | Cookie HMAC | JWT signe HS256 (jose), HttpOnly, Secure, SameSite=Lax, TTL 8h, domain .beepass.io |
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.
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 :
| Direction | Protocol | Port | Source |
|---|---|---|---|
| Inbound | UDP | 51820 | 0.0.0.0/0 |
| Inbound | UDP | 51820 | ::/0 |
DNS Cloudflare
Un enregistrement DNS doit pointer admin.beepass.io vers le serveur :
| Type | Nom | Contenu | Proxy |
|---|---|---|---|
| A | admin | <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
| Colonne | Description |
|---|---|
| Nom | Nom attribue au peer (convention # name=xxx dans wg0.conf) |
| IP | Adresse IP attribuee dans le subnet 10.0.0.0/24 |
| Cle publique | Cle publique du peer (tronquee pour lisibilite --- la cle complete fait 44 caracteres) |
| Dernier handshake | Date et heure du dernier echange de cles reussi (preuve que la connexion fonctionne) |
| Donnees transferees | Volume RX/TX envoye et recu par ce peer |
| Statut | Connecte (handshake < 2min) ou Deconnecte |
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) :
| Methode | Action | Description |
|---|---|---|
| GET | Liste | Liste peers + stats via wg show all dump (commande WireGuard qui retourne l'etat de tous les peers) |
| POST | add_peer | Genere cles, ajoute peer a chaud (sans redemarrer le VPN), retourne config client |
| POST | remove_peer | Supprime peer + cles du serveur |
| POST | get_config | Regenere 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 peervpn_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 :
- Ouvrir
/backoffice/wireguard - Cliquer "Ajouter un peer"
- Saisir le nom du peer et l'IP souhaitee (ex:
10.0.0.3) - Le systeme genere automatiquement les cles et la configuration
- Telecharger le fichier
.confou copier dans le clipboard - 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) :
- Ouvrir
/backoffice/wireguard - Cliquer le bouton de suppression sur le peer a revoquer
- Confirmer dans la modale AlertDialog
- 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
| Client | IP VPN |
|---|---|
| Serveur | 10.0.0.1 |
| Mathieu | 10.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 :
| Plateforme | Installation |
|---|---|
| Windows | https://www.wireguard.com/install/ > Windows Installer |
| macOS | App Store > "WireGuard" |
| Linux | sudo apt install wireguard (Debian/Ubuntu) |
| Android | Google Play Store > "WireGuard" |
| iOS | App 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
| Parametre | Description |
|---|---|
| PrivateKey | Cle privee du peer --- a ne jamais partager ni commiter (c'est l'equivalent de votre mot de passe VPN) |
| Address | IP attribuee au peer dans le reseau WireGuard (unique par peer) |
| DNS | Serveur DNS utilise lorsque le VPN est actif (ici Cloudflare DNS) |
| PublicKey | Cle publique du serveur WireGuard (permet au client de verifier qu'il parle bien au bon serveur) |
| Endpoint | Adresse IP publique du serveur + port UDP 51820 (le point de connexion) |
| AllowedIPs | 10.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) |
| PersistentKeepalive | Intervalle 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) :
- Ouvrir WireGuard
- "Importer tunnel(s) depuis un fichier" ou "Add tunnel"
- Selectionner le fichier
.conf - Activer le tunnel (toggle ON)
Mobile (Android/iOS) :
- Ouvrir WireGuard
- "+" > "Scanner un QR code"
- Scanner le QR code affiche par le script serveur ou la page admin
- Nommer le tunnel "BeePass Admin"
- 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 :
| Symptome | Cause probable | Solution |
|---|---|---|
| Handshake timeout | Port UDP 51820 bloque par un firewall | Verifier le firewall Hetzner (UDP 51820 inbound) et le firewall local (antivirus, box Internet) |
| Handshake timeout | Cles peer/serveur ne correspondent pas | Verifier la cle publique serveur dans le .conf client |
| Pas de handshake | Serveur WireGuard arrete | Verifier : wg show sur le serveur |
| DNS admin.beepass.io ne resout pas | Propagation DNS en cours | Attendre 5-30 minutes apres creation de l'enregistrement DNS |
| 403 sur admin.beepass.io avec VPN actif | IP VPN incorrecte (hors du subnet 10.0.0.0/24) | Verifier IP tunnel : wg show cote client |
| Handshake mais pas de trafic | IP forwarding desactive sur le serveur | Verifier : sysctl net.ipv4.ip_forward doit etre 1 |
| Connexion etablie mais pas d'acces | DNS mal configure dans le .conf client | Verifier les DNS dans le .conf. Tester nslookup admin.beepass.io |
| Deconnexions frequentes | NAT 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 :
- Verifier l'IP assignee : l'adresse doit etre dans le range
10.0.0.0/24 - Verifier la configuration Traefik : le middleware
ipallowlistdoit inclure le subnet10.0.0.0/24 - Verifier le routing :
AllowedIPsdans le.confclient doit inclure10.0.0.0/24 - Tester la connectivite :
ping 10.0.0.1(IP du serveur WireGuard)
Resolution de hostname derriere Traefik
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 :
- Header
X-Forwarded-Host(injecte par Traefik --- contient le vrai hostname) - Header
Host 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 :
| Point | Detail |
|---|---|
| Cles privees | Ne doivent jamais etre partagees ou commitees dans Git --- si une cle fuite, l'attaquant peut usurper l'identite du peer |
| wg0.conf | Fichier en chmod 600 (lecture/ecriture root uniquement) --- protege contre les lectures non autorisees |
| Port ouvert | Seul le port 51820 UDP est ouvert en supplement des ports 80/443 |
| Double protection | VPN = 1ere couche. L'admin doit aussi s'authentifier (HMAC cookie + TOTP 2FA) --- meme avec un acces VPN, il faut les identifiants |
| Convention nommage | Commentaire # 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 log | Actions vpn_peer_add et vpn_peer_remove logees dans auth_audit_log --- tracabilite complete des acces accordes et revoques |
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