Date: Thu, 28 Mar 2024 16:39:26 +0100 (CET) Message-ID: <1975391152.129.1711640366541@confluence-esup.uphf.fr> Subject: Exported From Confluence MIME-Version: 1.0 Content-Type: multipart/related; boundary="----=_Part_128_574207031.1711640366541" ------=_Part_128_574207031.1711640366541 Content-Type: text/html; charset=UTF-8 Content-Transfer-Encoding: quoted-printable Content-Location: file:///C:/exported.html
Adaptation d'un serveur CAS existant= p>
Cette page d=C3=A9crit l'installation de A =C3=A0 Z d'un nouveau serveur= CAS qui permet :
Il est facile pour un administrateur CAs d'extraire de cette documentati= on les =C3=A9l=C3=A9ments n=C3=A9cessaires =C3=A0 l'adaptation d'un serveur= CAS existant pour lui donner les fonctionnalit=C3=A9s voulues.
Nom du serveur |
cas-kerb.univ-rennes1.fr = |
Syst=C3=A8me |
RedHat Entreprise 5 |
Ouverture de ports |
ssh (22 tcp) |
Installer les packages Tomcat (yum install tomcat5), Ap= ache (yum install httpd), puis Maven :
[root@c= as-kerb ~]# cd /usr/local [root@cas-kerb local]# wget ftp://ftp.inria.fr/pub/Apache/maven/binaries/ap= ache-maven-2.2.1-bin.tar.gz --2010-03-09 10:35:41-- ftp://ftp.inria.fr/pub/Apache/maven/binaries/apach= e-maven-2.2.1-bin.tar.gz =3D> `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! =3D=3D> SYST ... done. =3D=3D> PWD ... done. =3D=3D> TYPE I ... done. =3D=3D> CWD /pub/Apache/maven/binaries ... = done. =3D=3D> SIZE apache-maven-2.2.1-bin.tar.gz ... 2840961 =3D=3D> PASV ... done. =3D=3D> RETR apache-maven-2.2.1-bin.tar.gz = ... done. Length: 2840961 (2.7M) 100%[=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D>] 2,840,961 2.01M/s in 1.3s 2010-03-09 10:35:43 (2.01 MB/s) - `apache-maven-2.2.1-bin.tar.gz' saved [28= 40961] [root@cas-kerb local]# tar xf apache-maven-2.2.1-bin.tar.gz [root@cas-kerb local]# ln -s apache-maven-2.2.1 maven2 [root@cas-kerb local]# cd /etc/profile.d [root@cas-kerb profile.d]# cat > maven2.sh export PATH=3D$PATH:/usr/local/maven2/bin [root@cas-kerb profile.d]# chmod 644 maven2.sh [root@cas-kerb profile.d]# . maven2.sh [root@cas-kerb profile.d]#
T=C3=A9l=C3=A9charger la derni=C3=A8re version de CAS depuis http://www.jasig.org/cas/download et d=C3=A9compresser :
[root@c= as-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%[=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D>] 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 [1= 4467126/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]#
Pour diminuer les temps de compilation, on ajoute la propri=C3=A9t=C3=A9= skipTests au plugin maven-sunfire dans le fichier pom.xml =C3=A0 la racine du projet :
<plug= in> <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=C3=A9er un r=C3=A9pertoire cas-server-rennes1 dans l= equel seront stock=C3=A9es toutes les personnalisations et y ajouter le fic= hier pom.xml suivant :
<proj= ect xmlns=3D"http://maven.apache.org/POM/4.0.0" xmlns:xsi=3D"http://www.w3.= org/2001/XMLSchema-instance" xsi:schemaLocation=3D"http://maven.apache.org/POM/4.0.0 http://maven.apac= he.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> <artifactId>cas-server-core</artifactId> <version>${project.version}</version> </dependency> </dependencies> <build> <finalName>cas</finalName> <plugins> <plugin> <artifactId>maven-compiler-plugin</artifactId> <version>RELEASE</version> <configuration> <source>1.5</source> <target>1.5</target> </configuration> </plugin> </plugins> </build> <repositories> <repository> <id>jasig-repository</id> <name>JA-SIG Maven2 Repository</name> <url>http://developer.ja-sig.org/maven2</url> </repository> </repositories> <reporting> <plugins> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-project-info-reports-plugin</art= ifactId> </plugin> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-javadoc-plugin</artifactId> </plugin> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-changelog-plugin</artifactId> </plugin> </plugins> </reporting> </project>
Plut=C3=B4t que modifier les fichiers de la distribution CAS, il est pr= =C3=A9f=C3=A9rable de maintenir toutes modifications effectu=C3=A9es dans c= e r=C3=A9pertoire, ce qui facilite les mises =C3=A0 jour. Tous les fichiers= trouv=C3=A9s dans ce r=C3=A9pertoire =C3=A9craseront les fichiers de la di= stribution, on adoptera donc exactement la m=C3=AAme hi=C3=A9rarchie de fic= hiers que celle de la distribution.
Copier le fichier src/main/webapp/WEB-INF/classes/log4j.properti= es de cas-server-webapp dans src/main/web= app/WEB-INF/classes et indiquer le chemin des logs :
log4j.a= ppender.logfile.File=3D/var/log/tomcat5/cas.log
G=C3=A9n=C3=A9rer le WAR, le copier dans Tomcat et red=C3=A9marrer :
[root@c= as cas-server-rennes1]# mvn package install [root@cas cas-server-rennes1]# cp target/cas.war /var/lib/tomcat5/webapps/= ROOT.war [root@cas cas-server-rennes1]# /etc/init.d/tomcat5 restart
Ajouter dans le fichier src/main/webapp/WEB-INF/classes/log4j.pr= operties la ligne suivante :
log4j.l= ogger.org.jasig.cas=3DDEBUG
Les logs se trouvent dans le r=C3=A9pertoire /var/log/tomcat5.
La mise au point la plus difficile est celle de Kerberos (les logs en de= bug de Krb5LoginModule se trouvent dans catalina.o= ut).
Tester http://cas-kerb.univ-rennes1.fr:8080 (user =3D= test, password =3D test).
Pour faciliter le d=C3=A9ploiement du serveur CAS et le red=C3=A9marrage= de Tomcat, on pourra ajouter le script /usr/local/cas-server-3.3.5= /deploy-restart.sh suivant :
[root@c= as-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 /var/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]#
On va dans cette partie configurer un frontal Apache sur le port 80, qui= va acc=C3=A9der au Tomcat du serveur CAS en AJP sur le port 8009.
Il n'est pas obligatoire de mettre un frontal Apache devant Tomcat, mais= cela d=C3=A9l=C3=A8gue le chiffrement =C3=A0 Apache au lieu de Tomcat et s= implifie l'administration syst=C3=A8me (cette architecture est employ=C3=A9= e de mani=C3=A8re g=C3=A9n=C3=A9rale sur les plateformes d'exploitation).= p>
Ins=C3=A9rer dans /etc/httpd/conf.d/proxy_ajp.conf les = lignes suivantes :
ProxyPa= ss / ajp://cas-kerb.univ-rennes1.fr:8009/ min=3D0 max=3D100 smax=3D50 ttl= =3D10
S'assurer que le connecteur AJP sur le port 8009 n'est pas comment=C3=A9= et a bien le param=C3=A8tres tomcatAuthentication positio= nn=C3=A9 =C3=A0 false :
<Conn= ector port=3D"8009" debug=3D"0" enableLookups=3D"false" redirectPort=3D"8443" protocol=3D"AJP/1.3" tomcatAuthentication=3D"false" />
Apr=C3=A8s red=C3=A9marrage de Apache et Tomcat, le serveur CAS doit d= =C3=A9sormais r=C3=A9pondre sur l'URL https://cas-kerb.univ= -rennes1.fr (sur le port 80 par d=C3=A9faut en HTTP).
Installer si n=C3=A9cessaire le package mod_ssl (
Installerle certificat x509 et la cl=C3=A9priv=C3=A9e du serveur dans le= s r=C3=A9pertoires appropri=C3=A9s (/etc/pki/tls/
Installer le certificat du serveur en =C3=A9ditant /etc/httpd/co= nf.d/ssl.conf et modifier les lignes suivantes dans le virtual= host _default_:443 :
#SSLCer= tificateFile /etc/pki/tls/certs/localhost.crt SSLCertificateFile /etc/pki/tls/certs/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=C3=A8s red=C3=A9marrage de Apache, le serveur CAS doit d=C3=A9sormai= s r=C3=A9pondre sur l'URL https://cas.ifsic.univ-rennes1.f= r (sur le port 443 par d=C3=A9faut en HTTPS).
Ne pas oublier de supprimer la ligne suivante de /etc/httpd/conf= /httpd.conf :
Listen = 80
Ajouter la d=C3=A9pendance vers le module cas-server-support-lda= p dans le fichier pom.xml :
<depe= ndency> <groupId>org.jasig.cas</groupId> <artifactId>cas-server-support-ldap</artifactId> <version>${project.version}</version> </dependency>
Copier le fichier src/main/webapp/WEB-INF/deployerConfigContext.= xml de cas-server-webapp dans src/main/we= bapp/WEB-INF, ajouter le bean suivant pour d=C3=A9clarer le contex= te LDAP :
<bean= id=3D"contextSource" class=3D"org.springframework.ldap.core.support.LdapCo= ntextSource"> <property name=3D"pooled" value=3D"true"/> <property name=3D"urls"> <list> <value>ldap://ldapglobal.univ-rennes1.fr/</value> </list> </property> <property name=3D"userDn" value=3D""/> <property name=3D"password" value=3D""/> <property name=3D"baseEnvironmentProperties"> <map> <entry> <key> <value>java.naming.security.authentication</value> </key> <value>simple</value> </entry> </map> </property> </bean>
puis changer le handler SimpleTestUsernamePasswordAuthentication= Handler par celui-ci :
<bean class=3D"org.jasig.cas.adaptors.ldap.FastBindLdapAuthenticationHandler" = > <property name=3D"filter" value=3D"uid=3D%u,ou=3Dpeople,dc=3Duniv-r= ennes1,dc=3Dfr" /> <property name=3D"contextSource" ref=3D"contextSource" /> </bean>
Red=C3=A9ployer le serveur CAS, et tester l'authentification d'un utilis= ateur LDAP.
La documentation de r=C3=A9f=C3=A9rence est ht= tp://www.ja-sig.org/wiki/display/CASUM/SPNEGO .
Editer le fichier /etc/krb5.conf pour int=C3=A9grer le = serveur au domaine Kerberos :
[loggin= g] default =3D FILE:/var/log/krb5libs.log kdc =3D FILE:/var/log/krb5kdc.log admin_server =3D FILE:/var/log/kadmind.log [libdefaults] default_realm =3D UNIV-RENNES1.FR dns_lookup_realm =3D false dns_lookup_kdc =3D false ticket_lifetime =3D 24h forwardable =3D yes [realms] UNIV-RENNES1.FR =3D { kdc =3D kerb1.univ-rennes1.fr:88 admin_server =3D kerb1.univ-rennes1.fr:749 default_domain =3D univ-rennes1.fr } [domain_realm] .univ-rennes1.fr =3D UNIV-RENNES1.FR univ-rennes1.fr =3D UNIV-RENNES1.FR [appdefaults] pam =3D { debug =3D false ticket_lifetime =3D 36000 renew_lifetime =3D 36000 forwardable =3D true krb4_convert =3D false }
Ajouter le principal HTTP/cas-kerb.univ-rennes1.fr (casse importante) au royaume et l'exporter dans le fichier /e= tc/http.keytab :
[root@c= as-kerb ~]# kadmin Authenticating as principal rootifsic/admin@UNIV-RENNES1.FR with password. kadmin: Client not found in Kerberos database while initializing kadmin int= erface [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 t= ype Triple DES cbc mode with HMAC/sha1 added to keytab WRFILE:/etc/http.key= tab. Entry for principal HTTP/cas-kerb.univ-rennes1.fr with kvno 3, encryption t= ype ArcFour with HMAC/md5 added to keytab WRFILE:/etc/http.keytab. Entry for principal HTTP/cas-kerb.univ-rennes1.fr with kvno 3, encryption t= ype DES with HMAC/sha1 added to keytab WRFILE:/etc/http.keytab. Entry for principal HTTP/cas-kerb.univ-rennes1.fr with kvno 3, encryption t= ype 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=C3=A9 par la li= brairie JCIFS, il doit =C3=AAtre lisible par l'utilisateur tomcat= strong> :
[root@c= as-kerb ~]# cd /etc [root@cas-kerb etc]# chown root:tomcat http.keytab [root@cas-kerb etc]# chmod 640 http.keytab [root@cas-kerb etc]#
Ajouter dans le fichier /etc/tomcat5/tomcat5.conf les l= ignes suivantes :
JAVA_OP= TS=3D"$JAVA_OPTS -Dcom.ibm.security.jgss.debug=3Dall" JAVA_OPTS=3D"$JAVA_OPTS -Dsun.security.jgss.debug=3Dtrue" JAVA_OPTS=3D"$JAVA_OPTS -Dsun.security.krb5.debug=3Dtrue" JAVA_OPTS=3D"$JAVA_OPTS -Djava.security.debug=3Dlogincontext,policy,scl,gss= loginconfig
Les logs se trouvent dans /var/log/tomcat5/catalina.out= .
Editer le fichier pom.xml et ajouter la d=C3=A9pendance= suivante (par exemple juste apr=C3=A8s la d=C3=A9pendance vers le module <= strong>cas-server-support-ldap) :
<depe= ndency> <groupId>org.jasig.cas</groupId> <artifactId>cas-server-support-spnego</artifactId> <version>${project.version}</version> </dependency>
Editer le fichier src/main/webapp/WEB-INF/login-webflow.xml et ajouter l'=C3=A9tat suivant juste avant l'=C3=A9tat viewLoginFo= rm :
<acti= on-state id=3D"startAuthenticate"> <action bean=3D"negociateSpnego" /> <transition on=3D"success" to=3D"spnego" /> </action-state> <action-state id=3D"spnego"> <action bean=3D"spnego" /> <transition on=3D"success" to=3D"sendTicketGrantingTicket" /> <transition on=3D"error" to=3D"viewLoginForm" /> </action-state>
Dans ce m=C3=AAme fichier, remplacer les r=C3=A9f=C3=A9rences =C3=A0 viewLoginForm par startAuthenticate pour les deux decisi= on-state gatewayRequestCheck et renewRequestCheck :<= /p>
<deci= sion-state id=3D"gatewayRequestCheck"> <if test=3D"${externalContext.requestParameterMap['gateway'] !=3D '' &a= mp;& externalContext.requestParameterMap['gateway'] !=3D null &= amp;& flowScope.service !=3D null}" then=3D"redirect" else=3D"startAuthenticate" /> </decision-state>
<deci= sion-state id=3D"renewRequestCheck"> <if test=3D"${externalContext.requestParameterMap['renew'] !=3D '' &= ;& externalContext.requestParameterMap['renew'] !=3D null}" then=3D"startAuthenticate" else=3D"generateServiceTicket" /> </decision-state>
D=C3=A9clarer le bean impl=C3=A9mentant le nouvel =C3=A9tat du webflow e= n ajoutant les lignes suivantes dans le fichier src/main/webapp/WEB= -INF/cas-servlet.xml (par exemple juste avant le bean auth= enticationViaFormAction) :
<bean id=3D"negociateSpnego" class=3D"org.jasig.cas.support.spnego.web.flow.SpnegoNegociateCredentia= lsAction" /> <bean id=3D"spnego" class=3D"org.jasig.cas.support.spnego.web.flow.SpnegoCredentialsAction"= > =09<property name=3D"centralAuthenticationService" ref=3D"centralAuthent= icationService"/> </bean>
Pour modifier le sch=C3=A9ma d'authentification, =C3=A9diter le fichier = src/main/webapp/WEB-INF/deployerConfigContext.xml et modif= ier le bean authenticationManager en ajoutant :
<bean= id=3D"authenticationManager" class=3D"org.jasig.cas.authentication.Authent= icationManagerImpl"> <property name=3D"credentialsToPrincipalResolvers"> <list> <!-- ... the others credentialsToPrincipalResolvers ... --> <bean class=3D"org.jasig.cas.support.spnego.authentication.princip= al.SpnegoCredentialsToPrincipalResolver" /> </list> </property> <property name=3D"authenticationHandlers"> <list> <bean class=3D"org.jasig.cas.support.spnego.authentication.handler= .support.JCIFSSpnegoAuthenticationHandler"> =09<property name=3D"authentication"> =09 <bean class=3D"jcifs.spnego.Authentication" /> =09</property> =09<property name=3D"principalWithDomainName" value=3D"false" /> =09<property name=3D"NTLMallowed" value=3D"false"/> </bean> <!-- ... the others authenticationHandlers... --> </list> </property> </bean>
Le bean authenticationManager doit ainsi ressembler =C3= =A0 :
<bean= id=3D"authenticationManager" class=3D"org.jasig.cas.authentication.AuthenticationManagerImpl">= ; <property name=3D"credentialsToPrincipalResolvers"> <list> <bean class=3D"org.jasig.cas.authentication.principal.UsernamePa= sswordCredentialsToPrincipalResolver" /> <bean class=3D"org.jasig.cas.authentication.principal.HttpBasedS= erviceCredentialsToPrincipalResolver" /> <bean class=3D"org.jasig.cas.support.spnego.authentication.princ= ipal.SpnegoCredentialsToPrincipalResolver" /> </list> </property> <property name=3D"authenticationHandlers"> <list> <bean class=3D"org.jasig.cas.support.spnego.authentication.handl= er.support.JCIFSSpnegoAuthenticationHandler"> =09 <property name=3D"authentication"> =09 <bean class=3D"jcifs.spnego.Authentication" /> =09 </property> =09 <property name=3D"principalWithDomainName" value=3D"true" /> =09 <property name=3D"NTLMallowed" value=3D"false"/> </bean> <bean class=3D"org.jasig.cas.authentication.handler.support.HttpBa= sedServiceCredentialsAuthenticationHandler" p:httpClient-ref=3D"httpClient" /> =09<bean class=3D"org.jasig.cas.adaptors.ldap.FastBindLdapAuthentication= Handler" > <property name=3D"filter" value=3D"uid=3D%u,ou=3Dpeople,dc=3Du= niv-rennes1,dc=3Dfr" /> <property name=3D"contextSource" ref=3D"contextSource" /> </bean> </list> </property> </bean>
Ajouter enfin le bean jcifsConfig, qui done les options= de configuration de JCIFS :
<bea= n name=3D"jcifsConfig" class=3D"org.jasig.cas.support.spnego.authentication= .handler.support.JCIFSConfig"> <property name=3D"jcifsServicePrincipal" value=3D"HTTP/cas-kerb.univ-rennes1.fr" /> <property name=3D"kerberosDebug" value=3D"true" /> <property name=3D"kerberosRealm" value=3D"UNIV-RENNES1.FR" /> <property name=3D"kerberosKdc" value=3D"kerb1.univ-rennes1.fr" /> <property name=3D"loginConf" value=3D"/etc/jcifs/login.conf" /> </bean>
La configuration de JCIFS se fait =C3=A9galement dans le fichier login.conf = point=C3=A9 par le bean jcifsConfig. Cr=C3=A9er ce fichier= avec le contenu suivant :
com.sun= .security.jgss.krb5.accept { com.sun.security.auth.module.Krb5LoginModule required debug=3Dtrue storeKey=3Dtrue useKeyTab=3Dtrue keyTab=3D"/etc/http.keytab" principal=3D"HTTP/cas-kerb.univ-rennes1.fr"; };
Il faut passer =C3=A0 la JVM qui ex=C3=A9cute Tomcat l'option -D= javax.security.auth.useSubjectCredsOnly=3Dfalse, par exemple en = =C3=A9ditant le fichier /etc/tomcat5/tomcat5.conf et en aj= outant la ligne suivante :
JAVA_OP= TS=3D"$JAVA_OPTS -Djavax.security.auth.useSubjectCredsOnly=3Dfalse"
Un navigateur bien configur=C3=A9 et poss=C3=A9dant des credentials Kerb= eros valides doit maintenant se connecter au serveur CAS sans aucune intera= ction....
L'alimentation Kerberos d=C3=A9signe le processus qui permet d'alimenter= un royaume Kerberos avec comptes utilisateurs lors de la connexion au serv= eur CAS. Elle peut =C3=AAtre utilis=C3=A9e pour amorcer le remplissage du r= oyaume =C3=A0 partir d'un annuaire LDAP, ce que nous montrons dans cet exem= ple.
En premier lieu, d=C3=A9clarer le principal qui servira =C3=A0 = la mise =C3=A0 jour du royaume Kerberos (ici cas/admin) et= l'exporter dans le fichier /etc/cas-admin.keytab :
[root@c= as-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 n= o 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 m= ode with HMAC/sha1 added to keytab WRFILE:/etc/cas-admin.keytab. Entry for principal cas/admin with kvno 3, encryption type ArcFour with HMA= C/md5 added to keytab WRFILE:/etc/cas-admin.keytab. Entry for principal cas/admin with kvno 3, encryption type DES with HMAC/sh= a1 added to keytab WRFILE:/etc/cas-admin.keytab. Entry for principal cas/admin with kvno 3, encryption type DES cbc mode wit= h RSA-MD5 added to keytab WRFILE:/etc/cas-admin.keytab. kadmin: exit [root@cas-kerb ~]#
Le fichier cas-admin.keytab doit =C3=AAtre lisible par = l'utilisateur tomcat :
[root@c= as-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 =C3=A9galement n=C3=A9cessaire de modifier les permissions du fic=
hier de log de kadmin sans quoi l'appel de
[root@c= as-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]#
L'alimentation du royaume Kerberos se fait en utilisant le module
Il faut ensuite ajouter la d=C3=A9pendance de cas-server-rennes1= vers cas-server-integration-kerberosfeed en ajou= tant dans le fichier pom.xml du module cas-server-= rennes1 les lignes suivantes :
<depe= ndency> <groupId>org.jasig.cas</groupId> <artifactId>cas-server-integration-kerberosfeed</artifactId> <version>${project.version}</version> </dependency>
On utilise la classe KerberosFeedAuthenticationHandlerWrapper pour enrober l'appel des authenticationHandlers pour lesque= ls on souhaite mettre en place une alimentation du royaume Kerberos. Les li= gnes suivantes de src/main/webapp/WEB-INF/deployerConfigContext.xml=
<bean= class=3D"org.jasig.cas.adaptors.ldap.FastBindLdapAuthenticationHandler" &g= t; <property name=3D"filter" value=3D"uid=3D%u,ou=3Dpeople,dc=3Duniv-renn= es1,dc=3Dfr" /> <property name=3D"contextSource" ref=3D"contextSource" /> </bean>
Seront ainsi remplac=C3=A9es par :
<bean= class=3D"org.esupportail.cas.adaptors.kerberosfeed.KerberosFeedAuthenticat= ionHandlerWrapper" > <property name=3D"authenticationHandler"> <bean class=3D"org.jasig.cas.adaptors.ldap.FastBindLdapAuthenticatio= nHandler" > <property name=3D"filter" value=3D"uid=3D%u,ou=3Dpeople,dc=3Duniv-= rennes1,dc=3Dfr" /> <property name=3D"contextSource" ref=3D"contextSource" /> </bean> </property> <property name=3D"config" ref=3D"kerberosFeedConfig" /> <property name=3D"registry" ref=3D"kerberosFeedRegistry" /> </bean>
Lorsqu'un authenticationHandler est enrob=C3=A9 de la sorte et = que l'authentification du bean enrob=C3=A9 (ici FastBindLdapAuthent= icationHandler) s'effectue avec succ=C3=A8s, alors elle est suivie= de l'ajout dans le royaume de l'utilisateur =C3=A0 l'aide d'une commande <= strong>kadmin, en utilisant la configuration donn=C3=A9e par le be= an kerberosFeedConfig :
<bean id=3D"kerberosFeedConfig" class=3D"org.esupportail.cas.adaptors.kerberosfeed.KerberosFeedConfig"&= gt; <property name=3D"kadminPath" value=3D"/usr/kerberos/bin/kadmin" /> <property name=3D"realm" value=3D"UNIV-RENNES1.FR" /> <property name=3D"principal" value=3D"cas/admin" /> <property name=3D"useKeytab" value=3D"true" /> <property name=3D"keytab" value=3D"/etc/cas-admin.keytab" /> <!-- property name=3D"password" value=3D"secret" /--> <property name=3D"passwordAllowedChars" value=3D"abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789= &~#{([-|`\\_^@)]=3D+}$%*!:/;.,?><" /> </bean>
La propri=C3=A9t=C3=A9 password n'est utilis=C3=A9e que= lorsque useKeytab est positionn=C3=A9e =C3=A0 fal= se, dans le cas ci-dessous on utilise la keytab g=C3=A9n= =C3=A9r=C3=A9e pr=C3=A9c=C3=A9demment.
L'ajout d'un utilisateur d=C3=A9j=C3=A0 pr=C3=A9sent dans le royaume Ker=
beros provoque une erreur de kadmin, qui n'est pas prise e=
n compte (rien n'est fait dans ce cas, l'erreur n'est pas dommageable). N=
=C3=A9anmoins, afin de ne pas rejouer l'ajout d'un utilisateur d=C3=A9j=C3=
=A0 pr=C3=A9sent dans le royaume, le bean KerberosFeedAuthenticatio=
nHandlerWrapper s'appuie sur un registre (propri=C3=A9t=C3=A9
<bean id=3D"kerberosFeedRegistry" class=3D"org.esupportail.cas.adaptors.kerberosfeed.registry.BerkeleyDbR= egistryImpl"> <property name=3D"dbPath" value=3D"/tmp" /> </bean>
Les informations seront ici stock=C3=A9es dans le r=C3=A9pertoire
Se connecter sur le serveur CAS avec un utilisateur de l'annuaire LDAP (= par exemple dupont) et v=C3=A9rifier qu'il est bien ajout= =C3=A9 dans la base Kerberos (getprinc dupont sous kadmin sur le KDC).