Keycloak Nexus SSO

de | avril 27, 2020

Aujourd’hui nous allons voir comment ajouter la SSO via openid connect à un serveur Nexus. Pour cela nous utiliserons un serveur Keycloak comme fournisseur d’identité et Apache avec le mod_auth_openidc. On pourrait aussi utiliser Keycloak Gatekeeper en lieu et place de Apache mais mes essais avec ont été infructueux.

Étape nécessaire

  • Configuration de Keycloak
  • Configuration de apache en tant que Reverse proxy avec mod_auth_oidc
  • Configuration du realm RUT sur Nexus

Configuration de Keycloak

Commençons par configurer un nouveau client pour notre apache. Client -> Create

Rien de spécial ici, J’ai nommé le client apache-nexus-proxy. La root url est à régler sur le nom de domaine sur lequel vous voulez votre nexus accessible.

L’access type est réglé en mode confidential. Cela oblige l’utilisation d’un client id et d’un client secret pour que le client puisse s’authentifier auprès de Keycloak. Ensuite nous enlevons tout sauf Standard Flow Enabled qui correspond au flow Authorization Code d’OpenId Connect.

Nous n’activons pas la gestion des autorisations car le mod apache ne le supporte pas. Vérifiez ensuite les urls. La redirect uri doit être réglée sur https://mondomaine.com/oauth2callback.

Dans l’onglet Installation -> Keycloak OIDC JSON nous avons nos informations de connexion.

{
   "realm": "myRealm",
    "auth-server-url": "https://login.mondomain.com/auth/",
    "ssl-required": "none",
     "resource": "apache-nexus-proxy",
     "credentials": {
         "secret": "4733584a-bb38-4f7a-8581-7f6e8093d004"
     },
    "confidential-port": 0
}

auth-server-url correspond à l’adresse du serveur keycloak. Dans mon cas apache et keycloak sont sur le même serveur. Donc pas besoin de ssl.

Configuration de apache en tant que Reverse proxy avec mod_auth_oidc

Vérifiez que vous avez bien les modules nécessaires :

  • Headers
  • Proxy
  • Proxy_http
  • Auth_oidc

Ensuite ajoutez dans un virtualHost :

<VirtualHost *:80>
    ServerName login.mondomain.com
    ServerAdmin contact@mondomain.com

    ErrorLog ${APACHE_LOG_DIR}/error.log
    CustomLog ${APACHE_LOG_DIR}/access.log combined

    <Location />
        #Activation de OpenIdConnect
        AuthType openid-connect
        Require valid-user
    </Location>

    ProxyPreserveHost on
    # ProxyPass des requètes vers le Nexus.
    ProxyPass / http://192.168.1.43:8081/
    ProxyPassReverse / http://192.168.1.43:8081/
    ProxyRequests Off

    # L'url de configuration automatique du keycloak
    OIDCProviderMetadataURL https://mondomain.com/auth/realms/myRealm/.well-known/openid-configuration
    # Notre url de callback du proxy apache
    OIDCRedirectURI  https://nexus.mondomain.com/oauth2callback
    # Une passphrase pour chiffrer les cookies et le JWT
    OIDCCryptoPassphrase eSJfYooXzkomT3PeQJDWmD4gGimamMrk
    # L'id du client
    OIDCClientID apache-nexus-proxy
    # Le secret du client
    OIDCClientSecret 4733584a-bb38-4f7a-8581-7f6e8093d004

    # Le claim qui sera utilisé par nexus pour l'authentification
    OIDCRemoteUserClaim preferred_username
    OIDCPassIDTokenAs claims
    OIDCPassUserInfoAs claims
    OIDCPassClaimsAs headers
    # Le header contenant la valeur de OIDCRemoteUserClaim 
    OIDCAuthNHeader X-Auth-Username
    # Les scope OIDC à demander
    OIDCScope "openid email"

</VirtualHost>

Mon apache tourne dans un conteneur LXC avec lui même un serveur Nginx devant comme proxy. J’utilise le port 80 en http. Si apache est votre proxy principal veuillez utiliser du https.

La configuration est auto documentée. Concernant l’url d’autoconfiguration, celle-ci est disponible dans l’onglet Général du Royaume, section Endpoints.

J’utilise le preferred-name comme valeur à passer au Nexus. Cela correspond au username défini dans Keycloak. Cette valeur sera utiliser comme mapping avec le nom du compte nexus.

Configuration du realm RUT sur Nexus

Pour configurer le Nexus, rendez-vous dans le menu Administration > System > Capabilities et créez une nouvelle Capacité. Choisir Rut Auth.

Dans le champ HTTP Header name, ajouter la valeur X-Auth-Username correspondant à la valeur définie dans notre configuration apache. Une fois validé, vérifiez dans Administration > Realms, que Rut Auth Realm soit bien dans la partie active.

Créez un utilisateur coté keycloak et coté nexus avec le même nom. La connexion au nexus devrait être automatique.

Problème restant

Nous avons maintenant le SSO qui fonctionne. Cependant il reste quelques problèmes à résoudre pour que cela soit parfait. Le premier est la déconnexion. Si vous tenter de vous déconnecter vous allez être redirigé de nouveau sur le nexus, et vous allez être reconnecté instantanément. Pour résoudre ce problème, il faut à priori intercepter l’URL de déconnexion du nexus pour faire une redirection vers l’url de logout du keycloak.

Le second problème est la connexion d’un utilisateur existant dans keycloak mais pas dans nexus. Actuellement, cela ne fonctionne pas. Il faut impérativement créer le même utilisateur des deux cotés. Une solution pourrait être d’ajouter un provider Keycloak utilisant l’API Event pour détecter l’ajout/suppression/modification d’un utilisateur et répercuter les changements sur le nexus via son api REST.

Enfin la gestion des droits n’est pas non plus synchronisée. De la même manière que pour les utilisateurs, utiliser l’API Event de keycloak pour synchroniser les rôles Keycloak et nexus devrait être possible.

Je posterai les avancées que je trouverai le cas échéant en mettant à jour cet article.

00

Laisser un commentaire

Votre adresse de messagerie ne sera pas publiée. Les champs obligatoires sont indiqués avec *

Ce site utilise Akismet pour réduire les indésirables. En savoir plus sur comment les données de vos commentaires sont utilisées.