CAS et Kerberos
Pages enfant
  • Installation et configuration du serveur CAS (archive)

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
Sommaire

Boot sur CD Fedora 10.

  • FQDN : cas.ifsic.univ-rennes1.fr
  • IP : 148.60.10.51

Packages supplémentaires :

  • Servers -> Web Server -> mod_auth_kerb
  • Servers -> Windows File Server (pour le test des montages SMB)

Il n'est pas nécessaire de configurer l'authentification des utilisateurs avec system-config-authentication sur ce serveur (les utilisateurs n'ont pas à se connecter sur le serveur CAS). Il faut néanmoins installer le fichier /etc/krb5.conf :

Bloc de code
[logging]
 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
 default_etypes = des3-hmac-sha1 des-cbc-crc
 default_tkt_enctypes = des3-hmac-sha1 des-cbc-crc
 default_tgs_enctypes = des3-hmac-sha1 des-cbc-crc
 permitted_enctypes = des3-hmac-sha1 des-cbc-crc rc4-hmac
 ticket_lifetime = 24h
 forwardable = yes

[realms]
 UNIV-RENNES1.FR = {
  kdc = kerb.ifsic.univ-rennes1.fr:88
  admin_server = kerb.ifsic.univ-rennes1.fr:749
  default_domain = univ-rennes1.fr
 }

[domain_realm]
 .univ-rennes1.fr = UNIV-RENNES1.FR
 univ-rennes1.fr = UNIV-RENNES1.FR

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

Debuggage

Apache

Modifier la directive LogLevel du fichier /etc/httpd/conf/httpd.conf :

Bloc de code
LogLevel debug

Les logs sont dans le répertoire /var/log/httpd.

CAS

Ajouter dans le fichier src/main/webapp/WEB-INF/classes/log4j.properties la ligne suivante :

Bloc de code
log4j.logger.org.jasig.cas=DEBUG

Les logs se trouvent dans le répertoire /var/log/tomcat5.

Authentification web Kerberos par Apache en utilisant mod_auth_kerb

Installation basique Apache

Installer httpd (Apache) et mod_auth_kerb et démarrer Apache :

Bloc de code
[root@cas ~]# chkconfig httpd on
[root@cas ~]# service httpd start
Starting httpd:                          [OK]
[root@cas ~]#

Ecrire un simple script test.php dans le répertoire /var/www/html/kerb :

Bloc de code
<?php
echo "<p>REMOTE_USER=[".$_SERVER['REMOTE_USER']."]</p>";
echo "<p>PHP_AUTH_USER=[".$_SERVER['PHP_AUTH_USER']."]</p>";
phpinfo();
?>

Tester en accédant à http://cas.ifsic.univ-rennes1.fr/kerb/test.php .

Installation mod_auth_kerb

Déclarer le client Kerberos. Sous kadmin :

Installer un JDK, Maven et Tomcat comme spécifié sur cette page : Installation Java, Maven et Tomcat

Installation d'un serveur CAS basique

Installation

Télécharger la dernière version de CAS depuis http://www.jasig.org/cas/download  et décompresser :

Bloc de code
[root@cas ~]# cd /usr/local
[root@cas local]# wget http://www.ja-sig.org/downloads/cas/cas-server-3.3.5-release.tar.gz
--2010-01-18 10:47:55--  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   271K/s   in 84s
2010-01-18 10:49:19 (168 KB/s) - "cas-server-3.3.5-release.tar.gz" saved [14467126/14467126]
[root@cas local]# tar xf cas-server-3.3.5-release.tar.gz
[root@cas local]# cd cas-server-3.3.5
[root@cas cas-server-3.3.5]# cd cas-server-webapp
[root@cas cas-server-webapp]#  

Modifier le fichier src/main/webapp/WEB-INF/classes/log4j.properties en indiquant le chemin des logs :

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 cas-server-webapp]#  mvn package install
[root@cas cas-server-webapp]#  cp target/cas.war /var/lib/tomcat5/webapps/ROOT.war
[root@cas cas-server-webapp]#  /etc/init.d/tomcat5 restart

Debuggage

Ajouter dans le fichier src/main/webapp/WEB-INF/classes/log4j.properties la ligne suivante :

Bloc de code
log4j.logger.org.jasig.cas=DEBUG

Les logs se trouvent dans le répertoire /var/log/tomcat5.

