User Tools

Site Tools


doc:appunti:linux:sa:sldap

This is an old revision of the document!


LDAP con slapd 2.4.23

Gli appunti LDAP sono relativi a Debian Lenny, che installa slapd 2.4.11. Con Debian Squeeze viene fornito slapd 2.4.23: la logica della configurazione rimane sostanzialmente invariata, cambia invece il metodo predefinito di salvare la configurazione.

Al posto del tradizionale file di configurazione /etc/ldap/slapd.conf adesso esiste la directory /etc/ldap/slapd.d/ che contiene la configurazione sotto forma di numerosi file in formato LDIF, secondo l'impostazione gerarchica dei nodi. La configurazione è disponibile come oggetto LDAP e corrisponde al nodo che ha come distinguished name cn=config.

slapd usa un backend speciale per memorizzare questo nodo e lo identifica con il nome config. Ne può esistere uno solo e viene istanziato automaticamente anche se non viene definito esplicitamente.

In generale il contenuto del database cn=config viene modificato a runtime tramite snippet di file LDIF caricati con il comando ldapmodify. Le modifiche effettuate a runtime vengono salvate automaticamente nella directory /etc/ldap/slapd.d/, ma bisogna fermare il servizio slapd per essere sicuri che tutte le modifiche siano state salvate. Quando il servizio è fermo è anche possibile intervenire manualmente sui file .ldif.

Ecco un esempio di come interrogare il nodo cn=config con ldapsearch:

ldapsearch -LLLQY EXTERNAL -H ldapi:/// -b cn=config "(|(olcDatabase={1}hdb)(cn=module{0}))"

Nell'esempio l'accesso avviene tramite Unix-domain socket (ldapi) e meccanismo di autenticazione SASL EXTERNAL (?).

Debug

Si imposta con l'attributo olcLogLevel del nodo cn=config (/etc/ldap/slapd.d/cn=config.ldif, da editare a servizio fermo).

Vedere loglevel in man slapd.conf. Il valore predefinito stats è fin troppo prolisso, su un sistema in produzione conviene il valore none

olcLogLevel: none

Creazione di un indice

FIXME NON CREARE QUESTO INDICE FIXME Altrimenti la ricerca per sambaSID fallisce!

Questa è la query che esegue il demone Samba:

ldapsearch -x -H ldaps://127.0.0.1/ -D "cn=admin,dc=rigacci,dc=org" -W -b "dc=rigacci,dc=org" \
    "(&(sambaSID=s-1-5-21-507755589-3346621370-1365447521-3000)(objectClass=sambaSamAccount))"

se esiste l'indice la ricerca resituisce zero risultati, bisogna aggiungere un * in coda al sambaSID per ottenere qualcosa. Come mai?

Esempio: l'esecuzione di pdbedit -L -w con Samba che si appoggia su LDAP genera il seguente messaggio di log:

slapd[28067]: <= bdb_equality_candidates: (sambaSID) not indexed

Per aggiungere l'indice opportuno si aggiunge l'attributo nel nodo relativo al database:

olcDbIndex: sambaSID eq

Nel nostro esempio la configurazione del database è contenuta nel nodo olcDatabase={1}hdb, cioè nel file /etc/ldap/slapd.d/cn=config/olcDatabase={1}hdb.ldif (sempre da editare a servizio fermo).

Inclusione di uno schema aggiuntivo

Il metodo tradizionale (versione 2.4.11) per includere uno schema LDAP era quello di utilizzare la direttiva include nel file /etc/ldap/slapd.conf, gli schemi venivano solitamente salvati in /etc/ldap/schema/.

Nella nuova configurazione gli schemi vengono caricati da file LDIF contenuti nella directory /etc/ldap/slapd.d/cn=config/cn=schema/. È comunque buona norma salvare li file sorgente dello schema in /etc/ldap/schema/.

Nell'impostazione predefinita LDAP di Debian include i seguenti schemi:

  • core
  • cosine
  • nis
  • inetorgperson

Vogliamo aggiungere a questo elenco il samba.schema, fornito dal pacchetto samba-doc.

Caricamento a freddo da file .ldif

Quello che segue è un metodo manuale per compilare i file samba.schema in un file .ldif:

zcat /usr/share/doc/samba-doc/examples/LDAP/samba.schema.gz > /etc/ldap/schema/samba.schema
mkdir tmp
cd tmp
cat << EOF > my_slapd.conf
include /etc/ldap/schema/core.schema
include /etc/ldap/schema/cosine.schema
include /etc/ldap/schema/nis.schema
include /etc/ldap/schema/inetorgperson.schema
include /etc/ldap/schema/samba.schema
EOF
mkdir my_slapd.d
slaptest -f my_slapd.conf -F my_slapd.d

