Imaginez un monde parfait, où vous vous connectez à une seule application le matin, et vous avez accès à toutes vos applications, sans avoir à vous reconnecter à chaque fois. N’imaginez plus, Authentik est la solution qu’il vous faut !

Vous connaissez peut-être déjà des solutions comme Keycloak, Okta, ou encore Auth0. Authentik est une solution self-hosted et totalement open-source, et honnêtement, extrêmement complète. Elle permet de gérer l’authentification et l’autorisation de vos applications, et est compatible avec les protocoles OAuth2, OIDC, SAML, LDAP, et bien d’autres.

Voilà un petit tableau récapitulatif des fonctionnalités d’Authentik :

authentik comparaison

Avant de plonger tête la première dans la configuration d’Authentik, il est important de comprendre certains concepts de base.

C’est quoi un IAM ?

Vous connaissez tous un IAM très connu, Active Directory. Voilà, j’ai plus besoin de continuer, vous savez ce que c’est :)… Mais pour les autres, un IAM (Identity and Access Management) est une solution qui permet de gérer l’identité des utilisateurs et leurs accès aux ressources de l’entreprise. Il permet de centraliser la gestion des utilisateurs, des groupes, des rôles, des permissions, et bien plus encore.

En gros, c’est le point central de votre entreprise pour gérer l’authentification et l’autorisation des utilisateurs.

identity-and-access-management schema

Un IAM a quatre grandes fonctions :

  • Authentification : Vérifier l’identité de l’utilisateur.
  • Autorisation : Vérifier si l’utilisateur a le droit d’accéder à la ressource.
  • User Management : Gérer les utilisateurs, les groupes, les rôles, les permissions, etc.
  • Central user repository : Centraliser les informations sur les utilisateurs, les groupes, les rôles, les permissions, etc.

Par exemple, imaginez que vous sonnez à l’interphone de chez vous, et vous dites “Bonjour, c’est moi”. Votre maman va sortir la tête de la fenêtre et va vous identifier. Donc là, on est à l’étape de l’authentification.

Ensuite, elle va décider si vous avez le droit d’entrer ou pas, car peut-être avez-vous oublié de ramener le pain, et là vous n’avez pas le droit d’entrer. Donc là, on est à l’étape de l’autorisation.

Pour les deux autres points, mon exemple est moins parlant, mais imaginez que votre mère tient un carnet avec la liste de tous les enfants de la maison, leurs corvées et leurs droits de sortie (User management & central repository).

Authentik dans tout ça ?

altAuthentik logo

Authentik est la réponse open-source à toutes les solutions IAM qui existent actuellement. Okta, Keycloak, même Active Directory, Authentik est capable de faire tout ce qu’ils font, et même plus.

Je vais arrêter avec la théorie, on apprend mieux en pratiquant, donc on va passer au déploiement d’Authentik.

Déploiement d’Authentik avec Docker compose

La première chose qu’il faut faire, c’est de récupérer le docker-compose.yml donné gracieusement par Authentik. Pour cela, sur votre serveur cible, vous allez lancer cette commande :

wget https://goauthentik.io/docker-compose.yml

Ensuite, il faut créer un fichier .env à la racine du projet. Authentik, dans sa documentation officielle, nous facilite la tâche en nous donnant déjà les variables obligatoires à remplir et une façon sécurisée de les générer. Pour cela, vous allez lancer cette commande :

echo "PG_PASS=$(openssl rand -base64 36 | tr -d '\n')" >> .env
echo "AUTHENTIK_SECRET_KEY=$(openssl rand -base64 60 | tr -d '\n')" >> .env

Et normalement, vous devriez déjà pouvoir lancer le docker compose. Pour cela, vous allez lancer cette commande :

docker compose pull
docker compose up -d

Pour info, pour ceux qui utilisent Traefik, voici le docker-compose.yml que j’utilise pour Authentik :

