Comparaison des versions

Légende

  • Ces lignes ont été ajoutées. Ce mot a été ajouté.
  • Ces lignes ont été supprimées. Ce mot a été supprimé.
  • La mise en forme a été modifiée.
Commentaire: Migrated to Confluence 5.3
Astuce
titleAdaptation d'un serveur CAS existant

Cette page décrit l'installation de A à Z d'un nouveau serveur CAS qui permet :

  • l'authentification transparente des utilisateurs par la transmission de tickets Kerberos
  • l'alimentation automatique d'un royaume Kerberos à partir des utilisateurs LDAP lors de leur connexion

Il est facile pour un administrateur CAs d'extraire de cette documentation les éléments nécessaires à l'adaptation d'un serveur CAS existant pour lui donner les fonctionnalités voulues.

Sommaire

Nom du serveur

cas-kerb.univ-rennes1.fr

Système

RedHat Entreprise 5

Ouverture de ports

ssh (22 tcp)
https

Sommaire

Nom du serveur

cas-kerb.univ-rennes1.fr

Système

RedHat Entreprise 5

Ouverture de ports

ssh (22 tcp)
https (443)

Installation système

...

Bloc de code
[root@cas-kerb ~]# cd /usr/local
[root@cas-kerb local]# wget http://www.ja-sig.org/downloads/cas/cas-server-3.3.5-release.tar.gz
--2010-03-09 09:25:51--  http://www.ja-sig.org/downloads/cas/cas-server-3.3.5-release.tar.gz
Resolving www.ja-sig.org... 128.112.131.108
Connecting to www.ja-sig.org|128.112.131.108|:80... connected.
HTTP request sent, awaiting response... 200 OK
Length: 14467126 (14M) [application/x-gzip]
Saving to: `cas-server-3.3.5-release.tar.gz'
100%[========================>] 14,467,126   427K/s   in 15s
2010-03-09 09:26:07 (919 KB/s) - `cas-server-3.3.5-release.tar.gz' saved [14467126/14467126]
[root@cas-kerb local]# tar xf cas-server-3.3.5-release.tar.gz
[root@cas-kerb local]# cd cas-server-3.3.5
[root@cas-kerb cas-server-3.3.5]#

Créer un répertoire cas-server-rennes1 dans lequel seront stockées toutes les personnalisations et y ajouter le Pour diminuer les temps de compilation, on ajoute la propriété skipTests au plugin maven-sunfire dans le fichier pom.xml suivant à la racine du projet :

Bloc de code
xml
xml
<project xmlns="http://maven<plugin>
  <groupId>org.apache.maven.plugins</groupId>
  <artifactId>maven-surefire-plugin</artifactId>
  <configuration>
    <skipTests>true</skipTests>
    <includes>
      <include>**/*Tests.java</include>
    </includes>
    <excludes>
      <exclude>**/Abstract*.java</exclude>
    </excludes>
  </configuration>
</plugin>

Créer un répertoire cas-server-rennes1 dans lequel seront stockées toutes les personnalisations et y ajouter le fichier pom.xml suivant :

Bloc de code
xml
xml
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
  <parent>
    <groupId>org.jasig.cas</groupId>
    <artifactId>cas-server</artifactId>
    <version>3.3.5</version>
  </parent>
  <modelVersion>4.0.0</modelVersion>
    <groupId>fr.univrennes1.cas</groupId>
    <artifactId>cas-server-rennes1</artifactId>
    <version>3.3.5</version>
    <packaging>war</packaging>
    <name>University of Rennes 1 CAS webapp</name>
    <organization>
        <name>University of Rennes 1</name>org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
  <parent>
    <groupId>org.jasig.cas</groupId>
    <artifactId>cas-server</artifactId>
    <version>3.3.5</version>
  </parent>
  <modelVersion>4.0.0</modelVersion>
    <groupId>fr.univrennes1.cas</groupId>
    <artifactId>cas-server-rennes1</artifactId>
    <version>3.3.5</version>
    <packaging>war</packaging>
    <name>University of Rennes 1 CAS webapp</name>
    <organization>
        <name>University of Rennes 1</name>
        <url>http://www.univ-rennes1.fr.fr</url>
    </organization>
    <description>The University of Rennes 1 customizations to the JA-SIG CAS server.</description>
    <dependencies>
        <dependency>
            <groupId>org.jasig.cas</groupId>
            <artifactId>cas-server-webapp</artifactId>
            <version>${project.version}</version>
            <type>war</type>
        </dependency>
        <dependency>
            <groupId>org.jasig.cas</groupId><url>http://www.univ-rennes1.fr.fr</url>
    </organization>
    <description>The University of  <artifactId>cas-server-core</artifactId>
            <version>${project.version}</version>Rennes 1 customizations to the JA-SIG CAS server.</description>
      <dependencies>
  </dependency>
      </dependencies><dependency>
    <build>
        <finalName>cas</finalName><groupId>org.jasig.cas</groupId>
        <plugins>
    <artifactId>cas-server-webapp</artifactId>
        <plugin>
    <version>${project.version}</version>
            <artifactId>maven-compiler-plugin</artifactId><type>war</type>
        </dependency>
        <version>RELEASE</version><dependency>
            <groupId>org.jasig.cas</groupId>
    <configuration>
        <artifactId>cas-server-core</artifactId>
            <source>1.5</source><version>${project.version}</version>
        </dependency>
      </dependencies>
      <target>1.5</target><build>
        <finalName>cas</finalName>
        </configuration><plugins>
            </plugin><plugin>
         </plugins>
    </build>   <artifactId>maven-compiler-plugin</artifactId>
    <repositories>
        <repository>
    <version>RELEASE</version>
        <id>jasig-repository</id>
        <configuration>
      <name>JA-SIG Maven2 Repository</name>
            <url>http://developer.ja-sig.org/maven2</url>
