CAS - Central Authentication Service et Active Directory

réf :
CAS : http://www.ja-sig.org/wiki/display/CAS/CAS-toolbox
+ doc UT1 en pièce jointe
JDK : http://java.sun.com/javase/6/webnotes/install/jdk/install-linux-self-extracting.html
            http://doc.ubuntu-fr.org/java
Ant :  http://ant.apache.org/manual/index.html
Tomcat : http://tomcat.apache.org/download-60.cgi?Preferred=http%3A%2F%2Fapache.cict.fr
Certificats : http://www.esup-portail.org/consortium/espace/SSO_1B/tech/java/java_x509.html#ImportCert
            http://www.esup-portail.org/pages/viewpage.action?pageId=7209125

Le but est de déployer un serveur CAS s'appuyant sur l'AD.


Pré-requis sur le serveur Active Directory


On crée dans l'AD un utilisateur standard qui servira de compte de connexion au LDAP (bind). Le compte créé est "ldapview" avec le dn  : "CN=ldapview,CN=Users,DC=dometud,DC=iut-rodez,DC=local"

On crée aussi, à partir de l'autorité de certification locale, un certificat X509 du serveur. Ce certificat est exporté dans un fichier .cer.der (la création du certificat lui-même sur l'AD est expliquée ici). Ce certificat va être nécessaire pour accéder AD en ldaps. En effet, tomcat/java impose la connaissance (ou sa vérification) du certificat avant toute connexion SSL.

Pour ceci, dans l'Autorité de certification, ouvrir le certificat (dans certificats émis). Dans l'onglet 'Détails', cliquez sur le bouton 'Copier dans un fichier ...'., puis sélectionner le format 'Binaire codé DER X.509'.
Sauver ensuite le fichier (nommé activedirectory.der.cer dans notre exemple) dans un répertoire, puis le transférer sur le serveur CAS.

Attention à la durée de validité du certificat !

On peut modifier la durée de validité d'un an par défaut des certificats émis en modifiant une clé de registre sur le serveur : http://support.microsoft.com/kb/254632/

  1. Cliquez sur Démarrer, puis cliquez sur exécuter.
  2. Dans la zone Ouvrir, tapez regedit, puis cliquez sur OK.
  3. Recherchez et cliquez sur la clé de Registre suivante :
    HKEY_LOCAL_MACHINE\System\CurrentControlSet\Services\CertSvc\Configuration\<CAName>
  4. Dans le volet droit, double-cliquez sur ValidityPeriod.
  5. Dans la zone données de la valeur, tapez une des opérations suivantes, puis cliquez sur OK :
    • Jours
    • Semaines
    • Mois
    • Ans
    .
  6. Dans le volet droit, double-cliquez sur ValidityPeriodUnits.
  7. Dans la zone données de la valeur, tapez la valeur numérique de votre choix, puis cliquez sur OK. Par exemple, tapez 2.
  8. Arrêtez et redémarrez les services de certificats. Pour ce faire :
    1. Cliquez sur Démarrer, puis cliquez sur exécuter.
    2. Dans la zone Ouvrir, tapez cmd, puis cliquez sur OK.
    3. À l'invite de commandes, tapez les lignes suivantes. Appuyez sur ENTRÉE après chaque ligne.
      net stop certsvc
      Net start certsvc
    4. Tapez exit pour quitter l'invite.



Pré-requis  sur le serveur CAS: jdk, ant, tomcat

jdk

On récupère la dernière version du  jdk chez Sun : jdk-6u18-linux-i586.bin
On le rend exécutable et  on le décompresse :
chmod a+x jdk-6u18-linux-i586.bin
./jdk-6u18-linux-i586.bin
On déplace l'extraction dans /opt
mv jdk1.6.0_18/ /opt/
On se déplace dans la destination et on propose au système d'utiliser java :
cd /opt
update-alternatives --install /usr/bin/java java /opt/jdk1.6.0_18/bin/java 1
update-alternatives --config java

ant
On récupère ant chez Apache :
wget http://apache.cict.fr/ant/binaries/apache-ant-1.8.0-bin.zip
On dézippe et on installe :
unzip apache-ant-1.8.0-bin.zip
mv apache-ant-1.8.0 /opt/
update-alternatives --install /usr/bin/ant ant /opt/apache-ant-1.8.0/bin/ant 1
update-alternatives --config ant

tomcat
On récupère tomcat chez Apache :
wget http://apache.crihan.fr/dist/tomcat/tomcat-6/v6.0.24/bin/apache-tomcat-6.0.24.zip
On dézippe et on installe :
unzip apache-tomcat-6.0.24.zip
mv apache-tomcat-6.0.24 /usr/local/
ln -s /usr/local/apache-tomcat-6.0.24/ /usr/local/tomcat
chmod a+x /usr/local/tomcat/bin

