Mise en place SSO CAS avec backend LDAP

ATTENTION : Cet article à plus de 4 années, il se peut que les infos soient obsolètes ou à adapter aux dernières versions des logiciels.

Nous allons voir ici comment mettre en place un système d’authentification unique centralisé basé sur un annuaire d’utilisateurs LDAP.

CAS est un système d’authentification fiable, permettant d’authentifier un utilisateur sur une application.

Un SSO est un système d’authentification unique.

Voici deux ressources permettant de comprendre les principes :

http://www.artduweb.com/tutoriels/cas-sso

http://jasig.github.io/cas/4.1.x/planning/Architecture.html

Nous allons voir dans cet article comment mettre en place ce système sur une distribution Debian 8 avec la dernière version de CAS, la 4.1.0

Prérequis

Annuaire LDAP

Je ne vais pas m’étendre sur cette partie mais il faut un annuaire LDAP fonctionnel.

J’utilises des utilisateurs système spécifiques ayant des droits d’accès différents suivant les besoins : ldapreader pour les actions en lecture et ldapwriter pour des actions en écriture. Ici on utilisera que ldapreader.

 

Java et Tomcat

CAS est un composant Java à déployer sur un serveur d’application. Par habitudes je fais le choix d’utiliser Tomcat. On verra aussi comment proxyfier la connexion via Apache.

Java

# apt-get install openjdk-7-jdk openjdk-7-jre maven

 

Tomcat

# apt-get install tomcat8 tomcat8-admin

Mise en place d’un utilisateur autorisé pour l’interface d’admin :

dans /etc/tomcat8/tomcat-users.xml

<tomcat-users>
<role rolename="manager-gui"/>
<user username="tomcat" password="secret" roles="manager-gui"/>
</tomcat-users>

On redémarre tomcat :

service tomcat8 restart

Pour le moment le manager est accessible sur http://IP:8080/manager

 

CAS

Déploiement

On va partir des sources pour créer notre fichier war et le déployer avec Tomcat.

# wget https://github.com/Jasig/cas/archive/v4.1.0.tar.gz
# tar xvzf v4.1.0.tar.gz
# cd cas-4.1.0

 

Le premier fichier à modifier est le fichier pom.xml pour inclure les dépendances nécessaires pour LDAP et SAML (on en a besoins pour l’authentification LDAP) :

# cd cas-server-webapp
# vi pom.xml

 

On rajoute ceci dans les :

dependency>
                <groupId>org.jasig.cas</groupId>
                <artifactId>cas-server-support-ldap</artifactId>
                <version>4.1.0</version>
        </dependency>
        <dependency>
                <groupId>org.jasig.cas</groupId>
                <artifactId>cas-server-support-saml</artifactId>
                <version>4.1.0</version>
</dependency>

 

Le second fichier à modifier est le fichier src/main/webapp/WEB-INF/deployerConfigContext.xml.

Ma version est à télécharger dans ce zip : CAS

Cette version prends en compte des paramètres spécifiés dans un fichier /etc/cas/cas.properties, il faut modifier le fichier src/main/webapp/WEB-INF/spring-configuration/propertyFileConfigurer.xml.

Remplacer :

 <util:properties id="casProperties" location="${cas.properties.filepath:/WEB-INF/cas.properties}"/>

    <context:property-placeholder properties-ref="casProperties"/>

Par :

<util:properties id="casProperties" location="file:/etc/cas/cas.properties" />

    <context:property-placeholder properties-ref="casProperties" />

 

Notre configuration est prête, suffit maintenant de la « compiler » avec maven, il faut retourner dans le répertoire cas-4.1.0/cas-server-webapp

# mvn -Dmaven.test.skip=true package install -e

Après quelques minutes de construction on options un fichier target/cas.war à déployer. Pour cela il suffit de copier le fichier cas.war dans le répertoire /var/lib/tomcat8/webapps/

 

Configuration

La configuration va se trouver dans le répertoire /etc/cas qu’il faut crééer :

# mkdir /etc/cas

Le fichier de configuration à créer /etc/cas/cas.properties dont une version à modifier est téléchargeable dans ce zip : CAS

A modifier :

  • server.name : le nom du serveur CAS, ce sera un truc du genre https://cas.domaine.com pour cela il faudra mettre en place le proxy apache (voir plus bas)
  • host.name : le nom d’hôte du serveur
  • tgc.encryption.key et tgc.signing.key : des clés générées lors du build à récupérer dans le fichier cas-4.1.0/cas-server-webapp/target/cas-server-webapp-4.1.0/WEB-INF/cas.properties

