Mise en place SSO CAS avec backend LDAP

 

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.