Installer Authelia avec Docker

Guide d'installation de Authelia.

Installer Authelia avec Docker
authelia docker 2fa sfa

Au sommaire :

  • 1-Qu'est-ce que Authelia ?
  • 2-Prérequis
  • 3-Configuration
  • 4-Créer un utilisateur
  • 5-Créer un middleware
  • 6-Déploiement
  • 7-SFA et MFA

1-Qu'est-ce que Authelia ?

Authelia est un serveur d'authentification et d'autorisation qui remplit le rôle de gestion des identités et des accès (IAM).

L’intérêt d'utiliser Authelia est qu'il est open-source. Aucun frais de licence à avancer et vous pouvez héberger votre propre instance à domicile.

Ensuite, vous allez pouvoir sécuriser l’accès de vos applications en local et sur l'internet public avec de l'authentification à un facteur (SFA) ou multi-facteurs (MFA).

Authelia est compatible sur l'authentification basé sur le temps (Google Authenticator), les notifications push (Duo) ainsi que les clés U2F (Yubikey).

Encore mieux, Authelia va vous simplifier l'administration des comptes utilisateurs en vous permettant de vous authentifier avec un compte unique via le SSO (Single Sign On ou Authentification Unique) basé sur le système d’authentification décentralisé OpenID.

Enfin, Authelia est compatible avec la majorité des reverse proxy à l'exception Apache et IIS.

Pour les besoins de ce guide, nous allons utiliser Traefik.

2-Prérequis

Il vous faudra une machine virtuelle sous Ubuntu Server 22.04 LTS.

Voici le guide pour ceux qui veulent repartir de zéro.

Virtualiser Ubuntu Server 22.04 LTS sur Proxmox VE
Guide d’installation de Ubuntu Server 22.04 LTS sur Proxmox VE avec mes meilleurs réglages.

Si vous voulez gagner du temps, utilisez un template cloud-init.

Initialiser vos machines virtuelles avec Cloud-init sur Proxmox VE
Guide d’installation de Cloud-Init qui va vous permettre d’automatiser vos déploiements

Ensuite, suivez ce guide pour installer Docker, Docker Compose et préparer vos variables d'environnement.

Installer Docker
Guide d’installation de Docker.

Enfin, pour exposer l'application sur l'internet public, il vous faudra déployer Traefik.

Installer Traefik avec Docker
Guide d’installation de Traefik.

3-Configuration

Dans "appdata", commencez par créer un dossier que vous nommerez "authelia".

mkdir authelia

Ensuite, créez le fichier "configuration.yml"

touch configuration.yml

Nous allons partir sur une configuration épurée à l'extrême pour pouvoir permettre aux débutants de s'en sortir avec ce guide.

Il faut savoir que nombre de paramètres sont configurés par défaut dans Authelia donc si vous n'apportez aucune modification, il est pas nécessaire de citer lesdites options dans le fichier "configuration.yml".

Voici les codes couleurs que vous trouverez dans la documentation :

  • En bleu : le paramètre par défaut.
  • En vert : "not required" ou non requis qui signifie qu'il n'est pas obligatoire d'indiquer l'option dans le fichier "configuration.yml" sauf si vous modifiez la valeur par défaut.
  • En rouge : "required" ou requis donc obligation d'indiquer les informations nécessaires.

Ouvrez le fichier avec votre éditeur préféré (nano ou vim) puis ajouter les options au fur et à mesure.

Commençons par configurer quelques options dites "diverses".

Miscellaneous
Miscellaneous Configuration.

Indiquez un secret pour pouvoir créer des jetons JWT qui sont utilisés par le processus de vérification de l'identité (obligatoire).

Tapez la commande suivante pour en générer un.

docker run authelia/authelia:latest authelia crypto rand --length 64 --charset alphanumeric

Puis ajoutez-le.

jwt_secret: <votre_secret>

Choisissez un thème d'affichage. Par défaut c'est "light" mais pour ma part, je choisi le thème "dark" pour ne pas fatiguer mes yeux.

theme: dark

