Files
docudjeex/content/fr/3.serveex/9.apps/2.vaultwarden.md
T

338 lines
11 KiB
Markdown

---
title: Vaultwarden
description: Installer Vaultwarden, un gestionnaire de mots de passe auto-hébergé compatible Bitwarden, pour remplacer ceux de Google ou d'Apple sur tous vos appareils.
---
:ellipsis{left=0px width=40rem top=10rem blur=140px zIndex=60}
![Vaultwarden](/img/serveex/vaultwarden.png)
[Vaultwarden](https://github.com/dani-garcia/vaultwarden) est une solution de gestion de mots de passe (génération, remplissage automatique...) que vous pouvez héberger directement sur votre serveur. Elle remplace les gestionnaires du type Google, Apple ou Keepass. Vaultwarden synchronise vos mots de passe sur tous vos appareils avec un chiffrement de bout en bout.
Vaultwarden est un fork de [Bitwarden](https://bitwarden.com/fr-fr/help/).
## Installation
::file-tree
---
tree:
/:
- srv:
- docker:
- vaultwarden:
- data/
- compose.yaml
- .env
---
::
::steps{level="3"}
### Déployer la stack
Ouvrez Dockge, cliquez sur `compose`, nommez la stack `vaultwarden`, et collez ce qui suit :
```yaml [compose.yaml]
---
services:
vaultwarden:
container_name: vaultwarden
image: vaultwarden/server:latest
restart: unless-stopped
env_file:
- .env
volumes:
- ./data/:/data/
ports:
- 3050:80
environment:
- DOMAIN=${URL}
- LOGIN_RATELIMIT_MAX_BURST=10
- LOGIN_RATELIMIT_SECONDS=60
- ADMIN_RATELIMIT_MAX_BURST=10
- ADMIN_RATELIMIT_SECONDS=60
- ADMIN_TOKEN=${TOKEN}
- SENDS_ALLOWED=true
- EMERGENCY_ACCESS_ALLOWED=true
- WEB_VAULT_ENABLED=true
- SIGNUPS_ALLOWED=false
- SIGNUPS_VERIFY=true
- SIGNUPS_VERIFY_RESEND_TIME=3600
- SIGNUPS_VERIFY_RESEND_LIMIT=5
```
::tip{icon=""}
✨ __Astuce :__ ajoutez le label Watchtower dans chaque conteneur pour automatiser les mises à jour
```yaml [compose.yaml]
---
services:
vaultwarden:
#...
labels:
- com.centurylinklabs.watchtower.enable=true
```
::
### Renseigner vos variables d'environnement
Générez ensuite un hash de mot de passe à mettre dans la variable `TOKEN` du `.env` :
```bash [Terminal]
echo -n 'votremotdepasse' | argon2 "$(openssl rand -base64 32)" -e -id -k 65540 -t 3 -p 4
```
Copiez le résultat en lieu sûr.
Dans le fichier `.env`, renseignez les variables suivantes :
```properties [.env]
URL=
TOKEN=
```
| Variable | Valeur | Exemple |
|----------|-------|---------|
| `URL` | L'URL de votre serveur Vaultwarden | `https://vault.mondomaine.fr` |
| `TOKEN` | Le token copié précédemment | `'$argon2id$v=19$m=65540,t=3,p=4$bXBGME...` |
Déployez ensuite le conteneur.
Depuis peu, Vaultwarden exige du SSL pour être accessible, ce qui empêche l'accès via une IP locale. Nous allons l'exposer avec SWAG, qui fournit un certificat SSL.
### Terminé !
::
::caution
__Si ça ne marche pas :__ vérifiez les règles de votre pare-feu.
::
## Exposer Vaultwarden avec SWAG
Le principal intérêt de Vaultwarden est de pouvoir y accéder à distance depuis n'importe quel appareil. Nous allons l'exposer à travers [SWAG](/serveex/core/swag).
::note{icon="" to="/general/networking/nat"}
📋 __Au préalable :__ assurez-vous d'avoir créé un sous-domaine DNS du type `vault.mondomaine.fr` avec un `CNAME` pointant vers `mondomaine.fr` et (à moins d'utiliser Cloudflare Zero Trust) d'avoir redirigé le port `443` de votre box vers le `443` de votre serveur via les **règles NAT**.
::
::steps{level="3"}
### Ajouter le réseau de Vaultwarden à SWAG
Dans Dockge, allez sur la stack SWAG et modifiez le fichier compose pour y ajouter le réseau de Vaultwarden :
```yaml [compose.yaml]
---
services:
swag:
container_name: # ...
# ...
networks: # Rattache le conteneur au réseau personnalisé
# ...
- vaultwarden # Nom du réseau déclaré
networks: # Définit le réseau personnalisé
# ...
vaultwarden: # Nom du réseau déclaré
name: vaultwarden_default # Nom réel du réseau externe
external: true
```
::note
Nous partons du principe que le nom du réseau est `vaultwarden_default`. Vous pouvez vérifier la connectivité en visitant le tableau de bord de SWAG sur http://ipdevotreserveur:81.
::
Redémarrez la stack en cliquant sur « Deploy » et attendez que SWAG soit pleinement opérationnel.
### Créer le fichier subdomain.conf
Dans le dossier de configuration de SWAG, créez le fichier `vault.subdomain.conf` :
::tip{icon="" to="/serveex/files/file-browser-quantum"}
✨ __Astuce :__ utilisez **File Browser Quantum** pour naviguer et modifier les fichiers plutôt que des commandes dans le terminal.
::
```bash [Terminal]
sudo nano /srv/docker/swag/config/nginx/proxy-confs/vault.subdomain.conf
```
Et collez la configuration suivante :
```nginx [vault.subdomain.conf]
server {
listen 443 ssl;
listen [::]:443 ssl;
server_name vault.*;
include /config/nginx/ssl.conf;
client_max_body_size 128M;
# enable for ldap auth (requires ldap-location.conf in the location block)
#include /config/nginx/ldap-server.conf;
# enable for Authelia (requires authelia-location.conf in the location block)
#include /config/nginx/authelia-server.conf;
# enable for Authentik (requires authentik-location.conf in the location block)
#include /config/nginx/authentik-server.conf;
location / {
# enable the next two lines for http auth
#auth_basic "Restricted";
#auth_basic_user_file /config/nginx/.htpasswd;
# enable for ldap auth
#include /config/nginx/ldap-location.conf;
# enable for Authelia
#include /config/nginx/authelia-location.conf;
# enable for Authentik
#include /config/nginx/authentik-location.conf;
include /config/nginx/proxy.conf;
include /config/nginx/resolver.conf;
set $upstream_app vaultwarden;
set $upstream_port 80;
set $upstream_proto http;
proxy_pass $upstream_proto://$upstream_app:$upstream_port;
}
location ~ ^(/vaultwarden)?/admin {
# enable the next two lines for http auth
#auth_basic "Restricted";
#auth_basic_user_file /config/nginx/.htpasswd;
# enable for ldap auth
#include /config/nginx/ldap-location.conf;
# enable for Authelia
#include /config/nginx/authelia-location.conf;
# enable for Authentik
#include /config/nginx/authentik-location.conf;
include /config/nginx/proxy.conf;
include /config/nginx/resolver.conf;
set $upstream_app vaultwarden;
set $upstream_port 80;
set $upstream_proto http;
proxy_pass $upstream_proto://$upstream_app:$upstream_port;
}
location ~ (/vaultwarden)?/api {
include /config/nginx/proxy.conf;
include /config/nginx/resolver.conf;
set $upstream_app vaultwarden;
set $upstream_port 80;
set $upstream_proto http;
proxy_pass $upstream_proto://$upstream_app:$upstream_port;
}
location ~ (/vaultwarden)?/notifications/hub {
include /config/nginx/proxy.conf;
include /config/nginx/resolver.conf;
set $upstream_app vaultwarden;
set $upstream_port 80;
set $upstream_proto http;
proxy_pass $upstream_proto://$upstream_app:$upstream_port;
}
}
```
Appuyez sur :kbd{value="Ctrl+O"}, puis :kbd{value="Enter"} pour enregistrer, et :kbd{value="Ctrl+X"} pour quitter.
### Terminé !
::
Et voilà ! Vaultwarden est maintenant exposé ! Rendez-vous sur `https://vault.mondomaine.fr/admin` pour accéder au panneau d'administration et collez le mot de passe que vous avez indiqué lors de la génération de l'`ADMIN_TOKEN`. Pour plus d'informations, voir la [documentation Bitwarden](https://bitwarden.com/help/).
N'oubliez pas d'installer les extensions navigateur Bitwarden (elles fonctionnent avec Vaultwarden) pour [Chrome](https://chromewebstore.google.com/detail/gestionnaire-de-mots-de-p/nngceckbapebfimnlniiiahkandclblb) et [Firefox](https://addons.mozilla.org/fr/firefox/addon/bitwarden-password-manager/), ainsi que les applications [iOS](https://apps.apple.com/fr/app/bitwarden/id1137397744) et [Android](https://play.google.com/store/apps/details?id=com.x8bit.bitwarden&hl=fr) pour synchroniser vos mots de passe.
## Protéger Vaultwarden avec Pocket ID
Contrairement à la plupart des applications de ce site, Vaultwarden gère OIDC nativement, il n'y a donc pas besoin ici du proxy forward-auth de TinyAuth ni de l'astuce reverse-proxy d'Authentik : Vaultwarden lui-même peut exiger une connexion OIDC avant de laisser qui que ce soit entrer dans le coffre.
::steps{level="3"}
### Enregistrer Vaultwarden comme client OIDC
[Enregistrez un client OIDC dans Pocket ID](/serveex/security/pocket-id#registering-an-oidc-client) (ou dans Authentik, ou tout autre fournisseur OIDC) avec cette URL de callback :
```text
https://vault.mondomaine.fr/identity/connect/oidc-signin
```
### Ajouter les variables SSO
Modifiez le fichier `.env` de Vaultwarden :
```bash [Terminal]
sudo nano /srv/docker/vaultwarden/.env
```
Ajoutez ceci :
```properties [.env]
SSO_ENABLED=true
SSO_ONLY=true
SSO_AUTHORITY=https://id.mondomaine.fr
SSO_CLIENT_ID=
SSO_CLIENT_SECRET=
```
| Variable | Valeur |
|----------|-------|
| `SSO_AUTHORITY`{lang=properties} | L'URL publique de votre fournisseur OIDC (Pocket ID ici) |
| `SSO_CLIENT_ID`{lang=properties} | Le client ID copié depuis votre fournisseur |
| `SSO_CLIENT_SECRET`{lang=properties} | Le client secret copié depuis votre fournisseur |
::note
Mettez plutôt `SSO_ONLY=false` si vous préférez garder aussi la possibilité de vous connecter avec un mot de passe maître local.
::
Appuyez sur :kbd{value="Ctrl+O"}, puis :kbd{value="Enter"} pour enregistrer, et :kbd{value="Ctrl+X"} pour quitter.
### Redéployer la stack
Redéployez Vaultwarden. Votre prochaine visite sur `https://vault.mondomaine.fr` demandera une connexion SSO plutôt que (ou en plus de) le mot de passe maître local.
### Terminé !
::
::note{to="https://github.com/dani-garcia/vaultwarden/wiki/Enabling-SSO-support-using-OpenId-Connect"}
Voir le **wiki SSO de Vaultwarden** pour la liste complète des options, y compris l'application par organisation et les politiques de mot de passe maître.
::
::::tip{icon=""}
✨ Vous pouvez utiliser [Authentik](/serveex/advanced/authentik) plutôt que Pocket ID :
:::collapsible{name="les étapes de configuration Authentik"}
::steps{level="4"}
#### Créer un scope mapping pour le claim email
Dans Authentik, créez un scope mapping nommé `email` avec l'expression `return {"email": request.user.email, "email_verified": True}` (Vaultwarden exige ce claim).
#### Créer l'application et le provider
Créez une application et un provider OAuth2/OpenID Connect nommé `Vaultwarden`, avec une redirect URI (de type `Strict`) valant `https://vault.mondomaine.fr/identity/connect/oidc-signin`. Dans les Advanced protocol settings, réglez la validité du token d'accès à plus de 5 minutes, remplacez le scope email par défaut par votre mapping personnalisé, et ajoutez le scope mapping `offline_access`.
#### Renseigner les variables d'environnement de Vaultwarden
Notez les __Client ID__, __Client Secret__ et __Slug__ du provider, puis utilisez-les dans le `.env` de Vaultwarden :
```properties [.env]
SSO_AUTHORITY=https://authentik.mondomaine.fr/application/o/<slug>/
SSO_CLIENT_ID=
SSO_CLIENT_SECRET=
SSO_SCOPES=email profile offline_access
```
#### Terminé !
::
:::
::::