Il file samba.schema verrà compilato in my_slapd.d/cn=config/cn=schema/cn={4}samba.ldif e potrà essare copiato in /etc/ldap/slapd.d/cn=config/cn=schema dopo aver fermato il servizio slapd:

/etc/init.d/slapd stop
cp 'my_slapd.d/cn=config/cn=schema/cn={4}samba.ldif' '/etc/ldap/slapd.d/cn=config/cn=schema/'
/etc/init.d/slapd start

NOTA: Eventualmente modificare il creatorsName e modifiersName per uniformarlo agli altri file .ldif.

Caricamento a caldo con ldapadd

Un vantaggio della configurazione cn=config di slapd è quella di poter modificare la configurazione senza fermare il servizio (in questo caso aggiungere uno schema). Per fare questo bisogna “ripulire” un po' il file creato con il metodo visto sopra e caricarlo a runtime con ldapadd.

La pulizia consiste nel togliere le stringhe {4} all'inizio del file (4 è il numero progressivo dello schema, mentre core.schema è il primo ed ha numero zero):

dn: cn={4}samba
objectClass: olcSchemaConfig
cn: {4}samba

In fondo al file bisogna togliere le righe:

structuralObjectClass:
entryUUID:
creatorsName:
createTimestamp:
entryCSN:
modifiersName:
modifyTimestamp:

Infine per caricare il file LDIF (in questo caso senza fermare il servizio):

ldapadd -x -D "cn=admin,cn=config" -f 'my_slapd.d/cn=config/cn=schema/cn={4}samba.ldif'

Configurazione TLS

Per utilizzare i protocolli cifrati ldaps (su porta 636 TCP) oppure ldap con StartTLS (su porta 389 TCP) bisogna anzitutto creare un certificato auto-firmato, utilizziamo per questo openssl.

Creare un file di configurazione, ad esempio /etc/ldap/tls/ldap.my.rigacci.org.cnf:

#----------------------------------------------------------------
# Create an RSA key and a self-signed Certificate with the
# following command:
#
# openssl req -config /etc/ldap/tls/ldap.my.rigacci.org.cnf \
#     -new -x509 -days 1461 -nodes \
#     -keyout /etc/ldap/tls/ldap.my.rigacci.org.pem \
#     -out /etc/ldap/tls/ldap.my.rigacci.org.pem
#
# The resulting file (unencrypted otherwise Slapd can't start
# automatically) will contains the RSA private key, so be sure
# to set its mode to 0400.
#----------------------------------------------------------------
[ req ]
prompt                          = no
default_bits                    = 2048
distinguished_name              = ldap.rigacci.org_distinguished_name

[ ldap.my.rigacci.org_distinguished_name ]
countryName                     = IT
stateOrProvinceName             = Italy
localityName                    = Firenze
organizationName                = Rigacci.Org
organizationalUnitName          = Information and Communications Technology
commonName                      = ldap.my.rigacci.org
emailAddress                    = webmaster@rigacci.org

Utilizzare il comando openssl come indicato nel commento. Il certificato .pem generato ha validtià 4 anni, deve essere protetto con mode 0400 e appartenere a openldap:openldap.

Per utilizzare il certificato si deve aggiungere al nodo cn=config le due chiavi:

olcTLSCertificateFile: /etc/ldap/tls/ldap.my.rigacci.org.pem
olcTLSCertificateKeyFile: /etc/ldap/tls/ldap.my.rigacci.org.pem

cioè (avendo fermato slapd) basta aggiungere le due righe in /etc/ldap/slapd.d/cn=config.ldif.

Avendo attivato ldaps si potrebbe chiudere all'esterno il protocollo ldap, mettendo in /etc/default/slapd (impedendo peró anche ldap StartTLS):

SLAPD_SERVICES="ldap://127.0.0.1:389/ ldaps:/// ldapi:///"

Questi i protocolli e i meccanismi di trasporto supportati da OpenLDAP:

URL Protocol Transport
ldap:/// LDAP TCP port 389
ldaps:/// LDAP over SSL TCP port 636
ldapi:/// LDAP IPC (Unix-domain socket)

Test

Per provare la connessione su protocollo ldaps si può usare:

ldapsearch -v -x -H ldaps://127.0.0.1/ -b "dc=rigacci,dc=org" "(objectclass=*)"

ATTENZIONE: Poiché il server slapd sta usando un certificato auto-firmato, il client (ldapsearch) non deve tentare di validarlo. Si imposta questo comportamento per tutti i client system-wide mettendo in /etc/ldap/ldap.conf:

TLS_REQCERT     never

Per verificare ldap con StartTLS (sulla porta 389 TCP) basta aggiungere l'opzione -ZZ a ldapsearch.

Catturando i pacchetti con tcpdump sull'interfaccia lo si verifica che la trasmissione dati sia cifrata.

doc/appunti/linux/sa/sldap.1318587909.txt.gz · Last modified: 2011/10/14 12:25 by niccolo