La mise au point la plus difficile est celle de Kerberos. Les logs en debug de Krb5LoginModule se trouvent dans catalina.out.

Test

Désactiver si nécessaire le firewall pour le port 8080 (system-config-firewall) et tester http://cas.ifsic.univ-rennes1.fr:8080 (user = test, password = test).

Passage en HTTPS

Génération du keystore

Rapatrier Jetty (par exemple dans /usr/local) depuis http://static.roopindersingh.com/jetty-6.1.7.jar .

Copier les clés publique (cas.ifsic.univ-rennes1.fr.pem) et privée (cas.ifsic.univ-rennes1.fr.key) dans /etc/pki/tls/private pour générer le keystore dans /etc/tomcat5 (en donnant comme mot de passe changeit) :

Bloc de code
[root@cas private]# openssl pkcs12 -export \
>     -out 
Bloc de code
[root@cas ~]# kadmin
Authenticating as principal root/admin@UNIV-RENNES1.FR with password.
Password for root/admin@UNIV-RENNES1.FR:
kadmin:  addprinc -randkey HTTP/cas.ifsic.univ-rennes1.fr
WARNING: no policy specified for HTTP/cas.ifsic.univ-rennes1.fr@UNIV-RENNES1.FR; defaulting to no policy
Principal "HTTP/cas.ifsic.univ-rennes1.fr@UNIV-RENNES1.FR" created.
kadmin:  ktadd -k /etc/httpd/conf/mod_auth_kerb.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/httpd/conf/mod_auth_kerb.keytab.
Entry for principal HTTP/cas.ifsic.univ-rennes1.fr.pkcs12 with\
> kvno 3, encryption type AES-128 CTS mode with 96-bit SHA-1 HMAC added to keytab WRFILE:/etc/httpd/conf/mod_auth_kerb.keytab.
Entry for principal HTTP/in cas.ifsic.univ-rennes1.fr.pem \
>     -inkey cas.ifsic.univ-rennes1.fr.key
Enter with kvno 3, encryption type Triple DES cbc mode with HMAC/sha1 added to keytab WRFILE:/etc/httpd/conf/mod_auth_kerb.keytab.
Entry for principal HTTP/Export Password:
Verifying - Enter Export Password:
[root@cas private]# java -cp /usr/local/jetty-6.1.7.jar org.mortbay.jetty.security.PKCS12Import \
>     cas.ifsic.univ-rennes1.fr with kvno 3, encryption type ArcFour with HMAC/md5 added to keytab WRFILE:/etc/httpd/conf/mod_auth_kerb.keytab.
Entry for principal HTTP/cas..pkcs12 /etc/tomcat5/cas.ifsic.univ-rennes1.fr.keystore
Enter withinput kvnokeystore 3, encryption type DES with HMAC/sha1 added to keytab WRFILE:/etc/httpd/conf/mod_auth_kerb.keytab.
Entry for principal HTTP/passphrase: changeit
Enter output keystore passphrase: changeit
Alias 0: 1
Adding key for alias 1
[root@cas private]# 

Régler les permissions du keystore :

Bloc de code
[root@cas private]# cd /etc/tomcat5/
[root@cas tomcat5]# chgrp tomcat cas.ifsic.univ-rennes1.fr with kvno 3, encryption type DES cbc mode with RSA-MD5 added to keytab WRFILE:/etc/httpd/conf/mod_auth_kerb.keytab.
kadmin:  exit
[root@cas ~]# 

Puis :

Bloc de code
[root@cas ~]# chown apache /etc/httpd/conf/mod_auth_kerb.keytab
[root@cas ~]# chmod 640 /etc/httpd/conf/mod_auth_kerb.keytab
[root@cas ~]#

Protéger un répertoire par Kerberos en éditant /etc/httpd/conf.d/auth_kerb.conf :

Bloc de code
<Location /kerb>
  #SSLRequireSSL
  AuthType KerberosV5
  AuthName "Kerberos Login"
  KrbMethodNegotiate On
  KrbMethodK5Passwd Off
  KrbAuthRealms UNIV-RENNES1.FR
  Krb5KeyTab /etc/httpd/conf/mod_auth_kerb.keytab
  require valid-user
</Location>

Test

Avant de tester, ne pas oublier d'ouvrir le port 80 entrant (system-config-firewall).