Environnement java
Pour être sûr que l'environnement jdk/ant/tomcat soit disponible pour tous les utilisateurs de ce VPS, on ajoute à la fin du fichier /etc/bash.bashrc ceci :
JAVA_HOME=/opt/jdk1.6.0_18
ANT_HOME=/opt/apache-ant-1.8.0
CATALINA_HOME=/usr/local/tomcat

PATH=$PATH:$JAVA_HOME/bin:$ANT_HOME/bin:$CATALINA_HOME/bin

export JAVA_HOME ANT_HOME CATALINA_HOME
et on le source pour le recharger immédiatement :
source /etc/bash.bashrc

Script de démarrage de tomcat
On crée un script de démarrage à la main :

nano /etc/init.d/tomcat


#!/bin/bash
#

source /etc/bash.bashrc

repprog=/usr/local/tomcat/bin
repcas=/usr/local/tomcat/webapps/cas

 
start () {
        echo "Demarrage de tomcat:"

        # start daemon
        cd $repcas; $repprog/startup.sh  2>&1
        RETVAL=$?
        echo
        [ $RETVAL = 0 ] && touch /var/lock/tomcat
        return $RETVAL
}
 
stop () {
        # stop daemon
        echo "Arret du CAS : "

        cd $repcas; $repprog/shutdown.sh 2>&1
        RETVAL=$?
        echo
        [ $RETVAL = 0 ] && rm -f /var/lock/tomcat
}
 
restart() {
        stop
        start
}
 
case $1 in
        start)
                start
        ;;
        stop)
                stop
        ;;
        restart)
                restart
        ;;
        status)
                ps auwx | grep tomcat
        ;;
        *)
 
        echo "Usage: tomcat {start|stop|restart|status}"
        exit 1
esac

On le rend éxecutable et on l'inscrit dans le système pour le lancement automatique au démarrage du serveur :

chmod a+x /etc/init.d/tomcat
update-rc.d tomcat defaults


CAS

On télécharge la dernière version de CAS-toolbox et CAS-Maven, l'outil de déploiement et de gestion des dépendances.
wget http://sourcesup.cru.fr/frs/download.php/2939/cas-maven-repository-3.3.5-2.tar.gz
wget http://sourcesup.cru.fr/frs/download.php/2938/cas-toolbox-3.3.5-2.tar.gz

On détare et on paramètre le fichier d'installation :
tar xvzf cas-toolbox-3.3.5-2.tar.gz
cd cas-toolbox-3.3.5-2
cp build.sample.properties build.properties
nano build.properties

    Configuration

Le build.properties va servir à générer le fichier cas.properties sous tomcat dans notre application et à savoir où déployer l'application etoù récupérer les fichiers de customisation locale.
Les paramètres importants dans le build.properties sont :
  • deploy.path : répertoire de déploiement de l'application CAS
  • maven.offline : à laisser à false lors de l'initialisation (ant init) pour forcer la récupération des sources. A passer à true ensuite.
  • svnant.update.url : définition du repository de mise à jour de CAS. Laisser l'URL sur celui d'Esup contenant des paramètres propres aux universités.
  • update.path : définition des répertoires à consulter à la compilation (ne rien changer).
  • custom.path : répertoire contenant le paramètrage propre à l'établissement (images/css, etc) 
extraits :
#deploy dir
deploy.path=/usr/local/tomcat/webapps/cas
...
#use maven dependency offline
#must run on time inline
maven.offline=false
...
#SVN part to get other update
svnant.update.url=http://subversion.cru.fr/cas-toolbox/tags/3.3.5-1/update.esup/
...
custom.path=${basedir}/custom.iut
...
# A ajouter !
cas.package.version=3.3.5

On paramètre ensuite le fichier de configuration (en gras, les points essentiels à vérifier). Ce fichier va contenir des variables dont les valeurs seront, au lancement de l'application, injectées dans les fichiers xml -à rallonge- de configuration  :
cp config.sample.properties config.properties
nano config.properties

# Ldap properties
ldap.host.1=ldaps://active-directory.iut.rdz:636
#ldap.host.2=ldap://ldap2.fr:389
ldap.basedn=DC=dometud,DC=iut-rodez,DC=fr         #c'est la base de recherche des comptes utilisateurs dans AD

# file authenticate layer
passfile.encode-algo=MD5
passfile.location=classpath:/../usersFile
log.dir=${catalina.home}/logs

#cas host
cas.host=cas.iut.rdz
# cas uri (empty if /)
cas.uri=/
# cas port empty (if standard)
cas.port=:8080

#User allow to use services manager (services/manage.html)
security.useradmin=admin

# graphic theme
#theme=esup
#views=default
theme=iut
views=iut

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