<source>1.5</source>
            </repository>
    </repositories>
    <reporting><target>1.5</target>
        <plugins>
        </configuration>
    <plugin>
        </plugin>
        <groupId>org.apache.maven.plugins</groupId></plugins>
    </build>
    <repositories>
        <artifactId>maven-project-info-reports-plugin</artifactId><repository>
            <<id>jasig-repository</plugin>id>
            <plugin>
<name>JA-SIG Maven2 Repository</name>
              <groupId>org.apache.maven.plugins</groupId><url>http://developer.ja-sig.org/maven2</url>
        </repository>
        <artifactId>maven-javadoc-plugin</artifactId></repositories>
    <reporting>
        </plugin><plugins>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-changelogproject-info-reports-plugin</artifactId>
            </plugin>
            <plugin>
        </plugins>
        <groupId>org.apache.maven.plugins</groupId>
                </reporting>
</project>

Plutôt que modifier les fichiers de la distribution CAS, il est préférable de maintenir toutes modifications effectuées dans ce répertoire, ce qui facilite les mises à jour. Tous les fichiers trouvés dans ce répertoire écraseront les fichiers de la distribution, on adoptera donc exactement la même hiérarchie de fichiers que celle de la distribution.

Installation basique

Copier le fichier src/main/webapp/WEB-INF/classes/log4j.properties de cas-server-webapp dans src/main/webapp/WEB-INF/classes et indiquer le chemin des logs :

<artifactId>maven-javadoc-plugin</artifactId>
            </plugin>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-changelog-plugin</artifactId>
            </plugin>
        </plugins>
    </reporting>
</project>

Plutôt que modifier les fichiers de la distribution CAS, il est préférable de maintenir toutes modifications effectuées dans ce répertoire, ce qui facilite les mises à jour. Tous les fichiers trouvés dans ce répertoire écraseront les fichiers de la distribution, on adoptera donc exactement la même hiérarchie de fichiers que celle de la distribution.

Installation basique

Copier le fichier src/main/webapp/WEB-INF/classes/log4j.properties de cas-server-webapp dans src/main/webapp/WEB-INF/classes et indiquer le chemin des logs :

Bloc de code
log4j.appender.logfile.File=/var/log/tomcat5/
Bloc de code
log4j.appender.logfile.File=/var/log/tomcat5/cas.log

Générer le WAR, le copier dans Tomcat et redémarrer :

...

Bloc de code
[root@cas-kerb ~]# cd /usr/local/cas-server-3.3.5
[root@cas-kerb cas-server-3.3.5]# cat > deploy-restart.sh
#!/bin/bash
service tomcat5 stop
pushd /usrvar/local/cas-server-3.3.5/cas-server-rennes1
mvn package && rm -f /var/lib/tomcat5/webapps/ROOT.war && lib/tomcat5/webapps
rm -rf ROOT ROOT.war
popd
rm -rf /usr/share/tomcat5/work/_
pushd /var/log/tomcat5
rm -rf cas.log catalina.out
touch cas.log catalina.out
chown tomcat.tomcat cas.log catalina.out
popd
pushd /usr/local/cas-server-3.3.5
pushd cas-server-rennes1
mvn package install
cp target/cas.war /var/lib/tomcat5/webapps/ROOT.war
popd
popd
service tomcat5 start
[root@cas-kerb cas-server-3.3.5]# chmod 744 deploy-restart.sh
[root@cas-kerb cas-server-3.3.5]#

