Mirror the French docs onto the English structure
This commit is contained in:
@@ -0,0 +1,2 @@
|
||||
title: Avancé
|
||||
icon: i-lucide-flask-conical
|
||||
@@ -0,0 +1,567 @@
|
||||
---
|
||||
title: Authentik
|
||||
description: Installer Authentik comme fournisseur d'identité auto-hébergé, configurer le MFA et protéger vos services avec du SSO et l'authentification via reverse proxy.
|
||||
---
|
||||
|
||||
|
||||
:ellipsis{left=0px width=40rem top=10rem blur=140px zIndex=60}
|
||||
|
||||
[Authentik](https://goauthentik.io) est un outil d'authentification unique permettant de vous logger une seule fois sur les plateformes compatibles OpenID. Il permet également de sécuriser l'accès aux services que vous exposez, en s'injectant via SWAG aux requetes vers vos services.
|
||||
|
||||
Ainsi, si vous exposez Dockge sur internet via `dockge.mondomaine.fr`, au moment de l'accès à cette page, vous tomberez sur une page de login d'authentik. Si vous avez déjà été identifié sur un autre service sécurisé par authentik auparavant, alors vous serez déjà identifié. cela permet d'avoir à vous identifiez qu'une seule fois par jour sur l'ensemble des services protégés par authentik.
|
||||
|
||||
Authentik permet aussi d'utiliser le multi-facteur, notamment par TOTP (code généré par une application d'authentification de votre choix. Enfin, authentik permet aussi de se connecter directement via un compte Microsoft ou Google, si vous avez configuré une application d'un de ces services.
|
||||
|
||||
C'est une bonne manière de se passer de VPN pour exposer vos services, et d'exposer des services qui ne sont pas protégés par du MFA voir pas protégés par des login (comme le dashboard de swag).
|
||||
|
||||
Authentik dipose d'[une doc très fournie](https://docs.goauthentik.io/docs/installation/docker-compose) et des [fabuleux tuto de Cooptonian](https://www.youtube.com/@cooptonian). Ici, nous montrerons juste les bases, avec l'exemple de l'exposition de Dockge.
|
||||
|
||||
Deux modes principaux sont à connaitre:
|
||||
|
||||
- Le premier permet à une application qui dispose nativement d'une intégration avec du SSO compatible OpenID de se connecter directement à Authentik. C'est la solution à privilégier car elle permet de laisser l'application décider de ce qui est public et de ce qui est protégé.
|
||||
|
||||

|
||||
|
||||
- Le second permet d'injecter une authentification via authentik grace à SWAG avant d'arriver sur le service désiré.
|
||||
|
||||

|
||||
|
||||
Les deux modes son configurables application par application.
|
||||
|
||||
## Installation
|
||||
Structure des dossiers :
|
||||
```text [Arborescence]
|
||||
root
|
||||
└── docker
|
||||
└── authentik
|
||||
├── .env
|
||||
├── compose.yml
|
||||
├── media
|
||||
├── certs
|
||||
├── custom-template
|
||||
└── ssh
|
||||
```
|
||||
|
||||
Créez les dossiers :
|
||||
|
||||
```bash [Terminal]
|
||||
sudo mkdir -p /srv/docker/authentik/media /srv/docker/authentik/certs /srv/docker/authentik/custom-template /srv/docker/authentik/ssh
|
||||
```
|
||||
|
||||
Positionnez vous dans le dossier `authentik` via `cd /srv/docker/authentik` et générez un mot de passe et une clé secrete que l'on va intégrer dans le .env :
|
||||
|
||||
```bash [Terminal]
|
||||
sudo echo "PG_PASS=$(openssl rand 36 | base64)" >> .env
|
||||
sudo echo "AUTHENTIK_SECRET_KEY=$(openssl rand 60 | base64)" >> .env
|
||||
```
|
||||
::note
|
||||
|
||||
Afin de générer la clé, nous avons créé les dossiers en amont du déploiement via Dockge. Dockge vous empechera de créer une stack du meme nom dans ces dossiers s'il n'existe pas de `compose.yml`. Il faut donc créer un `compose.yml` vide afin que ce dernier la reconnaisse comme existante dans les stacks inactives :
|
||||
```bash [Terminal]
|
||||
sudo nano /srv/docker/authentik/compose.yml
|
||||
```
|
||||
::
|
||||
|
||||
Ouvrez dockge, et cherchez "authentik" dans les stack inactives.
|
||||
Nommez la stack authentik et collez la configuration suivante, en changeant les chiffres de `{AUTHENTIK_TAG:-2026.2}`{lang=properties} par [la dernière version de Authentik](https://goauthentik.io/docs/releases).
|
||||
|
||||
```yaml [compose.yaml]
|
||||
---
|
||||
services:
|
||||
|
||||
postgresql:
|
||||
image: docker.io/library/postgres:16-alpine
|
||||
container_name: authentik-postgresql
|
||||
restart: unless-stopped
|
||||
healthcheck:
|
||||
test:
|
||||
- CMD-SHELL
|
||||
- pg_isready -d $${POSTGRES_DB} -U $${POSTGRES_USER}
|
||||
start_period: 20s
|
||||
interval: 30s
|
||||
retries: 5
|
||||
timeout: 5s
|
||||
volumes:
|
||||
- database:/var/lib/postgresql/data
|
||||
environment:
|
||||
POSTGRES_PASSWORD: ${PG_PASS:?database password required}
|
||||
POSTGRES_USER: ${PG_USER:-authentik}
|
||||
POSTGRES_DB: ${PG_DB:-authentik}
|
||||
env_file:
|
||||
- .env
|
||||
|
||||
redis:
|
||||
image: docker.io/library/redis:alpine
|
||||
container_name: authentik-redis
|
||||
command: --save 60 1 --loglevel warning
|
||||
restart: unless-stopped
|
||||
healthcheck:
|
||||
test:
|
||||
- CMD-SHELL
|
||||
- redis-cli ping | grep PONG
|
||||
start_period: 20s
|
||||
interval: 30s
|
||||
retries: 5
|
||||
timeout: 3s
|
||||
volumes:
|
||||
- redis:/data
|
||||
|
||||
server:
|
||||
image: ${AUTHENTIK_IMAGE:-ghcr.io/goauthentik/server}:${AUTHENTIK_TAG:-2026.2}
|
||||
container_name: authentik-server
|
||||
restart: unless-stopped
|
||||
command: server
|
||||
environment:
|
||||
AUTHENTIK_REDIS__HOST: redis
|
||||
AUTHENTIK_POSTGRESQL__HOST: postgresql
|
||||
AUTHENTIK_POSTGRESQL__USER: ${PG_USER:-authentik}
|
||||
AUTHENTIK_POSTGRESQL__NAME: ${PG_DB:-authentik}
|
||||
AUTHENTIK_POSTGRESQL__PASSWORD: ${PG_PASS}
|
||||
volumes:
|
||||
- ./media:/media
|
||||
- ./custom-templates:/templates
|
||||
- ./ssh:/authentik/.ssh
|
||||
env_file:
|
||||
- .env
|
||||
ports:
|
||||
- ${COMPOSE_PORT_HTTP:-9000}:9000
|
||||
- ${COMPOSE_PORT_HTTPS:-9443}:9443
|
||||
depends_on:
|
||||
- postgresql
|
||||
- redis
|
||||
|
||||
worker:
|
||||
image: ${AUTHENTIK_IMAGE:-ghcr.io/goauthentik/server}:${AUTHENTIK_TAG:-2026.2}
|
||||
container_name: authentik-worker
|
||||
restart: unless-stopped
|
||||
command: worker
|
||||
environment:
|
||||
AUTHENTIK_REDIS__HOST: redis
|
||||
AUTHENTIK_POSTGRESQL__HOST: postgresql
|
||||
AUTHENTIK_POSTGRESQL__USER: ${PG_USER:-authentik}
|
||||
AUTHENTIK_POSTGRESQL__NAME: ${PG_DB:-authentik}
|
||||
AUTHENTIK_POSTGRESQL__PASSWORD: ${PG_PASS}
|
||||
# `user: root` and the docker socket volume are optional.
|
||||
# See more for the docker socket integration here:
|
||||
# https://goauthentik.io/docs/outposts/integrations/docker
|
||||
# Removing `user: root` also prevents the worker from fixing the permissions
|
||||
# on the mounted folders, so when removing this make sure the folders have the correct UID/GID
|
||||
# (1000:1000 by default)
|
||||
user: root
|
||||
volumes:
|
||||
- /var/run/docker.sock:/var/run/docker.sock
|
||||
- ./media:/media
|
||||
- ./certs:/certs
|
||||
- ./custom-templates:/templates
|
||||
- ./ssh:/authentik/.ssh
|
||||
env_file:
|
||||
- .env
|
||||
depends_on:
|
||||
- postgresql
|
||||
- redis
|
||||
|
||||
volumes:
|
||||
database:
|
||||
driver: local
|
||||
redis:
|
||||
driver: local
|
||||
```
|
||||
|
||||
Dans le point `.env`, les variables `PG_PASS` et `AUTHENTIK_SECRET_KEY` sont déjà remplies.
|
||||
Déployez la stack.
|
||||
|
||||
Vous pouvez alors commencer le set-up d'authentik en tappant `http://ipduserveur:9000/if/flow/initial-setup/`.
|
||||
|
||||
::warning
|
||||
|
||||
__Attention :__ il est conseillé de créer un nouveau compte admin, et de **désactiver** le compte admin de base `akadmin`.
|
||||
::
|
||||
|
||||
## Exposer authentik
|
||||
Pour être utilisable hors de chez vous, vous devez exposer authentik.
|
||||
|
||||
::note
|
||||
📋 __Au préalable :__ <br/><br/>
|
||||
Nous partons du principe quer vous avez créé dans votre [zone DNS](/general/networking/dns) un sous domaine du type `auth.mondomaine.fr` avec pour CNAME `mondomaine.fr` et, [à moins que vous utilisiez Cloudflare Zero Trust](/serveex/security/cloudflare), vous avez déjà redirigé le port `443` de votre box vers le `443` de votre serveur dans [les règles NAT](/general/networking/nat).
|
||||
::
|
||||
|
||||
Ouvrez le fichier `authentik-server.conf`.
|
||||
|
||||
::tip{icon="" to="/serveex/files/file-browser-quantum"}
|
||||
✨ __Astuce pour les allergiques au terminal :__
|
||||
vous pouvez utiliser **File Browser Quantum** pour naviguer dans vos fichier et éditer vos documents au lieu d'utiliser les commandes du terminal.
|
||||
::
|
||||
|
||||
```bash [Terminal]
|
||||
sudo nano /srv/docker/swag/config/nginx/authentik-server.conf
|
||||
```
|
||||
|
||||
Vérifiez que dans chaque cas les variables ci-dessous sont correctes :
|
||||
|
||||
```nginx [authentik-server.conf]
|
||||
set $upstream_authentik authentik-server;
|
||||
proxy_pass http://$upstream_authentik:9000;
|
||||
```
|
||||
|
||||
Si ce n'est pas le cas, éditez-les, puis enregistrez avec :kbd{value="Ctrl+O"} et :kbd{value="Entrée"}, et quittez avec :kbd{value="Ctrl+X"}.
|
||||
|
||||
Créez le fichier `auth.subdomain.conf`
|
||||
|
||||
```bash [Terminal]
|
||||
sudo nano /srv/docker/swag/config/nginx/proxy-confs/auth.subdomain.conf
|
||||
|
||||
```
|
||||
|
||||
Collez la configuration suivante :
|
||||
|
||||
```nginx [auth.subdomain.conf]
|
||||
## Version 2023/05/31
|
||||
# make sure that your authentik container is named authentik-server
|
||||
# make sure that your dns has a cname set for authentik
|
||||
|
||||
server {
|
||||
listen 443 ssl;
|
||||
listen [::]:443 ssl;
|
||||
|
||||
server_name auth.*;
|
||||
|
||||
include /config/nginx/ssl.conf;
|
||||
|
||||
client_max_body_size 0;
|
||||
|
||||
location / {
|
||||
|
||||
include /config/nginx/proxy.conf;
|
||||
include /config/nginx/resolver.conf;
|
||||
set $upstream_app authentik-server;
|
||||
set $upstream_port 9000;
|
||||
set $upstream_proto http;
|
||||
proxy_pass $upstream_proto://$upstream_app:$upstream_port;
|
||||
|
||||
}
|
||||
|
||||
location ~ (/authentik)?/api {
|
||||
include /config/nginx/proxy.conf;
|
||||
include /config/nginx/resolver.conf;
|
||||
set $upstream_app authentik-server;
|
||||
set $upstream_port 9000;
|
||||
set $upstream_proto http;
|
||||
proxy_pass $upstream_proto://$upstream_app:$upstream_port;
|
||||
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
Enregistrez avec :kbd{value="Ctrl+O"} puis :kbd{value="Entrée"}, puis quittez avec :kbd{value="Ctrl+X"}.
|
||||
|
||||
Rendez-vous dans dockge, et éditez le compose de SWAG en ajoutant le réseau d'Authentik :
|
||||
|
||||
```yaml [compose.yaml]
|
||||
---
|
||||
services:
|
||||
swag:
|
||||
container_name: # ...
|
||||
# ...
|
||||
networks: # Relie le conteneur au réseau custom
|
||||
# ...
|
||||
- authentik # Nom du réseau déclaré dans la stack
|
||||
|
||||
networks: # Définit le réseau custom
|
||||
# ...
|
||||
authentik: # Nom du réseau déclaré dans la stack
|
||||
name: authentik_default # Nom véritable du réseau externe
|
||||
external: true # Précise que c'est un réseau à rechercher en externe
|
||||
```
|
||||
|
||||
Relancez la stack et patientez le temps que SWAG soit complètement opérationnel.
|
||||
|
||||
Et voilà ! Vous pouvez accéder à authentik via `https://auth.mondomaine.fr`
|
||||
|
||||
## Activer le multifacteur
|
||||
Tout l'intérêt de authentik c'est de disposer du multifacteur pour toutes les apps que l'on protègera.
|
||||
|
||||
- Rendez vous sur `https://auth.mondomaine.fr`
|
||||
- Identifiez-vous
|
||||
- Rendez-vous dans _paramètres_
|
||||
- Cliquez sur la section _MFA_
|
||||
- Cliquez sur _s'inscrire_
|
||||
- Choisissez une méthode comme _TOTP device_ ( dans ce cas vous devrez utilisez une app d'authentification telle que Google Authenticator par exemple)
|
||||
- Suivez les étapes
|
||||
|
||||
Et voilà, vous serez invité à saisir un code à usage unique à chaque connexion.
|
||||
|
||||
## Protéger une app native
|
||||
Authentik est compatible nativement avec un certain nombre d'application, vous retrouverez la liste et [le support ici](https://docs.goauthentik.io/integrations/services/)
|
||||
|
||||
## Protéger une app par reverse proxy
|
||||
Swag permet d'intercaler la page d'authentik entre la requête et l'accès à votre service. Pour cela il va falloir :
|
||||
|
||||
- Configurer le service d'authentification dans authentik.
|
||||
- Configurer le fichier proxy du domaine pour que swag puisse intercaler la page.
|
||||
|
||||
Pourquoi le faire alors que Dockge a déjà une page d'authentification ? Tout simplement parce que l'authentification HTTP utilisée par Dockge est faible. Avec Authentik, vous aurez directement une authentification forte par MFA, et vous serez loggé automatiquement à toutes vos apps déjà protégées par authentik. Cela permet de sécuriser l'accès à Dockge et aux autres apps que vous protégerez, sans avoir à passer par un VPN.
|
||||
|
||||
### Configuration de Authentik
|
||||
|
||||
- Rendez vous dans Authentik
|
||||
- Allez dans le panneau d'administration
|
||||
- Sélectionnez _application_ puis _créer avec l'assistant_
|
||||
- Renseignez les champs comme suit :
|
||||
|
||||

|
||||
|
||||
- Puis à l'étape suivante choisissez "Transférer l'authentification (application unique)" et éditez comme suit (attention aux flow, c'est important) :
|
||||
|
||||

|
||||
|
||||
- Ensuite, allez dans le menu à gauche dans _Avant-poste_ et éditez _authentik Embedded Outpost_
|
||||
|
||||

|
||||
|
||||
- Ajoutez l'application `dockge` en la faisant passer à droite et validez.
|
||||
|
||||
### Configuration de SWAG
|
||||
|
||||
Ensuite rendez-vous dans le fichier `dockge.mondomaine.fr`.
|
||||
|
||||
```bash [Terminal]
|
||||
sudo nano /srv/docker/swag/config/nginx/proxy-confs/dockge.subdomain.conf
|
||||
```
|
||||
|
||||
Puis enlevez les `#` des deux lignes `#include /config/nginx/authentik-server.conf;`{lang=nginx}.
|
||||
|
||||
Enregistrez avec :kbd{value="Ctrl+O"} puis :kbd{value="Entrée"}, puis quittez avec :kbd{value="Ctrl+X"}.
|
||||
|
||||
Et voilà ! En tapant `https://dockge.mondomaine.fr`, vous tomberez à présent sur la mire d'authentification de authentik.
|
||||
|
||||
::tip{icon=""}
|
||||
✨ __Astuce :__ dans Dockge, dans les paramètres, vous pouvez désactiver l'authentification de Dockge afin de ne pas avoir à vous identifier deux fois. **Attention**, cela voudra dire que si vous avez exposé un port sur votre réseau local, il n'y aura plus aucune authentification.
|
||||
::
|
||||
|
||||
::note
|
||||
|
||||
Vous pouvez répétez l'opération pour chaque application que vous souhaitez protéger (si elle ne dipose pas d'intégration directe avec Authentik).
|
||||
::
|
||||
|
||||
Voilà votre nouvelle architecture :
|
||||
|
||||

|
||||
|
||||
## Protéger un service sur un serveur distant
|
||||
Dans le cas d'une application [native](/serveex/advanced/authentik#protéger-une-app-native) (via OAuth 2.0 ou autre), rien ne change.
|
||||
|
||||
Dans le cas d'une application non native à protéger derrière un reverse proxy, vous devrez déployer un __avant-poste__. Un avant-poste est un conteneur qui jouera le rôle de proxy local, c'est à dire que c'est vers ce conteneur que les requêtes d'authentification de vos applications seront redirigées. C'est le seul qui est autorisé à dialoguer avec l'API de votre instance authentik.
|
||||
|
||||
::note
|
||||
Pré-requis :
|
||||
|
||||
- Avoir installé [docker](/serveex/core/docker) sur votre machine distante hébergeant le service à protéger.
|
||||
- Si l'application n'a pas d'intégration native, avoir un reverse proxy compatible. Comme partout ici, nous utiliserons [SWAG](/serveex/core/swag).
|
||||
::
|
||||
|
||||
Ce conteneur redirigera ensuite les requetes vers votre instance [Authentik](/serveex/advanced/authentik#authentik) principale, à travers le web (ou votre réseau local). Le serveur executera les controle et renverra la réponse à l'_avant-poste_, qui bloquera ou non la connexion à l'app protégée.
|
||||
|
||||

|
||||
|
||||
### Configuration d'Authentik
|
||||
|
||||
Créez vos [fournisseurs et applications](/serveex/advanced/authentik#protéger-une-app-native) comme nous l'avons vu plus haut.
|
||||
|
||||
Puis, dans votre panneau admin, allez dans la rubrique _Applications > Avant-postes_, puis créez un nouvel avant-poste.
|
||||
|
||||
Remplissez comme suit :
|
||||
|
||||
| Champs | Valeur |
|
||||
|----------------|-----------------------------------------------------------------------|
|
||||
| `Nom` | Le nom que vous souhaitez |
|
||||
| `Type` | `Proxy` |
|
||||
| `Intégration` | Laissez vide |
|
||||
| `Applications` | Sélectionnez le ou les applications que vous avez créées précédemment |
|
||||
|
||||
Dans la section `Paramètres avancés`, supprimez l'existant, et complétez comme suit :
|
||||
|
||||
```yaml
|
||||
log_level: info
|
||||
docker_labels: null
|
||||
authentik_host: https://domaine_de_votre_serveur_authentik/
|
||||
object_naming_template: ak-outpost-%(name)s
|
||||
authentik_host_insecure: false
|
||||
container_image:
|
||||
docker_network: null
|
||||
docker_map_ports: true
|
||||
docker_labels: null
|
||||
```
|
||||
|
||||
Enrtegistrez et quittez.
|
||||
|
||||
Sur l'écran affichant les avant-postes créés, vous verrez le nouvel avant-poste que vous venez de créer. A la fin de la ligne, cliquez sur _afficher les informations_, et copiez précieusement le jeton d'accès.
|
||||
|
||||
### Configuration de la machine distante
|
||||
|
||||
Nous partons du principe que vous avez déjà installé [Docker](/serveex/core/docker) et [SWAG](/serveex/core/swag) sur cette machine distante.
|
||||
|
||||
Sur votre machine distante, à l'aide de [Dockge](/serveex/core/docker#installer-dockge-pour-gérer-et-déployer-les-conteneurs), créez une stack `authentik-outpost`.
|
||||
|
||||
Si vous n'avez pas installé [Dockge](/serveex/core/docker#installer-dockge-pour-gérer-et-déployer-les-conteneurs), créez un dossier `/srv/docker/authentik-outpost`, ou directement en ligne de commande :
|
||||
|
||||
```bash [Terminal]
|
||||
sudo mkdir -P /srv/docker/authentik-outpost
|
||||
```
|
||||
|
||||
::tip{icon="" to="/serveex/files/file-browser-quantum"}
|
||||
✨ __Astuce pour les allergiques au terminal :__
|
||||
vous pouvez utiliser **File Browser Quantum** pour naviguer dans vos fichier et éditer vos documents au lieu d'utiliser les commandes du terminal.
|
||||
::
|
||||
|
||||
Créez le fichier `compose.yaml` ou copiez la configuration directement dans le champs si vous avez [Dockge](/serveex/core/docker#installer-dockge-pour-gérer-et-déployer-les-conteneurs)
|
||||
|
||||
En ligne de commande :
|
||||
|
||||
```bash [Terminal]
|
||||
sudo nano /srv/docker/authentik-outpost/compose.yaml
|
||||
```
|
||||
Collez la configuration suivante, en changeant les chiffres de `{AUTHENTIK_TAG:proxy:2024.2.3}`{lang=properties} par la meme version que celle de votre serveur Authentik.
|
||||
|
||||
```yaml [compose.yaml]
|
||||
---
|
||||
version: "3.5"
|
||||
services:
|
||||
authentik_proxy:
|
||||
container_name: authentik-outpost
|
||||
image: ghcr.io/goauthentik/proxy:2024.2.3
|
||||
# Optionally specify which networks the container should be
|
||||
# might be needed to reach the core authentik server
|
||||
restart: unless-stopped
|
||||
env_file:
|
||||
- .env
|
||||
# - foo
|
||||
ports:
|
||||
- 9000:9000
|
||||
- 9443:9443
|
||||
environment:
|
||||
AUTHENTIK_HOST: ${HOST}
|
||||
AUTHENTIK_INSECURE: "false"
|
||||
AUTHENTIK_TOKEN: ${TOKEN}
|
||||
# Starting with 2021.9, you can optionally set this too
|
||||
# when authentik_host for internal communication doesn't match the public URL
|
||||
# AUTHENTIK_HOST_BROWSER: https://external-domain.tld
|
||||
```
|
||||
|
||||
Rendez-vous sur la stack de SWAG de la machine distante (ou remplissez directement si vous avez [Dockge](/serveex/core/docker#installer-dockge-pour-gérer-et-déployer-les-conteneurs)) et ajoutez le réseau de authentik-outpost dans le fichier de conf sur ce modele (les champs `networks`) :
|
||||
|
||||
```bash [Terminal]
|
||||
sudo nano /srv/docker/swag/compose.yaml
|
||||
```
|
||||
|
||||
```yaml [compose.yaml]
|
||||
---
|
||||
services:
|
||||
swag:
|
||||
container_name: #...
|
||||
# ...
|
||||
networks: # Relie le conteneur au réseau custom
|
||||
|
||||
- authentik-outpost # Nom du réseau déclaré dans la stack
|
||||
|
||||
networks: # Définit le réseau custom
|
||||
#...
|
||||
authentik-outpost: # Nom du réseau déclaré dans la stack
|
||||
name: authentik-outpost_default # Nom véritable du réseau externe
|
||||
external: true # Précise que c'est un réseau à rechercher en externe
|
||||
```
|
||||
|
||||
Enregistrez avec :kbd{value="Ctrl+O"} puis :kbd{value="Entrée"}, puis quittez avec :kbd{value="Ctrl+X"}.
|
||||
|
||||
::note
|
||||
|
||||
Ici nous partons du principe que le nom du réseau de dockge est `authentik-outpost_default`.
|
||||
::
|
||||
|
||||
Si vous avez [Dockge](/serveex/core/docker#installer-dockge-pour-g"rer-et-d"ployer-les-conteneurs), relancez SWAG.
|
||||
|
||||
Sinon, via le terminal :
|
||||
|
||||
```bash [Terminal]
|
||||
cd /srv/docker/swag/
|
||||
sudo docker compose up -d
|
||||
```
|
||||
|
||||
Creez (ou remplissez directement si vous avez [Dockge](/serveex/core/docker#installer-dockge-pour-gérer-et-déployer-les-conteneurs)) le fichier `.env` dans le dossier de l'avant poste authentik :
|
||||
|
||||
En ligne de commande :
|
||||
|
||||
```bash [Terminal]
|
||||
sudo nano /srv/docker/authentik-outpost/.env
|
||||
```
|
||||
|
||||
Collez la configuration suivante
|
||||
|
||||
```properties [.env]
|
||||
HOST=
|
||||
TOKEN=
|
||||
```
|
||||
Remplissez comme suit
|
||||
|
||||
| Variable | Valeur | Exemple |
|
||||
|-------------------------|---------------------------------------------------------|----------------------------|
|
||||
| `HOST`{lang=properties} | L'url de votre serveur authentik | `https://auth.domaine.fr` |
|
||||
| `TOKEN`{lang=properties} | Le token que vous avez précédemment copié précieusement | `Q2pVEqsTNRkJSO9SkJzU3KZ2` |
|
||||
|
||||
Enregistrez avec :kbd{value="Ctrl+O"} puis :kbd{value="Entrée"}, puis quittez avec :kbd{value="Ctrl+X"}.
|
||||
|
||||
Si vous avez [Dockge](/serveex/core/docker#installer-dockge-pour-g"rer-et-d"ployer-les-conteneurs), déployez la stack.
|
||||
|
||||
Sinon, via le terminal :
|
||||
|
||||
```bash [Terminal]
|
||||
cd /srv/docker/authentik-outpost/
|
||||
sudo docker compose up -d
|
||||
```
|
||||
|
||||
Le conteneur est en route, vous pouvez vérifier son état dans votre panneau admin de votre instance Authentik, section _Applications > Avant-postes_.
|
||||
|
||||
Nous allons a présent configurer SWAG.
|
||||
|
||||
Ouvrez le fichier `authentik-server.conf`.
|
||||
|
||||
```bash [Terminal]
|
||||
sudo nano /srv/docker/swag/config/nginx/authentik-server.conf
|
||||
```
|
||||
|
||||
Dans le fichier, changez `authentik-server` par `authentik-outpost` comme suit :
|
||||
|
||||
```nginx [authentik-server.conf]
|
||||
set $upstream_authentik authentik-outpost;
|
||||
proxy_pass http://$upstream_authentik:9000;
|
||||
```
|
||||
|
||||
Enregistrez avec :kbd{value="Ctrl+O"} puis :kbd{value="Entrée"}, puis quittez avec :kbd{value="Ctrl+X"}.
|
||||
|
||||
Ensuite, configurez les applications à protéger selon si elles sont [natives](/serveex/advanced/authentik#protéger-une-app-native) ou par [proxy](/serveex/advanced/authentik#protéger-une-app-par-reverse-proxy) comme vous l'avez fait sur votre serveur principal.
|
||||
|
||||
## Migrer une base authentik
|
||||
Sur la machine d'origine, dumper la bdd :
|
||||
|
||||
```bash [Terminal]
|
||||
sudo docker exec authentik-postgres pg_dump -U authentik -F t authentik > /path/to/mydb.tar
|
||||
```
|
||||
|
||||
Puis l'envoyer sur la machine cible. Sur la machine cible, copier le fichier dans le container docker
|
||||
|
||||
```bash [Terminal]
|
||||
cp /path/to/mydb.tar authentik-postgres:/path/to/wherever
|
||||
```
|
||||
|
||||
(Optionnel) Purgez les tables existantes :
|
||||
|
||||
```bash [Terminal]
|
||||
sudo docker exec -i authentik-postgres psql -U authentik -c "SELECT pg_terminate_backend(pg_stat_activity.pid) FROM pg_stat_activity WHERE pg_stat_activity.datname = 'authentik' AND pid <> pg_backend_pid();" && \
|
||||
sudo docker exec -i authentik-postgres psql -U authentik -d postgres -c "DROP DATABASE IF EXISTS authentik;" && \
|
||||
sudo docker exec -i authentik-postgres psql -U authentik -d postgres -c "CREATE DATABASE authentik;" && \
|
||||
```
|
||||
|
||||
Restaurez la bdd
|
||||
|
||||
```bash [Terminal]
|
||||
sudo docker exec authentik-postgresql pg_restore -U authentik -d authentik /path/to/wherever/mydb.tar
|
||||
```
|
||||
@@ -0,0 +1,344 @@
|
||||
---
|
||||
title: Arcane
|
||||
description: Installer Arcane, une interface web moderne de gestion Docker et Compose, comme alternative plus avancée à Dockge avec gestion multi-hôtes et connexion OIDC.
|
||||
---
|
||||
|
||||
|
||||
:ellipsis{left=0px width=40rem top=10rem blur=140px zIndex=60}
|
||||
|
||||
::note{to="/serveex/core/docker#installer-dockge-pour-gérer-et-déployer-les-conteneurs"}
|
||||
|
||||
C'est une alternative avancée à **Dockge** : il peut gérer plusieurs hôtes Docker distants depuis une seule instance, et prend en charge la connexion OIDC nativement plutôt que de dépendre d'un proxy de forward-auth séparé.
|
||||
::
|
||||
|
||||
[Arcane](https://github.com/getarcaneapp/arcane) est une interface web auto-hébergée pour gérer les conteneurs, images, volumes et stacks Compose de Docker.
|
||||
|
||||

|
||||
|
||||
- [Documentation d'Arcane](https://getarcane.app/docs/)
|
||||
- [Arcane sur GitHub](https://github.com/getarcaneapp/arcane)
|
||||
|
||||
::note{to="https://docs.linuxserver.io/images/docker-socket-proxy/"}
|
||||
|
||||
Arcane a besoin d'accéder au socket Docker pour gérer les conteneurs, ce qui équivaut à un accès root sur votre hôte. Plutôt que de monter le socket directement, ce tutoriel place **Docker Socket Proxy** devant, en n'autorisant que les permissions d'API dont Arcane a réellement besoin. Quoi que vous utilisiez, assurez-vous qu'Arcane lui-même ne soit jamais joignable sans authentification.
|
||||
::
|
||||
|
||||
## Installation
|
||||
|
||||
::file-tree
|
||||
---
|
||||
tree:
|
||||
/:
|
||||
- srv:
|
||||
- docker:
|
||||
- arcane:
|
||||
- compose.yaml
|
||||
- .env
|
||||
- data/
|
||||
---
|
||||
::
|
||||
|
||||
::steps{level="3"}
|
||||
### Générer une clé de chiffrement
|
||||
|
||||
```bash [Terminal]
|
||||
openssl rand -base64 32
|
||||
```
|
||||
|
||||
Gardez le résultat, vous en aurez besoin pour le fichier `.env` ci-dessous.
|
||||
|
||||
### Déployer la stack
|
||||
|
||||
Ouvrez Dockge, cliquez sur `compose`, nommez la stack `arcane`, et ajoutez la configuration suivante. Elle inclut le socket proxy : `arcane` ne touche jamais directement à `/var/run/docker.sock`, seul `docker-socket-proxy` le fait, et il n'autorise que les permissions dont Arcane a besoin (conteneurs, images, réseaux, volumes, exec, build/commit), sur leur propre réseau interne :
|
||||
|
||||
```yaml [compose.yaml]
|
||||
---
|
||||
services:
|
||||
arcane:
|
||||
image: ghcr.io/getarcaneapp/manager:latest
|
||||
container_name: arcane
|
||||
restart: unless-stopped
|
||||
cgroup: host
|
||||
env_file:
|
||||
- .env
|
||||
volumes:
|
||||
- /srv/docker/arcane/data:/app/data
|
||||
networks:
|
||||
- arcane-internal
|
||||
ports:
|
||||
- 3552:3552
|
||||
depends_on:
|
||||
- docker-socket-proxy
|
||||
|
||||
docker-socket-proxy:
|
||||
image: lscr.io/linuxserver/socket-proxy:latest
|
||||
container_name: arcane-docker-proxy
|
||||
security_opt:
|
||||
- no-new-privileges:true
|
||||
networks:
|
||||
- arcane-internal
|
||||
volumes:
|
||||
- /var/run/docker.sock:/var/run/docker.sock:ro
|
||||
environment:
|
||||
- CONTAINERS=1
|
||||
- IMAGES=1
|
||||
- NETWORKS=1
|
||||
- VOLUMES=1
|
||||
- EXEC=1
|
||||
- BUILD=1
|
||||
- COMMIT=1
|
||||
- INFO=1
|
||||
- SYSTEM=1
|
||||
- POST=1
|
||||
- ALLOW_START=1
|
||||
- ALLOW_STOP=1
|
||||
- ALLOW_RESTARTS=1
|
||||
restart: unless-stopped
|
||||
read_only: true
|
||||
tmpfs:
|
||||
- /run
|
||||
|
||||
networks:
|
||||
arcane-internal:
|
||||
name: arcane-internal
|
||||
```
|
||||
|
||||
::note
|
||||
|
||||
`POST=1` est l'autorisation d'écriture globale nécessaire pour créer et supprimer conteneurs, images, réseaux et volumes ; `ALLOW_START`/`ALLOW_STOP`/`ALLOW_RESTARTS` couvrent séparément les actions sur le cycle de vie des conteneurs. Tout le reste (Swarm, secrets, configs, auth) est laissé à sa valeur par défaut `0`, puisque ce site ne les utilise pas.
|
||||
::
|
||||
|
||||
::tip{icon=""}
|
||||
✨ Ajoutez le label Watchtower pour automatiser les mises à jour :
|
||||
|
||||
```yaml [compose.yaml]
|
||||
---
|
||||
services:
|
||||
arcane:
|
||||
#...
|
||||
labels:
|
||||
- com.centurylinklabs.watchtower.enable=true
|
||||
```
|
||||
::
|
||||
|
||||
### Renseigner vos variables d'environnement
|
||||
|
||||
Remplissez le fichier `.env` :
|
||||
|
||||
```properties [.env]
|
||||
APP_URL=https://arcane.mondomaine.fr
|
||||
ENCRYPTION_KEY=
|
||||
DOCKER_HOST=tcp://docker-socket-proxy:2375
|
||||
PUID=1000
|
||||
PGID=1000
|
||||
```
|
||||
|
||||
| Variable | Valeur | Exemple |
|
||||
|----------|-------|---------|
|
||||
| `APP_URL`{lang=properties} | L'URL publique par laquelle vous joindrez Arcane (voir l'exposition plus bas), sans port | `https://arcane.mondomaine.fr` |
|
||||
| `ENCRYPTION_KEY`{lang=properties} | La clé générée ci-dessus | `Q2pVEqsTNRkJSO9SkJzU3KZ2...` |
|
||||
| `DOCKER_HOST`{lang=properties} | Pointe Arcane vers le socket proxy plutôt qu'un socket monté | `tcp://docker-socket-proxy:2375` |
|
||||
| `PUID` / `PGID`{lang=properties} | Vos identifiants d'utilisateur et de groupe, via `id votreutilisateur` | `1000` |
|
||||
|
||||
Déployez la stack. L'interface locale est disponible sur `http://ipdevotreserveur:3552`.
|
||||
|
||||
### Terminé !
|
||||
::
|
||||
|
||||
::caution
|
||||
|
||||
__Si ça ne marche pas :__ vérifiez les règles de votre pare-feu.
|
||||
::
|
||||
|
||||
## Exposer Arcane avec SWAG
|
||||
Le principal intérêt de cette installation est de pouvoir accéder à Arcane à distance depuis tous vos appareils. Nous allons l'exposer avec SWAG.
|
||||
|
||||
::warning
|
||||
|
||||
La connexion locale d'Arcane n'a pas d'authentification multifacteur. Ne l'exposez que si vous utilisez [Pocket ID](/serveex/security/pocket-id) (voir plus bas) ou [Authentik](/serveex/advanced/authentik) pour la connexion. Sinon, ne l'exposez pas avec SWAG. Utilisez plutôt un VPN comme [Wireguard](/serveex/core/wireguard), surtout vu le niveau d'accès qu'Arcane a sur votre hôte.
|
||||
::
|
||||
|
||||
::note
|
||||
|
||||
Nous partons du principe que vous avez le sous-domaine `arcane.mondomaine.fr` avec un `CNAME` pointant vers `mondomaine.fr` dans votre [zone DNS](/general/networking/dns). Et bien sûr, [à moins d'utiliser Cloudflare Zero Trust](/serveex/security/cloudflare), le port `443` de votre box doit être redirigé vers le port `443` de votre serveur dans les [règles NAT](/general/networking/nat).
|
||||
::
|
||||
|
||||
::steps{level="3"}
|
||||
### Ajouter le réseau d'Arcane à SWAG
|
||||
|
||||
Allez dans Dockge et modifiez le fichier compose de SWAG en y ajoutant le réseau d'Arcane :
|
||||
|
||||
```yaml [compose.yaml]
|
||||
---
|
||||
services:
|
||||
swag:
|
||||
container_name: # ...
|
||||
# ...
|
||||
networks: # Rattache le conteneur au réseau personnalisé
|
||||
# ...
|
||||
- arcane # Nom du réseau déclaré
|
||||
|
||||
networks: # Définit le réseau personnalisé
|
||||
# ...
|
||||
arcane: # Nom du réseau déclaré
|
||||
name: arcane_default # Nom réel du réseau externe
|
||||
external: true # Le marque comme défini à l'extérieur
|
||||
```
|
||||
|
||||
Redéployez la stack et attendez que SWAG soit pleinement opérationnel.
|
||||
|
||||
::note
|
||||
|
||||
Nous partons ici du principe que le nom du réseau d'Arcane est `arcane_default`. Vous pouvez vérifier la connexion en visitant le tableau de bord de SWAG sur `http://ipdevotreserveur:81`.
|
||||
::
|
||||
|
||||
### Créer le fichier subdomain.conf
|
||||
|
||||
Dans les dossiers de Swag, créez le fichier `arcane.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/arcane.subdomain.conf
|
||||
```
|
||||
|
||||
Collez la configuration suivante :
|
||||
|
||||
```nginx [arcane.subdomain.conf]
|
||||
## Version 2023/12/19
|
||||
|
||||
server {
|
||||
listen 443 ssl;
|
||||
listen [::]:443 ssl;
|
||||
|
||||
server_name arcane.*;
|
||||
|
||||
include /config/nginx/ssl.conf;
|
||||
|
||||
client_max_body_size 0;
|
||||
|
||||
location / {
|
||||
include /config/nginx/proxy.conf;
|
||||
include /config/nginx/resolver.conf;
|
||||
set $upstream_app arcane;
|
||||
set $upstream_port 3552;
|
||||
set $upstream_proto http;
|
||||
proxy_pass $upstream_proto://$upstream_app:$upstream_port;
|
||||
|
||||
proxy_set_header Upgrade $http_upgrade;
|
||||
proxy_set_header Connection "upgrade";
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
::note
|
||||
|
||||
Les mises à jour en direct d'Arcane passent par un websocket, d'où les en-têtes `Upgrade`/`Connection` ci-dessus, en plus de l'inclusion habituelle de `proxy.conf`.
|
||||
::
|
||||
|
||||
Appuyez sur :kbd{value="Ctrl+O"}, puis :kbd{value="Enter"} pour enregistrer, et :kbd{value="Ctrl+X"} pour quitter.
|
||||
|
||||
### Terminé !
|
||||
::
|
||||
|
||||
Et voilà ! Arcane est maintenant accessible depuis internet.
|
||||
|
||||
## Connecter un hôte distant
|
||||
Arcane peut gérer plusieurs hôtes Docker depuis une seule instance. Chaque hôte distant fait tourner un conteneur **agent** léger qui se reconnecte à Arcane. Plutôt que d'exposer cette connexion sur internet, nous la ferons passer par le [VPN WireGuard](/serveex/core/wireguard) déjà mis en place plus tôt, ainsi le trafic de l'agent ne quitte jamais votre réseau privé.
|
||||
|
||||
::note{to="/serveex/core/wireguard#client-server-setup"}
|
||||
|
||||
Ceci suppose que l'hôte Arcane et l'hôte distant font déjà tourner leur propre client WireGuard, connectés à votre VPN comme décrit dans **Client Server Setup**. Notez l'adresse VPN que wg-easy a attribuée à l'__hôte Arcane__ (par exemple `10.8.0.3`) ; c'est l'adresse que visera l'agent distant ci-dessous.
|
||||
::
|
||||
|
||||
::steps{level="3"}
|
||||
### Ajouter l'environnement distant dans Arcane
|
||||
|
||||
Dans Arcane, allez dans _Environments > Add Environment_. Arcane génère un __Agent Token__ à usage unique et le bout de configuration compose à déployer sur l'hôte distant.
|
||||
|
||||
### Déployer l'agent sur l'hôte distant
|
||||
|
||||
Sur l'hôte distant, ouvrez Dockge, cliquez sur `compose`, nommez la stack `arcane-agent`, et ajoutez la configuration suivante, en remplaçant le token par celui qu'Arcane vous a donné et l'URL par l'adresse VPN de votre hôte Arcane :
|
||||
|
||||
```yaml [compose.yaml]
|
||||
---
|
||||
services:
|
||||
arcane-agent:
|
||||
image: ghcr.io/getarcaneapp/agent:latest
|
||||
container_name: arcane-agent
|
||||
restart: unless-stopped
|
||||
environment:
|
||||
- EDGE_AGENT=true
|
||||
- EDGE_TRANSPORT=poll
|
||||
- AGENT_TOKEN=arc_votretoken
|
||||
- MANAGER_API_URL=http://10.8.0.3:3552
|
||||
volumes:
|
||||
- /var/run/docker.sock:/var/run/docker.sock
|
||||
- /srv/docker/arcane-agent/data:/app/data
|
||||
```
|
||||
|
||||
::note
|
||||
|
||||
C'est le « mode edge » : l'agent se connecte vers Arcane plutôt que l'inverse, il fonctionne donc derrière un NAT sans rien rediriger sur la box de l'hôte distant. Utiliser l'adresse VPN plutôt qu'un domaine public fait que cette connexion reste sur le tunnel WireGuard même si l'agent est techniquement en mode « edge ». Contrairement au manager ci-dessus, l'agent a besoin du vrai socket Docker monté directement, puisque c'est lui qui exécute réellement les commandes sur cet hôte ; il n'existe pas d'option socket-proxy documentée pour lui.
|
||||
::
|
||||
|
||||
Déployez la stack.
|
||||
|
||||
### Vérifier la connexion
|
||||
|
||||
De retour dans Arcane, le nouvel environnement devrait apparaître comme connecté en quelques secondes. Basculez dessus depuis le sélecteur d'environnement pour gérer les conteneurs et les stacks de cet hôte.
|
||||
|
||||
### Terminé !
|
||||
::
|
||||
|
||||
## Connecter Pocket ID
|
||||
Arcane gère OIDC nativement, vous pouvez donc exiger une connexion Pocket ID avant de laisser qui que ce soit gérer vos conteneurs, plutôt qu'avec (ou en plus de) les comptes propres à l'application.
|
||||
|
||||
::steps{level="3"}
|
||||
### Enregistrer Arcane comme client OIDC
|
||||
|
||||
[Enregistrez un client OIDC dans Pocket ID](/serveex/security/pocket-id#registering-an-oidc-client) nommé `arcane`, avec cette URL de callback :
|
||||
|
||||
```text
|
||||
https://arcane.mondomaine.fr/auth/oidc/callback
|
||||
```
|
||||
|
||||
### Activer OIDC dans Arcane
|
||||
|
||||
Modifiez le fichier `.env` d'Arcane et ajoutez :
|
||||
|
||||
```properties [.env]
|
||||
OIDC_ENABLED=true
|
||||
OIDC_CLIENT_ID=
|
||||
OIDC_CLIENT_SECRET=
|
||||
OIDC_ISSUER_URL=https://id.mondomaine.fr
|
||||
OIDC_SCOPES=openid email profile
|
||||
OIDC_PROVIDER_NAME=Pocket ID
|
||||
```
|
||||
|
||||
| Variable | Valeur |
|
||||
|----------|-------|
|
||||
| `OIDC_CLIENT_ID`{lang=properties} | Le client ID copié depuis Pocket ID |
|
||||
| `OIDC_CLIENT_SECRET`{lang=properties} | Le client secret copié depuis Pocket ID |
|
||||
| `OIDC_ISSUER_URL`{lang=properties} | L'URL publique de Pocket ID, sans slash final ; Arcane découvre le reste via `.well-known/openid-configuration` |
|
||||
|
||||
Redéployez la stack.
|
||||
|
||||
::tip{icon=""}
|
||||
✨ Pour aller directement sur Pocket ID et masquer le formulaire de connexion local, mettez `OIDC_AUTO_REDIRECT_TO_PROVIDER=true`, ou désactivez complètement la connexion locale dans _Settings > Authentication_ pour un accès uniquement OIDC.
|
||||
::
|
||||
|
||||
### Terminé !
|
||||
::
|
||||
|
||||
Et voilà ! Arcane propose désormais une option « Login with Pocket ID » à côté du formulaire de connexion local.
|
||||
|
||||
::tip{icon="" to="/serveex/advanced/authentik"}
|
||||
✨ Vous pouvez utiliser **Authentik** plutôt que Pocket ID :
|
||||
|
||||
1. Dans Authentik, créez une application et un provider OAuth2/OpenID Connect nommé `Arcane`, avec une redirect URI (de type `Strict`) valant `https://arcane.mondomaine.fr/auth/oidc/callback`.
|
||||
2. Notez les __Client ID__ et __Client Secret__ du provider.
|
||||
3. Dans le `.env` d'Arcane, mettez `OIDC_ISSUER_URL=https://authentik.mondomaine.fr/application/o/arcane/`, puis renseignez le Client ID et le Client Secret.
|
||||
::
|
||||
Reference in New Issue
Block a user