CAS : Centraliser l’authentification de Zimbra

Nous allons aujourd’hui voir comment mettre Zimbra en SSO avec le service CAS stockant ses couples logins/mot de passes dans une base de données MariaDB. Pour cette installation on considère que tous les services de bases et de sécurités sont préconfigurés et on ne tient pas compte des services annexes que l’on pourrait avoir à installer (les autres services à fédérer au CAS par exemple).

Voici une liste des versions des logiciels qui vont être installé dans cet exemple :

  • Zimbra 8.6
  • MariaDB 5.5.42
  • CAS 4.0.1
  • Tomcat 7
  • JRE 7

Zimbra

Pour l’installation de Zimbra il nous faut télécharger les dernières sources à l’adresse https://www.zimbra.com/downloads/zimbra-collaboration-open-source. On sélectionne l’archive qui correspond à notre OS/architecture et on la télécharge dans notre répertoire de travail (ici /usr/local/src) puis on l’extrait.

# cd /usr/local/src
# wget https://files.zimbra.com/downloads/8.6.0_GA/zcs-8.6.0_GA_1153.RHEL6_64.20141215151155.tgz 
# tar xvzf zcs-8.6.0_GA_1153.RHEL6_64.20141215151155.tgz

L’installation de zimbra se veut très intuitive et se lance à partir du script install.sh, il suffit ensuite de se laisser guider à travers les étapes d’installations. Sachez qu’il faut préalablement avoir définis un nom à votre machine existant dans votre domaine et que ce nom de machine doit être un MX du domaine sinon l’installation se bloquera.

# cd zcs-8.6.0_GA_1153.RHEL6_64.20141215151155
# ./install.sh

Après les premières étapes d’installations on arrive à une étape de personnalisation, je vous invite à parcourir les différentes sections pour vérifier toutes les infos et modifier celles qui vous intéresse (si vous souhaitez passer rapidement vous pouvez simplement modifier le mot de passe d’administration). Il faut ensuite taper ‘a’ pour appliquer et l’installation se termine.

Si vous n’avez pas changé le paramétrage des ports par défaut vous devriez pouvoir accéder à votre plateforme à partir des url suivantes :

zimbra : https://votre.url
zimbra cas
zimbra Admin : https://votre.url:7071
zimbradmin

L’installation en elle-même est terminée, nous vous conseillons néanmoins de tester la création des comptes, l’envoi et la réception des mails avant de poursuivre pour vous assurer du bon fonctionnement du zimbra seul. Dans notre cas, pour la suite on crée un utilisateur ‘usertest’ dont le mot de passe est ‘password’.

MariaDB

Concernant l’installation de MariaDB, on ajoute le repository fournit par le site officiel ce qui nous permettra de maintenir le service à jour de manière flexible.

# vi /etc/yum.repos.d/MariaDB.repo
[mariadb]
name = MariaDB
baseurl = http://yum.mariadb.org/10.0/centos6-amd64
gpgkey=https://yum.mariadb.org/RPM-GPG-KEY-MariaDB
gpgcheck=1
# yum install MariaDB-server MariaDB-client

La première étape de toute configuration d’un MariaDB ou d’un mysql est la sécurisation via la commande mysql_secure_installation. Ensuite on crée la base de donnée qui servira à stocker les informations de connexion pour le serveur CAS une base cas_server dont l’utilisateur principal est cas.

# mysql_secure_installation
# mysql -u root -p
> Create database cas_server;
> GRANT ALL PRIVILEGES ON cas_server.* to cas@’localhost’ identified by ‘password’;
> GRANT ALL PRIVILEGES ON cas_server.* to cas@’127.0.0.1’ identified by ‘password’;
> flush privileges ;

Dans l’étape suivante on crée une table users qui va contenir les nom d’utilisateurs et mots de passes correspondant aux nom d’utilisateurs et aux mots de passes des comptes zimbra. Puis on ajoute notre compte de test en l’insérant à la main dans la table. Sachant qu’il s’agit d’une plateforme de test on n’ utilise pas de hashage pour le mot de passe, néanmoins vous pouvez le faire en ajoutant l’option MD5() autour du mot de passe – Le MD5 étant une manière de hashage basique nous ne vous la recommandons pas sur une base de donnée de production.

