By Walid ETTAYEB

Authelia est un serveur d’authentification et d’autorisation open-source fournissant une authentification à deux facteurs et du single sign-on (SSO) pour vos applications via un portail web.

Authelia se comporte comme un module compagnon pour votre reverse proxy, que ce soit nginx, Traefik ou HAProxy afin de leur faire savoir si les demandes doivent être autorisées ou redirigées vers le portail d’Authelia pour l’authentification.

Ce système open source supporte différentes méthodes d’authentification double facteur comme U2F (pour les Yubikey…etc.), ceux basés sur le temps comme ce que propose Google Authenticator ou encore les notifs push comme ce que permet Duo.

Authelia embarque également différents niveaux de sécurité comme la possibilité d’interdire l’accès automatique dès qu’il y a eu trop d’essais non valides, ou valider uniquement les accès selon certaines règles (sous domaine précis, groupe utilisateur, réseau, type de requête…etc.). Authelia ne fonctionnera que pour les sites web en HTTPS, car le cookie de session ne peut être transmis que via des connexions sécurisées.

Si vous utilisez Nginx Proxy Manager et souhaitez ajouter l'authentification aux services ou aux applications que vous exposez, Authelia est une excellente solution. Vous pouvez choisir d'utiliser une authentification à un ou deux facteurs pour chaque hôte proxy que vous configurez.

Ce guide suppose que vous avez déjà configuré Docker et Nginx Proxy Manager et que vous avez une certaine expérience dans l'ajout d'hôtes proxy et la configuration d'enregistrements DNS.

Configuration du serveur Authelia

Je vais installer mon serveur Authelia sur une nouvelle VM utilisant Ubuntu 20.04.

Créer le répertoire de travail

La première chose à faire est de créer un répertoire appelé authelia où nous allons y placer un autre répertoire et 3 fichiers.

  • configuration.yml
  • users_database.yml
  • docker-compose.yml
cd /
mkdir authelia
cd authelia
mkdir config
cd config

Nous sommes maintenant dans /authelia/config :

nano configuration.yml

Collez ceci dans le fichier configration.yml :

##############################################################################
#                   Authelia configuration  ettayeb.fr                       #
##############################################################################

host: 0.0.0.0
port: 9091 # si vous avez besoin de modifier ces paramètres, assurez-vous qu'ils sont également pris en compte dans le fichier docker-compose.yml
log_level: info
jwt_secret: A4gYb7QFpbfKaNWAX7P7FX5y
default_redirection_url: https://auth.votredomaine.com
totp:
  issuer: votredomaine.com
  period: 30
  skew: 1

#duo_api:     ## If you want push notifictions of login attempts you can pay for this feature
#  hostname: api-123456789.example.com
#  integration_key: ABCDEF
#  secret_key: yet-another-long-string-of-characters-and-numbers-and-symbols

authentication_backend:
  disable_reset_password: false
  file:
    path: /config/users_database.yml # Make sure this file exists
    password:
      algorithm: argon2id
      iterations: 1
      salt_length: 16
      parallelism: 8
      memory: 64

access_control:
  default_policy: deny
  rules:
    # Rules applied to everyone
    - domain:
        - "auth.yourdomain.com"
        - "some-app-with-api.yourdomain.com"
      policy: bypass
    - domain: # Proxies only requiring username and password
        - "homer.yourdomain.com"
      policy: one_factor
#      networks:
#        - 192.168.1.0/24
    - domain: # Proxies needing 2 factor below
        - "proxmox.yourdomain.com"
      policy: two_factor
#      networks:
#         - 192.168.1.0/24
         
session:
  name: authelia_session
  # This secret can also be set using the env variables AUTHELIA_SESSION_SECRET_FILE
  secret: BEcQnvjxawGh4U9JgXBMXNVE
  expiration: 3600 # 1 hour
  inactivity: 7200 # 2 hours
  domain: yourdomain.lol # Needs to be your root domain

  redis:
    host: authelia_redis_1
    port: 6379
    # This secret can also be set using the env variables AUTHELIA_SESSION_REDIS_PASSWORD_FILE
#    password: authelia

regulation:
  max_retries: 5
  find_time: 2m
  ban_time: 10m

theme: dark   # options: dark, light

storage:
  local:
    path: /config/db.sqlite3
    
