En écrivant mon article sur Authelia, je suis dans la documentation tombé sur une partie openID Connect que j’avais un peu laissé de côté. J’avais d’abord pensé que c’était un client, c’est à dire la possibilité d’utiliser github, gitlab ou autre solution Oauth/OpenID auto-hébergé ou non pour pouvoir me connecter.

Mais en fait non, c’est Authelia qui est serveur OpenID et permets donc d’être la source d’authentification pour vos services le supportant.

Je me suis donc dit, qu’au lieu de recommencer l’échec récent d’openldap (j’ai tout cassé ^^), ou de partir sur une solution un peu beaucoup plus lourde qu’est KeyCloak (lourde mais top), il pourrait être intéressant d’utiliser Authelia pour m’authentifier sur Nextcloud.

OpenID Connect est disponible depuis la version 4.29 de Authelia, et est toujours en phase beta (beta2 avec la version actuelle 4.33). Bien que je n’aie rencontré aucun bug, il n’est pas exclu que vous, vous en ayez.

Pre-requis

Je pars du principe que vous avez déjà Authelia et Nextcloud de configurer, le but ici est simplement de faire la connexion entre nextcloud et authelia, pas d’installer ces applications.

Configuration de authelia

Pour commencer il nous faudra générer des secrets, mais également une clé privée RSA.

Génération de la clé RSA

Pour ceci authelia fourni ce qu’il faut dans leur cli, vous pouvez donc faire ceci pour en générer une :

$ docker run authelia/authelia sh -c "authelia rsa generate --dir . && cat key.pem"
RSA Private Key written to key.pem
RSA Public Key written to key.pub
-----BEGIN RSA PRIVATE KEY-----
MIIEpQIBAAKCAQEA+WfHZlWFr4YLtt+URbM9oEGMbSYDSRc3mLPv4r6p2M83/ITI
yBgJAzLSM8BGsMdBvX/W+7jRcu9R8sQtdnNczT+9IKQna6zxAIOa5vy4/t7fgNf4
5K/dmrBzhtBxTTddS2z4GhlmzCl3yUh6sgc0lZ5FJklFTvUn2tswYq5m/pMlnKG5
/WgUNP3V/2zdGkVahzqUFj220Pk2bTVEHTml2zQgLuTwGl4Isqc+Rd2pV/vVTc27
M6W3kwsZM6c1xkYGYD0Ls/u105NMhPcdEhvjS+6og1YLSByKKe2DhqrFJthW1dsw
qmeFXzxT8OkjzD4NW0sCWR5+alHjjIZPra56JQIDAQABAoIBAQDENhAagzfcYgG/
SmAVAbF+7XKzwA8fpoNXwF/+K+/loQizwidPvBEDEi1rB17V3rzqf7O7b6hf2sXG
zu3RXWrqErYRAvP8cx9bPy5TgQltghul+sNV7sHR2/XXXw90JxVfrIf3yHomLo2N
rlbQznhhKRXPzB8Zwicrt/t19y0SI1X+ZHUXJZZGQGab+fUNIyUAT6sUHKHd///T
1tIqIVRudp4mJcKYSFNH94p6In33y0LyBETD+MebbEdu7w08gk/LqaJwEcptQy3w
jhG7qPXk03EZKkBJLm4LkSmJVKeQaMqP+rub53eerI3MhYZi8kQYS1TpA5/VSb/B
jkLEJ7q1AoGBAP9A6KI7MhA752IUsNvIs4QocoI4x4jPjBNyq4fgKrrzirCJL2WZ
pC+jXv1nVsO+gJKOaacXXQvOpfdpUj2cTLhHCoMTZN44vlZFeQOP4oJ3fRDtF9DJ
Xr2A9fPhrrHD6j5F7YuHaDCbnoXrbcYOxcsTzVcdfjwPZcE76WT3ALYnAoGBAPoi
ffcI+fbnymWTWq/387r0hzeyKB9ECPHsZh/+igbOKlbXp4aM4te2ci6jgYThmsk2
oPkBHJZRChna3RL/fS8Q7uW+8LWoVtIDbwOULL/AGD+8HuksUhvBZQxDYhDtqRmQ
+r2Ef5RJuu2eljVbHbp9E/lVZIYYevjnWxyU8+jTAoGASqTTouWGrWKnNnJwicU2
YfZmDhjGmQaAowtMiA6Q0Fz5+MgVWTPF5Lx0wcvffpyOAs2srdVSO2qx9BkTmLrF
YLo9o7kfLTEQ0C++xMDl71s78qAy77aDgw1cX3Zm3Ms7C/ztC3mMiXJouCbx0hJt
2wYubURNrwidrBV2GjV1Os8CgYEAkZtehF1/VRFdKn/6vJC0GtKZm/xjir/KDTo1
wM4lfwyobOEgrhx5OGUGVsvra3UA67yXPBw/jeki3iYfpx1+u9U5nBfoe3bBA4Po
LcclvYGPHBrgS4/3RBzyO49GGOCgHTfeHlBxC9tXq1czzV97EMIazHu/BqhdfWMA
EMVMru0CgYEAnN1pwi5mmEKyGkqyyDAJR0x+kYwx/lHzrp6zQ8zBDKFJoKqCT1CN
NozBPtN8AIKuiHQ7tBx5BY22kpQ68EyBJAlm+ig7OZwnslmCUkDhQ03A9AwegwZ+
nBHKx6QAL8Kde1U9XUzIhlE42CCzoL3HRsuTuufQrk5N40etpfntu08=
-----END RSA PRIVATE KEY-----

