Corrige l'échec silencieux « Accès refusé » à la connexion Windows : wireguard.exe /install|uninstalltunnelservice était lancé sans élévation en misant sur son manifeste UAC natif, qui ne s'auto-déclenche jamais via un appel process-à-process. L'appel tente maintenant sans élévation (compatible avec les ACLs accordées via le bouton dédié), puis retente avec une vraie élévation UAC si le premier essai échoue. Le diagnostic d'élévation est mis à jour pour refléter les deux cas. 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.5 · 🐍 · 🪟🐧 · 🔐 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
|