Il faut ensuite adapter les paramètres ldap correspondant à votre serveur :

  • ldap.url : url du ldap
  • ldap.authn.baseDn : l’utilisateur pour l’authentification ldap
  • ldap.authn.managerDn : son mot de passe
  • ldap.authn.searchFilter : le filtre de recherche, dans mon cas l’utilisateur est défini par son uid et j’ai un attribut accountStatus pour éviter que les utilisateurs désactivés se connectent
  • ldap.authn.format : format d’authentification
  • ldap.baseDn : point de départ de la recherche des utilisateurs

 

Les logs

On peut voir dans la configuration de cas qu’on fait appel à un fichier de configuration pour les logs :

log4j.config.location=file:///etc/cas/log4j2.xml 

Ce fichier est téléchargeable dans ce zip : CAS

 

Pour finir on recharge tomcat pour activer tout cela:

# service tomcat8 force-reload

Si tout c’est bien passé CAS est accessible sur l’url suivante :

http://IP:8080/cas

ce qui amène à une interface d’authentification avec un joli avertissement :

Non-secure Connection

You are currently accessing CAS over a non-secure connection. Single Sign On WILL NOT WORK. In order to have single sign on work, you MUST log in over HTTPS.

Un petit test de connexion avec un utilisateur de l’annuaire permet de valider que tout est ok :

Log In Successful

 

Sécuriser la connexion

CAS nous averti gentiment que la connexion n’est pas sécurisée. Pour y remédier, le plus simple est de passer par un proxy Apache.

La première chose est d’avoir un certificat SSL, soit un certificat SSL auto-signé, soit un certificat SSL reconnu. Il est extrêmement important que la connexion vers le CAS soit sécurisée.

On met en place Apache et le proxy_ajp :

# apt-get install apache2-mpm-worker libapache2-mod-jk
# a2enmod rewrite ssl proxy_ajp

 

Voici un petit exemple de mon vhost :

<VirtualHost *:80>
   ServerName cas.domaine.com
   Redirect / https://cas.domaine.com/
</VirtualHost>
<VirtualHost *:443>
   ServerName cas.domaine.com
   ErrorLog /var/log/apache2/ajp.error.log
   CustomLog /var/log/apache2/ajp.log combined


   SSLEngine On
   SSLProtocol -all +SSLv3 +TLSv1
   SSLCipherSuite ALL:!aNULL:!ADH:!eNULL:!LOW:!EXP:RC4+RSA:+HIGH:+MEDIUM
   SSLCertificateFile /etc/ssl/web/cas.domaine.com.crt
   SSLCertificateKeyFile /etc/ssl/web/cas.domaine.com.key.pem
   SSLCACertificateFile /etc/ssl/web/cacert.pem

   RewriteEngine  on
   RewriteRule    ^/$  /cas [PT]


   <Proxy *>
     AddDefaultCharset Off
     Order deny,allow
     Allow from all
   </Proxy>

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

Je redirige toutes les requêtes http vers https.

Je redirige le / vers le /cas

On renvoi le tout vers le port local 8009.

 

Il faut aussi activer le protocol AJP dans tomcat dans le fichier /etc/tomcat8/server.xml décommenter la ligne :

<Connector port="8009" protocol="AJP/1.3" redirectPort="8443" />

Reste à activer le vhost Apache et recharger Tomcat.

On arrive bien sûr sur la même interface d’authentification, mais cette fois-ci de façon sécurisée.

 

On verra prochainement comment mettre en place deux sites pour valider cette configuration.