Indiquez l'adresse de redirection qui est le nom de domaine que vous avez attribuer à Authelia.

default_redirection_url: https://authelia.<votre_nom_de_domaine>

Passons à la partie "authentication_backend".

File
File

Indiquez le nom du fichier "users_database" qui va contenir la liste de vos utilisateurs.

Par défaut, Authelia propose l'algorithme argon2 mais en propose d'autres comme scrypt, pbkdf2, sha2crypt et bcrypt.

authentication_backend:
  file:
    path: /config/users_database.yml

Passons à la partie "access_control".

Access Control
Configuring the Access Control or RBAC settings.

La politique par défaut est "deny" (refuser) pour des raisons de sécurité et de performances.

Cela veut dire que c'est à vous de lister les applications que vous souhaitez sécuriser via Authelia puis d'ajouter le label Traefik dans votre fichier compose pour pouvoir effectuer la redirection vers l'authentification.

Pour ce guide, on va se servir d'une simple application de test de bande passante nommé "librespeed" qui ne dispose d''aucune gestion des comptes utilisateurs.

Docker

On va testé à la fois

  • Le SFA avec comme authentification le compte et le mot de passe que vous allez créer dans le fichier "user_database.yml".
  • Le MFA pour mettre la sécurité au maximum via une authentification basé sur le temps avec Google Authenticator.
access_control:
  rules:
    - domain:
        - "librespeed.sussudio.ovh"
      policy: two_factor

Passons à la partie "session".

Session
Session Configuration

Indiquez le nom de domaine que le cookie est censé protéger et générez un secret avec la commande suivante.

docker run authelia/authelia:latest authelia crypto rand --length 64 --charset alphanumeric

Puis ajoutez le à la ligne correspondante.

session:
  secret: <votre_secret>
  domain: sussudio.ovh

Passons à la partie "storage" et le choix de la base de données.

Storage
Storage Configuration

Pour ce guide, nous allons utiliser la version "lite" qui propose du SQLite donc pas besoin de conteneur de base de données dédié et c'est largement suffisant pour un usage domestique.

SQLite3
SQLite3 Configuration

Il vous faudra indiquer le chemin de la base de données et générer une clé de chiffrement avec la même commande suivante.

docker run authelia/authelia:latest authelia crypto rand --length 64 --charset alphanumeric

Ajoutez le à la ligne correspondante.

storage:
  encryption_key: <la_clé_de_chiffrement>
  local:
    path: /config/db.sqlite3

Enfin, finalisons la configuration avec la partie "notification".

File System
Configuring the File Notifications Settings.

On va éviter d'utiliser un serveur SMTP et plutôt utiliser un fichier "notification.txt" (beaucoup plus simple à mettre en place) pour récupérer le lien permettant d'associer notre smartphone à Authelia.

notifier:
  filesystem:
    filename: /config/notification.txt

Si vous avez bien suivi mes consides, vous devriez obtenir cette configuration.

jwt_secret: nAGPN9TIfWsSWUYU6IALnctwoqMjTeXmXellHhCTD9nvgCbYreKX4d4N4mihOu0o
default_redirection_url: https://authelia.sussudio.ovh
theme: dark

authentication_backend:
  file:
    path: /config/users_database.yml

access_control:
  rules:
    - domain:
        - "emulatorjs.sussudio.ovh"
      policy: two_factor

session:
  secret: 3lSGS4x011mwfEhp9u8mJMW8Alvwu5ElklWjcxWD5KTxFcAD7W9rTCsrL3Ca3Yoh
  domain: sussudio.ovh

storage:
  encryption_key: lGvkBjKuhaY1gwLqd9RUHQ3aDvmvKSlx7VUTZgDWYZ5Z3bG6Az83ERP49qGHLg0P
  local:
    path: /config/db.sqlite3

notifier:
  filesystem:
    filename: /config/notification.txt

Comme indiqué plus haut, beaucoup de paramètres sont configurés par défaut donc faisons un rapide détour des options que je n'ai pas citer mais qui peuvent vous servir selon vos besoins.

