Prerequisiti
JDK 8, apache tomcat 8 per installazione del cas-server
JDK 7, per il runtime di liferay 6.2
Installazione Ldap
Per semplicità d'uso e configurazione ho deciso di utilizzare apacheDS.
- Scaricare apache DS
- Installare apache DS con le impostazioni standard
Ora scarichiamo e installiamo JXplorer, un utility che useremo per connetterci e gestire il nostro ldap
- Scaricare JXplorer
- Installare JXplorer
- Configurate JXplorer per connettersi al nostro ldap
Ecco i parametri di connessione:
- hostname : localhost
- port : 10389
- Level : user+password
- User DN : uid=admin,ou=system
- password : secret
Andiamo ad aggiungere l'utente di default di Liferay (test@liferay.com) ad ldap:
- Nella parte sinistra di JXplorer espandiamo l'albero
- Tasto destro su "example" ---> new
Insieriamo :
- RDN: cn=test
- Base DN:dc=example,dc=com
Aggiungiamo i seguenti campi
- organizationalPerson
- person
- top
- inetOrgPerson
Compiliamo i campi in questo modo:
- cn=Test Test (full name di liferay)
- sn=Test
- displayName=test
- givenName=Test
- mail=test@liferay.com
- uid=test
- userPassword -->inseriamo la password e come policy di crypt utilizziamo SHA1
Prima di startare Liferay aggiugiamo la seguente property nel portal-ext.properties
ldap.auth.password.encryption.algorithm=SHA
quindi avviamo liferay e autentichimoci con l'utenza di default (test@liferay.com)
Da pannello di controllo configuriamo la connessione ad Ldap
Spuntare i seguenti flag
- Enabled (abilita ldap)
- Export Enabled (abilita l'export degli utenti liferay verso ldap)
Aggiungiamo un server ldap e configuriamolo in questo modo
- Server Name : ldap://localhost:10389
- Base Provider URL : ldap://localhost:10389
- Base DN : dc=example,dc=com
- Principal : uid=admin,ou=system
- Credential : secret
- Auth Search Filter : (mail=@email_address@)
- Import Search Filter : (objectClass=organizationalPerson)
Configuriamo il mapping dei campi ldap-->utente liferay
- screen name :displayname
- Email Address :mail
- Password : userPassword
- First Name : givenName
- Last Name : sn
- Job Title : title
- Full Name : cn
Come ultima cosa configuriamo i parametri per l'export degli utenti
- Users DN : dc=example,dc=com
- User Default Object Class : organizationalPerson,top,person,inetOrgPerson
La configurazione di ldap è terminata.
Configurazione del cas server
Come prima cosa scarichiamo i sorgenti del cas-server
https://github.com/apereo/cas/releases/tag/v5.0.4
Scompattiamo i sorgenti e portiamoci nella cartella cas-server-webapp
cas5.0.4/webapp/cas-server-webapp
Modifichiamo il build.gradle
per aggiungere il supporto ad ldap (che di default non è installato)
compile project(":support:cas-server-support-ldap")
a questo punto dalla root-folder di cas lanciamo il seguente comando
gradlew war
Non abbiamo bisogno di installare gradle in quanto CAS contiene il gradle wrapper
.
Rinominiamo il war appena generato in cas-server.war
(eliminando quindi la versione)
A questo punto dobbiamo generare il certificato e importarlo nelle jre di entrambe le jdk
keytool -genkey -alias tomcat -keypass changeit -keyalg RSA
Enter keystore password: changeit
What is your first and last name?
[Unknown]: localhost
What is the name of your organizational unit?
[Unknown]:
What is the name of your organization?
[Unknown]:
What is the name of your City or Locality?
[Unknown]:
What is the name of your State or Province?
[Unknown]:
What is the two-letter country code for this unit?
[Unknown]:
Is CN=localhost, OU=Unknown, O=Unknown, L=Unknown, ST=Unknown, C=Unknown correct?
[no]: y
Esportare il certificato in un file che, per esempio, possiamo chiamare: server.cert
keytool -export -alias tomcat -keypass changeit -file server.cert
Importarlo nella jre di entrambe le jdk
keytool -import -alias tomcat -file server.cert -keypass changeit -keystore %JAVA_HOME%/jre/lib/security/cacerts
Dopo aver importato i certificati dobbiamo abilitare il connettore https su entrambi i tomcat
Editiamo il server.xml del cas-server e aggiungiamo
<Connector port="9443" maxHttpHeaderSize="8192" protocol="org.apache.coyote.http11.Http11NioProtocol"
maxThreads="150" minSpareThreads="25" maxSpareThreads="75"
enableLookups="false" disableUploadTimeout="true"
acceptCount="100" scheme="https" secure="true"
clientAuth="false" sslProtocol="TLS" SSLEnabled="true" keystoreFile="${user.home}/.keystore" keystorePass="changeit"/>
Ora editiamo in maniera speculare il server.xml del tomcat di liferay
<Connector SSLEnabled="true" acceptCount="100" clientAuth="false" disableUploadTimeout="true" enableLookups="false"
keystoreFile="${user.home}/.keystore" keystorePass="changeit"
maxHttpHeaderSize="8192" maxSpareThreads="75" maxThreads="150" minSpareThreads="25" port="8443"
protocol="org.apache.coyote.http11.Http11Protocol" scheme="https" secure="true" sslProtocol="TLS"/>
Ora possiamo startare il server liferay.
Come già fatto per ldap andiamo nel pannello di controllo e nella sezione riguardante il cas configuriamo i paramentri nel modo seguente
Abilitiamo il flag
configuriamo gli altri parametri in questo modo
- cas login: https://localhost:9443/cas-server/login
- cas logout:https://localhost:9443/cas-server/logout
- server name:https://localhost:8443
- server url:https://localhost:9443/cas-server
- No Such User Redirect URL:https://localhost:8443
Salviamo la configurazione e facciamo logout.
Come ultimo passo dobbiamo configurare la webapp di cas.
Copiamo il war di cas nella webapp di tomcat 8 e startiamo il server.
Appena il war viene scompattato stoppiamo il tomcat.
Ora modifichiamo i file di proprty del cas che si trovano in tomcat/webapp/cas-server/classes
Editiamo boostrap.property
Commentiamo la riga seguente
spring.cloud.config.server.native.searchLocations=file:///etc/cas/config
Ora editiamo
application.property
sovrascirvere il contennuto del file con le property seguenti (adattando i paramentri di connessione ad ldap)
Modifichiamo la sezione relativa al logging in questo modo
##
# CAS Log4j Configuration
#
#logging.config=file:/etc/cas/log4j2.xml
logging.config=classpath:log4j2.xml
#server.context-parameters.isLog4jAutoInitializationDisabled=true
Disabiltiamo gli utenti statici di cas (in caso contrario funzionerebbe solo con questi)
##
# CAS Authentication Credentials
#
cas.authn.accept.users=
e come ultimo passo agiungiamo i parametri di connessione ad ldap
cas.authn.ldap[0].ldapUrl=ldap://localhost:10389
cas.authn.ldap[0].useSsl=false
cas.authn.ldap[0].useStartTls=false
cas.authn.ldap[0].connectTimeout=5000
cas.authn.ldap[0].baseDn=dc=example,dc=com
cas.authn.ldap[0].userFilter=mail={user}
cas.authn.ldap[0].subtreeSearch=true
cas.authn.ldap[0].bindDn=uid=admin,ou=system
cas.authn.ldap[0].bindCredential=secret
cas.authn.ldap[0].dnFormat=objectClass=organizationalPerson
cas.authn.ldap[0].type=AUTHENTICATED
cas.authn.ldap[0].principalAttributeId=mail
cas.authn.ldap[0].principalAttributePassword=userPassword
cas.authn.ldap[0].minPoolSize=3
cas.authn.ldap[0].maxPoolSize=10
cas.authn.ldap[0].validateOnCheckout=true
cas.authn.ldap[0].validatePeriodically=true
cas.authn.ldap[0].validatePeriod=600
cas.authn.ldap[0].failFast=false
cas.authn.ldap[0].idleTime=5000
cas.authn.ldap[0].prunePeriod=5000
cas.authn.ldap[0].blockWaitTime=5000
Configuriamo le chiavi di encrypt per i cookie. (Se non le configuriamo al primo start di cas verranno generate e scritte nei log)
# CAS SSO Cookie Generation & Security
# See https://github.com/mitreid-connect/json-web-key-generator
#
# Do note that the following settings MUST be generated per deployment.
#
# Defaults at spring-configuration/ticketGrantingTicketCookieGenerator.xml
# The encryption secret key. By default, must be a octet string of size 256.
tgc.encryption.key=f0ScJSsOIEzZf5Llhmq-xc9GA9oHBHtQmoRLbCxKFUc
# The signing secret key. By default, must be a octet string of size 512.
tgc.signing.key=tPw2L0W3fyPpZUEiIi-qKz6RAt4FuHsqUPJblBNUfBPWkrDtAJaMFOYOoCqrUapf6pDOke8ApFAO4itTQBvMag
Finalemente abbiamo finito tutte le configurazioni e possiamo startare il nostro server cas.
Purtroppo Liferay, ha un bug sul primo accesso, dovuto ad una doppia validazione del ticket generato dai termini d'uso e dal cambio password.
Quindi ho dovuto modificare tramite un hook due jsp
terms_of_use.jsp
in cui ho modificato il primo statement if
all'interno della jsp in questo modo
if (referer.equals(themeDisplay.getPathMain() + "/portal/update_terms_of_use")) {
referer = themeDisplay.getPathMain() + "?doAsUserId=" + themeDisplay.getDoAsUserId();
} else if (referer.contains("ticket")) {
referer = HttpUtil.removeParameter(referer, "ticket");
}
e in modo speculare ho modificato
update_password.jsp
if (referer.startsWith(themeDisplay.getPathMain() + "/portal/update_password") && Validator.isNotNull(ticketKey)) {
referer = themeDisplay.getPathMain();
}else if (referer.contains("ticket")) {
Prevents CAS ticket to be validated twice
referer = HttpUtil.removeParameter(referer, "ticket");
}
Dopo paver deployato l'hook colleghiamoci a https://localhost:8443
- registriamo un utente
- verifichiamo che venga esportato su ldap
- clicchiamo su sign-in (non dalla portlet) per venire reindirizzati su cas
- inseriamo le nostre credenziali
se tutto è andato a buon fine verremo reindirizzati su liferay che ci chiederà di accettare i termini d'uso e cambiare la password.