Alfresco supporta l’integrazione con sottosistemi di autenticazione esterni basati su protocollo LDAP. Sulla documentazione ufficiale è riportata la seguente tabella sui tipi di sottosistemi attualmente supportati dall’Authentication Chain di Alfresco.
Questo articolo mostra due casi di studio relativi all’integrazione con i sottosistemi ldap e ldap-ad ovvero OpenLDAP e Active Directory. Ulteriori approfondimenti sul meccanismo di autenticazione usato da Alfresco si trovano qui.
CASO 1. – Subsystem ldap, integrazione con Netscape Directory Server (NDS)
In questo caso di studio viene mostrato come integrare Alfresco con CentOS Directory Server la soluzione LDAP per distribuzioni CentOS Linux. Si tratta sostanzialmente di un rebuild del più vecchio Netscape Directory Server (NDS). Altre soluzioni LDAP provenienti da NDS sono Red Hat Directory Server, Fedora 389 Directory Server e Sun One Directory Server. Per testare la connessione ldap e per facilitare le operazioni di amministrazione del server ldap viene utilizzato il client JXplorer open source scritto in java. Ecco lo stack applicativo per questo caso di studio.
Alfresco: Community 4.0.e
LDAP Server: CentOS Directory Server 8.2
LDAP Client: JXplorer 3.3
La prima cosa da fare è un test di connessione verso il server ldap. L’accesso anonimo è abilitato di default su CentOS-DS (LDAPv3). Utilizzando JXplorer è possibile navigare l’alberatura ldap configurata sul sistema.
Un altro test importante riguarda il binding verso il server ldap nel caso di accesso con credenziali. Ancora con JXplorer è possibile connettersi al server ldap inserendo il Distinguished Name (DN) esteso associato a un utente di cui si conoscono le credenziali. Ecco due esempi di possibili DN :
DN: cn=Lara Croft,ou=People,dc=foocorp,dc=com DN: uid=lara.croft,ou=People,dc=foocorp,dc=com
Fare attenzione alla presenza dell’attributo cn rispetto a uid poichè è importante ai fini di una corretta configurazione del formato dello username da usare per il login su Alfresco via ldap (proprietà ldap.authentication.userNameFormat).
Di seguito la rappresentazione ldif per Utenti e Gruppi utilizzata in questo esempio.
– LDAP USER
DN: uid=lara.croft,ou=People,dc=foocorp,dc=com objectClass: person objectClass: top objectClass: inetOrgPerson objectClass: organizationalPerson cn: Lara Croft givenName: Lara sn: Croft uid: lara.croft
– LDAP GROUP
DN: cn=R&D,ou=Groups,dc=foocorp,dc=com objectClass: groupOfUniqueNames objectClass: top cn: R&D description: Research and Development uniqueMember: uid=lara.croft,ou=People,dc=foocorp,dc=com uniqueMember: uid=sailor.popeye,ou=People,dc=foocorp,dc=com uniqueMember: uid=ufo.robot,ou=People,dc=foocorp,dc=com uniqueMember: uid=lupin.3,ou=People,dc=foocorp,dc=com
Oltre al meccanismo di autenticazione ldap, Alfresco supporta la funzionalità di user registry export ovvero la sincronizzazione di tutte le informazioni relative agli utenti e ai gruppi conservate sul server ldap. In questo modo è possibile tenere sempre aggiornato Alfresco sulle modifiche che vengono fatte sul server ldap (password cambiate, anagrafiche utenti, utenze aggiunte o cancellate da un gruppo ecc.). Per configurare autenticazione e sincronizzazione ldap su Alfresco basta seguire le quattro linee guida riportate di seguito.
1. Creare la directory e il file di configurazione per l’istanza ldap
$ mkdir {ALFRESCO_HOME}/shared/classes/alfresco/extension/subsystems/Authentication/myldap $ cd {ALFRESCO_HOME}/tomcat/webapps/alfresco/WEB-INF/classes/alfresco/subsystems/Authentication/ $ cp ./ldap/*.properties {ALFRESCO_HOME}/shared/classes/alfresco/extension/subsystems/Authentication/ldap/myldap
2. Modificare il file ldap-authentication.properties, di seguito un estratto di alcune proprietà
ldap.authentication.active=true # Full DN format to login ldap.authentication.userNameFormat=uid=%s,ou=People,dc=foocorp,dc=com ldap.authentication.java.naming.provider.url=ldap://192.168.56.101:389 ldap.synchronization.active=true # Anonymous access for sync ldap.synchronization.java.naming.security.authentication=none ldap.synchronization.groupQuery=(objectclass\=groupOfUniqueNames) ldap.synchronization.groupDifferentialQuery=(&(objectclass\=groupOfUniqueNames)(!(modifyTimestamp<\={0}))) ldap.synchronization.personQuery=(objectclass\=inetOrgPerson) ldap.synchronization.personDifferentialQuery=(&(objectclass\=inetOrgPerson)(!(modifyTimestamp<\={0}))) ldap.synchronization.groupSearchBase=ou\=Groups,dc\=foocorp,dc\=com ldap.synchronization.userSearchBase=ou\=People,dc\=foocorp,dc\=com ldap.synchronization.userIdAttributeName=uid ldap.synchronization.userFirstNameAttributeName=givenName ldap.synchronization.userLastNameAttributeName=sn ldap.synchronization.userEmailAttributeName=mail ldap.synchronization.userOrganizationalIdAttributeName=o ldap.synchronization.defaultHomeFolderProvider=largeHomeFolderProvider ldap.synchronization.groupIdAttributeName=cn ldap.synchronization.groupDisplayNameAttributeName=description ldap.synchronization.groupType=groupOfUniqueNames ldap.synchronization.personType=inetOrgPerson ldap.synchronization.groupMemberAttributeName=uniqueMember
3. Impostare l’istanza ldap nel file alfresco-global.properties
# LDAP authentication.chain=alfrescoNtlm1:alfrescoNtlm,myldap:ldap synchronization.sinchronyzeChangesOnly=false synchronization.syncWhenMissingPeopleLogIn=true synchronization.syncOnStartup=true synchronization.import.cron=0 0 18 * * ?
4. Configurare il debugging sul file log4j.properties
#LDAP log4j.logger.org.alfresco.repo.importer.ImporterJob=debug log4j.logger.org.alfresco.repo.importer.ExportSourceImporter=debug log4j.logger.org.alfresco.repo.security.authentication.ldap=debug log4j.logger.org.alfresco.repo.security.sync=debug #log4j.logger.org.alfresco.repo.security.sync=info
In questo esempio, avendo impostato la proprietà synchronization.syncOnStartup=true Alfresco effettua la sincronizzazione con il server ldap all’avvio oltre che tutti i giorni alle 18 (synchronization.import.cron).
Ecco come si presenta il log nel caso di corretta sincronizzazione.
Il formato da utilizzare per il login username è definito dalla proprietà seguente.
ldap.authentication.userNameFormat=uid=%s,ou=People,dc=foocorp,dc=com
CASO 2. – Subsystem ldap-ad, integrazione con Microsoft Active Directory
In questo secondo caso di studio viene mostrato come integrare Alfresco con Microsoft Acrive Directroy. L’esempio fa riferimento a una macchina virtuale di test dove è in esecuzione Microsoft Active Directory Server 2003. Ecco lo stack applicativo per questo caso di studio.
Alfresco: Community 4.0.e
LDAP Server: Microsoft Active Directory 2003
LDAP Client: JXplorer 3.3
Sul server AD vengono create due unità organizzative Groups e People rispettivamente per gruppi e utenti :
E’ possibile utilizzare ancora JXplorer con accesso anonimo per effettuare un primo test sulla connessione verso il server AD. Tuttavia Per navigare l’alberatura ldap è necessario effettuare il binding verso AD accedendo con credenziali.
Il binding verso il server AD viene effettuato utilizzando il Common Name (CN) all’interno del Distinguished Name esteso:
DN: CN=ian hill,OU=People,DC=adsrv,DC=foocorp,DC=com
Di seguito la rappresentazione ldif per Utenti e Gruppi utilizzata in questo esempio.
– LDAP-AD Group
DN: CN=R&D,OU=Groups,DC=adsrv,DC=foocorp,DC=com objectClass: top objectClass: group cn: R&D description: Research and Development Department distinguishedName: CN=R&D,OU=Groups,DC=adsrv,DC=foocorp,DC=com groupType: -2147483646 instanceType: 4 member: CN=steve harris,OU=People,DC=adsrv,DC=foocorp,DC=com member: CN=jimi hendrix,OU=People,DC=adsrv,DC=foocorp,DC=com name: R&D objectCategory: CN=Group,CN=Schema,CN=Configuration,DC=adsrv,DC=foocorp,DC=com objectGUID:: RmNuVu+/ve+/vSxJ77+9RUt0Xkfvv70Y objectSid:: AQUAAAAAAAUVAAAA77+977+9be+/ve+/vTnvv71xS++/ve+/vQZUBAAA sAMAccountName: R&D sAMAccountType: 268435456
– LDAP-AD User
DN: CN=brian may,OU=People,DC=adsrv,DC=foocorp,DC=com objectClass: top objectClass: person objectClass: organizationalPerson objectClass: user accountExpires: 9223372036854775807 cn: brian may displayName: brian may distinguishedName: CN=brian may,OU=People,DC=adsrv,DC=foocorp,DC=com givenName: brian memberOf: CN=Production,OU=Groups,DC=adsrv,DC=foocorp,DC=com name: brian may objectCategory: CN=Person,CN=Schema,CN=Configuration,DC=adsrv,DC=foocorp,DC=com sAMAccountName: brian.may sAMAccountType: 805306368 sn: may userAccountControl: 512 userPrincipalName: brian.may@adsrv.foocorp.com
Come per il caso precedente, su Alfresco viene configurato autenticazione e sincronizzazione verso il server AD. Il formato username usato per il login è:
sAMAccountName@adsrv.foocorp.com
Ecco come configurare autenticazione e sincronizzazione ldap-ad su Alfresco.
1. Creare la directory e il file di configurazione per l’istanza ldap-ad.
$ mkdir {ALFRESCO_HOME}/shared/classes/alfresco/extension/subsystems/Authentication/ldap-ad/myldap $ cd {ALFRESCO_HOME}/tomcat/webapps/alfresco/WEB-INF/classes/alfresco/subsystems/Authentication/ $ cp ./ldap-ad/*.properties {ALFRESCO_HOME}/shared/classes/alfresco/extension/subsystems/Authentication/ldap-ad/myldap
2. Modificare il file ldap-ad-authentication.properties, di seguito un estratto di alcune proprietà.
ldap.authentication.active=true ldap.authentication.userNameFormat=%s@adsrv.foocorp.it ldap.authentication.java.naming.factory.initial=com.sun.jndi.ldap.LdapCtxFactory ldap.authentication.java.naming.provider.url=ldap://192.168.56.106:389 ldap.synchronization.active=true ldap.synchronization.java.naming.security.authentication=simple ldap.synchronization.java.naming.security.principal=ian.hill@adsrv.foocorp.it ldap.synchronization.java.naming.security.credentials=12345 ldap.synchronization.groupQuery=(objectclass\=*) ldap.synchronization.groupDifferentialQuery=(objectclass\=*) ldap.synchronization.personQuery=(objectclass\=*) ldap.synchronization.personDifferentialQuery=(objectclass\=*) ldap.synchronization.groupSearchBase=ou\=Groups,dc\=adsrv,dc\=foocorp,dc\=com ldap.synchronization.userSearchBase=ou\=People,dc\=adsrv,dc\=foocorp,dc\=com ldap.synchronization.modifyTimestampAttributeName=modifyTimestamp ldap.synchronization.timestampFormat=yyyyMMddHHmmss'.0Z' ldap.synchronization.userIdAttributeName=sAMAccountName ldap.synchronization.userFirstNameAttributeName=givenName ldap.synchronization.userLastNameAttributeName=sn ldap.synchronization.userEmailAttributeName=mail ldap.synchronization.userOrganizationalIdAttributeName=company ldap.synchronization.defaultHomeFolderProvider=largeHomeFolderProvider ldap.synchronization.groupIdAttributeName=cn ldap.synchronization.groupDisplayNameAttributeName=displayName ldap.synchronization.groupType=group ldap.synchronization.personType=user ldap.synchronization.groupMemberAttributeName=member ldap.synchronization.enableProgressEstimation=true
3. Impostare l’istanza ldap-ad nel file alfresco-global.properties.
# LDAP authentication.chain=alfrescoNtlm1:alfrescoNtlm,myldap:ldap-ad synchronization.sinchronyzeChangesOnly=true synchronization.syncWhenMissingPeopleLogIn=true synchronization.syncOnStartup=true synchronization.import.cron=0 0 18 * * ?
4. Debugging nel file log4j.properties
#LDAP log4j.logger.org.alfresco.repo.importer.ImporterJob=debug log4j.logger.org.alfresco.repo.importer.ExportSourceImporter=debug log4j.logger.org.alfresco.repo.security.authentication.ldap=debug log4j.logger.org.alfresco.repo.security.sync=debug #log4j.logger.org.alfresco.repo.security.sync=info