Balise Wiki
Tester en accédant [http://cas.ifsic.univ-rennes1.fr/kerb/test.php]. Le nom de l'utilisateur doit apparaître dans les variables *$_SERVER\["REMOTE_USER"\]* et *$_SERVER\["PHP_AUTH_USER"\]* (quelque chose comme *paubry@IFSIC.UNIV-RENNES1.FR*).

Note : il faut configurer les navigateurs clients pour que l'authentification kerberos soit transmise au serveur web.

Il est possible de supprimer le domaine Kerberos de l'identifiant renvoyé par mod_auth_kerb en ajoutant l'option suivante à mod_auth_kerb :

Bloc de code
KrbLocalUserMapping On

Installation Java/Maven/Tomcat

Télécharger le dernier JDK depuis http://java.sun.com/javase/downloads/index.jsp , puis exécuter :

Bloc de code
[root@cas Download]# chmod +x jdk-6u18-linux-i586-rpm.bin
[root@cas Download]# chmod +x jdk-6u18-linux-i586-rpm.bin
[...]
Done.
[root@cas Download]# 

Ajouter le fichier /etc/profile.d/java.sh contenant les lignes suivantes :

Bloc de code
export JAVA_HOME=/usr/java/default
export PATH=$JAVA_HOME/bin:$PATH

Vérifier l'installation :

Bloc de code
[root@cas ~]# java -version
java version "1.6.0_18"
Java(TM) SE Runtime Environment (build 1.6.0_18-b07)
Java HotSpot(TM) Client VM (build 16.0-b13, mixed mode, sharing)
[root@cas ~]#

Installer Maven et Tomcat :

Bloc de code
[root@cas ~]# yum install maven2 tomcat5
Astuce
titleVersion de Maven

Si jamais la version de Maven est avant 2.0.9, faire une installation manuelle depuis http://maven.apache.org/download.html :

Bloc de code
[root@cas ~]# mvn --version
/usr/java/default
Maven version: 2.0.8
Java version: 1.6.0_18
OS name: "linux" version: "2.6.31.9-174.fc12.i686" arch: "i386" Family: "unix"
[root@cas ~]# yum remove maven2
[...]
Complete!
[root@cas ~]# cd /usr/local
[root@cas local]# wget [ftp://ftp.inria.fr/pub/Apache/maven/binaries/apache-maven-2.2.1-bin.tar.gz]
--2010-01-18 11:14:08-- [ftp://ftp.inria.fr/pub/Apache/maven/binaries/apache-maven-2.2.1-bin.tar.gz]
=> "apache-maven-2.2.1-bin.tar.gz"
Resolving ftp.inria.fr... 192.93.2.32
Connecting to ftp.inria.fr\|192.93.2.32\|:21... connected.
Logging in as anonymous ... Logged in!
==> SYST ... done.    ==> PWD ... done.
==> TYPE I ... done.  ==> CWD (1) /pub/Apache/maven/binaries ... done.
==> SIZE apache-maven-2.2.1-bin.tar.gz ... 2840961
==> PASV ... done.    ==> RETR apache-maven-2.2.1-bin.tar.gz ... done.
Length: 2840961 (2.7M) (unauthoritative)
100%[==========================================================================================================================>] 2,840,961    987K/s   in 2.8s
2010-01-18 11:14:12 (987 KB/s) - "apache-maven-2.2.1-bin.tar.gz" saved [2840961]
[root@cas local]# tar xf apache-maven-2.2.1-bin.tar.gz
[root@cas local]# ln -s apache-maven-2.2.1 maven2
[root@cas local]#

Ajouter Maven au PATH dans /etc/profile.d/java.sh :

Bloc de code
export JAVA_HOME=/usr/java/default
export MVN_HOME=/usr/local/maven2
export PATH=$JAVA_HOME/bin:$PATH:$MVN_HOME/bin

Puis vérifier que Maven 2.2 est bien installé :

Bloc de code
[root@cas local]# mvn -version
Apache Maven 2.2.1 (r801777; 2009-08-06 21:16:01+0200)
Java version: 1.6.0_18
Java home: /usr/java/jdk1.6.0_18/jre
Default locale: en_US, platform encoding: UTF-8
OS name: "linux" version: "2.6.31.9-174.fc12.i686" arch: "i386" Family: "unix"
[root@cas local]#

Installation d'un serveur CAS basique

Installation

Télécharger la dernière version de CAS depuis http://www.jasig.org/cas/download  et décompresser :

Bloc de code
[root@cas ~]# cd /usr/local
[root@cas local]# wget http://www.ja-sig.org/downloads/cas/cas-server-3.3.5-release.tar.gz
--2010-01-18 10:47:55--  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   271K/s   in 84s
2010-01-18 10:49:19 (168 KB/s) - "cas-server-3.3.5-release.tar.gz" saved [14467126/14467126]
[root@cas local]# tar xf cas-server-3.3.5-release.tar.gz
[root@cas local]# cd cas-server-3.3.5
[root@cas cas-server-3.3.5]# cd cas-server-webapp
[root@cas cas-server-webapp]#  

Modifier le fichier src/main/webapp/WEB-INF/classes/log4j.properties en indiquant le chemin des logs :

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 cas-server-webapp]#  mvn package install
[root@cas cas-server-webapp]#  cp target/cas.war /var/lib/tomcat5/webapps/ROOT.war
[root@cas cas-server-webapp]#  /etc/init.d/tomcat5 restart

Test

Désactiver si nécessaire le firewall pour le port 8080 (system-config-firewall) et tester http://cas.ifsic.univ-rennes1.fr:8080 (user = test, password = test).

Passage en HTTPS

Génération du keystore

Rapatrier Jetty (par exemple dans /usr/local) depuis http://static.roopindersingh.com/jetty-6.1.7.jar .

Copier les clés publique (cas.ifsic.univ-rennes1.fr.pem) et privée (cas.ifsic.univ-rennes1.fr.key) dans /etc/pki/tls/private pour générer le keystore dans /etc/tomcat5 (en donnant comme mot de passe changeit) :

Bloc de code
[root@cas private]# openssl pkcs12 -export \
>     -out cas.ifsic.univ-rennes1.fr.pkcs12 \
>     -in cas.ifsic.univ-rennes1.fr.pem \
>     -inkey cas.ifsic.univ-rennes1.fr.key
Enter Export Password:
Verifying - Enter Export Password:
[root@cas private]# java -cp /usr/local/jetty-6.1.7.jar org.mortbay.jetty.security.PKCS12Import \
>     cas.ifsic.univ-rennes1.fr.pkcs12 /etc/tomcat5/cas.ifsic.univ-rennes1.fr.keystore
Enter input keystore passphrase: changeit
Enter output keystore passphrase: changeit
Alias 0: 1
Adding key for alias 1
[root@cas private]# 

Régler les permissions du keystore :

Bloc de code
[root@cas private]# cd /etc/tomcat5/
[root@cas tomcat5]# chgrp tomcat cas.ifsic.univ-rennes1.fr.keystore
[root@cas tomcat5]# chmod 640 cas.ifsic.univ-rennes1.fr.keystore
[root@cas tomcat5]# 

Configuration de Tomcat

Dans /etc/tomcat5/server.xml, commenter le connecteur HTTP sur le port 8080 et décommenter le connecteur HTTPS sur le port 8443 en ajoutant l'attribut :

Bloc de code
keystoreFile="/etc/tomcat5/cas.ifsic.univ-rennes1.fr.keystore"

Test

Redémarrer Tomcat, désactiver si nécessaire le firewall pour le port 8443 et tester https://cas.ifsic.univ-rennes1.fr:8443  (user = test, password = test).

Ajout de l'authentification LDAP

Script de déploiement de CAS

Pour faciliter le déploiement du serveur CAS, on pourra ajouter le script /usr/local/cas-server-3.3.5/deploy.sh suivant :

Bloc de code
#!/bin/bash
/etc/init.d/tomcat5 stop
pushd /usr/local/cas-server-3.3.5/cas-server-webapp
mvn package install && rm -f /var/lib/tomcat5/webapps/ROOT.war && cp target/cas.war /var/lib/tomcat5/webapps/ROOT.war
popd
/etc/init.d/tomcat5 start

Configuration de CAS pour LDAP

Dans le fichier src/main/webapp/WEB-INF/deployerConfigContext.xml, ajouter le bean suivant pour déclarer le contexte LDAP :

...

<bean id="contextSource" class="org.springframework.ldap.core.support.LdapContextSource">
  <property name="pooled" value="true"/>
  <property name="urls">
    <list>
      <value>ldap://ldapglobal.univ-rennes1.fr/</value>
    </list>
  </property>
  <property name="userDn" value=""/>
  <property name="password" value=""/>
  <property name="baseEnvironmentProperties">
    <map>
      <entry>
       <key>
         <value>java.naming.security.authentication</value>
       </key>
       <value>simple</value>
      </entry>
     </map>
  </property>
</bean>
.keystore
[root@cas tomcat5]# chmod 640 cas.ifsic.univ-rennes1.fr.keystore
[root@cas tomcat5]# 

Configuration de Tomcat

Dans /etc/tomcat5/server.xml, commenter le connecteur HTTP sur le port 8080 et décommenter le connecteur HTTPS sur le port 8443 en ajoutant l'attribut :

Bloc de code
keystoreFile="/etc/tomcat5/cas.ifsic.univ-rennes1.fr.keystore"

Test

Redémarrer Tomcat, désactiver si nécessaire le firewall pour le port 8443 et tester https://cas.ifsic.univ-rennes1.fr:8443  (user = test, password = test).

Ajout de l'authentification LDAP

Script de déploiement de CAS

Pour faciliter le déploiement du serveur CAS, on pourra ajouter le script /usr/local/cas-server-3.3.5/deploy.sh suivant :

Bloc de code
#!/bin/bash
/etc/init.d/tomcat5 stop
pushd /usr/local/cas-server-3.3.5/cas-server-webapp
mvn package install && rm -f /var/lib/tomcat5/webapps/ROOT.war && cp target/cas.war /var/lib/tomcat5/webapps/ROOT.war
popd
/etc/init.d/tomcat5 start

Configuration de CAS pour LDAP

Dans le fichier src/main/webapp/WEB-INF/deployerConfigContext.xml, ajouter le bean suivant pour déclarer le contexte LDAP :

Bloc de code
xml
xml
<bean id="contextSource" class="org.springframework.ldap.core.support.LdapContextSource">
  <property name="pooled" value="true"/>
  <property name="urls">
    <list>
      <value>ldap://ldapglobal.univ-rennes1.fr/</value>
    </list>
  </property>
  <property name="userDn" value=""/>
  <property name="password" value=""/>
  <property name="baseEnvironmentProperties">
    <map>
      <entry>
       <key>
         <value>java.naming.security.authentication</value>
       </key>
       <value>simple</value>
      </entry>
     </map>
  </property>
</bean>

puis changer le handler SimpleTestUsernamePasswordAuthenticationHandler par celui-ci :

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>

Test

Redéployer le serveur CAS et tester l'authentification d'un utilisateur LDAP.

Ajout d'un frontal Apache

On va dans cette partie configurer un frontal Apache sur le port 443, qui va accéder au Tomcat du serveur CAS en AJP sur le port 8009.

Remarque

Il n'est pas obligatoire de mettre un frontal Apache devant Tomcat, mais cela délègue le chiffrement à Apache au lieu de Tomcat et simplifie l'admisnitration système (cette architecture est employée de manière générale sur les plateformes d'exploitation).

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/private/cas.ifsic.univ-rennes1.fr.pem
#SSLCertificateKeyFile /etc/pki/tls/private/localhost.key
SSLCertificateKeyFile /etc/pki/tls/private/cas.ifsic.univ-rennes1.fr.key

Ajouter la ligne suivante pour indiquer à Apache de passer les requêtes à Tomcat :

Bloc de code
ProxyPass / ajp://cas.ifsic.univ-rennes1.fr:8009/ min=0 max=100 smax=50 ttl=10 route=ori-indexing

Configuration de Tomcat

S'assurer que le connecteur AJP sur le port 8009 est décommenté et a bien le paramètres tomcatAuthentication positionné à false :

Bloc de code
xml
xml
<Connector port="8009"
    debug="0"
    enableLookups="false"
    redirectPort="8443"
    protocol="AJP/1.3"
    tomcatAuthentication="false" />

Le connecteur HTTPS sur le port 8443 peut être commenté.

Test

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).

Ajout de l'authentification Kerberos

La documentation de référence est http://www.ja-sig.org/wiki/display/CASUM/SPNEGO .

Configuration de Kerberos

Procéder comme vu précédemment pour générer le fichier /etc/http.keytab qui sera utilisé ultérieurement par la librairie JCIFS :

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.ifsic.univ-rennes1.fr 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.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) :