Et c’est tout.

Génération des secrets

Pour ceci, nous utiliserons toujours la commande conseillez par authelia, mais vous pouvez les générer via votre générateur de mot de passe.

Un de ces secrets sera utilisé pour le serveur, et l’autre pour le client.

Voici une commande permettant de le faire, je l’exécute donc 2 fois pour avoir mes secrets :

$ LENGTH=64
$ tr -cd '[:alnum:]' < /dev/urandom | fold -w "${LENGTH}" | head -n 1 | tr -d '\n' ; echo
MnmmnwYYszOdsVHvviLtPT93RIv0U0UZlHfLyKg93XLhW9qt72vPzDO2a2xBF3XO
$ tr -cd '[:alnum:]' < /dev/urandom | fold -w "${LENGTH}" | head -n 1 | tr -d '\n' ; echo
yfpOSeP3rgD4yEKQiQyCeMiWoWn93GGjLnMBG5xkhnoQAOnSWb2VaHsK60h0jjoj

Et voilà, mes secrets sont générés.

Configuration d’authelia

Pour ceci nous ouvrons notre fichier yaml de configuration d’authelia, pour moi, c’est /docker/config/authelia/configuration.yml, et on y ajoute ceci :

[...]
identity_providers:
  oidc:
    hmac_secret: MnmmnwYYszOdsVHvviLtPT93RIv0U0UZlHfLyKg93XLhW9qt72vPzDO2a2xBF3XO
    issuer_private_key: |
      -----BEGIN RSA PRIVATE KEY-----
      MIIEpQIBAAKCAQEA+WfHZlWFr4YLtt+URbM9oEGMbSYDSRc3mLPv4r6p2M83/ITI
      yBgJAzLSM8BGsMdBvX/W+7jRcu9R8sQtdnNczT+9IKQna6zxAIOa5vy4/t7fgNf4
      5K/dmrBzhtBxTTddS2z4GhlmzCl3yUh6sgc0lZ5FJklFTvUn2tswYq5m/pMlnKG5
      /WgUNP3V/2zdGkVahzqUFj220Pk2bTVEHTml2zQgLuTwGl4Isqc+Rd2pV/vVTc27
      M6W3kwsZM6c1xkYGYD0Ls/u105NMhPcdEhvjS+6og1YLSByKKe2DhqrFJthW1dsw
      qmeFXzxT8OkjzD4NW0sCWR5+alHjjIZPra56JQIDAQABAoIBAQDENhAagzfcYgG/
      SmAVAbF+7XKzwA8fpoNXwF/+K+/loQizwidPvBEDEi1rB17V3rzqf7O7b6hf2sXG
      zu3RXWrqErYRAvP8cx9bPy5TgQltghul+sNV7sHR2/XXXw90JxVfrIf3yHomLo2N
      rlbQznhhKRXPzB8Zwicrt/t19y0SI1X+ZHUXJZZGQGab+fUNIyUAT6sUHKHd///T
      1tIqIVRudp4mJcKYSFNH94p6In33y0LyBETD+MebbEdu7w08gk/LqaJwEcptQy3w
      jhG7qPXk03EZKkBJLm4LkSmJVKeQaMqP+rub53eerI3MhYZi8kQYS1TpA5/VSb/B
      jkLEJ7q1AoGBAP9A6KI7MhA752IUsNvIs4QocoI4x4jPjBNyq4fgKrrzirCJL2WZ
      pC+jXv1nVsO+gJKOaacXXQvOpfdpUj2cTLhHCoMTZN44vlZFeQOP4oJ3fRDtF9DJ
      Xr2A9fPhrrHD6j5F7YuHaDCbnoXrbcYOxcsTzVcdfjwPZcE76WT3ALYnAoGBAPoi
      ffcI+fbnymWTWq/387r0hzeyKB9ECPHsZh/+igbOKlbXp4aM4te2ci6jgYThmsk2
      oPkBHJZRChna3RL/fS8Q7uW+8LWoVtIDbwOULL/AGD+8HuksUhvBZQxDYhDtqRmQ
      +r2Ef5RJuu2eljVbHbp9E/lVZIYYevjnWxyU8+jTAoGASqTTouWGrWKnNnJwicU2
      YfZmDhjGmQaAowtMiA6Q0Fz5+MgVWTPF5Lx0wcvffpyOAs2srdVSO2qx9BkTmLrF
      YLo9o7kfLTEQ0C++xMDl71s78qAy77aDgw1cX3Zm3Ms7C/ztC3mMiXJouCbx0hJt
      2wYubURNrwidrBV2GjV1Os8CgYEAkZtehF1/VRFdKn/6vJC0GtKZm/xjir/KDTo1
      wM4lfwyobOEgrhx5OGUGVsvra3UA67yXPBw/jeki3iYfpx1+u9U5nBfoe3bBA4Po
      LcclvYGPHBrgS4/3RBzyO49GGOCgHTfeHlBxC9tXq1czzV97EMIazHu/BqhdfWMA
      EMVMru0CgYEAnN1pwi5mmEKyGkqyyDAJR0x+kYwx/lHzrp6zQ8zBDKFJoKqCT1CN
      NozBPtN8AIKuiHQ7tBx5BY22kpQ68EyBJAlm+ig7OZwnslmCUkDhQ03A9AwegwZ+
      nBHKx6QAL8Kde1U9XUzIhlE42CCzoL3HRsuTuufQrk5N40etpfntu08=
      -----END RSA PRIVATE KEY-----      
    access_token_lifespan: 1h
    authorize_code_lifespan: 1m
    id_token_lifespan: 1h
    refresh_token_lifespan: 90m
    enable_client_debug_messages: false
    clients:
      - id: nextcloud
        description: Cloud Perso
        secret: yfpOSeP3rgD4yEKQiQyCeMiWoWn93GGjLnMBG5xkhnoQAOnSWb2VaHsK60h0jjoj
        public: false
        authorization_policy: one_factor
        audience: []
        scopes:
          - openid
          - groups
          - email
          - profile
        redirect_uris:
          - https://nextcloud.mondomaine.fr/apps/oidc_login/oidc
        grant_types:
          - refresh_token
          - authorization_code
        response_types:
          - code
        response_modes:
          - form_post
          - query
          - fragment
        userinfo_signing_algorithm: none

