Dicembre 09, 2019

Alfresco e LDAP due esempi: Netscape Directory Server e Active Directory

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.

giuseppe-urso-alfresco-ldap-00
Questo articolo mostra due casi di studio relativi all’integrazione con i sottosistemi ldap e ldap-ad ovvero OpenLDAP e Active DirectoryUlteriori 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.

 giuseppe-urso-alfresco-ldap-01

giuseppe-urso-alfresco-ldap-02

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

giuseppe-urso-alfresco-ldap-03

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.

giuseppe-urso-alfresco-ldap-04

giuseppe-urso-alfresco-ldap-05

Il formato da utilizzare per il login username è definito dalla proprietà seguente.

ldap.authentication.userNameFormat=uid=%s,ou=People,dc=foocorp,dc=com

giuseppe-urso-alfresco-ldap-06

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 :

giuseppe-urso-alfresco-ldap-07

giuseppe-urso-alfresco-ldap-08

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. 

giuseppe-urso-alfresco-ldap-09

giuseppe-urso-alfresco-ldap-10

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

giuseppe-urso-alfresco-ldap-11

giuseppe-urso-alfresco-ldap-12

giuseppe-urso-alfresco-ldap-13

Related posts

Leave a Reply

Your email address will not be published.