Je vous en parle pour que vous puissiez en savoir plus sur comment tourne Authelia et pas vous laisser dans l'ignorance.

L'authentification basé sur le temps est activé par défaut contrairement aux notifications push, ça nous sera utile avec l'application Google Authenticator.

Time-based One-Time Password
Configuring the Time-based One-Time Password Second Factor Method.

Ensuite l'adresse IP et le port d'écoute sont 0.0.0.0:9091.

Pour information, 0.0.0.0 est l'adresse IP dans les environnements conteneurisés.

Server
Configuring the Server Settings.

Les logs sont de base configurés sur "info".

Log
Configuring the Log Settings.

Il y en a d'autres que je n'ai pas vu mais ça fera l'objet d'un guide avancée.

4-Créer un utilisateur

Il va falloir maintenant créer un utilisateur pour pouvoir vous authentifier. Créez le fichier "users_database.yml" et ajouter ce bloc.

users:
  <votre_nom>:
    displayname: <votre_nom>
    password: >votre_mot_de_passe>
    email: <votre_adresse_mail>
    groups:
      - admins
      - dev

Il faudra indiquer :

  • Le nom de l'utilisateur
  • Le nom d'affichage de l'utilisateur
  • Un mot de passe
  • Une adresse email

Par défaut, le compte appartiendra aux groupes "admins" et "dev"

Pour générer un mot de passe, lancez la commande la commande suivante puis ajoutez le à la ligne "password".

docker run authelia/authelia:latest authelia hash-password <votre_mot_de_passe>

Maintenant que vous avez créé le compte utilisateur, passons à Traefik.

5-Créer un middleware

Il va falloir créer un middleware pour rediriger les utilisateurs vers le portail d'authentification de Authelia.

Pour ceux qui veulent en savoir plus sur les middlewares, voici un excellent article qui vulgarise la chose.

Traefik 2 : Les Middlewares en quelques exemples
L’un des énormes avantages des middlewares apparu avec la version 2 de Traefik est la possibilité de ré-utiliser facilement ces déclarations et des les combiner à volonté.

Pour réussir cette étape, suivez bien mon guide de déploiement de Traefik (voir le lien plus haut).

Allez dans le dossier de Traefik (home/<username>/appdata/traefik) et ajoutez ce bloc tel quel dans le fichier "dynamic.yml".

    authelia:
      forwardAuth:
        address: "http://authelia:9091/api/verify?rd=https%3A%2F%2Fauthelia.sussudio.ovh%2F"

Indiquez l'adresse de redirection suivante : http://authelia:9091/api/verify?rd=https%3A%2F%2Fauthelia.<votre_nom_de_domaine>%2F

Puis ajoutez à la suite une chaîne de middleware sauf que là on va uniquement faire appel au middleware "authelia".

Note : l'option "chain" dans Traefik permet d'utiliser plusieurs middleware en même temps et de simplifier la configuration compose en évitant les labels à répétition pour chaque application.

    chain-authelia:
      chain:
        middlewares:
          - authelia

