C'est quoi un WebSSO ? L'idée est de déléguer la phase d'authentification à une application tierce. Cela apporte deux avantages. Pour l'utilisateur, il s'authentifie une seule fois et est ré-authentifier automatiquement sur les autres applications de l'établissement. Pour l'établissement, les applications web n'ont plus le mot de passe de l'utilisateur car il n'y a plus qu'une seule application (le WebSSO) qui attaque les annuaires, sécurité accrue !

Pré-requis


Apache


Ouvrir le fichier /etc/httpd/conf/httpd.conf, vérifier que le module proxy_ajp est chargé :
# Support PROXY AJP
Include conf.d/proxy_ajp.conf


De même pour la conf du mod_ssl :
# Support SSL
Include conf.d/ssl.conf

Vérifier aussi que le serveur supporte les virtualhosts nommés sur 80 et 443 :
NameVirtualHost *:80
NameVirtualHost *:443


Virer dans httpd.conf la directive Listen 443 si celle ci est présente car elle est déjà dans ssl.conf.

NTP


Installer le paquet ntp :
yum install ntp

On édite la crontab de root :
crontab -u root -e

Ajouter la ligne suivante :
0 0     * * *   ntpdate ntp.<domaine>.fr > /dev/null

JAVA


Il est nécessaire d'installer l'outil de construction Java appelé ANT et le support de xml.
Pour l'installer :
yum install ant
yum install xml-commons-apis


Configuration coté serveur Apache


Création du fichier de configuration :
vim /etc/httpd/vh/cas.<domaine>.fr.conf

Configuration du VHost :
# Virtual host pour le service CAS
<VirtualHost *:80>
        # Hostname
        ServerName cas.<domaine>.fr
        ServerAlias cas
        ServerAdmin admin@cas.<domaine>.fr

        # Redirect vers le https
        RewriteEngine   On
        RewriteRule     (.*)            https://%{HTTP_HOST}$1     [R,L]
</VirtualHost>

<VirtualHost *:443>
        # Hostname
        ServerName cas.<domaine>.fr
        ServerAlias cas
        ServerAdmin admin@cas.<domaine>.fr

        # SSL
        SSLEngine on
        SSLCertificateFile /etc/httpd/ssl.crt/localhost.crt
        SSLCertificateKeyFile /etc/httpd/ssl.key/localhost.key

        # Logs
        ErrorLog        /var/log/httpd/cas.<domaine>.fr.error.log
        TransferLog     /var/log/httpd/cas.<domaine>.fr.access.log

        # Mod AJP
        ProxyRequests Off
       <Location />
                ProxyPass ajp://localhost:9009/
                ProxyPassReverse http://cas.<domaine>.fr/
       </Location>
</VirtualHost>


Modifier le fichier httpd.conf, y ajouter à la fin :
Include vh/cas.<domaine>.fr.conf

On génère un certificat autosigné (le vrai certificat est utilisé par les LBs en frontal) :
openssl req -x509 -nodes -days 365 -newkey rsa:1024 -out /etc/httpd/ssl.crt/localhost.crt -keyout /etc/httpd/ssl.key/localhost.key

On modifie les permissions :
chmod 400 /etc/httpd/ssl.key/localhost.key
chmod 444 /etc/httpd/ssl.crt/localhost.crt


On relance le service httpd :
/sbin/service httpd configtest
/sbin/service httpd restart


Installation de l'application


Récupérer la dernière version sur le site du CRU :
cd /root/
wget https://sourcesup.cru.fr/frs/download.php/3303/cas-toolbox-3.4.2-1.tar.gz
tar zxvf cas-toolbox-3.4.2-1.tar.gz
rm cas-toolbox-3.4.2-1.tar.gz


On récupère aussi les dépendances nécessaire :
wget https://sourcesup.cru.fr/frs/download.php/3304/cas-maven-repository-3.4.2-1.tar.gz
tar zxvf cas-maven-repository-3.4.2-1.tar.gz
rm cas-maven-repository-3.4.2-1.tar.gz


On déplace les sources vers le home de cas :
mv /root/cas-toolbox-3.4.2-1 /opt/cas/
mkdir /opt/cas/cas-toolbox-3.4.2-1/build
mv /root/maven-repository /opt/cas/cas-toolbox-3.4.2-1/build/


Configuration de l'application


Fichier build.properties


On crée un webapps dédié à CAS afin de ne pas embarquer les servlets par défaut de Tomcat :
mkdir /opt/cas/webapps.cas
chown cas:cas /opt/cas/webapps.cas


Modifier le deploy.path dans ce fichier :
deploy.path=/opt/cas/webapps.cas/cas

Et ajouter à la fin du fichier :
cas.package.version=3.4.2

Fichier config.properties