Je ne maitrise pas assez le protocole pour vous expliquer toutes ces options, mais ça fonctionne. Je vous renvoie donc à la documentation authelia sur Openid Connect.

C’est fini pour la partie Authelia, après une relance du service évidemment.

Configuration de Nextcloud

Installation de l’application OpenID Connect

Pour installer openID Connect, nous avons 2 solutions.

Via occ :

$ occ app:install oidc_login

Ou via le web, dans ce cas il suffit d’aller dans les applications, et dans la catégorie intégrations, vous devriez trouver OpenID Connect, A ne pas confondre avec OpenID User Backend, qui fourni lui un webUI pour la configuration, mais avez beaucoup moins d’options.

Configuration de Nextcloud

Pour que ce soit plus simple, je vais vous mettre toute ma configuration avec quelques commentaires, qui se trouve dans <NEXTCLOUD_FOLDER>/config/config.php :

  'oidc_login_provider_url' => 'https://sso.mondomaine.fr', // URL d'authelia
  'oidc_login_client_id' => 'nextcloud', // id donné dans authelia
  'oidc_login_client_secret' => 'yfpOSeP3rgD4yEKQiQyCeMiWoWn93GGjLnMBG5xkhnoQAOnSWb2VaHsK60h0jjoj', // Secret du client indiqué dans Authelia
  'oidc_login_auto_redirect' => false, // Rediriger automatique ou non vers Authelia, pratique si vous ne voulez utiliser que Authelia comme source d'authentification
  'oidc_login_logout_url' => 'https://sso.mondomaine.fr/logout', // Url de logout d'authelia
  'oidc_login_end_session_redirect' => false, // Si oui ou non on affiche la page de logout d'authelia
  //'oidc_login_default_quota' => '10000000000', // Je commente ce paramètre pour pas que l'oauth touche au quota
  'oidc_login_button_text' => 'Log in with Authelia', // Le nom du bouton qu'on affiche sur la page de connexion
  'oidc_login_scope' => 'openid profile email groups', // Les scopes d'authelia, en gros les groupes d'informations obtenu d'authelia
  'oidc_login_hide_password_form' => false, // Pour empêcher la modification du mot de passe Nextcloud
  'oidc_login_use_id_token' => false, 
  'oidc_login_attributes' => array (
    'id' => 'sub', // sub permets la correspondance entre l'utilisateur Authelia et celui de Nextcloud
    'name' => 'name',
    'mail' => 'email',
    'groups' => 'groups',
    // Par la suite, nous pourrions imaginer beaucoup plus d'attributs, comme le quota par exemple, ou si l'utilisateur est admin de l'instance. Mais authelia ne permets pas encore l'ajout d'attribut ou l'ajout de scope
  ),
  'oidc_login_use_external_storage' => false, 
  'oidc_login_proxy_ldap' => false, // Je n'utilise pas ldap donc inutile
  'oidc_login_disable_registration' => false, // A false, si l'utilisateur n'est pas présent coté Nextcloud, il le crée. A true l'utilisateur doit être créé des 2 cotés.
  'oidc_login_redir_fallback' => false,
  'oidc_login_tls_verify' => true, // Pour valider la connexion SSL
  'oidc_create_groups' => true, // Pour créer les groupes à l'identique d'authelia, attention, les groupes ajoutés via authelia seront supprimés à la reconnexion de l'utilisateur
  // 'oidc_login_default_group' => 'oidc', // Pour ajouter un groupe automatiquement, cela permet de repérer si l'utilisateur vient de nextcloud ou pas par exemple

