wiki:CreationServeurCas

Création d'un serveur d'authentification CAS

TOC?

Introduction

L'installation de CAS nécessite deux machines :

  • une machine de développement, pour la configuration et la compilation du serveur CAS ;
  • un serveur, pour héberger CAS.

Ces deux machines doivent posséder le kit de développement Java (JDK) en version 5.

Installation du JDK sur Debian

  1. Le JDK est fourni par Sun, sous la forme d'un paquet non libre. Nous devons donc activer les logiciels de type non-free sur les dépôts officiels de Debian, dans le fichier de configuration des sources APT (/etc/apt/sources.list). Voici un exemple de configuration minimale pour APT :
# Miroirs Debian en France
deb http://ftp.nerim.net/debian/ lenny main non-free
deb-src http://ftp.nerim.net/debian/ lenny main non-free

deb http://security.debian.org/ lenny/updates main contrib non-free
deb-src http://security.debian.org/ lenny/updates main contrib non-free
  1. Le JDK peut enfin être installé sur Debian grâce à la commande apt-get install sun-java5-jdk.
  2. Nous devons ensuite définir deux variables d'environnement pour les applications Java (la première définit l'emplacement du JDK, la seconde la configuration du proxy) :
export JAVA_HOME=/usr/lib/jvm/java-1.5.0-sun
export JAVA_OPTS="-Dhttp.proxyHost=proxy.enib.fr -Dhttp.proxyPort=3128 -Dhttp.nonProxyHosts=localhost|*.enib.fr"

Ces deux variables doivent être définies soit de manière globale dans le fichier /etc/bash.bashrc (recommandé), soit dans le fichier /home/$USER/.bashrc de l'utilisateur.

  1. Changer le mot de passe du keytool pour les certificats...

Machine de développement

Installation de Maven

Maven est un logiciel Java, conçu pour maitriser le cycle de développement d'applications Java ; c'est une sorte de Makefile amélioré. Nous avons besoin de Maven sur notre machine de développement car nous devrons recompiler le serveur CAS après la modification de ses paramètres.

Nous allons installer Maven manuellement, car la version proposée par le système APT de Debian fonctionne mal.

  1. La première étape consiste donc à télécharger la dernière version de Maven 2 sur le site  http://maven.apache.org.
  2. Nous allons ensuite dézipper l'archive téléchargé dans le dossier /usr/lib/maven.
  3. Après, nous créons un lien symbolique vers l'exécutable de Maven dans le dossier /usr/bin : ln -s /usr/lib/maven/bin/mvn /usr/bin/mvn.
  4. Enfin, nous configurons le proxy HTTP utilisé par Maven et un mirroir plus rapide ($MVN_PATH/conf/settings.xml) :
<settings>

  <proxies>

   <proxy>
      <active>true</active>
      <protocol>http</protocol>
      <host>proxy.enib.fr</host>
      <port>3128</port>
    </proxy>

  </proxies>

  <mirrors>

    <mirror>
      <id>skynet.be</id>
      <url>http://maven2.mirrors.skynet.be/pub/maven2</url>
      <mirrorOf>central</mirrorOf>
    </mirror>

  </mirrors>

</settings>

Configuration et compilation de CAS

Pour mieux gérer les modifications apportées au serveur CAS de l'ENIB, nous avons développé un projet Maven spécifique à l'ENIB (disponible en téléchargement au bas de cette page, dans un fichier ZIP). Il contient uniquement les personnalisations dont nous avons besoin (thème graphique, configuration). Les chapitres suivants vont vous détailler la configuration et la compilation du serveur CAS).

Configuration de CAS

La configuration du serveur CAS est centralisée dans le fichier src/main/webapp/WEB-INF/deployerConfigContext.xml. Ce dernier est un fichier définissant des  beans Spring (technologie très utilisée dans le monde Java). Les exemples suivants présenteront des bouts de code XML de notre fichier de configuration.