On créé un dossier dédié pour les logs de l'application CAS :
mkdir /opt/cas/logs.cas
chown cas:cas /opt/cas/logs.cas


Modifier les lignes suivantes :
# Ldap properties
ldap.host.1=ldap://ldap1.jouy.inra.fr:389
ldap.host.2=ldap://ldap2.jouy.inra.fr:389
ldap.filter=uid=%u
ldap.searchBase=DC=inra,DC=fr
ldap.userName=
ldap.password=


log.dir=/opt/cas/logs.cas

# cas port empty (if standard)
cas.port=:9009

# auth layer to use
# see build.properties to view all
cas.authHandlers=ldapHandler


Dossier custom/


De part la structure de notre annuaire LDAP, il va être nécessaire de modifier deux fichiers de configuration de l'authentification ldap.

Premièrement, on va copier le fichier d'origine vers le répertoire cutom/ :
mkdir -p custom/webpages/WEB-INF/auth-configuration/
cp -p update/webpages/WEB-INF/auth-configuration/ldap-auth.xml custom/webpages/WEB-INF/auth-configuration/
cp -p update/webpages/WEB-INF/cas.properties custom/webpages/WEB-INF/


Fichier ldap-auth.xml


Ouvrir le fichier ldap-auth.xml et faire cette série de modifications :
    * Modifier le nom de la classe "org.jasig.cas.adaptors.ldap.FastBindLdapAuthenticationHandler" par "org.jasig.cas.adaptors.ldap.BindLdapAuthenticationHandler".
    * Modifier la valeur de la propriété "filter" de "${ldap.basedn}" à "${ldap.filter}".
    * Ajouter en dessous la ligne "<property name="searchBase" value="${ldap.searchBase}" />".
    * Ajouter la ligne "<property name="userDn" value="${ldap.userName}" />" et la ligne "<property name="password" value="${ldap.password}" />" sous "<bean id="contextSource" class="org.springframework.ldap.core.support.LdapContextSource">".
    * Modifier la valeur de la propriété "pooled" de "true" à "false".

Exemple de fichier ldap-auth.xml modifié :
       <bean id="ldapHandler" class="org.jasig.cas.adaptors.ldap.BindLdapAuthenticationHandler" lazy-init="true">
               <property name="filter" value="${ldap.filter}" />
               <property name="searchBase" value="${ldap.searchBase}" />
               <property name="contextSource">
                       <bean id="contextSource" class="org.springframework.ldap.core.support.LdapContextSource">
                               <property name="userDn" value="${ldap.userName}" />
                               <property name="password" value="${ldap.password}" />
                               <property name="pooled" value="false" />
                               <property name="urls">
                                       <list>
                                               <value>${ldap.host.1}</value>
                                               <value>${ldap.host.2}</value>
                                       </list>
                               </property>
                               <property name="baseEnvironmentProperties">
                                       <map>
                                               <!--
                                                <entry>
                                                    <key><value>java.naming.security.protocol</value></key>
                                                <value>ssl</value>
                                        </entry>
                                        -->
                                               <entry>
                                                       <key><value>java.naming.security.authentication</value></key>
                                                       <value>simple</value>
                                               </entry>
                                       </map>
                               </property>
                       </bean>
               </property>
       </bean>


Fichier cas.properties


Ouvrir le fichier cas.properties et modifier la partie concernant ldap :
#LDAP auth configuration
ldap.host.1=@ldap.host.1@
ldap.host.2=@ldap.host.2@
ldap.filter=@ldap.filter@
ldap.searchBase=@ldap.searchBase@
ldap.userName=
ldap.password=


Compilation de l'application


Placer vous dans le dossier des sources :
cd /opt/cas/cas-toolbox-3.4.2-1

On va utiliser ant pour faciliter le déploiement de l'application. On va compiler l'application (init) puis copier les fichiers nécessaires dans le webapps de tomcat (deploy) :
ant init
ant deploy


Pour info, pour nettoyer les fichiers avant de refaire une nouvelle installation, il est conseillé d'utiliser :
ant clean undeploy

Configuration Tomcat


Editer le fichier /opt/cas/tomcat.cas/conf/server.xml et modifier la directive Host afin de changer le chemin du webapps :
<Host name="localhost" appBase="/opt/cas/webapps.cas">

   <Context path="/" docBase="cas"/>

</Host>

N'oublier pas de démarrer tomcat :
/etc/init.d/tomcat.cas start

Et voici le moment de cliquer http://cas.<domaine>.fr/

Références


Projet CAS Toolbox : https://sourcesup.cru.fr/projects/cas-toolbox/
Doc de configuration build.properties et config.properties : https://sites.google.com/a/bousquie.fr/jerome/Home/cas---central-authentication-service-et-active-directory
Doc de configuration du handler ldap : https://wiki.jasig.org/display/CASUM/LDAP