# mysql -u root -p
> use cas_server;
> CREATE TABLE IF NOT EXISTS `users` (
	`id` int(11) NOT NULL,
	`username` varchar(255) COLLATE utf8_unicode_ci NOT NULL,
	`password` varchar(255) COLLATE utf8_unicode_ci NOT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci AUTO_INCREMENT=45834;
> INSERT INTO `users` (`id`, `username`, `password`) 
VALUES (1, ‘usertest’, ‘password’);

Tomcat

CAS est une application web java, dans notre cas nous décidons de la faire tourner par le biais de Tomcat. La version 7 de serveur d’applet java a besoin au minimum de la version 7 de jre pour fonctionner.

# yum install java-1.7.0-openjdk java-1.7.0-openjdk-devel tomcat

Pour le bon fonctionnement de l’application cas il est recommandé de la mettre en place en https, nous allons donc passer tomcat en SSL/TLS. La première étape est de générer la clef SSL et de la mettre dans le répertoire de tomcat (Pour un serveur de production on utiliserait un certificat venant d’une autorité de certification reconnue). Puis on modifie le fichier

  • server.xml
  • de tomcat pour lui indiquer qu’il doit écouter sur le port 8443 en TLS et plus sur le 8080.

    # cd
    # keytool -genkey -alias tomcat -keyalg RSA -validity 365
    # mv /root/.keystore /usr/share/tomcat/
    # chown tomcat:tomcat /usr/share/tomcat/.keystore
    # vi /usr/share/tomcat/conf/server.xml
      <!--
      <Connector port="8080" protocol="HTTP/1.1"
                   connectionTimeout="20000"
                   redirectPort="8443" />
      -->
      <Connector port="8443" protocol="HTTP/1.1" SSLEnabled="true"
                 maxThreads="150" scheme="https" secure="true"
    		keypass="password"
    		keyStoreFile="/usr/share/tomcat/.keystore "
                 clientAuth="false" sslProtocol="TLS" /> 

    Maven

    Pour compiler CAS on à besoin du logiciel maven par chance il existe un repository pour l’installer directement dans CentOS, on l’ajoute et on installe l’application via yum.

    wget http://repos.fedorapeople.org/repos/dchen/apache-maven/epel-apache-maven.repo -O /etc/yum.repos.d/epel-apache-maven.repo
    yum install apache-maven

    CAS-Serveur

    On entame la partie la plus ardue. En effet, CAS doit être compilé spécifiquement selon l’utilisation qu’on en fait, le problème est que la documentation entre la version 3 et la version 4 a changé et que toutes les informations dont nous avons besoin sur la version 4 ne sont pas encore disponibles et les informations concernant la version 3 ne correspondent pas toujours dans la version 4. Il nous faut donc synthétiser les informations pour faire une installation de CAS avec MariaDB.

    On commence par télécharger la dernière version des sources à partir du site de Jasig dans notre répertoire de travail et on l’extrait. On télécharge les bibliothèques manquantes dont on aura besoin et on les extraits dans le répertoire de travail.

    # cd /usr/local/src
    # wget http://downloads.jasig.org/cas/cas-server-4.0.0-release.tar.gz
    # tar xvzf cas-server-4.0.0-release.tar.gz
    # wget http://dev.mysql.com/get/Downloads/Connector-J/mysql-connector-java-5.1.8.tar.gz
    # tar xvzf mysql-connector-java-5.1.8.tar.gz
    # wget http://central.maven.org/maven2/commons-collections/commons-collections/3.2.1/commons-collections-3.2.1.jar
    # tar xvzf commons-collections-3.2.1.jar

    Ensuite on va dans le répertoire cas-server puis cas-server-webapp et on ajoute les lignes suivantes entre les balises dependencies dans le fichier pom.xml :

    # cd cas-server-4.0.0-release/cas-server-webapp
    # vi pom.xml
    <dependencies>
    …
    <dependency>
      <groupId>${project.groupId}</groupId>
      <artifactId>cas-server-support-jdbc</artifactId>
      <version>${project.version}</version>
    </dependency>
    <dependency>
      <groupId>commons-dbcp</groupId>
      <artifactId>commons-dbcp</artifactId>
      <version>1.2.1</version>
      <scope>runtime</scope>
    </dependency>
    <dependency>
      <groupId>mysql</groupId>
      <artifactId>mysql-connector-java</artifactId>
      <version>5.1.8-bin</version>
      <scope>provided</scope>
    </dependency>
    …
    </dependencies>

    Comme les dépendances ne sont pas toutes présentes directement dans l’installation de la webapp il faut donner les chemins des librairies à maven pour qu’il les ajoute.

    # mvn install:install-file -DgroupId=commons-collections -DartifactId=commons-collections -Dversion=2.1 -Dpackaging=jar -Dfile=../../commons-collections-3.2.1.jar
    # mvn install:install-file -DgroupId=mysql -DartifactId=mysql-connector-java -Dversion=5.1.8-bin -Dpackaging=jar -Dfile=../../mysql-connector-java-5.1.8/mysql-connector-java-5.1.8-bin.jar

    Puis on compile les dossiers avec maven et on installe le fichier de webapp généré dans le répertoire tomcat. On démarre/redémarre tomcat pour qu’il génère le répertoire de la webapp puis on y copie les librairies qu’on a ajouté.

    # mvn package
    # cp target/cas.war /var/lib/tomcat/webapps/cas.war
    # service tomcat restart
    # cp /usr/local/src/mysql-connector-java-5.1.8/mysql-connector-java-5.1.8-bin.jar /var/lib/tomcat/webapps/cas/WEB-INF/lib/
    # cp /usr/local/src/commons-collections-3.2.1.jar /var/lib/tomcat/webapps/cas/WEB-INF/lib/

    Dans l’état actuel vous pouvez aller vérifier que la page https://votre.url:8443/cas/login s’affiche correctement, néanmoins le cas n’est pas encore complètement fonctionnel. Actuellement il acceptera uniquement comme login « casuser » et comme mot de passe « Mellon ». Pour implémenter la recherche des utilisateurs en base de données il faut encore éditer /var/lib/tomcat/webapps/cas/WEB-INF/deployerConfigContext.xml dans lequel sont spécifiées les options d’authentification. Trouver la balise bean contenant l’id primaryAuthenticationHandler et commenter ce code, à la suite ajouter les instructions permettant la connexion à la base de données.

    # vi /var/lib/tomcat/webapps/cas/WEB-INF/deployerConfigContext.xml
        <!--
        <bean id="primaryAuthenticationHandler"
              class="org.jasig.cas.authentication.AcceptUsersAuthenticationHandler">
            <property name="users">
                <map>
                    <entry key="casuser" value="Mellon"/>
                </map>
            </property>
        </bean>
        -->
    
        <bean id="primaryAuthenticationHandler"   class="org.jasig.cas.adaptors.jdbc.SearchModeSearchDatabaseAuthenticationHandler">
           <property  name="tableUsers">
              <value>user_account</value>
           </property>
           <property name="fieldUser">
              <value>username</value>
           </property>
           <property name="fieldPassword">
              <value>password</value>
           </property>
           <!-- Si vous avez encodé le mot de passe
           <property name="passwordEncoder">
               <bean class="org.jasig.cas.authentication.handler.DefaultPasswordEncoder">
                 <constructor-arg value="MD5" />
               </bean>
           </property> -->
           <property name="dataSource" ref="dataSource" />
        </bean>
    
        <bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource">
           <property name="driverClassName">
              <value>com.mysql.jdbc.Driver</value>
           </property>
           <property name="url">
              <value>jdbc:mysql://localhost:3306/cas_server</value> <!-- Replace this line with the database containing the users table -->
           </property>
           <property name="username">
              <value>cas</value> <!-- Replace this line with the MySQL username -->
           </property>
           <property name="password">
              <value>password</value> <!-- Replace this line with the actual MySQL password -->
           </property>
        </bean> 
    
    # service tomcat restart

    Une fois tomcat redémarrée vous devriez pouvoir tester votre utilisateur inséré en base de donnée sur l’url de cas. Si cela ne fonctionne pas essayez d’activer les logs généraux de mysql pour observer les interactions entre cas et la base de données.

    CAS – Client, intégration dans Zimbra

    Les prochaines manipulations sont à faire avec l’utilisateur zimbra. La première étape est l’importation des certificats utilisés par l’application cas dans les certificats racine de confiance de Zimbra. Pour cela il faut commencer par exporter la clef de tomcat que nous avons créée plus tôt sous la forme d’un certificat.

    # su - zimbra
    $ keytool -export -keystore /usr/share/tomcat/.keystore -alias tomcat -file cas.cert
    $ /opt/zimbra/java/bin/keytool -import -file cas.cert -alias tomcat -trustcacerts -keystore /opt/zimbra/java/jre/lib/security/cacerts

    On télécharge la librairie cas-client et on l’installe dans Zimbra.

    $ cd /opt/zimbra/jetty/common/lib
    $ wget http://mirrors.ibiblio.org/maven2/org/jasig/cas/client/cas-client-core/3.2.0/cas-client-core-3.2.0.jar

    On ajoute ensuite à /opt/zimbra/jetty/etc/zimbra.web.xml avant la première balise le contenu du fichier web.xml situé dans le github dont le lien est à la fin de cet article.

    On passe ensuite à la création de la clef de préauthentification et au fichier de préauthentification.

    zmprov gdpak yourdomain.com

    La clef générée doit être remplacée dans le fichier de préauthentification /opt/zimbra/jetty/webapps/zimbraAdmin/public/preauth.jsp dont vous trouverez l’exemple dans le github à la fin de cet article. Il vous faudra également remplacer « yourdomain » par votre domaine à la ligne 90.

    Enfin, il faut donner à zimbra les liens des pages de login et de logout et le redémarrer.

    $ zmprov md yourdomain.com zimbraWebClientLoginURL https://votre.url/public/preauth.jsp
    $ zmprov md yourdomain.com zimbraWebClientLogoutURL https://votre.url:8443/cas/logout

    Vous devriez retrouver l’interface de login de CAS mais pas d’inquiétude si vous tapez vos logins et mot de passes stockés en base de donnée et correspondant à votre compte zimbra vous devriez pouvoir vous connecter.

    Conclusion

    Maintenant que l’authentification de votre Zimbra est fédérée à votre serveur CAS et à sa base de données MariaDB vous pouvez y fédérer vos autres applications et ainsi ne vous authentifier qu’à un seul endroit.

    Voici le lien vers le github sur lequel vous pouvez récupérer des exemples des fichiers web.xml et preauth.jsp : https://github.com/YPCI/zimbra-cas