...

Après redémarrage de Apache et Tomcat, le serveur CAS doit désormais répondre sur l'URL https://cas-kerb.univ-rennes1.fr (sur le port 80 par défaut en HTTP).

Passage en HTTPS

Installer si nécessaire le package mod_ssl (yum install mod_ssl).

Installerle certificat x509 et la cléprivée du serveur dans les répertoires appropriés (/etc/pki/tls/

Configuration de Apache

Installer le certificat du serveur en éditant /etc/httpd/conf.d/ssl.conf et modifier les lignes suivantes dans le virtual host _default_:443 :

Bloc de code
#SSLCertificateFile /etc/pki/tls/certs/localhost.crt
SSLCertificateFile /etc/pki/tls/privatecerts/cas-kerb.univ-rennes1.fr.pem
#SSLCertificateKeyFile /etc/pki/tls/private/localhost.key
SSLCertificateKeyFile /etc/pki/tls/private/cas-kerb.univ-rennes1.fr.key

...

Après redémarrage de Apache, le serveur CAS doit désormais répondre sur l'URL https://cas.ifsic.univ-rennes1.fr  (sur le port 443 par défaut en HTTPS).

Astuce
titleSuppression de l'accès en HTTP

Ne pas oublier de supprimer la ligne suivante de /etc/httpd/conf/httpd.conf :

Bloc de code
Listen 80

Ajout de l'authentification LDAP

...

Configuration de Kerberos

Procéder comme vu précédemment pour générer le fichier Editer le fichier /etc/http.keytab qui sera utilisé ultérieurement par la librairie JCIFS krb5.conf pour intégrer le serveur au domaine Kerberos :

Bloc de code
[root@cas ~]# kadmin
Authenticating as principal root/admin@UNIV-RENNES1.FR with password.
Password for root/admin@UNIV-RENNES1.FR:
kadmin:  ktadd -k /etc/http.keytab HTTP/cas.ifsic.univ-rennes1.fr
Entry for principal HTTP/cas.ifsic.univ-rennes1.fr with kvno 3, encryption type AES-256 CTS mode with 96-bit SHA-1 HMAC added to keytab WRFILE:/etc/http.keytab.
Entry for principal HTTP/cas.ifsiclogging]
 default = FILE:/var/log/krb5libs.log
 kdc = FILE:/var/log/krb5kdc.log
 admin_server = FILE:/var/log/kadmind.log

[libdefaults]
 default_realm = UNIV-RENNES1.FR
 dns_lookup_realm = false
 dns_lookup_kdc = false
 ticket_lifetime = 24h
 forwardable = yes

[realms]
 UNIV-RENNES1.FR = {
  kdc = kerb1.univ-rennes1.fr:88
 with kvno 3, encryption type AES-128 CTS mode with 96-bit SHA-1 HMAC added to keytab WRFILE:/etc/http.keytab.
Entry for principal HTTP/cas.ifsic.admin_server = kerb1.univ-rennes1.fr:749
  default_domain = univ-rennes1.fr
 }

[domain_realm]
 .univ-rennes1.fr = UNIV-RENNES1.FR
 univ-rennes1.fr with kvno 3, encryption type Triple DES cbc mode with HMAC/sha1 added to keytab WRFILE:/etc/http.keytab.
Entry for principal HTTP/cas.ifsic.univ-rennes1.fr with kvno 3, encryption type ArcFour with HMAC/md5 added to keytab WRFILE:/etc/http.keytab.
Entry for principal HTTP/cas.ifsic.univ-rennes1.fr with kvno 3, encryption type DES with HMAC/sha1 added to keytab WRFILE:/etc/http.keytab.
Entry for principal HTTP/cas.ifsic.univ-rennes1.fr with kvno 3, encryption type DES cbc mode with RSA-MD5 added to keytab WRFILE:/etc/http.keytab.
kadmin:  exit
[root@cas ~]

Configuration de CAS

Ajouter le support du handler spnego

Editer le fichier <cas-home>/cas-server-webapp/pom.xml et ajouter la dépendance suivante (par exemple juste après la dépendance vers le module cas-server-support-ldap) :

...

<dependency>
     <groupId>${project.groupId}</groupId>
     <artifactId>cas-server-support-spnego</artifactId>
     <version>${project.version}</version>
</dependency>

Modifier le login webflow

