cmdbuild.png

CMDBuild est une CMDB libre très souple bâtie sur Java, Postgres, ExtJS, JasperReport et d'autres.

CMDBuild permet d'identifier les utilisateurs en créant des comptes dans sa base de données ou sur une source extérieure: LDAP, CAS ou, et c'est le sujet ici, Kerberos. Comme la documentation ne traite que de la configuration de CMDBuild, voici le reste.

CMDBuild est une application Java web servie par Tomcat. Dire que CMDBuild gère Kerberos est un peu exagéré: en fait, CMDBuild peut faire confiance à un système tiers du moment que celui-ci passe dans un en-tête de la requête un champ indiquant l'identifiant d'un utilisateur qu'il connait.

Le principe est donc le suivant:

  • on crée un utilisateur dans l'administration de CMDBuild. Le mot de passe associé peut être quelconque, il ne sera normalement pas utilisé.
  • on crée un compte de service et une keytab sur le serveur Kerberos (non traité ici).
  • on utilise un serveur Apache HTTP qui aura trois choses à faire:
    • faire proxy pour relayer les requêtes vers Tomcat (via le module mod_proxy_ajp)
    • faire l'authentification sur un Kerberos via le module mod_auth_kerb
    • ajouter dans la requête un en-tête contenant l'identifiant de l'utilisateur authentifié via la variable système REMOTE_USER (via le module mod_headers)
  • on configure CMDBuild pour lui dire d'utiliser en premier ce mode d'authentification et lui indiquer le nom de l'en-tête lui permettant de faire de lien avec les utilisateurs qu'il connait.

Note: mod_proxy_ajp et mod_headers sont en principe déjà installés avec httpd. Seul mod_auth_kerb devra être installé en plus. Cette installation devrait également modifier la configuration pour charger le module au démarrage.

Donc, sur le serveur, on installe le serveur httpd d'Apache puis on ajoute une configuration de virtualhost dans /etc/httpd/conf.d:


<virtualhost>
        ServerName cmdbuild.poum.fr
        ServerAlias cmdbuild

        ProxyRequests Off
        ProxyPreserveHost on

        ErrorLog /var/log/httpd/tomcat.error.log
        CustomLog /var/log/httpd/tomcat.log combined

        <location />
                AuthName "Connexion windows"
                AuthType Kerberos
                Krb5Keytab /etc/cmdbuild.keytab
                KrbAuthRealms POUM.FR
                KrbMethodNegotiate On
                #KrbMethodK5Passwd Off
                KrbVerifyKDC off
                KrbServiceName HTTP
                KrbSaveCredentials on
                Require valid-user

                RequestHeader set X-Forwarded-User %{REMOTE_USER}s

        </location>

        <proxy>
                Order deny,allow
                Allow from all
        </proxy>

        ProxyPass / ajp://localhost:8009/
        ProxyPassReverse / ajp://localhost:8009/
</virtualhost>

Notez :

  • qu'on utilise la commande RequestHeader et pas Header car ce sont les requêtes entrantes qu'on veut modifier (sinon, çà marche pas, 3 heures de perdues !)
  • le 's' après %{REMOTE_USER}s pour indiquer qu'on utilise une variable système (par opposition à 'e' par exemple pour une variable d'environnement
  • que X-Forwarded-User est un nom arbitraire qu'il faudra indiquer dans la configuration de CMDBuild
  • que KrbMethodK5Passwd permet de demander un identifiant / mot de passe à un utilisateur hors Kerberos mais qui aurait un compte par ailleurs. Sinon, décommenter la ligne.

Ensuite, on modifie le fichier webapp/cmdbuild/WEB-INF/conf/auth.conf pour:

  • modifier les modes d'authentification: auth.methods=HeaderAuthenticator,DBAuthenticator (on garde un mode secours sur le système interne)
  • indiquer le nom du champ: header.attribute.name=X-Forwarded-User

Voilà, il ne reste plus qu'à ET DANS CET ORDRE:

  • (re)lancer le serveur tomcat : # service tomcat restart
  • (re)lancer le serveur httpd: # service httpd start
  • aller à l'URL de CMDBuild (sur le port 80, pas le 8080)

Çà devrait fonctionner. Dans le cas contraire, voir les logs:

  • de httpd: /var/log/httpd/tomcat.error.log
  • de tomcat: /var/lib/tomcat7/logs/catalina.out ou cmdbuild.log

ou regarder les requêtes (via Firebug par exemple)