services:
  postgresql:
    image: docker.io/library/postgres:16-alpine
    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}
    networks:
      - frontend
    env_file:
      - .env
  redis:
    image: docker.io/library/redis:alpine
    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
    networks:
      - frontend
    volumes:
      - redis:/data
  server:
    image: ${AUTHENTIK_IMAGE:-ghcr.io/goauthentik/server}:${AUTHENTIK_TAG:-2025.6.3}
    restart: unless-stopped
    command: server
    environment:
      AUTHENTIK_SECRET_KEY: ${AUTHENTIK_SECRET_KEY:?secret key required}
      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
    env_file:
      - .env
    labels:
      - "traefik.enable=true"
      # HTTP -> HTTPS redirection
      - "traefik.http.routers.authentik.entrypoints=http"
      - "traefik.http.routers.authentik.rule=Host(`authentik.homelab.makhal.fr`)"
      - "traefik.http.routers.authentik.middlewares=https-redirect"
      - "traefik.http.middlewares.https-redirect.redirectscheme.scheme=https"
      # HTTPS configuration
      - "traefik.http.routers.authentik-secure.entrypoints=https"
      - "traefik.http.routers.authentik-secure.rule=Host(`authentik.homelab.makhal.fr`)"
      - "traefik.http.routers.authentik-secure.tls=true"
      - "traefik.http.routers.authentik-secure.tls.certresolver=cloudflare"
      # Security headers middleware
      - "traefik.http.middlewares.security-headers.headers.browserXssFilter=true"
      - "traefik.http.middlewares.security-headers.headers.contentTypeNosniff=true"
      - "traefik.http.middlewares.security-headers.headers.forceSTSHeader=true"
      - "traefik.http.middlewares.security-headers.headers.stsIncludeSubdomains=true"
      - "traefik.http.middlewares.security-headers.headers.stsPreload=true"
      - "traefik.http.middlewares.security-headers.headers.stsSeconds=31536000"
      - "traefik.http.middlewares.security-headers.headers.customFrameOptionsValue=DENY"
      - "traefik.http.routers.authentik-secure.middlewares=realip-headers@file,security-headers"
      # Service configuration
      - "traefik.http.services.authentik.loadbalancer.server.port=9000"
    networks:
      - frontend
    depends_on:
      postgresql:
        condition: service_healthy
      redis:
        condition: service_healthy
  worker:
    image: ${AUTHENTIK_IMAGE:-ghcr.io/goauthentik/server}:${AUTHENTIK_TAG:-2025.6.3}
    restart: unless-stopped
    command: worker
    environment:
      AUTHENTIK_SECRET_KEY: ${AUTHENTIK_SECRET_KEY:?secret key required}
      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
    env_file:
      - .env
    networks:
      - frontend
    depends_on:
      postgresql:
        condition: service_healthy
      redis:
        condition: service_healthy

volumes:
  database:
    driver: local
  redis:
    driver: local

networks:
  frontend:
    external: true

Avec votre configuration, il faudra donc adapter les labels pour que cela fonctionne avec votre domaine et votre configuration Traefik.

Accéder à Authentik

Une fois que tout est lancé, vous pouvez accéder à Authentik en vous rendant sur l’URL que vous avez configurée dans les labels de votre docker compose. Par exemple, si vous avez configuré authentik.homelab.makhal.fr, vous pouvez y accéder en ouvrant votre navigateur et en tapant cette URL.

Authentik login page

La première fois que vous accédez à Authentik, il faudra en fait vous rendre à l’URL suivante :

https://authentik.homelab.makhal.fr/if/flow/initial-setup/

Et ici, vous allez créer votre premier utilisateur administrateur.

Une fois dedans, vous allez tomber sur cette page :

Page applications authentik

Et vous allez appuyer sur Interface d’administration pour accéder à l’interface d’administration d’Authentik.

Dashboard Admin

Sécuriser notre première application

J’aurais pu m’arrêter là et vous dire qu’Authentik est super, mais je vais aller plus loin et vous montrer comment mettre en place OAuth2 sur une application. J’aurais pu prendre n’importe quelle application qui supporte OAuth2. Moi, je vais prendre Portainer.

D’abord, on va créer une application dans Authentik. L’application, c’est ce qui va permettre à Authentik de communiquer avec notre application.

alt text

Pour cela, on va aller dans la section Applications et cliquer sur Créer avec un fournisseur.