Il existe quelques options supplémentaires que je n’ai pas jugées utile de mettre, vous pouvez les retrouver ici.

Le fichier de configuration étant rechargé à chaque requête (ou presque), il n’y a rien à relancer avec Nextcloud, la configuration est automatiquement fonctionnelle.

Utilisation

Rendez-vous sur votre page d’authentification de Nextcloud, en bas de la page, vous devriez avoir un bouton Log in with Authelia. Si vous cliquez dessus, vous serez automatiquement redirigé vers la page d’authentification d’Authelia. Identifiez-vous, et il vous sera demandé d’approuver la connexion (cela s’affiche à chaque connexion).
Ensuite, si votre utilisateur est déjà présent sur Nextcloud, il sera mappé avec votre utilisateur Authelia, sinon il sera créé.
Attention cependant, les attributs comme les groupes ou les quotas seront automatiquement remplacés par ceux d’Authelia, ou par la valeur par défaut.

Limitations

  • Je n’ai pas trouvé comment filtrer les utilisateurs autorisés ou non à accéder à Nextcloud via Authelia, ni coté serveur, ni coté client. D’autant pour mon utilisation ça ne pose aucun souci, mais pour une plus grosse entité, ça peut devenir problématique. La seule solution que j’ai en tête serait d’empêcher la création d’un nouvel utilisateur ('oidc_login_disable_registration' => true), et de le créer manuellement sur Nextcloud. Cela limitera les utilisateurs, mais c’est plutôt contraignant. Autre solution serait donc de créer un script asynchrone pour ajouter automatiquement les utilisateurs à Nextcloud, s’ils font partie d’un groupe ou non.
  • J’aimerais n’utiliser que OpenID pour mes utilisateurs, mais permettre l’authentification Nextcloud pour mon utilisateur administrateur. Donc le but serait d’avoir un genre de /admin pour pouvoir me connecter en admin, et le reste automatiquement redirigé vers Authelia. Je n’ai pas encore trouvé de solution, donc je laisse oidc_login_auto_redirect à false pour le moment.

Conclusion

Il est relativement facile de configurer Oauth, et une fois que l’on a configuré ce protocole à une application, on se rend compte que beaucoup le permettent, comme Gitea ou Gitlab par exemple, qui fonctionne un peu différemment (Il faut associer un compte Gitea au compte Authelia, mais toto peu se connecter à tata).
En fait aujourd’hui, il ne me reste qu’une seule application qui n’est pas derrière Authelia (autre que mon blog qui est public), c’est Plex, tout le reste est géré par Authelia.

Je commence également à regarder Keycloak, mais ça reste vraiment lourd pour une utilisation personnelle. Authelia, quoiqu’un peu limité, est largement plus adapté à l’utilisation que j’en ai.

Ressources