Ajouter / supprimer des annuaires LDAP
<bean id="contextSource" class="org.jasig.cas.adaptors.ldap.util.AuthenticatedLdapContextSource">
  <property name="urls">
    <list>
      <value>ldap://ldap-replicat4.enib.fr/</value>
      <value>ldap://ldap-replicat3.fr/</value>
      <value>ldap://ldap2.enib.fr/</value>
      <value>ldap://ldap.enib.fr/</value>
    </list>
  </property>
</bean>
Définir la branche de recherche dans l'annuaire LDAP
<bean
  class="org.jasig.cas.adaptors.ldap.FastBindLdapAuthenticationHandler"
  p:filter="uid=%u,ou=people,dc=enib,dc=fr"
  p:contextSource-ref="contextSource" />

L'attribut p:filter définit la branche de recherche pour la connection d'un utilisateur de l'annuaire LDAP. Les caractères %u sont remplacés par le login de l'utilisateur qui souhaite se connecter.

Définir le chemin de stockage de la base de données des services
<bean
  id="dataSource"
  class="org.springframework.jdbc.datasource.DriverManagerDataSource"
  p:driverClassName="org.hsqldb.jdbcDriver"
  p:url="jdbc:hsqldb:file:/var/hsql/cas_services"
  p:username="sa"
  p:password="" />

L'attribut p:url définit la base de données utilisée. Dans l'exemple ci-dessus, on constate que l'on utilise une base de données HSQL, dont les chemins sont préfixés par /var/hsql/cas_services (les fichiers de la base HSQL sont donc stockés dans le dossier /var/hsql).

Autoriser des utilisateurs à administrer les services utilisant CAS
<bean
  id="userDetailsService"
  class="org.acegisecurity.userdetails.memory.InMemoryDaoImpl">
  <property name="userMap">
    <value>
      pgentile=unused_password,ROLE_ADMIN
      niboucha=unused_password,ROLE_ADMIN
      chevreto=unused_password,ROLE_ADMIN
    </value>
  </property>
</bean>