Bloc de code
xml
xml
<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 :

Bloc de code
xml
xml
<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>

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

Bloc de code
xml
xml
<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>
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

puis changer le handler SimpleTestUsernamePasswordAuthenticationHandler par celui-ci :

...

<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>

Test

Redéployer le serveur CAS et tester l'authentification d'un utilisateur LDAP.

Ajout d'un frontal Apache

On va dans cette partie configurer un frontal Apache sur le port 443, qui va accéder au Tomcat du serveur CAS en AJP sur le port 8009.

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/private/cas.ifsic.univ-rennes1.fr.pem
#SSLCertificateKeyFile /etc/pki/tls/private/localhost.key
SSLCertificateKeyFile /etc/pki/tls/private/cas.ifsic.univ-rennes1.fr.key

Ajouter la ligne suivante pour indiquer à Apache de passer les requêtes à Tomcat :

Bloc de code
ProxyPass / ajp://cas.ifsic.univ-rennes1.fr:8009/ min=0 max=100 smax=50 ttl=10 route=ori-indexing

Configuration de Tomcat

Si le connecteur AJP sur le port 8009 n'avait pas été précédemment commenté, il n'y a rien de plus à configurer au niveau de Tomcat.

Le connecteur HTTPS sur le port 8443 peut en revanche être commenté.