notifier:
  filesystem:
    filename: /config/notification.txt
#  smtp:
#    username: <[email protected]>
#    password: <your-user-email-password-for-smtp>
#    host: <your-email-host-url-or-ip>
#    port: <your-email-port-for-smtp>  # 25 non-ssl, 443 ssl, 587 tls
#    sender: <[email protected]>
#    subject: "[Authelia] {title}"
#    disable_require_tls: false # set to true if your domain uses no tls or ssl only
#    disable_html_emails: false # set to true if you don't want html in your emails
#    tls:
#      server_name: <your-email-host-url-or-ip>
#      skip_verify: false
#      minimum_version: TLS1.2

Ligne 8 - Il n'est pas nécessaire de la modifier, mais je le recommande. Peut-être ajouter ou changer quelques lettres/chiffres.

Ligne 9 - Créez un nouvel enregistrement dans Cloudflare puis ajoutez-le dans Nginx Proxy Manager comme vous le feriez normalement. Nous y reviendrons plus tard. Assurez-vous que c'est le domaine avec tous vos services et applications que vous voulez exposer.

Ligne 11 - Il s'agit du domaine racine principal que vous allez utiliser et qui doit être le même que celui utilisé à la ligne 9. Authelia ne peut gérer qu'un seul domaine et ses sous-domaines. Si vous souhaitez protéger plusieurs domaines, vous devez configurer une autre instance d'Authelia.

Ligne 31 - Contrôle d'accès. J'ai placé des exemples que vous devrez modifier. Tout ce qui est au-dessus de la ligne 37 ou "bypass" indique à Authelia d'ignorer l'authentification. Nous voulons nous assurer que notre page de redirection d'authentification est ici, sinon nous ne pourrons pas y accéder. Vous pouvez voir cela à la ligne 36.

Vous pouvez toujours utiliser Authelia sur le domaine, cependant, vous devrez ajouter tout proxy qui appelle une API dans la section bypass de la configuration et utiliser l'authentification native des applications si elle en a une. Qu'il s'agisse de NextCloud, Homer, OPA ou de toute autre application nécessitant un accès à l'API. Heureusement, la plupart des applications que nous utilisons et qui ont besoin d'accéder à l'API ont une authentification intégrée. La plupart d'entre elles en tout cas.

Ligne 42 - Vous pouvez restreindre l'accès aux seules machines de votre plage IP. J'ai commenté cette ligne parce que je n'utilise pas de restrictions de réseau et je pense que la plupart des gens qui utilisent cette application ne le feront pas non plus.

Ligne 52 - Vous pouvez changer le secret.

Ligne 74 - Notifieur - Ceci est important. Si vous utilisez deux facteurs, c'est la façon dont vous serez notifié de vos liens d'authentification et de la récupération du mot de passe. Cela va créer un fichier dans /authelia/config/notification.txt où il va écraser le fichier avec les notifications. Par exemple, lorsque vous configurez deux facteurs, c'est le fichier que vous ouvrirez pour obtenir le lien de vérification de l'authentification.

Vous pouvez configurer SMTP mais j'ai trouvé que c'était plus facile pour moi. J'ai configuré le navigateur de fichiers et j'ai ajouté un marque-page à ce fichier pour pouvoir le visualiser facilement. J'ai fait la même chose pour mon fichier configuration.yml afin de pouvoir le modifier facilement à la volée lorsque je dois ajouter de nouveaux hôtes proxy au fichier.

Créer un fichier de base de données des utilisateurs

Maintenant nous devons créer le fichier users_database.yml. Nous devrions toujours être dans le répertoire /authelia/config.

nano users_database.yml

Collez ce qui suit dans users_database.yml et assurez-vous de modifier votre nom et votre email:

###############################################################
#                         Users Database                      #
###############################################################
 
# This file can be used if you do not have an LDAP set up.
 
# List of users
users:
  john:
    displayname: "john doe"
    password: "$argon2id$v=19$m=1048576,t=1,p=8$MFJSeXh0V2VKVWZEZFJiZg$EOSz2OgjIIV//MWf8"   #hash using docker run authelia/authelia:latest YOURNAME hash-password SOMEPASSWORD
    email: [email protected]
    groups:
      - admins
      - dev