On définit une autorisation grâce au format suivant : login=password,role. Dans ce cas particulier, le mot de passe est inutilisé (d'où la présence de unused_password dans le bout de code), et le rôle de l'utilisateur est ROLE_ADMIN.

Création d'une archive WAR auto-déployable

Voici la marche à suivre pour créer une archive WAR auto-déployable sur le serveur Tomcat.

  1. Nous allons dans le dossier du projet : cd $ENIB_CAS_PROJECT_PATH.
  2. Nous créons notre archive auto-déployable avec la commande suivante : mvn package. Cette action peut durer assez longtemps, car Maven se charge de télécharger automatiquement les dépendances requises par notre projet. Si la création de l'archive se passe sans problème, nous obtenons à la fin un message du type [ BUILD SUCCESSFUL ].
  3. Notre archive WAR est présente dans le dossier target. Son nom a pour forme cas-server-XX.war (XX étant un numéro de version).

Serveur CAS

Nous avons opté pour le serveur CAS une configuration à base de serveurs Apache et Tomcat.

  • Apache agit en tant que reverse-proxy pour l'application CAS et crypte la communication HTTP avec SSL.
  • Tomcat héberge le serveur d'authentification CAS.

Ce serveur est joignable à l'adresse cas.enib.fr.

Installation de Tomcat

Tomcat est un conteneur de servlets Java, qui va héberger notre serveur CAS. Nous devons installer Tomcat manuellement, car la version fournie par le gestionnaire de paquets APT fonctionne assez mal.

  1. Nous devons télécharger la dernière version de Tomcat 5.5 sur le site officiel  http://tomcat.apache.org/.
  2. Ensuite, nous dézippons l'archive de Tomcat dans un dossier (ex: /home/tomcat). Ce dossier sera référé avec la variable $TOMCAT_PATH durant le reste du tutoriel.
  3. Nous créons un utilisateur sur notre machine Debian : adduser --ingroup tomcat tomcat. Tomcat sera exécuté avec les droits de cet utilisateur. N'oubliez pas de définir les droits en lecture/écriture sur le dossier $TOMCAT_PATH pour l'utilisateur/groupe tomcat.
  4. Nous créons le dossier destiné à contenir notre serveur CAS : mkdir $TOMCAT_PATH/cas-webapp.
  5. Nous remplaçons le contenu du fichier de configuration $TOMCAT_PATH/conf/server.xml par les lignes suivantes :
<Server port="8005" shutdown="SHUTDOWN">

  <GlobalNamingResources>

    <!-- Used by Manager webapp -->
    <Resource name="UserDatabase" auth="Container"
              type="org.apache.catalina.UserDatabase"
              description="User database that can be updated and saved"
              factory="org.apache.catalina.users.MemoryUserDatabaseFactory"
              pathname="conf/tomcat-users.xml" />
  </GlobalNamingResources>

  <Service name="CAS_Server">

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

    <Engine name="CAS_Server" defaultHost="localhost">
      <Host name="localhost" appBase="cas-webapp" unpackWARs="true" autoDeploy="true" />
    </Engine>

  </Service>

</Server>
  1. Nous créons un fichier de démarrage automatique pour Tomcat, dans /etc/init.d/tomcat avec le contenu suivant :
TOMCAT_HOME=/home/tomcat
CATALINA_HOME=/home/tomcat

JAVA_HOME=/usr/lib/jvm/java-1.5.0-sun
JAVA_OPTS="-Dhttp.proxyHost=proxy.enib.fr -Dhttp.proxyPort=3128 -Dhttp.nonProxyHosts=localhost|*.enib.fr"

CATALINA_OPTS="-Dfile.encoding=UTF-8"

TOMCAT_USER=tomcat
LC_ALL=fr_FR

export TOMCAT_HOME CATALINA_HOME JAVA_HOME CATALINA_OPTS TOMCAT_USER LC_ALL JAVA_OPTS

cd $TOMCAT_HOME/logs

case "$1" in
  start)
    echo -ne "Starting Tomcat. "
    /bin/su $TOMCAT_USER $TOMCAT_HOME/bin/startup.sh
    ;;

  stop)
    echo -ne "Stopping Tomcat. "
    /bin/su $TOMCAT_USER $TOMCAT_HOME/bin/shutdown.sh
    ;;

  restart)
    $0 stop
    $0 start
    ;;

  *)
    echo "Usage: /etc/init.d/tomcat {start|stop|restart}"
    exit 1
    ;;
esac
exit 0
  1. Nous pouvons démarrer Tomcat avec la commande /etc/init.d/tomcat start.
  2. Nous autorisons également le démarrage de Tomcat en même temps que le serveur : update-rc.d tomcat defaults 25.

Installation d'Apache

Apache va servir de reverse-proxy à Tomcat. Il cryptera également la connexion entre l'utilisateur et le serveur CAS avec SSL.

  1. Apache 2.2 s'installe automatiquement grâce aux paquets APT. Il suffit donc d'exécuter la commande suivante : apt-get install apache2.
  2. Nous devons ensuite activer 3 modules Apache pour activer le support des reverse proxys et du SSL. Il faut donc exécuter :
a2enmod proxy
a2enmod proxy_ajp
a2enmod ssl
  1. Nous désactivons le site par défaut : a2dissite default.
  2. Nous générons un certificat SSL et une clé privé pour crypter la communication HTTP :

Commandes de générations SSL...

  1. Nous créons un fichier de configuration pour un site web dans le fichier /etc/apache2/site-available/cas :
# Ajouter la ligne suivante pour écouter sur le port 80 (si non défini dans un autre fichier)
Listen 80

<VirtualHost *:80>

        DocumentRoot                    /var/www

        Options                         +FollowSymLinks

        <Directory /var/www>

                RewriteEngine           on
                RewriteBase             /
                RewriteRule             ^(.*)$ https://%{SERVER_NAME}/$1 [R,L]

        </Directory>

</VirtualHost>

# Ajouter la ligne suivante pour écouter sur le port 443
Listen 443