20 Comments

 Add your comment
  1. Merci beaucoup pour ce fabuleux tutoriel, je vais commencer aujourd’hui à le terter et j’attend impatiemment la suite, bon courage

  2. je voudrai le faire fonctionner entre owncloud et liferay

  3. A noter que les urls spécifiés en haut refèrent à une instance Owncloud et non pas les fichiers spécifiés

    • Merci pour la remarque, un problème avec un vieux owncloud à régler. Je viens de remplacer par un zip à télécharger contenant les fichiers de configuration à adapter.

  4. Bonjour, merci pour ce tutoriel très instructif, j’ai tout suivi sauf la partie securisation puisque je suis dans un environnement centos et je n’arrive pas à configurer le proxy comme cous l’avez faites puisque la commande : yum install apache2-mpm-worker libapache2-mod-jk ne parvient pas à trouver les packages.
    y’a-t-il une solution relatives à redhat/centos

    • Bonjour, sous des distributions de type RedHat le paquet s’appelle httpd par contre le mod_jk je sais pas. Une autre solution est de passer apache en mod-proxy devant tomcat. Le but c’est de vraiment proposer CAS sur un port standard 443.

  5. Bonsoir, c’est suivi votre tutoriel vraiment c’est super intéressant. J’ai une erreur dont le message est suivant:
    ECHEC – L’application pour le chemin de contexte /cas n’a pas pu être démarrée

    Merci de m’aidé.

    • Bonjour, il faudrait fouiller dans les logs de tomcat / cas pour voir le problème réel. Ce sont des logs java donc les messages sont assez longs.
      Typiquement j’ai ces deux fichiers dans /var/log/tomcat7 : cas.log et catalina.out.

  6. Bonjour,
    Je ne comprend pas comment utiliser tgc.encryption.key et tgc.signing.key
    Les valeurs jokers renseignées n’ont pas changées lors du build dans
    cas-4.1.1/cas-server-webapp/target/cas-server-webapp-4.1.1/WEB-INF/cas.properties

    De plus, pouquoi un simple mvn install renvoie une erreur de compilation sur surfire…même avec les code proposés par Apereo Wiki ?

    Merci par avance pour votre réponse et surtout pour ce tutoriel.
    Cordialement

    • Bonjour,
      merci d’être passé sur mon site.
      D’après ce que je comprends la compilation via Maven ne c’est pas terminée, c’est peut-être pour cela que vous n’avez pas les clé : tgc.encryption.key et tgc.signing.key
      Les problèmes de compilation peuvent être assez divers, bien regarder les logs voir ou ça plante. La mailing liste cas-user est assez active si c’est un problème de compilation.
      Bon courage

  7. Bonjour,

    Très bon tuto ! Par contre comment le relier non pas un backend LDAP mais plutôt avec une base mysql DRUPAL.

    Merci par avance pour votre réponse

    Cordialement

  8. Bonjour,

    Tout d’abord, encore merci pour ce tutoriel très complet et bien écrit. J’ai suivi la procédure de bout en bout et j’ai rencontré trois difficultés :

    1 – La génération des clés (que j’ai finalement générées manuellement avec json-web-key-generator)
    2 – Lorsque la webapp se lance, elle regénère de nouvelles clés, et quand je les copies dans le cas.properties, au prochain démarrage, la webapp en crée encore de nouvelles … 🙁
    3 – J’utilise comme serveur de test, celui déclaré sur le site http://www.forumsys.com/en/tutorials/integration-how-to/ldap/online-ldap-test-server/

    J’arrive à me connecter dessus comme il se doit avec ApacheStudio, les paramètres sont à useSSL=false et useStartTLS=false. Cependant je n’arrive pas à identifier un utiliateur via cas.

    J’utilise les paramètres d’authentification suivants :

    #========================================
    # Authentication
    #========================================

    # Base DN of users to be authenticated
    ldap.authn.baseDn=dc=example,dc=com

    # Manager DN for authenticated searches
    ldap.authn.managerDn=cn=read-only-admin,dc=example,dc=com

    # Manager password for authenticated searches
    ldap.authn.managerPassword=password

    # Search filter used for configurations that require searching for DNs
    # ldap.authn.searchFilter=(&(uid={user})(accountStatus=active))
    ldap.authn.searchFilter=(&(uid={user})

    # Search filter used for configurations that require searching for DNs
    ldap.authn.format=uid=%s
    ldap.baseDn=dc=example,dc=com

    ldap.trustedCert=

    ========================

    J’aimerais bien savoir ce qu’il faudrait faire réparer la configuration.

    Merci d’avance,

  9. Bonjour,

    Merci pour ce tuto, j’ai bien tout suivi à la lettre cependant, je suis bloqué, lorsque j’ouvre http://IP:8080/cas (IP étant remplacé par l’ip de mon serveur…), j’ai une erreur 404 « la ressource demandée n’est pas disponible ».
    Pouvez vous m’aider?

    Merci de votre retour et du temps que vous consacrerez a ma réponse.

    • Bonjour,
      cela fait très longtemps que j’ai pas touché à cas, il faut regardé les logs générés par CAS, attention c’est du Java donc les logs sont assez long à lire.
      Bon courage

      • Bonjour, j’ai le même soucis quand la connexion AD ne se fait pas, ça veut probablement dire que l’utilisateur de lecture ne fonctionne pas (bien vérifier les CN, DN, OU, etc.)

  10. Bonjour @guitz,

    Sauriez vous me préciser l’intérât du port 8443 dans votre conf? Je ne vois pas l’usage qu’en fait le reverse proxy apache

  11. Nzagou Mihindou Judes Alex

    Bonjour, je tiens d’abord à vous remercier pour ce tuto qui m’aide énormement. Cependant suis bloqué au niveau de la configuration. Je n’arrive pas à éditer le fichier /etc/cas/cas.properties. Comment faire alors pour le télécharger dans ce zip: cas?

Leave a Comment

Your email address will not be published.