- Guide d'installation détaillé étape par étape - Instructions de génération et hashage du token admin avec Argon2 - Configuration de sécurité (capabilities, rate limiting, limites ressources) - Procédures de backup/restore manuelles et automatiques - Guide de maintenance (mises à jour, logs, healthcheck) - Section dépannage avec solutions aux problèmes courants - Recommandations de sécurité additionnelle (Fail2Ban, 2FA) - Diagramme d'architecture et liens ressources 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
336 lines
7.3 KiB
Markdown
336 lines
7.3 KiB
Markdown
# Vaultwarden Docker Deployment
|
|
|
|
Déploiement sécurisé de [Vaultwarden](https://github.com/dani-garcia/vaultwarden) (serveur Bitwarden open-source) avec Docker Compose et Traefik.
|
|
|
|
## Caractéristiques
|
|
|
|
- **Sécurité renforcée** : Capabilities Linux limitées, rate limiting, inscriptions désactivées
|
|
- **HTTPS automatique** : Certificats Let's Encrypt via Traefik
|
|
- **Limites de ressources** : Protection contre les fuites mémoire
|
|
- **Health checks** : Surveillance automatique de l'état du service
|
|
- **Configuration SMTP** : Récupération de mot de passe par email
|
|
|
|
## Prérequis
|
|
|
|
- Docker et Docker Compose installés
|
|
- Traefik configuré avec le réseau `traefik-net`
|
|
- Nom de domaine pointant vers votre serveur
|
|
- Serveur SMTP (optionnel, pour les emails)
|
|
|
|
## Installation
|
|
|
|
### 1. Cloner le projet
|
|
|
|
```bash
|
|
git clone <votre-repo>
|
|
cd agence66-vaultwarden
|
|
```
|
|
|
|
### 2. Configuration
|
|
|
|
Copier et éditer le fichier d'environnement :
|
|
|
|
```bash
|
|
cp .env.example .env
|
|
nano .env
|
|
```
|
|
|
|
### 3. Variables d'environnement
|
|
|
|
Configurer les variables dans `.env` :
|
|
|
|
```env
|
|
# Domaine public de votre instance
|
|
DOMAIN=vault.example.com
|
|
|
|
# Token admin (IMPORTANT : générer un token fort)
|
|
ADMIN_TOKEN=<généré-avec-openssl-rand-base64-48>
|
|
|
|
# Configuration SMTP (optionnel)
|
|
SMTP_HOST=smtp.example.com
|
|
SMTP_PORT=587
|
|
SMTP_FROM=vaultwarden@example.com
|
|
SMTP_USER=votre-utilisateur
|
|
SMTP_PASSWORD=votre-mot-de-passe
|
|
```
|
|
|
|
#### Générer un token admin sécurisé
|
|
|
|
**Étape 1 : Générer un token aléatoire**
|
|
|
|
```bash
|
|
openssl rand -base64 48
|
|
```
|
|
|
|
**Étape 2 : Hasher le token (RECOMMANDÉ)**
|
|
|
|
Pour une sécurité maximale, il est **fortement recommandé** de hasher le token avec Argon2 avant de le mettre dans `.env`.
|
|
|
|
**Option A : Avec Docker (pas besoin d'installer argon2)**
|
|
|
|
```bash
|
|
# Remplacer YOUR_TOKEN par le token généré à l'étape 1
|
|
echo -n "YOUR_TOKEN" | docker run --rm -i vaultwarden/server:latest \
|
|
/vaultwarden hash --preset owasp
|
|
```
|
|
|
|
**Option B : Avec argon2 installé localement**
|
|
|
|
```bash
|
|
# Installation (Debian/Ubuntu)
|
|
sudo apt install argon2
|
|
|
|
# Hasher le token
|
|
echo -n "YOUR_TOKEN" | argon2 "$(openssl rand -base64 32)" -e -id -k 65540 -t 3 -p 4
|
|
```
|
|
|
|
**Utilisation du hash**
|
|
|
|
1. Copiez le hash généré (commence par `$argon2id$...`)
|
|
2. Mettez-le dans `.env` comme ceci :
|
|
|
|
```env
|
|
ADMIN_TOKEN=$argon2id$v=19$m=65540,t=3,p=4$base64hash...
|
|
```
|
|
|
|
3. Pour vous connecter au panel admin, utilisez le **token en clair** (celui de l'étape 1), pas le hash
|
|
|
|
**Pourquoi hasher ?**
|
|
|
|
- ✅ **Sécurité** : Si quelqu'un accède à votre `.env`, il ne peut pas utiliser le hash directement
|
|
- ✅ **Protection** : Le hash ne peut pas être inversé pour retrouver le token
|
|
- ✅ **Best practice** : Recommandé par la documentation officielle Vaultwarden
|
|
|
|
**Documentation officielle** : [Securing the admin token](https://github.com/dani-garcia/vaultwarden/wiki/Enabling-admin-page#secure-the-admin_token)
|
|
|
|
### 4. Créer le répertoire de données
|
|
|
|
```bash
|
|
mkdir -p data
|
|
chmod 700 data
|
|
```
|
|
|
|
### 5. Démarrer le service
|
|
|
|
```bash
|
|
docker compose up -d
|
|
```
|
|
|
|
### 6. Vérifier le statut
|
|
|
|
```bash
|
|
docker compose ps
|
|
docker compose logs -f vaultwarden
|
|
```
|
|
|
|
## Accès
|
|
|
|
- **Interface utilisateur** : `https://votre-domaine.com`
|
|
- **Panel admin** : `https://votre-domaine.com/admin`
|
|
- Token requis (celui dans `.env`)
|
|
|
|
## Configuration de sécurité
|
|
|
|
### Capabilities Linux
|
|
|
|
Le container utilise le principe du moindre privilège :
|
|
- Toutes les capabilities sont supprimées (`cap_drop: ALL`)
|
|
- Seules les capabilities nécessaires sont ajoutées :
|
|
- `CHOWN` : Changer propriétaire des fichiers
|
|
- `SETGID` : Changer group ID
|
|
- `SETUID` : Changer user ID
|
|
|
|
### Rate Limiting
|
|
|
|
Protection contre le brute-force :
|
|
- **Connexions** : 10 tentatives max par 60 secondes
|
|
- **Emails** : 3 tentatives max, expiration 10 minutes
|
|
|
|
### Limites de ressources
|
|
|
|
- **Mémoire max** : 256 MB
|
|
- **CPU max** : 50% d'un core
|
|
- **Mémoire réservée** : 128 MB
|
|
|
|
## Backup
|
|
|
|
### Backup manuel
|
|
|
|
```bash
|
|
# Arrêter le service
|
|
docker compose down
|
|
|
|
# Créer une archive datée
|
|
tar -czf backup-vaultwarden-$(date +%Y%m%d-%H%M%S).tar.gz data/
|
|
|
|
# Redémarrer le service
|
|
docker compose up -d
|
|
```
|
|
|
|
### Backup automatique (cron)
|
|
|
|
Créer un script `/usr/local/bin/backup-vaultwarden.sh` :
|
|
|
|
```bash
|
|
#!/bin/bash
|
|
BACKUP_DIR="/path/to/backups"
|
|
cd /path/to/agence66-vaultwarden
|
|
|
|
docker compose exec vaultwarden sqlite3 /data/db.sqlite3 ".backup /data/db-backup.sqlite3"
|
|
tar -czf "${BACKUP_DIR}/vaultwarden-$(date +%Y%m%d-%H%M%S).tar.gz" data/
|
|
find "${BACKUP_DIR}" -name "vaultwarden-*.tar.gz" -mtime +30 -delete
|
|
```
|
|
|
|
Ajouter au crontab :
|
|
|
|
```bash
|
|
0 2 * * * /usr/local/bin/backup-vaultwarden.sh
|
|
```
|
|
|
|
## Restore
|
|
|
|
```bash
|
|
# Arrêter le service
|
|
docker compose down
|
|
|
|
# Supprimer les données actuelles
|
|
rm -rf data/*
|
|
|
|
# Extraire le backup
|
|
tar -xzf backup-vaultwarden-YYYYMMDD-HHMMSS.tar.gz
|
|
|
|
# Redémarrer
|
|
docker compose up -d
|
|
```
|
|
|
|
## Maintenance
|
|
|
|
### Mise à jour
|
|
|
|
```bash
|
|
# 1. Backup (voir section Backup)
|
|
|
|
# 2. Mettre à jour l'image dans docker-compose.yml
|
|
# Remplacer : image: vaultwarden/server:latest
|
|
# Par : image: vaultwarden/server:1.31.0 (version désirée)
|
|
|
|
# 3. Télécharger la nouvelle image
|
|
docker compose pull
|
|
|
|
# 4. Recréer le container
|
|
docker compose up -d
|
|
|
|
# 5. Vérifier les logs
|
|
docker compose logs -f vaultwarden
|
|
```
|
|
|
|
### Logs
|
|
|
|
```bash
|
|
# Temps réel
|
|
docker compose logs -f vaultwarden
|
|
|
|
# 100 dernières lignes
|
|
docker compose logs --tail=100 vaultwarden
|
|
```
|
|
|
|
### Healthcheck
|
|
|
|
```bash
|
|
# Vérifier l'état
|
|
docker inspect vaultwarden --format='{{.State.Health.Status}}'
|
|
|
|
# Doit retourner : healthy
|
|
```
|
|
|
|
## Dépannage
|
|
|
|
### Le service ne démarre pas
|
|
|
|
```bash
|
|
# Vérifier les logs
|
|
docker compose logs vaultwarden
|
|
|
|
# Vérifier le réseau Traefik
|
|
docker network ls | grep traefik-net
|
|
|
|
# Créer le réseau si nécessaire
|
|
docker network create traefik-net
|
|
```
|
|
|
|
### Erreur certificat SSL
|
|
|
|
Vérifier que :
|
|
- Le domaine pointe bien vers le serveur (DNS)
|
|
- Le port 80 est ouvert (Let's Encrypt challenge)
|
|
- Traefik est correctement configuré
|
|
|
|
### Impossible de se connecter
|
|
|
|
```bash
|
|
# Vérifier que le service répond
|
|
curl -I http://localhost:80/alive
|
|
|
|
# Vérifier les labels Traefik
|
|
docker inspect vaultwarden | grep traefik
|
|
```
|
|
|
|
### Problème de performance
|
|
|
|
Ajuster les limites dans `docker-compose.yml` :
|
|
|
|
```yaml
|
|
deploy:
|
|
resources:
|
|
limits:
|
|
memory: 512M # Augmenter si nécessaire
|
|
cpus: '1.0'
|
|
```
|
|
|
|
## Sécurité additionnelle (recommandé)
|
|
|
|
### Fail2Ban
|
|
|
|
Installer Fail2Ban pour bloquer les IPs suspectes :
|
|
|
|
```bash
|
|
# /etc/fail2ban/filter.d/vaultwarden.conf
|
|
[Definition]
|
|
failregex = ^.*Username or password is incorrect\. Try again\. IP: <ADDR>\. Username:.*$
|
|
ignoreregex =
|
|
```
|
|
|
|
### Authentification 2FA
|
|
|
|
Configurer 2FA pour tous les utilisateurs via l'interface web.
|
|
|
|
### Audit régulier
|
|
|
|
Vérifier régulièrement :
|
|
- Panel admin → View logs
|
|
- Utilisateurs actifs
|
|
- Appareils connectés
|
|
|
|
## Architecture
|
|
|
|
```
|
|
Internet
|
|
↓
|
|
Traefik (reverse proxy)
|
|
↓ HTTPS
|
|
Vaultwarden (Docker)
|
|
↓
|
|
./data (SQLite + attachments)
|
|
```
|
|
|
|
## Ressources
|
|
|
|
- [Vaultwarden Wiki](https://github.com/dani-garcia/vaultwarden/wiki)
|
|
- [Vaultwarden GitHub](https://github.com/dani-garcia/vaultwarden)
|
|
- [Configuration SMTP](https://github.com/dani-garcia/vaultwarden/wiki/SMTP-Configuration)
|
|
- [Sécurité Admin Panel](https://github.com/dani-garcia/vaultwarden/wiki/Enabling-admin-page#secure-the-admin_token)
|
|
|
|
## Licence
|
|
|
|
Ce projet de déploiement est libre d'utilisation. Vaultwarden est sous licence GPL-3.0.
|