Editer le fichier <cas-home>/cas-server-webapp/src/main/webapp/WEB-INF/login-webflow.xml et ajouter l'état suivant juste avant l'état viewLoginForm :

...

<action-state id="startAuthenticate">
  <action bean="negociateSpnego" />
  <transition on="success" to="spnego" />
</action-state>

<action-state id="spnego">
  <action bean="spnego" />
  <transition on="success" to="sendTicketGrantingTicket" />
  <transition on="error" to="viewLoginForm" />
</action-state>
= UNIV-RENNES1.FR

[appdefaults]
 pam = {
   debug = false
   ticket_lifetime = 36000
   renew_lifetime = 36000
   forwardable = true
   krb4_convert = false
 }

Ajouter le principal HTTP/cas-kerb.univ-rennes1.fr (casse importante) au royaume et l'exporter dans le fichier /etc/http.keytab :

Bloc de code
[root@cas-kerb ~]# kadmin
Authenticating as principal rootifsic/admin@UNIV-RENNES1.FR with password.
kadmin: Client not found in Kerberos database while initializing kadmin interface
[rootifsic@cas-kerb ~]# kadmin -p root/admin
Authenticating as principal root/admin with password.
Password for root/admin@UNIV-RENNES1.FR:
kadmin:  addprinc -randkey HTTP/cas-kerb.univ-rennes1.fr
WARNING: no policy specified for HTTP/cas-kerb.univ-rennes1.fr@UNIV-RENNES1.FR; defaulting to no policy
Principal "HTTP/cas-kerb.univ-rennes1.fr@UNIV-RENNES1.FR" created.
kadmin:  ktadd -k /etc/http.keytab HTTP/cas-kerb.univ-rennes1.fr
Entry for principal HTTP/cas-kerb.univ-rennes1.fr with kvno 3, encryption type Triple DES cbc mode with HMAC/sha1 added to keytab WRFILE:/etc/http.keytab.
Entry for principal HTTP/cas-kerb.univ-rennes1.fr with kvno 3, encryption type ArcFour with HMAC/md5 added to keytab WRFILE:/etc/http.keytab.
Entry for principal HTTP/cas-kerb.univ-rennes1.fr with kvno 3, encryption type DES with HMAC/sha1 added to keytab WRFILE:/etc/http.keytab.
Entry for principal HTTP/cas-kerb.univ-rennes1.fr with kvno 3, encryption type DES cbc mode with RSA-MD5 added to keytab WRFILE:/etc/http.keytab.
kadmin:  exit
[root@cas-kerb ~]#

Le fichier /etc/http.keytab sera utilisé par la librairie JCIFS, il doit être lisible par l'utilisateur tomcat :

Bloc de code
[root@cas-kerb ~]# cd /etc
[root@cas-kerb etc]# chown root:tomcat http.keytab
[root@cas-kerb etc]# chmod 640 http.keytab
[root@cas-kerb etc]#
Astuce
titleDebug

Ajouter dans le fichier /etc/tomcat5/tomcat5.conf les lignes suivantes :

Bloc de code
JAVA_OPTS="$JAVA_OPTS -Dcom.ibm.security.jgss.debug=all"
JAVA_OPTS="$JAVA_OPTS -Dsun.security.jgss.debug=true"
JAVA_OPTS="$JAVA_OPTS -Dsun.security.krb5.debug=true"
JAVA_OPTS="$JAVA_OPTS -Djava.security.debug=logincontext,policy,scl,gssloginconfig

Les logs se trouvent dans /var/log/tomcat5/catalina.out.

Configuration de CAS

Ajouter le support du handler spnego

