Sécurité : la clé privée ne subsiste plus en clair dans %APPDATA%. Le .conf généré est écrasé puis supprimé dès que wireguard.exe l'a consommé (il en garde sa propre copie chiffrée DPAPI), et l'import propose d'effacer le fichier source. Windows uniquement : sous Linux /etc/wireguard/<iface>.conf reste requis par wg-quick down. Corrige aussi ImpersonateNamedPipeClient, qui appartient à win32security et non à win32pipe (vérifié par introspection). Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
214 lines
7.9 KiB
Markdown
214 lines
7.9 KiB
Markdown
# 🛡️ WGSecure (WGS)
|
||
|
||
🚀 v0.7.19 · 🐍 · 🪟🐧 · 🔐 MFA TOTP · 🛡️ WireGuard
|
||
|
||
**WGSecure** est une interface graphique multiplateforme (Windows & Linux) pour gérer une connexion WireGuard avec une surcouche MFA (authentification à deux facteurs TOTP).
|
||
|
||
---
|
||
|
||
## ✨ Fonctionnalités
|
||
|
||
| # | Fonctionnalité | Détail |
|
||
|---|---|---|
|
||
| 🖥️ | **Interface systray** | Icône bouclier dans la barre de notification, connexion en un clic |
|
||
| 👤 | **Mode User** (défaut) | Connexion / déconnexion WireGuard, statut RX/TX en temps réel |
|
||
| 📊 | **Graphique bande passante** | Courbes RX/TX en direct sur les 30 dernières secondes |
|
||
| 📋 | **Journal d'événements** | Horodatage de chaque connexion, déconnexion, erreur |
|
||
| 🕘 | **Historique des sessions** | Durée, données transférées, serveur par session |
|
||
| ⚙️ | **Mode Admin** | Configuration complète, protégé par mot de passe |
|
||
| 🔑 | **Génération de clés** | Paire Curve25519 native (sans dépendance au binaire `wg`) |
|
||
| 👤 | **Multi-profils** | Sauvegarde / bascule entre profils, import/export `.conf` |
|
||
| 🛡️ | **Configuration WireGuard** | Serveur, port UDP, DNS, IP client, keepalive |
|
||
| 🔐 | **MFA TOTP** | Compatible Bitwarden + QR Code |
|
||
| 🔍 | **Test DNS leak** | Vérifie que le DNS passe bien par le tunnel |
|
||
| 🏓 | **Ping en temps réel** | Badge de latence dans l'interface principale |
|
||
| 🔄 | **Auto-reconnexion** | Surveillance et reconnexion automatique si le tunnel tombe — activée par défaut (15 s) |
|
||
| 📡 | **Test de connexion** | Handshake WireGuard réel, sans monter le tunnel, avec détection du filtrage sur port source |
|
||
| 🚀 | **Démarrage automatique** | Lancement au démarrage du système — activé par défaut |
|
||
| 1️⃣ | **Instance unique** | Un second lancement réveille l'instance déjà active plutôt que d'en ouvrir une seconde |
|
||
| 🪟🐧 | **Cross-platform** | Windows 10+ et Linux (wg-quick) |
|
||
|
||
---
|
||
|
||
## 📋 Prérequis
|
||
|
||
### 🐧 Linux
|
||
```bash
|
||
sudo apt install wireguard-tools # Debian/Ubuntu
|
||
sudo dnf install wireguard-tools # Fedora
|
||
```
|
||
|
||
### 🪟 Windows
|
||
- [WireGuard for Windows](https://www.wireguard.com/install/) installé
|
||
|
||
### 🐍 Python
|
||
```
|
||
Python >= 3.11
|
||
```
|
||
|
||
---
|
||
|
||
## 📦 Installation
|
||
|
||
```bash
|
||
git clone <repo>
|
||
cd WGSecure
|
||
pip install -r requirements.txt
|
||
```
|
||
|
||
---
|
||
|
||
## 🚀 Utilisation
|
||
|
||
### Mode User (par défaut)
|
||
```bash
|
||
python main.py
|
||
# ou via Makefile :
|
||
make run
|
||
```
|
||
|
||
### ⚙️ Mode Administrateur (configuration)
|
||
```bash
|
||
python main.py --admin
|
||
# ou via Makefile :
|
||
make run-admin
|
||
```
|
||
|
||
### Sans systray
|
||
```bash
|
||
python main.py --no-tray
|
||
```
|
||
|
||
---
|
||
|
||
## 🔧 Makefile
|
||
|
||
| Commande | Description |
|
||
|---|---|
|
||
| `make install` | Installe les dépendances Python |
|
||
| `make linux` | Compile un binaire Linux autonome (PyInstaller) |
|
||
| `make windows` | Compile un binaire Windows via Wine |
|
||
| `make release` | Binaire Linux renommé avec la version |
|
||
| `make install-gnome` | Installe dans le menu GNOME (`~/.local/`) |
|
||
| `make uninstall-gnome` | Désinstalle du menu GNOME |
|
||
| `make reset-password` | Supprime le mot de passe administrateur |
|
||
| `make run` | Lance l'application |
|
||
| `make run-admin` | Lance en mode administrateur |
|
||
| `make clean` | Supprime les artefacts de build |
|
||
|
||
---
|
||
|
||
## 🗺️ Workflow recommandé
|
||
|
||
1. 🚀 Lancer `python main.py --admin`
|
||
2. 🛡️ Onglet **WireGuard** : renseigner l'adresse, le port et la clé publique du serveur
|
||
3. 🔑 Onglet **Clés** : générer une paire de clés → copier la clé publique sur le serveur
|
||
4. 🔐 Onglet **MFA** : activer le MFA, générer un secret, scanner le QR Code avec Bitwarden
|
||
5. 🔒 Onglet **Sécurité** : définir un mot de passe pour l'accès admin
|
||
6. ✅ **Enregistrer** → quitter → lancer `python main.py` en mode user
|
||
|
||
---
|
||
|
||
## 🐧 Élévation de privilèges Linux
|
||
|
||
`wg-quick`, la lecture de l'état du tunnel (`wg show`) et le nettoyage réseau
|
||
(interface orpheline, DNS) nécessitent les droits root. WGSecure tente dans
|
||
l'ordre :
|
||
|
||
1. **sudo -n** — silencieux, fonctionne si une règle NOPASSWD est en place
|
||
(voir ci-dessous)
|
||
2. **sudo -A** avec programme askpass graphique (`ssh-askpass`, etc.)
|
||
3. **pkexec** (polkit) — dialogue graphique GNOME/KDE ; nécessite un agent
|
||
d'authentification actif, absent d'un simple terminal (SSH, tmux)
|
||
|
||
Le sondage périodique de l'état du tunnel (toutes les 3 s) ne tente que
|
||
l'étape 1 : sans règle NOPASSWD, aucun dialogue n'apparaît, le handshake et
|
||
les compteurs RX/TX restent simplement vides.
|
||
|
||
### Supprimer la demande de mot de passe (recommandé)
|
||
|
||
```bash
|
||
make setup-sudoers
|
||
```
|
||
|
||
Invite le mot de passe une fois dans le terminal (via `sudo`, plus fiable que
|
||
`pkexec` hors session graphique), puis installe une règle NOPASSWD limitée à
|
||
`wg-quick`, `wg`, et au nettoyage d'une interface/DNS orpheline — jamais un
|
||
accès root généralisé. Idempotent : une relance ne redemande le mot de passe
|
||
que si le contenu a changé. `make check-privileges` affiche l'état courant.
|
||
|
||
Pour le faire à la main :
|
||
|
||
```bash
|
||
sudo visudo -f /etc/sudoers.d/wgsecure
|
||
```
|
||
|
||
```
|
||
<utilisateur> ALL=(ALL) NOPASSWD: /usr/bin/wg-quick
|
||
<utilisateur> ALL=(ALL) NOPASSWD: /usr/bin/wg
|
||
<utilisateur> ALL=(ALL) NOPASSWD: /usr/sbin/ip link delete dev *
|
||
<utilisateur> ALL=(ALL) NOPASSWD: /usr/sbin/resolvconf -d *
|
||
<utilisateur> ALL=(ALL) NOPASSWD: /usr/bin/resolvectl revert *
|
||
<utilisateur> ALL=(ALL) NOPASSWD: /usr/bin/resolvectl dns *
|
||
<utilisateur> ALL=(ALL) NOPASSWD: /usr/bin/resolvectl domain *
|
||
<utilisateur> ALL=(ALL) NOPASSWD: /usr/bin/install -D -m 600 -o root -g root * /etc/wireguard/*
|
||
```
|
||
|
||
### Réinitialiser le mot de passe admin oublié
|
||
|
||
```bash
|
||
make reset-password
|
||
```
|
||
|
||
---
|
||
|
||
## 🏗️ Architecture
|
||
|
||
```
|
||
WGSecure/
|
||
├── main.py # 🚀 Point d'entrée
|
||
├── requirements.txt
|
||
├── Makefile
|
||
├── app/
|
||
│ ├── __init__.py # Version
|
||
│ ├── app_info.py # ℹ️ Contenu de la page « À propos »
|
||
│ ├── core/
|
||
│ │ ├── config.py # 💾 Configuration JSON persistante + bcrypt
|
||
│ │ ├── wireguard.py # 🛡️ Clés, tunnel, statut, DNS leak
|
||
│ │ ├── wg_handshake.py # 🤝 Sonde de handshake réel, sans monter le tunnel
|
||
│ │ ├── single_instance.py # 1️⃣ Garde une seule instance active
|
||
│ │ ├── history.py # 🕘 Historique des sessions (sessions.json)
|
||
│ │ ├── log.py # 📋 Journal d'événements (events.json)
|
||
│ │ └── mfa.py # 🔐 TOTP / QR Code
|
||
│ ├── ui/
|
||
│ │ ├── icons.py # 🎨 Icônes bouclier générées par QPainter
|
||
│ │ ├── main_window.py # 👤 Fenêtre principale (mode user)
|
||
│ │ ├── admin_window.py # ⚙️ Panneau admin (onglets, thème sombre)
|
||
│ │ ├── bw_graph.py # 📊 Widget graphique bande passante
|
||
│ │ ├── history_dialog.py # 🕘 Dialogue historique des sessions
|
||
│ │ ├── mfa_dialog.py # 🔐 Dialogue de vérification MFA
|
||
│ │ └── systray.py # 🖥️ Icône systray + menu contextuel
|
||
│ └── utils/
|
||
│ └── platform_utils.py # 🔧 Détection OS, élévation de privilèges
|
||
```
|
||
|
||
---
|
||
|
||
## 🔒 Sécurité
|
||
|
||
| Élément | Protection |
|
||
|---|---|
|
||
| 🔑 Mot de passe admin | **bcrypt** (rounds=12) + sel intégré — migration transparente depuis SHA-256 |
|
||
| 🗝️ Clé privée WireGuard | `~/.wgsecure/config.json` (Linux) / `%APPDATA%\WGSecure\` (Windows) |
|
||
| 🔐 Secret MFA TOTP | Stocké dans le fichier de configuration local |
|
||
| 📄 Fichier `.conf` WireGuard | Permissions `0600` (lecture propriétaire uniquement) |
|
||
|
||
> ⚠️ **Recommandation** : chiffrez votre disque pour protéger le fichier de configuration.
|
||
|
||
---
|
||
|
||
## 👤 Auteur
|
||
|
||
Développé par **Johnny** — [JT-Tools](https://github.com/JT-Tools)
|
||
Version :  — Septembre 2026
|