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.