À la fin ça devrait ressembler à ça (attention à l'indentation).

```python
http:
  middlewares:
    authelia:
      forwardAuth:
        address: "http://authelia:9091/api/verify?rd=https%3A%2F%2Fauthelia.sussudio.ovh%2F"

    chain-authelia:
      chain:
        middlewares:
          - authelia

Maintenant, tout est fin prêt, il est temps de déployer tout ça.

6-Déploiement

Commencez par créer un dossier "docker" à la racine du dossier utilisateur"

mkdir -p ~/docker

Créez un fichier nommé "compose.yml"

touch ~/docker/compose.yml

Ouvrez le fichier "compose.yml" et copiez cette configuration.

version: "3.9"

networks:
  web:

services:

  authelia:
    image: authelia/authelia
    container_name: authelia
    volumes:
      - ${APPDATA}/authelia:/config
    networks:
      - web
    labels:
      - traefik.enable=true
      - traefik.http.routers.authelia.entrypoints=websecure
      - traefik.http.routers.authelia.rule=Host(`authelia.<votre_nom_de_domaine>`)
      - traefik.http.routers.authelia.tls.certresolver=letsencrypt
    ports:
      - 9091:9091
    restart: unless-stopped
    healthcheck:
      disable: true
    environment:
      - TZ=${TZ}

Puis à la suite, ajoutez la configuration du conteneur Librespeed.

  librespeed:
    image: lscr.io/linuxserver/librespeed:latest
    container_name: librespeed
    environment:
      - PUID=${PUID}
      - PGID=${PGID}
      - TZ=${TZ}
    volumes:
      - ${APPDATA}/librespeed:/config
    networks:
      - web
    restart: unless-stopped
    labels:
      - traefik.enable=true
      - traefik.http.routers.librespeed.entrypoints=websecure
      - traefik.http.routers.librespeed.tls.certresolver=letsencrypt
      - traefik.http.routers.librespeed.rule=Host(`librespeed.sussudio.ovh`)
      - traefik.http.routers.librespeed.service=librespeed-svc
      - traefik.http.services.librespeed-svc.loadbalancer.server.port=80
      - 'traefik.http.routers.librespeed.middlewares=chain-authelia@file'

Rien d'extraordinaire au niveau de la configuration si vous avez suivi le guide sur Traefik.

Vous verrez que la partie "labels" est similaire à celle de Authelia à un petit détail, j'ai ajouter le middleware de redirection vers le portail d'authentification.

Déployez le fichier compose.

docker compose create && docker compose up -d

7 - SFA et MFA

Si vous avez suivi l'ensemble des guides vu plus haut et celui-ci, l'application devrait récupérer son certificat SSL et vous devriez normalement être redirigé vers le portail d'authentification.

Si vous indiquez "one_factor", le compte utilisateur suffira pour accéder à l'application mais si vous indiquez "two_factors" comme je l'ai indiquer dans le fichier "users_database.yml", vous allez devoir indiquer un code temporaire fourni par votre application Google Authenticator.

Cliquez sur "Enregistrer l'appareil".

L'application indique que vous allez recevoir un mail.

Mais comme on a vu plus haut, on a pas mis en place de serveur SMTP mais un simple fichier "notification.txt".

Donc allez dans le dossier de Authelia et affichez le contenu du fichier avec la commande "cat".

cat notification.txt

Cliquez sur le lien.

Et scannez le QR Code avec votre application Google Authenticator sur votre smartphone.

Actualisez la page puis entrez le code à 6 chiffres qui se renouvelle toutes les 30 secondes par défaut.

Et si tout se passe bien, vous accéderez à votre application.

Félicitation!!!! Vous allez pouvoir utiliser du SFA et du MFA sans avoir besoin de serveur SMTP ou de base de données compliqué à administrer.

Auhelia est idéal pour sécuriser l'accès de vos applications sur l'internet public mais aussi en local.

Ce guide est volontairement simplifié à l'extrême pour que vous puissiez avoir une instance fonctionnelle et prête à l'emploi.

Pour ma part; je vais éplucher la documentation comme il doit pour vous fournir de prochains tutoriels à ce sujet.

Sources

Au départ, je me suis basé sur le guide de SmartHomeBeginner (un excellent site que je vous conseille vivement) qui m'avait permis de découvrir et mettre en place Traefik v1 en 2020.

Beaucoup de bonnes informations mais la configuration était loin de me satisfaire, il fallait que je la personnalise davantage.

Authelia Tutorial - Protect your Docker Traefik stack with Private MFA | SHB
Don’t like to outsource your authentication for Docker Traefik stack to third-party services? Then this in-depth Authelia tutorial is for you.

Je suis ensuite voir du côté de Youtube dont les meilleures vidéos sur Authelia sont signés TechnoTim et IbraCorp mais idem, à part avoir appris 2-3 astuces, je n'était toujours pas satisfait de ma configuration.

Du coup, je me suis plonger dans la documentation fournis par le site web et cela m'a permis de vous proposer ce guide.

Prologue
An introduction into configuring Authelia.