Aller au contenu principal

Authentik et SSO

Authentik est le fournisseur d'identité du club. Les membres se connectent une fois avec leur compte AD, et Authentik les connecte ensuite aux applications compatibles (GitLab, Vaultwarden…) : c'est l'authentification unique (SSO).

ÉlémentValeur
Adressehttps://auth.formuleets.ca (interface d'admin : bouton Admin interface)
MachineVM 131 fsae-auth sur formule-pve-02, Debian 13, 10.194.24.61
VersionAuthentik 2026.8.5, en Docker Compose (PostgreSQL 16, server, worker)
GestionVM créée par OpenTofu (tofu/envs/prod/main.tf), configurée par Ansible (rôles common, ad_dns, authentik, playbook authentik.yml)
Compte d'adminakadmin
Comptes des membressynchronisés depuis l'AD
À compléter

L'emplacement dans Vaultwarden du mot de passe d'akadmin, de celui de svc-authentik, et des Client ID / Client Secret de chaque application.

Où en est le SSO​

ApplicationÉtatComment
GitLabPiloteOpenID Connect, groupe sso-pilote
VaultwardenPiloteOpenID Connect, groupe sso-pilote
Google Workspace (Gmail, Drive…)PiloteSAML, groupe sso-pilote dans Authentik et dans Google
OpenProjectMêmes identifiants, sans SSOLe SSO d'OpenProject est payant (Enterprise). OpenProject se connecte directement à l'AD en LDAPS.
OPNsense, TrueNAS, FOGÀ fairePas d'OpenID Connect : connexion LDAP à l'AD (ou jonction à l'AD pour TrueNAS)
WAPT, WD My CloudImpossiblePas de connexion AD dans WAPT Community, ni sur le NAS WD

Pour l'instant, seuls les membres du groupe sso-pilote (groupe créé dans Authentik, pas dans l'AD) peuvent utiliser le SSO. Pour tous les autres, la connexion classique par mot de passe continue de fonctionner partout.

L'installation​

Le rôle Ansible authentik installe Docker et lance le fichier Compose officiel, dans /opt/authentik, avec une différence : le worker n'a pas accès au socket Docker de la machine. Il ne sert qu'aux « outposts » gérés par Docker, qu'on n'utilise pas, et il donnerait au conteneur le contrôle de la machine.

  • Secrets : le mot de passe de la base et la clé secrète sont générés une seule fois par Ansible, dans /opt/authentik/.env (root, 0600). Ils ne sont ni dans le dépôt ni dans un coffre.
  • Publication : Caddy, sur OPNsense, publie auth.formuleets.ca vers 10.194.24.61:9000 (voir Ajouter un sous-domaine). Un enregistrement A auth chez Cloudflare pointe vers 142.137.247.115.
  • Monter de version : lire les notes de version d'Authentik, changer authentik_version dans ansible/roles/authentik/defaults/main.yml, puis relancer le playbook.

Pour relancer le playbook, depuis la VM elle-même (Ansible y est installé) :

cd ~/infra-ansible # copie du dossier ansible du dépôt
ansible-playbook playbooks/authentik.yml --limit fsae-auth -e ansible_connection=local
Sauvegardes

Authentik est sauvegardé chaque nuit sur la VM (voir Sauvegarde Authentik), mais pas encore hors site. Sans le .env, une sauvegarde de la base est inutilisable : il est inclus dans la sauvegarde.

La source Active Directory​

Authentik recopie les comptes et les groupes de l'AD : Directory → Federation and Social login → Active Directory.