Vous allez avoir ce menu qui va s’afficher :

alt text

Vous pouvez le remplir comme je l’ai fait.

Une fois fini, vous allez appuyer sur Next.

alt text

Comme vous le voyez, Authentik nous donne beaucoup de choix : on a du Radius, du LDAP, du SAML, de l’OIDC, et bien d’autres. C’est hyper intéressant d’aller jeter un coup d’œil à la doc et de voir à quoi sert chacun de ces protocoles.

Et si jamais votre application ne supporte aucun de ces protocoles, Authentik permet de faire du reverse proxy !! Il va donc être comme un middleware entre votre application et l’utilisateur, où il devra s’authentifier avant d’accéder à votre application. C’est vraiment super-complet.

On va choisir OAuth2 et appuyer sur Next.

alt text

Une fois dedans, vous allez pouvoir configurer votre fournisseur OAuth2. Comme vous le voyez, il faut un nom, vous pouvez mettre ce que vous voulez.

Pour le flux de l’autorisation, on va prendre explicit-consent. Cette configuration va dire à Authentik de demander à l’utilisateur de se connecter à chaque fois qu’il veut accéder à cette application. Il y a d’autres flux, comme implicit, qui permettent de ne pas demander à l’utilisateur de se connecter à chaque fois, mais je vous laisse aller voir la doc pour en savoir plus.

Une fois qu’on a rempli cela, on voit plus en bas, l’ID Client et le Secret Client. Ces deux valeurs sont importantes, car elles vont permettre à votre application de se connecter à Authentik. N’ayez pas peur, on pourra les récupérer plus tard.

On va appuyer sur Next pour continuer.

alt text

Ici, on va sélectionner le groupe d’utilisateurs qui aura accès à cette application. Moi, je ne vais pas me prendre la tête, je vais prendre le groupe admin par défaut.

Une fois que c’est fait, vous pouvez faire Next, Next et Soumettre.

Et on a notre application qui est créée.

alt text

Connecter Portainer à Authentik

Maintenant que notre application est créée sur Authentik, on va pouvoir la connecter à Portainer. Pour cela, on va aller dans Portainer.

alt text

Et ici, on va aller dans Settings et dans la section Authentication. On va sélectionner OAuth2. Il nous demande de remplir quelques champs.

Pour récupérer les valeurs que notre fournisseur nous a données un peu plus tôt, il faut aller dans la section Providers dans Authentik, et cliquer sur le fournisseur qu’on a créé pour l’éditer.

Et on a ici les valeurs qu’il faut remplir dans Portainer :

alt text

Donc dans l’interface de Portainer, il suffit de copier/coller les valeurs dans les champs correspondants.

Maintenant, il faut saisir les URL de redirection. Pour récupérer ces URL, il faut cliquer sur le nom de votre provider dans la section Providers (pas comme tout à l’heure où on a édité le provider), et vous allez avoir cette page :

alt text

Chez moi, du coup, ça va ressembler à ça lorsque l’on met ces valeurs dans Portainer :

alt text

Si jamais vous n’utilisez pas Traefik, ça va devoir ressembler à ça :

alt text

Maintenant, une fois qu’on a appuyé sur Save, on va aller sur la section Users de Portainer, et on va créer un utilisateur.

alt text

Et vous allez voir qu’automatiquement, Portainer va mettre cet utilisateur dans la méthode d’authentification OAuth2.

Moment de vérité

Maintenant, si on se déconnecte de Portainer, on va tomber sur cette page :

alt text

Donc déjà, bon signe, on voit le bouton Login with OAuth. On va cliquer dessus, et on va être redirigé vers Authentik.

alt text

Il va me demander de me connecter, et une fois connecté, il va me rediriger vers Portainer !!

Conclusion

Et voilà, on a réussi à connecter Portainer à Authentik en utilisant OAuth2. C’est vraiment super simple, et ça permet de centraliser l’authentification de vos applications.

Si vous avez des questions, n’hésitez pas à me les envoyer par message sur LinkedIn, je me ferai un plaisir de vous aider.

Et sur ce, je vous dis à la prochaine pour un nouvel article.