<VirtualHost *:443>

        DocumentRoot                    /var/www

        ServerName                      cas.enib.fr

        ProxyRequests                   off
        ProxyPass                       / ajp://localhost:8009/
        ProxyPassReverse                / ajp://localhost:8009/

        SSLCertificateFile             /etc/ssl/ca/ca.crt
        SSLCertificateKeyFile          /etc/ssl/ca/ca.key

        SSLEngine                       on

        <Location />
                Order                   allow,deny
                Allow from              all
        </Location>

</VirtualHost>
  1. Nous activons le site : a2ensite cas.
  2. Nous redémarrons Apache : /etc/init.d/apache2 restart.

Importation du certificat SSL du serveur dans Java

Java a besoin de connaitre le certificat SSL de notre serveur Apache. Nous allons donc l'importer dans le keystore principal de Java :

keytool -alias cas_server -import -file $PATH_TO_CERT -keystore /usr/lib/jvm/java-1.5.0-sun/jre/lib/security/cacerts

Cette commande peut vous demander un mot de passe. Par défaut, il a pour valeur changeit.

Déploiement de CAS

  1. Nous créons sur le serveur CAS un dossier contenant les fichiers de la base de données du gestionnaire de services : mkdir /var/hsql. Celui-ci doit être accessible en lecture/écriture à l'utilisateur tomcat.
  2. Nous copions notre archive WAR depuis notre machine de développement sur le serveur CAS, grâce à scp. La commande ressemble à : scp $ENIB_CAS_PROJECT_PATH/target/cas-server-XX.war root@cas:$TOMCAT_PATH/cas-webapp/ROOT.war. Notez bien que le nom de l'archive doit être ROOT.war, afin qu'elle s'installe correctement à la racine du serveur Tomcat.
  3. Après quelques secondes (le temps de déployer CAS sur Tomcat), nous pouvons nous connecter sur https://cas.enib.fr/ et voir le formulaire de connexion.

Gestionnaire de services

Le serveur CAS possède une petite application pour gérer les services autorisés à se connecter, accessible sur https://cas.enib.fr/services/. Si vous possédez les droits d'administration, vous aurez accès à une liste de services. Par défaut, cette dernière est vide, ce qui signifie en fait qu'il n'y a aucun contrôle d'accès. Si vous souhaitez exercer un contrôle sur les services, vous devez avant tout chose autoriser le gestionnaire de service à utiliser CAS. Le pattern d'URL à utiliser est le suivant : https://cas.enib.fr/services/**.

Problèmes possibles

Problème Solution
Je ne peux plus accéder au gestionnaire de services après avoir enregistré une application utilisant CAS. Vous avez oublié d'autoriser le gestionnaire de services à utiliser le serveur CAS. Stoppez Apache et Tomcat, supprimez la base de données HSQL (normalement, les fichiers préfixés par /var/hsql/cas_services), puis redémarrez les serveurs.
J'obtiens une erreur du type Authorization Failure : unable to find valid certification path to requested target lorsque je tente d'accéder au gestionnaire de services. La politique de Java sur les certificats SSL est très stricte. Vous devez importer le certificat dans le keystore global de Java, comme indiqué plus tôt dans le tutoriel.

CAS en haute disponibilité

  •  cas-spare est une solution pour piloter un cluster de serveurs CAS.
  •  Heartbeat par Linux HA est une solution plus générique (et plus difficile à mettre en oeuvre) pour les clusters de serveurs Linux.

En résumé

Logiciels utilisés

Nom Version Fonction Adresse
Linux Debian 4 Système d'exploitation  http://debian.org
JDK (Java Development Kit) 5 (versionnée également à 1.5) Framework et outils de compilation  http://java.sun.com
Maven 2 Outil de build  http://maven.apache.org
Apache HTTP Server 2.2 Serveur web, utilisé comme reverse proxy  http://httpd.apache.org
Apache Tomcat 5.5 Serveur d'applications Java  http://tomcat.apache.org
JA-SIG CAS (Central Authentication Service) 3.1 Application de Single Sign-On  http://www.ja-sig.org/products/cas/

Attachments