RéglageValeur
Server URIldaps://ad-fsae.formulesae.local:636
StartTLSdésactivé (on utilise ldaps://, chiffré dès la connexion)
Use Server URI for SNI verificationactivé (l'AD répond en TLS 1.3)
TLS Verification CertificateCA FormuleSAE AD : l'autorité du domaine FormuleSAE-AD-FSAE-CA, valide jusqu'en 2036
Bind CNsvc-authentik@formulesae.local : compte de service en lecture seule, dans FormuleSAE → ComptesService, membre d'aucun groupe
Base DNDC=FormuleSAE,DC=local
Additional User DN / Group DNOU=Utilisateurs,OU=FormuleSAE / OU=Groupes,OU=FormuleSAE
User object filter(&(objectClass=user)(!(objectClass=computer)))
Object uniqueness fieldobjectSid
User password writebackdésactivé : l'AD reste la seule référence des mots de passe
Mappings utilisateursles 4 « Active Directory Mapping », plus DN to User Path, mail, Name
Mappings groupesuniquement LDAP Mapping: Name

La synchronisation passe toutes les deux heures. Pour la forcer (après avoir modifié un compte dans l'AD) : page de la source → Run sync.

Les comptes désactivés dans l'AD arrivent désactivés dans Authentik. Les mots de passe ne sont pas copiés : Authentik les vérifie auprès de l'AD à chaque connexion.

L'adresse courriel est indispensable

Les applications rattachent la connexion SSO au bon compte par l'adresse courriel, qui vient du champ Adresse de messagerie du compte AD. Un compte AD sans adresse ne peut pas être rattaché. Au 2026-11-10, 37 comptes actifs sur 85 n'en ont pas. Les adresses du club suivent le format prénom.nom@formule-ets.ca, mais pas toutes : vérifie-les dans Google Workspace.

Les applications branchées​

GitLab​

Côté AuthentikValeur
Application / slugGitLab / gitlab
FournisseurOAuth2/OpenID, Confidential
Redirect URI (Strict)https://gitlab.formuleets.ca/users/auth/openid_connect/callback

Côté GitLab, la configuration est dans /etc/gitlab/gitlab.rb (bloc omniauth, sauvegarde de l'ancienne version dans /root/gitlab.rb.avant-sso) :

  • issuer https://auth.formuleets.ca/application/o/gitlab/, avec découverte automatique et PKCE ;
  • l'identifiant du compte est le preferred_username, c'est-à-dire l'identifiant AD ;
  • liaison automatique par adresse courriel au compte GitLab existant ;
  • un nouveau compte créé par le SSO reste bloqué jusqu'à la validation d'un admin.

Pour lier à la main un compte GitLab existant (quand les adresses diffèrent) : le membre se connecte avec son mot de passe, puis Profil → Compte → Service sign-in → Connect Authentik.

Vaultwarden​

Côté AuthentikValeur
Application / slugVaultwarden / vaultwarden
Redirect URI (Strict)https://bitwarden.formuleets.ca/identity/connect/oidc-signin
Scopesopenid, profile et Vaultwarden : email vérifié à la place du mapping email par défaut

Le mapping Vaultwarden : email vérifié déclare les adresses comme vérifiées : Vaultwarden refuse sinon la connexion (« You need to verify your email with your provider »). C'est acceptable, puisque les adresses sont saisies par l'IT dans l'AD.

Côté Vaultwarden (panneau admin → OpenID Connect SSO settings) : SSO activé, Only SSO login désactivé, Allow email association activé, PKCE, et Use SSO only for auth not the session lifecycle activé.

Le mot de passe maître reste demandé après le SSO : le coffre est chiffré avec, et ni Authentik ni l'IT ne peuvent l'ouvrir.

L'adresse Vaultwarden doit être celle de l'AD

Beaucoup de comptes Vaultwarden utilisent l'adresse de l'école (@ens.etsmtl.ca). Pour que le SSO les reconnaisse, chaque membre doit passer à son adresse du club : Mon compte → Changer d'adresse (mot de passe maître, nouvelle adresse, puis le code reçu par courriel). Le mot de passe maître ne change pas.

Google Workspace​

Ici, Authentik est le fournisseur d'identité SAML de Google : le membre tape son adresse sur Google, est renvoyé vers auth.formuleets.ca, entre son mot de passe AD, puis revient dans Gmail. Mis en place le 2026-11-11, testé avec tbarbier.

Côté AuthentikValeur
Certificat de signaturegoogle-workspace-saml (System → Certificates), RSA, valide jusqu'au 2031-11-10
Application / slugGoogle Workspace / google-workspace (le slug est dans l'URL donnée à Google : ne pas le changer)
FournisseurSAML, flux default-provider-authorization-implicit-consent
ACS URLhttps://accounts.google.com/samlrp/02ge214q12tm7sw/acs
Audiencehttps://accounts.google.com/samlrp/02ge214q12tm7sw
EntityID/Issuer overridehttps://auth.formuleets.ca
Liaison du fournisseur de servicesPost (affiché « Appliquer » dans l'interface en français)
Signatureassertions et réponses signées, SHA256
Mappage NameIDauthentik default SAML Mapping: Email (sans lui, Google reçoit un identifiant opaque et ne trouve pas le compte)
Liaisongroupe sso-pilote
Côté Google (console d'administration)Valeur
Profil SSOSécurité → Authentification → SSO avec un fournisseur d'identité tiers → profil SAML Authentik
ID d'entité de l'IdPhttps://auth.formuleets.ca
URL de connexionhttps://auth.formuleets.ca/application/saml/google-workspace/sso/binding/redirect/
Déconnexion, changement de mot de passevides
Certificat de validationgoogle-workspace-saml exporté d'Authentik (certificat seulement, jamais la clé privée)
Attributiongroupe Google sso-pilote@formule-ets.ca (accès Restricted, Only invited users), profil Authentik - SAML, Google redirige vers l'IdP
Attribuer le profil à un groupe, jamais à l'UO Formule ETS

Dans Gérer les attributions de profils SSO, la portée par défaut est l'unité organisationnelle Formule ETS. Le Workspace est partagé avec d'autres clubs : sous l'UO Clubs, il y a aussi Baja ETS et Eclipse, qu'on ne touche jamais. L'y attribuer fait passer tout le club par Authentik d'un coup, y compris les comptes sans adresse dans l'AD ou hors de sso-pilote côté Authentik : ils ne peuvent plus se connecter. Toujours choisir l'onglet Groupes à gauche, et vérifier la ligne « Showing settings for users in … » avant Override.

Points à connaître :

  • Google n'applique jamais le SSO aux super-admins : ils gardent le mot de passe Google, c'est l'accès de secours. Pour tester, utiliser un compte simple utilisateur.
  • Le SSO ne crée pas les comptes Google : un membre doit déjà avoir son compte Google, avec la même adresse que le champ Adresse de messagerie de l'AD.
  • Pour ajouter quelqu'un au pilote : l'ajouter au groupe sso-pilote dans Authentik et au groupe Google sso-pilote@formule-ets.ca.
  • Pour tout annuler : retirer l'attribution du profil au groupe Google (Unset). Les membres retrouvent leur mot de passe Google en quelques minutes.
  • Le certificat expire le 2031-11-10 : en générer un nouveau avant, l'ajouter au profil Google (deux certificats sont acceptés), puis basculer le fournisseur Authentik dessus.

Ajouter une application​

  1. Applications → Providers → Create → OAuth2/OpenID Provider :
    • Authorization flow : default-provider-authorization-implicit-consent ;
    • Client type : Confidential ;
    • Redirect URIs : Strict, l'adresse de retour donnée par la documentation de l'application ;
    • Signing Key : authentik Self-signed Certificate.
  2. Applications → Applications → New Application (le bouton principal) : nom, slug, et le fournisseur choisi dans la liste. Dans UI settings, la Launch URL de l'application.
  3. Dans l'application → Policy / Group / User Bindings → Bind existing policy/group/user → Group : sso-pilote pendant les essais.
  4. Dans l'application elle-même : l'issuer https://auth.formuleets.ca/application/o/<slug>/, le Client ID et le Client Secret (rangés dans Vaultwarden).
  5. Teste avec un compte du pilote, dans une fenêtre de navigation privée.
astuce

Le menu New Application → with New Provider… propose un assistant tout-en-un, mais selon la version il n'ouvre que le formulaire simple. Créer le fournisseur d'abord, comme ci-dessus, marche toujours.

Élargir le pilote​

  1. Vérifier que les membres concernés ont une adresse courriel dans l'AD, identique à celle de leurs comptes GitLab, Vaultwarden et Google. Pour Google, élargir aussi le groupe Google auquel le profil SSO est attribué (jamais l'UO entière, voir Google Workspace).
  2. Ajouter un groupe aux liaisons des applications, par exemple GG_IT, puis GG_Lead, avant de les ouvrir à tous.
  3. Une fois tout le monde passé, envisager Only SSO login dans Vaultwarden et la désactivation du mot de passe dans GitLab.

Problèmes connus​

SymptômeCauseSolution
Synchro AD : LDAPServerPoolExhaustedErrorLes conteneurs ne résolvent pas ad-fsae.formulesae.local : le DNS interne de Docker passe par systemd-resolved, qui ignore les noms en .localRôle Ansible ad_dns (domaine FormuleSAE.local déclaré au résolveur)
Synchro AD : invalidCredentials … data 52eMauvais identifiant ou mot de passe de svc-authentikBind CN svc-authentik@formulesae.local ou FORMULESAE\svc-authentik, mot de passe copié depuis Vaultwarden
Synchro AD qui échoue avec ldaps://StartTLS activé en même tempsDésactiver StartTLS
Erreur 500, Permission denied: '/templates/…'Dossiers illisibles pour l'utilisateur 1000 des conteneursCorrigé dans le rôle authentik
« Request has been denied » sur l'installation initialeIl faut partir de l'adresse racineOuvrir http://10.194.24.61:9000/, qui redirige vers l'assistant
GitLab : compte « en attente d'approbation » au lieu du compte existantPas d'adresse (ou adresse différente) côté ADRejeter le compte créé, remplir l'adresse dans l'AD, ou lier le compte à la main
GitLab : « Extern uid has already been taken »L'identité est encore attachée au compte créé par le SSORejeter ce compte, attendre une minute, puis relier
Vaultwarden : « You need to verify your email with your provider »Authentik envoie l'adresse comme non vérifiéeMapping Vaultwarden : email vérifié sur le fournisseur
L'installation initiale est ouverte à tout le réseau

Sur une installation neuve, le premier qui ouvre la page d'installation crée le compte akadmin. Elle est joignable depuis tout le réseau de l'école : crée ce compte immédiatement après l'installation, avant de publier le site.