Editer le fichier pom.xml et ajouter la dépendance suivante (par exemple juste après la dépendance vers le module cas-server-support-ldap

Dans ce même fichier, remplacer les références à viewLoginForm par remoteAuthenticate pour les trois decision-state gatewayRequestCheck et renewRequestCheck :

...

<decision-state id="gatewayRequestCheck">
  <if
    test="${externalContext.requestParameterMap['gateway'] != '' &amp;&amp; externalContext.requestParameterMap['gateway'] != null &amp;&amp; flowScope.service != null}"
    then="redirect"
    else="startAuthenticate" />
</decision-state>

...

<decision-state id="renewRequestCheck">
  <if
    test="${externalContext.requestParameterMap['renew'] != '' &amp;&amp; externalContext.requestParameterMap['renew'] != null}"
    then="startAuthenticate"
    else="generateServiceTicket" />
</decision-state>

Déclarer le bean implémentant le nouvel état du webflow en ajoutant les lignes suivantes dans le fichier <cas-home>/cas-server-webapp/src/main/webapp/WEB-INF/cas-servlet.xml (par exemple juste avant le bean authenticationViaFormAction) :

Bloc de code
xml
xml
<bean<dependency>
    id="negociateSpnego" <groupId>org.jasig.cas</groupId>
    class="org.jasig.cas.support.spnego.web.flow.SpnegoNegociateCredentialsAction" />

<bean
 <artifactId>cas-server-support-spnego</artifactId>
    id="spnego"
    class="org.jasig.cas.support.spnego.web.flow.SpnegoCredentialsAction">
	<property name="centralAuthenticationService" ref="centralAuthenticationService"/>
</bean>

Modifier le schéma d'authentification

 <version>${project.version}</version>
</dependency>

Modifier le login webflow

Editer le fichier Pour modifier le schéma d'authentification, éditer le fichier <cas-home>/cas-server-webapp/src/main/webapp/WEB-INF/deployerConfigContextlogin-webflow.xml et modifier le bean authenticationManager en ajoutant :

...

ajouter l'état suivant juste avant l'état viewLoginForm :

Bloc de code
xml
xml
<bean<action-state id="authenticationManagerstartAuthenticate" class="org.jasig.cas.authentication.AuthenticationManagerImpl">
  <action bean="negociateSpnego" />
  <property<transition nameon="credentialsToPrincipalResolverssuccess">
    <list>
      <!--  ... the others credentialsToPrincipalResolvers ... --to="spnego" />
</action-state>

<action-state id="spnego">
      <bean class="org.jasig.cas.support.spnego.authentication.principal.SpnegoCredentialsToPrincipalResolver<action bean="spnego" />
  <transition  </list>
  </property>
  <property name="authenticationHandlers">
    <list>on="success" to="sendTicketGrantingTicket" />
  <transition on="error" to="viewLoginForm" />
</action-state>

Dans ce même fichier, remplacer les références à viewLoginForm par startAuthenticate pour les deux decision-state gatewayRequestCheck et renewRequestCheck :

Bloc de code
xml
xml
<decision-state id="gatewayRequestCheck">
  <if
      <bean classtest="org.jasig.cas.support.spnego.authentication.handler.support.JCIFSSpnegoAuthenticationHandler">
	<property name="authentication">
	  <bean class="jcifs.spnego.Authentication${externalContext.requestParameterMap['gateway'] != '' &amp;&amp; externalContext.requestParameterMap['gateway'] != null &amp;&amp; flowScope.service != null}"
    then="redirect"
    else="startAuthenticate" />
	</property>
	<property name="principalWithDomainName" value="true" />
	<property name="NTLMallowed" value="false"/>
      </bean>
      <!--  ... the others authenticationHandlers... -->
    </list>
  </property>
</bean>decision-state>
Bloc de code
xml
xml
<decision-state id="renewRequestCheck">
  <if
    test="${externalContext.requestParameterMap['renew'] != '' &amp;&amp; externalContext.requestParameterMap['renew'] != null}"
    then="startAuthenticate"
    else="generateServiceTicket" />
</decision-state>

Déclarer le bean implémentant le nouvel état du webflow en ajoutant les lignes suivantes dans le fichier src/main/webapp/WEB-INF/cas-servlet.xml (par exemple juste avant le bean authenticationViaFormAction) Le bean authenticationManager doit ainsi ressembler à :

Bloc de code
xml
xml
<bean
    id="authenticationManagernegociateSpnego"
        class="org.jasig.cas.authentication.AuthenticationManagerImpl">
support.spnego.web.flow.SpnegoNegociateCredentialsAction" />

<bean
    <property nameid="credentialsToPrincipalResolversspnego">
      <list>
        <bean class="org.jasig.cas.support.spnego.authenticationweb.principalflow.UsernamePasswordCredentialsToPrincipalResolverSpnegoCredentialsAction" />
	<property name="centralAuthenticationService" ref="centralAuthenticationService"/>
</bean>

Modifier le schéma d'authentification

Pour modifier le schéma d'authentification, éditer le fichier src/main/webapp/WEB-INF/deployerConfigContext.xml et modifier le bean authenticationManager en ajoutant :

  • PrincipalBearingCredentialsToPrincipalResolver après les resolvers existants de credentialsToPrincipalResolvers
  • PrincipalBearingCredentialsAuthenticationHandler avant les handlers existants de authenticationHandlers
Bloc de code
xml
xml
<bean id="authenticationManager"        <bean class="org.jasig.cas.authentication.principal.HttpBasedServiceCredentialsToPrincipalResolver" />
        <bean class="org.jasig.cas.support.spnego.authentication.principal.SpnegoCredentialsToPrincipalResolverAuthenticationManagerImpl" />
  <property name="credentialsToPrincipalResolvers">
    <list>
      </list>!--  ... the others credentialsToPrincipalResolvers ... -->
      <bean class="org.jasig.cas.support.spnego.authentication.principal.SpnegoCredentialsToPrincipalResolver" />
    </property>list>
  </property>
  <property name="authenticationHandlers">
      <list>
        <bean class="org.jasig.cas.support.spnego.authentication.handler.support.JCIFSSpnegoAuthenticationHandler">
	  <property name="authentication">
	    <bean class="jcifs.spnego.Authentication" />
	  </property>
	  <property name="principalWithDomainName" value="truefalse" />
	  <property name="NTLMallowed" value="false"/>
      </bean>
      <!-- <bean class="org.jasig.cas.authentication.handler.support.HttpBasedServiceCredentialsAuthenticationHandler". the others authenticationHandlers... -->
    </list>
  </property>
</bean>

Le bean authenticationManager doit ainsi ressembler à :

Bloc de code
xml
xml
<bean   id="authenticationManager"
      p:httpClient-ref="httpClient" />
	<bean class="org.jasig.cas.adaptorsauthentication.ldap.FastBindLdapAuthenticationHandlerAuthenticationManagerImpl" >
          <property name="filtercredentialsToPrincipalResolvers" value="uid=%u,ou=people,dc=univ-rennes1,dc=fr" />
>
      <list>
       <property name="contextSource" ref="contextSource<bean class="org.jasig.cas.authentication.principal.UsernamePasswordCredentialsToPrincipalResolver" />
        </bean><bean class="org.jasig.cas.authentication.principal.HttpBasedServiceCredentialsToPrincipalResolver" />
      </list>
    </property>
</bean>

Ajouter enfin le bean jcifsConfig, qui done les options de configuration de JCIFS :

Bloc de code
<bean name="jcifsConfig" class="org.jasig.cas.support.spnego.authentication.handlerprincipal.support.JCIFSConfigSpnegoCredentialsToPrincipalResolver" />
      <property
 </list>
    </property>
    <property name="jcifsServicePrincipalauthenticationHandlers">
      value="HTTP/cas.ifsic.univ-rennes1.fr" /><list>
  <property
      name="kerberosDebug"
      value="true" />
  <property
      name="kerberosRealm"
<bean class="org.jasig.cas.support.spnego.authentication.handler.support.JCIFSSpnegoAuthenticationHandler">
	  <property name="authentication">
	    <bean  valueclass="UNIV-RENNES1.FRjcifs.spnego.Authentication" />
	  <property</property>
	  <property    name="kerberosKdcprincipalWithDomainName"
      value="kerb.ifsic.univ-rennes1.frtrue" />
	  <property
   name="NTLMallowed" value="false"/>
      name="loginConf"
</bean>
      <bean class="org.jasig.cas.authentication.handler.support.HttpBasedServiceCredentialsAuthenticationHandler"
          value="/usr/local/cas-server-3.3.5/cas-server-webapp/src/main/webapp/WEB-INF/login.conf" />

Configuration de JCIFS

La configuration de JCIFS se fait également dans le fichier login.conf pointé par le bean jcifsConfig. Créer ce fichier avec le contenu suivant :

Bloc de code
jcifs.spnego.initiate {
  com.sun.security.auth.module.Krb5LoginModule
  required
  useKeyTab=true
  keyTab="/etc/http.keytab"
};
jcifs.spnego.accept {
  com.sun.security.auth.module.Krb5LoginModule
  required
  useKeyTab=true
  keyTab="/etc/http.keytab"
};
Astuce

On peut également ajouter l'option debug=true pour obtenir des informations dans catalina.out.

Configuration de Tomcat

Il faut passer à la JVM qui exécute Tomcat l'option -Djavax.security.auth.useSubjectCredsOnly=false, par exemple en éditant le fichier /etc/tomcat5/tomcat5.conf et en ajoutant la ligne suivante :

Bloc de code
JAVA_OPTS="$JAVA_OPTS -Djavax.security.auth.useSubjectCredsOnly=false"

Test

    p:httpClient-ref="httpClient" />
	<bean class="org.jasig.cas.adaptors.ldap.FastBindLdapAuthenticationHandler" >
          <property name="filter" value="uid=%u,ou=people,dc=univ-rennes1,dc=fr" />
          <property name="contextSource" ref="contextSource" />
        </bean>
      </list>
    </property>
</bean>

Ajouter enfin le bean jcifsConfig, qui done les options de configuration de JCIFS :

Bloc de code
<bean name="jcifsConfig" class="org.jasig.cas.support.spnego.authentication.handler.support.JCIFSConfig">
  <property
      name="jcifsServicePrincipal"
      value="HTTP/cas-kerb.univ-rennes1.fr" />
  <property
      name="kerberosDebug"
      value="true" />
  <property
      name="kerberosRealm"
      value="UNIV-RENNES1.FR" />
  <property
      name="kerberosKdc"
      value="kerb1.univ-rennes1.fr" />
  <property
      name="loginConf"
      value="/etc/jcifs/login.conf" />
</bean>

Configuration de JCIFS

La configuration de JCIFS se fait également dans le fichier login.conf pointé par le bean jcifsConfig. Créer ce fichier avec le contenu suivant :

Bloc de code
com.sun.security.jgss.krb5.accept {
  com.sun.security.auth.module.Krb5LoginModule
  required
  debug=true
  storeKey=true
  useKeyTab=true
  keyTab="/etc/http.keytab"
  principal="HTTP/cas-kerb.univ-rennes1.fr";
};

Configuration de Tomcat

Il faut passer à la JVM qui exécute Tomcat l'option -Djavax.security.auth.useSubjectCredsOnly=false, par exemple en éditant le fichier /etc/tomcat5/tomcat5.conf et en ajoutant la ligne suivante :

Bloc de code
JAVA_OPTS="$JAVA_OPTS -Djavax.security.auth.useSubjectCredsOnly=false"

Test

Un navigateur bien configuré et possédant des credentials Kerberos valides doit maintenant se connecter au serveur CAS sans aucune interaction....

Ajout de l'alimentation Kerberos

L'alimentation Kerberos désigne le processus qui permet d'alimenter un royaume Kerberos avec comptes utilisateurs lors de la connexion au serveur CAS. Elle peut être utilisée pour amorcer le remplissage du royaume à partir d'un annuaire LDAP, ce que nous montrons dans cet exemple.

Configuration de Kerberos

En premier lieu, déclarer le principal qui servira à la mise à jour du royaume Kerberos (ici cas/admin) et l'exporter dans le fichier /etc/cas-admin.keytab :

Bloc de code
[root@cas-kerb ~]# kadmin -p root/admin
Authenticating as principal root/admin with password.
Password for root/admin@UNIV-RENNES1.FR:
kadmin:  addprinc -randkey cas/admin
WARNING: no policy specified for cas/admin@UNIV-RENNES1.FR; defaulting to no policy
Principal "cas/admin@UNIV-RENNES1.FR" created.
kadmin:  ktadd -k /etc/cas-admin.keytab cas/admin
Entry for principal cas/admin with kvno 3, encryption type Triple DES cbc mode with HMAC/sha1 added to keytab WRFILE:/etc/cas-admin.keytab.
Entry for principal cas/admin with kvno 3, encryption type ArcFour with HMAC/md5 added to keytab WRFILE:/etc/cas-admin.keytab.
Entry for principal cas/admin with kvno 3, encryption type DES with HMAC/sha1 added to keytab WRFILE:/etc/cas-admin.keytab.
Entry for principal cas/admin with kvno 3, encryption type DES cbc mode with RSA-MD5 added to keytab WRFILE:/etc/cas-admin.keytab.
kadmin:  exit
[root@cas-kerb ~]#

Le fichier cas-admin.keytab doit être lisible par l'utilisateur tomcat :

Bloc de code
[root@cas-kerb ~]# cd /etc
[root@cas-kerb etc]# chown root:tomcat cas-admin.keytab
[root@cas-kerb etc]# chmod 640 cas-admin.keytab
[root@cas-kerb etc]#

Il est également nécessaire de modifier les permissions du fichier de log de kadmin sans quoi l'appel de kadmin par l'utilisateur tomcat provoquerait une erreur.

Bloc de code
[root@cas-kerb ~]# cd /var/log
[root@cas-kerb log]# touch kadmind.log
[root@cas-kerb log]# chown root:tomcat kadmind.log
[root@cas-kerb log]# chmod 664 kadmind.log
[root@cas-kerb log]#

Intégration du module cas-server-integration-kerberosfeed

L'alimentation du royaume Kerberos se fait en utilisant le module cas-server-integration-kerberosfeed (téléchargeable ici ), qui doit être installé au même niveau que les autres modules du projet puis compilé (lancer la commande mvn package install depuis le répertoire du module).

Il faut ensuite ajouter la dépendance de cas-server-rennes1 vers cas-server-integration-kerberosfeed en ajoutant dans le fichier pom.xml du module cas-server-rennes1 les lignes suivantes :

Bloc de code
xml
xml
<dependency>
  <groupId>org.jasig.cas</groupId>
  <artifactId>cas-server-integration-kerberosfeed</artifactId>
  <version>${project.version}</version>
</dependency>

Configuration de CAS

On utilise la classe KerberosFeedAuthenticationHandlerWrapper pour enrober l'appel des authenticationHandlers pour lesquels on souhaite mettre en place une alimentation du royaume Kerberos. Les lignes suivantes de src/main/webapp/WEB-INF/deployerConfigContext.xml

Bloc de code
xml
xml
<bean class="org.jasig.cas.adaptors.ldap.FastBindLdapAuthenticationHandler" >
  <property name="filter" value="uid=%u,ou=people,dc=univ-rennes1,dc=fr" />
  <property name="contextSource" ref="contextSource" />
</bean>

Seront ainsi remplacées par :

Bloc de code
xml
xml
<bean class="org.esupportail.cas.adaptors.kerberosfeed.KerberosFeedAuthenticationHandlerWrapper" >
  <property name="authenticationHandler">
    <bean class="org.jasig.cas.adaptors.ldap.FastBindLdapAuthenticationHandler" >
      <property name="filter" value="uid=%u,ou=people,dc=univ-rennes1,dc=fr" />
      <property name="contextSource" ref="contextSource" />
    </bean>
  </property>
  <property name="config" ref="kerberosFeedConfig" />
  <property name="registry" ref="kerberosFeedRegistry" />
</bean>

Lorsqu'un authenticationHandler est enrobé de la sorte et que l'authentification du bean enrobé (ici FastBindLdapAuthenticationHandler) s'effectue avec succès, alors elle est suivie de l'ajout dans le royaume de l'utilisateur à l'aide d'une commande kadmin, en utilisant la configuration donnée par le bean kerberosFeedConfig :

Bloc de code
xml
xml
<bean
    id="kerberosFeedConfig"
    class="org.esupportail.cas.adaptors.kerberosfeed.KerberosFeedConfig">
  <property name="kadminPath" value="/usr/kerberos/bin/kadmin" />
  <property name="realm" value="UNIV-RENNES1.FR" />
  <property name="principal" value="cas/admin" />
  <property name="useKeytab" value="true" />
  <property name="keytab" value="/etc/cas-admin.keytab" />
  <!-- property name="password" value="secret" /-->
  <property name="passwordAllowedChars"
    value="abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789&amp;~#{([-|`\\_^@)]=+}$%*!:/;.,?&gt;&lt;" />
</bean>

La propriété password n'est utilisée que lorsque useKeytab est positionnée à false, dans le cas ci-dessous on utilise la keytab générée précédemment.

L'ajout d'un utilisateur déjà présent dans le royaume Kerberos provoque une erreur de kadmin, qui n'est pas prise en compte (rien n'est fait dans ce cas, l'erreur n'est pas dommageable). Néanmoins, afin de ne pas rejouer l'ajout d'un utilisateur déjà présent dans le royaume, le bean KerberosFeedAuthenticationHandlerWrapper s'appuie sur un registre (propriété registry), dans lequel il mémorise les utilisateurs déjà ajoutés dans le royaume. Par défaut (lorsque la propriété registry n'est pas positionnée), la mémorisation est faite en mémoire (implémentation InMemoryRegistryImpl) et les informations sont perdues à chaque redémarrage du serveur CAS. On peut aussi utiliser un registre basé sur BerkeleyDb, dont les informations seront permanentes :

Bloc de code
xml
xml
<bean
    id="kerberosFeedRegistry"
    class="org.esupportail.cas.adaptors.kerberosfeed.registry.BerkeleyDbRegistryImpl">
  <property name="dbPath" value="/tmp" />
</bean>

Les informations seront ici stockées dans le répertoire /tmp.

Test

Se connecter sur le serveur CAS avec un utilisateur de l'annuaire LDAP (par exemple dupont) et vérifier qu'il est bien ajouté dans la base Kerberos (getprinc dupont sous kadmin sur le KDC)Un navigateur bien configuré et possédant des credentials Kerberos valides doit maintenant se connecter au serveur CAS sans aucune interaction....