C'est le bon moment pour exécuter le fichier docker du générateur de hachage, alors faisons-le.

docker run authelia/authelia:latest authelia hash-password 'yourpassword'

Vous obtiendrez ainsi votre nouveau hachage. Assurez-vous de remplacer le hachage qui vous a été donné par le hachage du fichier ci-dessus. Laissez les guillemets.

Création du Docker-Compose


Le fichier final que nous allons créer pour ce répertoire est le fichier docker-compose.yml. Nous devons reculer d'un répertoire dans /authelia

nano docker-compose.yml

Collez ceci dans docker-compose.yml

version: '3.3'
services:
  authelia:
    image: authelia/authelia
    volumes:
      - ./config:/config
    ports:
      - 9091:9091
    restart: unless-stopped
    healthcheck:
      disable: true
    environment:
      - TZ=Europe/Paris
    depends_on:
      - redis

  redis:
    image: redis:alpine
    volumes:
      - ./redis:/data
    expose:
      - 6379
    restart: unless-stopped
    environment:
      - TZ=Europe/Paris

Veillez à modifier le TZ pour qu'il reflète votre propre fuseau horaire. Ceci est important pour l'utilisation de l'authentification à deux facteurs.

Installer Authelia

Depuis le répertoire /authelia, vous pouvez maintenant exécuter l'installation de docker-compose.

docker-compose up -d

Configurations de Nginx Proxy Manager

Créez un nouveau Proxy Host pour la redirection Authelia. L'exemple que j'ai utilisé dans le fichier de configuration est auth.votredomaine.com.

Rediriger l'hôte proxy

Une fois que vous avez tout configuré et enregistré avec un certificat fonctionnel de Let's Encrypt, modifiez l'hôte proxy et allez dans l'onglet Avancé. C'est ici que nous allons mettre la configuration personnalisée de Nginx pour Authelia.

Collez ceci dans l'onglet avancé:

location / {
    set $upstream_authelia http://192.168.1.25:9091; 
    proxy_pass $upstream_authelia;
    client_body_buffer_size 128k;

    #Timeout if the real server is dead
    proxy_next_upstream error timeout invalid_header http_500 http_502 http_503;

    # Advanced Proxy Config
    send_timeout 5m;
    proxy_read_timeout 360;
    proxy_send_timeout 360;
    proxy_connect_timeout 360;

    # Basic Proxy Config
    proxy_set_header Host $host;
    proxy_set_header X-Real-IP $remote_addr;
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    proxy_set_header X-Forwarded-Proto $scheme;
    proxy_set_header X-Forwarded-Host $http_host;
    proxy_set_header X-Forwarded-Uri $request_uri;
    proxy_set_header X-Forwarded-Ssl on;
    proxy_redirect  http://  $scheme://;
    proxy_http_version 1.1;
    proxy_set_header Connection "";
    proxy_cache_bypass $cookie_session;
    proxy_no_cache $cookie_session;
    proxy_buffers 64 256k;

    # If behind reverse proxy, forwards the correct IP
    set_real_ip_from 10.0.0.0/8;
    set_real_ip_from 172.0.0.0/8;
    set_real_ip_from 192.168.0.0/16;
    set_real_ip_from fc00::/7;
    real_ip_header X-Forwarded-For;
    real_ip_recursive on;
}

Maintenant, tout ce que vous avez à changer ici est la ligne 2. Changez l'IP pour votre serveur/hôte Authelia. Vous pouvez trouver l'IP en exécutant cette commande :

ip addr

Assurez-vous de cliquer sur enregistrer puis de tester l'hôte pour vous assurer qu'il fonctionne.

Tous les autres hôtes Proxy

Pour tout autre hôte proxy que vous ajoutez à Nginx Proxy Manager, le JSON sera un peu différent. Par exemple, je veux mettre l'authentification sur mon tableau de bord Homer. Je crée un hôte proxy homer.votredomaine.com pour cela. Dans l'onglet avancé de cet hôte proxy, j'ai besoin du JSON suivant.