On n'oublie pas de créer, dans le répertoire courant, le répertoire custom.iut spécifié dans le build.properties. Dans cette arborescence, on va placer le ou les fichiers propres à nos choix locaux (xml, CSS, JSP, etc). Ils seront copiés dans l'application au moment du déploiement.
mkdir custom.iut
mkdir
custom.iut/webpages
mkdir
custom.iut/webpages/WEB-INF
mkdir custom.iut/webpages/WEB-INF/auth-configuration
On crée le fichier ldap-auth.xml :
nano custom.iut/webpages/WEB-INF/auth-configuration/ldap-auth.xml


<?xml version="1.0" encoding="UTF-8"?>
<!--
    | deployerConfigContext.xml centralizes into one file some of the declarative configuration that
    | all CAS deployers will need to modify.
    |
    | This file declares some of the Spring-managed JavaBeans that make up a CAS deployment. 
    | The beans declared in this file are instantiated at context initialization time by the Spring
    | ContextLoaderListener declared in web.xml.  It finds this file because this
    | file is among those declared in the context parameter "contextConfigLocation".
    |
    | By far the most common change you will need to make in this file is to change the last bean
    | declaration to replace the default SimpleTestUsernamePasswordAuthenticationHandler with
    | one implementing your approach for authenticating usernames and passwords.
    +-->
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xmlns:p="http://www.springframework.org/schema/p"
       xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.0.xsd">
   
    <!--
        |    LDAP authentication.
    +-->
    <bean id="ldapHandler" class="org.jasig.cas.adaptors.ldap.BindLdapAuthenticationHandler">
        <property name="filter" value="sAMAccountName=%u" />
        <property name="searchBase" value="${ldap.basedn}" />
        <property name="ignorePartialResultException" value="yes" />
        <property name="contextSource">
            <bean id="contextSource" class="org.springframework.ldap.core.support.LdapContextSource">
                <property name="anonymousReadOnly" value="false" />
                <property name="userDn" value="CN=ldapview,CN=Users,DC=dometud,DC=iut-rodez,DC=local" />
                <property name="password" value="password_user_ldapview" />
                <property name="pooled" value="true" />
                <property name="urls">
                    <list>
                        <value>${ldap.host.1}</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>
</beans>

    Compilation et déploiement

On commence par récupérer le update.esup, les dernières mises à jour :
ant _get.remoteUpdate
Buildfile: /home/jerome/cas-toolbox-3.3.5-2/build.xml

_get.remoteUpdate:
     [echo] Get our update folder from
     [echo]  - from url http://subversion.cru.fr/cas-toolbox/tags/3.3.5-1/update.esup/
     [echo]  - to folder /home/jerome/cas-toolbox-3.3.5-2/update.esup
     [echo]  Clean local folder before 
   [delete] Deleting directory /home/jerome/cas-toolbox-3.3.5-2/update.esup
      [svn] <Checkout> started ...
      [svn] <Checkout> finished.
     [echo] ************************************************************************
     [echo] * WARN : Don't forget to change build.properties : update.path to      *
     [echo] *  /home/jerome/cas-toolbox-3.3.5-2/update.esup                                                  *
     [echo] ************************************************************************

BUILD SUCCESSFUL
Total time: 4 seconds

Puis on passe le init (le init décompresse, compile et range dans l'arborescence locale) :
ant init

Puis, si on obtient un 'BUILD SUCCESSFUL', on passe le deploy (le deploy fait une copie dans tomcat) :
ant deploy


Accès en Ldaps

On importe le certificat créé par AD, après l'avoir transféré sur le serveur (mdp = 'changeit') :
keytool -import -alias tomcat -keystore $JAVA_HOME/jre/lib/security/cacerts -file ../activedirectory.der.cer

Démarrage

A partir de là, CAS peut authentifier directement en attaquant AD en ldaps.
/etc/init.d/tomcat start

Le serveur CAS sera ensuite placé derrière un reverse proxy web qui assurera la couche https.
Le virtual host Apache a alors, dans notre configuration, cette forme :

# Redirecteur cas.mondomaine.fr port 443 SSL
<VirtualHost 193.54.54.100:443>
  ServerName cas.mondomaine.fr
  SSLEngine on
  SSLCertificateFile /etc/apache2/cas.crt
  SSLCertificateKeyFile /etc/apache2/cas.key
  ProxyPass          /cas/          http://cas.iut.rdz:8080/cas/
  ProxyPassReverse   /cas/          http://cas.iut.rdz:8080/cas/
  ProxyPassReverseCookieDomain cas.iut.rdz      cas.mondomaine.fr
  Redirect permanent /              http://cas.mondomaine.fr/cas/
</VirtualHost>
Le serveur CAS est alors directement accessible sur https://cas.iut-rodez.fr/


commandes utiles :
ant clean
ant undeploy
Comments