Test

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).

Ajout de l'authentification Kerberos

Configuration de Apache

On ajoute simplement mod_auth_kerb au serveur virtuel frontal :

Bloc de code
<Location />
  #SSLRequireSSL
  AuthType KerberosV5
  AuthName "Kerberos Login"
  KrbMethodNegotiate On
  KrbMethodK5Passwd Off
  KrbAuthRealms UNIV-RENNES1.FR
  Krb5KeyTab /etc/httpd/conf/mod_auth_kerb.keytab
  #require valid-user
</Location>

Bien noter que l'on ne force pas l'authentification Kerberos (la directive require valid-user est commentée) pour que le serveur CAS bascule sur une authentification LDAP si l'authentification Kerberos n'est pas vérifiée.

Configuration de CAS

Les instruction de configuration de CAS sont extraites de http://www.ja-sig.org/wiki/display/CASUM/Trusted .

Ajouter le support du handler trusted

Editer le fichier <cas-home>/cas-server-webapp/pomsrc/main/webapp/WEB-INF/cas-servlet.xml et ajouter la dépendance suivante (par exemple juste après la dépendance vers le module cas-server-support-ldapavant le bean authenticationViaFormAction) :

Bloc de code
xml
xml
<dependency>
<groupId>org.jasig.cas</groupId>
<artifactId>cas-server-support-trusted</artifactId>

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