location /authelia {
    internal;
    set $upstream_authelia http://192.168.1.25:9091/api/verify; #ADD YOUR IP AND PORT OF AUTHELIA
    proxy_pass_request_body off;
    proxy_pass $upstream_authelia;    
    proxy_set_header Content-Length "";
 
    # Timeout if the real server is dead
    proxy_next_upstream error timeout invalid_header http_500 http_502 http_503;
    client_body_buffer_size 128k;
    proxy_set_header Host $host;
    proxy_set_header X-Original-URL $scheme://$http_host$request_uri;
    proxy_set_header X-Real-IP $remote_addr;
    proxy_set_header X-Forwarded-For $remote_addr; 
    proxy_set_header X-Forwarded-Proto $scheme;
    proxy_set_header X-Forwarded-Host $http_host;
    proxy_set_header X-Forwarded-Uri $request_uri;
    proxy_set_header X-Forwarded-Ssl on;
    proxy_redirect  http://  $scheme://;
    proxy_http_version 1.1;
    proxy_set_header Connection "";
    proxy_cache_bypass $cookie_session;
    proxy_no_cache $cookie_session;
    proxy_buffers 4 32k;
 
    send_timeout 5m;
    proxy_read_timeout 240;
    proxy_send_timeout 240;
    proxy_connect_timeout 240;
}
 
    location / {
        set $upstream_homer http://192.168.1.30:8080;  #CHANGE NAME AND IP AND PORT
        proxy_pass $upstream_homer;  #change name of the service
 
		auth_request /authelia;
		auth_request_set $target_url $scheme://$http_host$request_uri;
		auth_request_set $user $upstream_http_remote_user;
		auth_request_set $groups $upstream_http_remote_groups;
		proxy_set_header Remote-User $user;
		proxy_set_header Remote-Groups $groups;
		error_page 401 =302 https://auth.yourdomain.com/?rd=$target_url; #change YOURDOMAIN.COM to your domain
 
		client_body_buffer_size 128k;
 
		proxy_next_upstream error timeout invalid_header http_500 http_502 http_503;
 
		send_timeout 5m;
		proxy_read_timeout 360;
		proxy_send_timeout 360;
		proxy_connect_timeout 360;
 
		proxy_set_header Host $host;
		proxy_set_header X-Real-IP $remote_addr;
		proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
		proxy_set_header X-Forwarded-Proto $scheme;
		proxy_set_header X-Forwarded-Host $http_host;
		proxy_set_header X-Forwarded-Uri $request_uri;
		proxy_set_header X-Forwarded-Ssl on;
		proxy_redirect  http://  $scheme://;
		proxy_http_version 1.1;
		proxy_set_header Connection "";
		proxy_cache_bypass $cookie_session;
		proxy_no_cache $cookie_session;
		proxy_buffers 64 256k;
 
		set_real_ip_from 192.168.1.0/16;
		real_ip_header X-Forwarded-For;
		real_ip_recursive on;
 
    }

Vous devrez modifier la ligne 3 avec l'adresse IP et le port de votre propre serveur Authelia. Lorsque vous effectuez cette opération la première fois, vous pouvez simplement la copier et l'enregistrer afin de ne pas avoir à modifier cette ligne à chaque fois. Cependant, il y a quelques lignes que vous devrez modifier chaque fois que vous ajouterez ceci à un autre hôte proxy. Mais ce n'est pas difficile !

Ligne 33 - Cette ligne a un nom en amont. Remplacez-le par le nom du service, puis par l'IP et le port sur lesquels le service fonctionne. Si le service est sur le port 80, aucun port n'est nécessaire. Juste l'IP.

Ligne 34 - Même chose. Changez le nom du service pour qu'il corresponde à celui de la ligne 33.

Ligne 42 - C'est comme la ligne 3. Si vous modifiez cette ligne une fois et l'enregistrez, vous n'aurez pas à la modifier à chaque fois.

N'oubliez pas

Le fichier configuration.yml devra être modifié chaque fois que vous voudrez ajouter l'authentification à un nouvel hôte proxy. Vous devrez également ajouter le JSON correspondant ci-dessus dans l'onglet avancé de Nginx Proxy Manager. Une fois modifié, vous devrez redémarrer Authelia. Vous pouvez le faire avec Portainer ou en exécutant la commande suivante depuis le répertoire /authelia.

docker-compose restart

Walid ETTAYEB • 36 Articles

Passionné par l'informatique depuis mon plus jeune âge, je transforme ma passion en expertise.

View Articles