Modifier le login webflow

<bean
    id="negociateSpnego"
    class="org.jasig.cas.support.spnego.web.flow.SpnegoNegociateCredentialsAction" />

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

Modifier le schéma d'authentification

Pour modifier le schéma d'authentification, éditer Editer le fichier <cas-home>/cas-server-webapp/src/main/webapp/WEB-INF/login-webflowdeployerConfigContext.xml et ajouter l'état suivant juste avant l'état viewLoginForm :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
<action-state<bean id="authenticationManager" class="remoteAuthenticateorg.jasig.cas.authentication.AuthenticationManagerImpl">
<action  <property bean="principalFromRemoteAction" />
<transition on="success" to="sendTicketGrantingTicket" />
<transition on="error" to="viewLoginForm" />
</action-state>

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

...

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

...

<decision-state id="renewRequestCheck">
  <if
    test="${externalContext.requestParameterMap['renew'] != '' &amp;&amp; externalContext.requestParameterMap['renew'] != null}"
    then="remoteAuthenticate"
    else="generateServiceTicket" />
</decision-state>
name="credentialsToPrincipalResolvers">
    <list>
      <!--  ... the others credentialsToPrincipalResolvers ... -->
      <bean class="org.jasig.cas.support.spnego.authentication.principal.SpnegoCredentialsToPrincipalResolver" />
    </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="true" />
	<property name="NTLMallowed" value="false"/>
      </bean>
      <!--  ... the others authenticationHandlers... -->
    </list>
  </property>
</bean>

Le bean authenticationManager doit ainsi ressembler à :

Bloc de code
xml
xml
<bean   id="authenticationManager"
        class="org.jasig.cas.authentication.AuthenticationManagerImpl">
    <property name="credentialsToPrincipalResolvers">
      <list>
        <bean class="org.jasig.cas.authentication.principal.UsernamePasswordCredentialsToPrincipalResolver" />
        <bean class="org.jasig.cas.authentication.principal.HttpBasedServiceCredentialsToPrincipalResolver" />
        <bean

...

<action-state id="generateServiceTicket">
  <action bean="generateServiceTicketAction" />
  <transition on="success" to ="warn" />
  <transition on="error" to="remoteAuthenticate" />
  <transition on="gateway" to="redirect" />
</action-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
xmlxml
<bean
  id="principalFromRemoteAction"
  class="org.jasig.cas.adaptorssupport.trustedspnego.webauthentication.flowprincipal.PrincipalFromRequestRemoteUserNonInteractiveCredentialsActionSpnegoCredentialsToPrincipalResolver" />
  p:centralAuthenticationService-ref="centralAuthenticationService" />

Modifier le schéma d'authentification

Pour modifier le schéma d'authentification, éditer le fichier <cas-home>/cas-server-webapp/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
xmlxml
<bean id="authenticationManager"    </list>
    </property>
    <property name="authenticationHandlers">
      <list>
        <bean class="org.jasig.cas.authentication.AuthenticationManagerImpl">
support.spnego.authentication.handler.support.JCIFSSpnegoAuthenticationHandler">
	  <property name="authentication">
	    <bean class="jcifs.spnego.Authentication" />
	  </property>
	  <property name="principalWithDomainName" value="true" />
	  <property name="NTLMallowed" value="credentialsToPrincipalResolversfalse"/>
    <list>  </bean>
      <!--  ... the others credentialsToPrincipalResolvers ... -->
<bean class="org.jasig.cas.authentication.handler.support.HttpBasedServiceCredentialsAuthenticationHandler"
              p:httpClient-ref="httpClient" />
	<bean class="org.jasig.cas.adaptors.trusted.authentication.principal.PrincipalBearingCredentialsToPrincipalResolverldap.FastBindLdapAuthenticationHandler" />
    </list>
    </property>
  <property name="authenticationHandlers"filter" value="uid=%u,ou=people,dc=univ-rennes1,dc=fr" />
    <list>
      <property <bean class="org.jasig.cas.adaptors.trusted.authentication.handler.support.PrincipalBearingCredentialsAuthenticationHandlername="contextSource" ref="contextSource" />
      <!--  ... the others authenticationHandlers... --> </bean>
      </list>
    </property>
</bean>

Le bean authenticationManager doit ainsi ressembler à Ajouter enfin le bean jcifsConfig, qui done les options de configuration de JCIFS :

xml
Bloc de code
xml
<bean   idname="authenticationManagerjcifsConfig"
        class="org.jasig.cas.authentication.AuthenticationManagerImpl">
    <property name="credentialsToPrincipalResolverssupport.spnego.authentication.handler.support.JCIFSConfig">
  <property
    <list>
  name="jcifsServicePrincipal"
      <bean classvalue="org.jasig.HTTP/cas.authenticationifsic.principaluniv-rennes1.UsernamePasswordCredentialsToPrincipalResolverfr" />
  <property
      <bean class="org.jasig.cas.authentication.principal.HttpBasedServiceCredentialsToPrincipalResolvername="kerberosDebug"
      value="true" />
  <property
      name="kerberosRealm"
     <bean classvalue="org.jasig.cas.adaptors.trusted.authentication.principal.PrincipalBearingCredentialsToPrincipalResolverUNIV-RENNES1.FR" />
  <property
    </list>
  name="kerberosKdc"
  </property>
    <property namevalue="authenticationHandlers"kerb.ifsic.univ-rennes1.fr" />
  <property
    <list>
  name="loginConf"
      <bean class="org.jasig.cas.adaptors.trusted.authentication.handler.support.PrincipalBearingCredentialsAuthenticationHandler" />
        <bean class="org.jasig.cas.authentication.handler.support.HttpBasedServiceCredentialsAuthenticationHandler"
              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>

Test

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

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