Newsgroup: it.comp.os.linux.sys
Titolo: Chiarimento LDAP PART-2

Ok, escludendo ogni riferimento all'ldap, sono riuscito a far funzionare
postfix utilizzando solo gli utenti locali, ed è OK.
Ora, il problema è nato quando ho provato a fargli pescare gli utenti
registrati nell'LDAP.
Dopo un'infinità di prove, ho notato dal debug che il risultato della
query_filter era un errore 32, riporto dal 
main.cf
:
[CUT]
ldapsource_search_base = ou=people,dc=casa,dc=it
ldapsource_query_filter = (mail=%s)
ldapsource_result_attribute = mail
[CUT]
in effetti se provo la query con ldapsearch e quella base, non mi ritorna
nessun risultato, mentre se provo con:
ldapsearch -x -D "cn=admin,dc=casa,dc=it" -W mail 
ottengo tutte le caselle email nell'ldap.
Dove ho sbagliato?
Da notare che in phpldapadmin, le caselle email le trovo tutte sotto la
ou=people quindi speravo che anche ldapsearch con base in people me le
facesse vedere.
Non so se serve, ma ho settato per ou=people la stessa PW di cn=admin.
Per scrupolo, riporto un tipico ldif che ho creato ed inserito nel ramo:
dn: cn=gino,ou=people,dc=casa,dc=it
cn: gino
gidNumber: 10007
mail: 
gi...@casa.it
sn: Gino
uidNumber: 10005
objectClass: couriermailaccount
objectClass: person
objectClass: top
objectClass: inetOrgPerson
homeDirectory: /home/vmail
quota: 0
mailbox: 
casa.it/login/
userPassword: {CRYPT}gino
Ripeto, se provo con utenti di sistema funziona tutto in tutti i modi.
-- 
questo articolo e` stato inviato via web dal servizio gratuito 
http://www.newsland.it/news
 segnala gli abusi ad 
ab...@newsland.it

OOOOpps
Mi sono accorto che se faccio:
ldapsearch -h localhost -x -w secret -D "cn=admin,dc=casa,dc=it" -b
"ou=people,dc=casa,dc=it" mail
mi ritorna esattamente le caselle email sotto il ramo ou=people, quindi
ora rimane il problema del perchè la stessa query nel 
main.cf
 mi produce
l'errore 32 ( è slapd che dice error 32 no such object ).
SiriusDog ha scritto:


 "ou=people,dc=casa,dc=it" mail
Se ti può essere utile:
ldapaccounts_timeout = 10
ldapaccounts_server_host = localhost
ldapaccounts_search_base = ou=people,dc=example,dc=com
ldapaccounts_server_port = 389
ldapaccounts_domain = 
example.com
ldapaccounts_query_filter = (|(uid=%s)(mail=%s)(mailAlternateAddress=%s)
ldapaccounts_result_attribute = mailbox
ldapaccounts_bind = yes
ldapaccounts_bind_dn = cn=postfix,ou=daemons,dc=example,dc=com
ldapaccounts_bind_pw = password
Questo funziona.
-- 
Flavio Visentin
Membro del CICAP
Comitato Italiano per il Controllo delle Affermazioni di P4

 Questo funziona.
Ora provo, ma mi spieghi questa riga?
ldapaccounts_bind_dn = cn=postfix,ou=daemons,dc=example,dc=com
Non sono sicuro di averla capita, non conoscento la struttura del tuo
albero LDAP.
Grazie
:-)


 ldapaccounts_bind_dn = cn=postfix,ou=daemons,dc=example,dc=com
E' l'utente con cui fare bind a LDAP.
E' buona norma *non* utilizzare l'admin per accedere a LDAP ma creare un
utente dedicato; io abitualmente creo un OU dedicata (daemons appunto)
contenenti tutti gli utenti utilizzati per il bind da parte dei vari
servizi (quindi uno per postfix, uno per courier, ecc.ecc.), in modo
tale da poter gestire in modo raffinato anche i permessi.


 tale da poter gestire in modo raffinato anche i permessi.
Ho capito, comunque anche facendo il bind con l'utente admin e non ti dico
quante prove sui filtri o sull'utilizzo stesso di altri parametri
dell'ldap, in condizioni normali, dovrebbe andare.
questo è, invece, il mio risultato:
Dopo aver fatto correttamente la connessione la server ldap,
al momento della query_filter->
-> dict_ldap_lookup: Search error 32: No such object
KAKKIO!!!


 -> dict_ldap_lookup: Search error 32: No such object
[CUT]
ldapsource_search_base = ou=people,dc=casa,dc=it
ldapsource_query_filter = (mail=%s)
ldapsource_result_attribute = mail
[CUT]
Perché il tuo result_attribute è mail? Non dovrebbe essere mailbox?
Perché ldapsource_domain non è definito?
Prova ad aumentare il livello di logging (306 o 4095) di slapd e posta
il log di tutta una transazione.


 Perché ldapsource_domain non è definito?
In realtà ldapsource_domain è definito, ma era compreso nel [CUT].
Ho usato result_attribute = mail perchè facendo ldasearch con mail
ottenevo le caselle email del ramo che andavo ad interrogare, comunque ho
provato a mettere mailbox ed ho fatto un postmap -v -q 
gi...@casa.it
ldap:ldapsource ed ecco il risultato:
postmap: dict_ldap_lookup: No existing connection for LDAP source
ldapsource, reopening
postmap: dict_ldap_connect: Connecting to server ldap://
mail.casa.it:389
postmap: dict_ldap_connect: Actual Protocol version used is 2.
postmap: dict_ldap_connect: Binding to server ldap://
mail.casa.it:389
 as
dn cn=admin,dc=casa,dc=it
postmap: dict_ldap_connect: Successful bind to server
ldap://
mail.casa.it:389
 as cn=admin,dc=casa,dc=it
postmap: dict_ldap_connect: Cached connection handle for LDAP source
ldapsource
postmap: dict_ldap_lookup: Searching with filter
(|(uid=
gi...@casa.it
)(mail=
gi...@casa.it
))(mailAlternateAddress=
gi...@casa.it
)
postmap: warning: dict_ldap_lookup: Search error 32: No such object
La query filter è quella che mi avevi suggerito, ma tanto ottengo sempre
lo stesso risultato anche lasciando solo mail=%s.


 lo stesso risultato anche lasciando solo mail=%s.
La query filter va bene anche "(mail=%s)". Che dice il log di slapd?
quello di postfix č abbastanza inutile in questo caso.
Posta magari anche la conf. di openldap.


 Posta magari anche la conf. di openldap.
Ciao THe_ZiPMaN, dopo innumerevoli capriole carpiate all'indietro, ho
capito che "warning: dict_ldap_lookup: Search error 32: No such object" è
un errore generico dovuto o alla struttura errata di LDAP, o dalla
query_filter che non trova risultati.
A questo punto, dato che sono sicuro della corretta configurazione del
main.cf
 ( nello specifico parlo di ldapsource ), mi servirebbe un estratto
di un ou=people, con un paio di utenti sicuramente funzionanti.
Pensi di potermi postare una parte dell'LDIF che contiene i tui account
mail sotto ou=people ( o chi per lui) ?
Così proverò un import e vedrò se questa volta il postmap -q andrà a buon
fine.
Se potrai faremi questo favore, te ne sarò molto grato.
Grazie
Ciao


 mail sotto ou=people ( o chi per lui) ?
Con ovviamente sostituiti i nomi :-)
La struttura base:
# extended LDIF
#
# LDAPv3
# base <> with scope sub
# filter: (objectclass=*)
# requesting: *
#
# 
example.com
dn: dc=example,dc=com
objectClass: top
objectClass: domain
objectClass: dcObject
description: top level of directory
o: Example
dc: example
# people, 
example.com
dn: ou=people,dc=example,dc=com
objectClass: top
objectClass: organizationalunit
ou: people
description: Rubrica Indirizzi
# daemons, 
example.com
dn: ou=daemons,dc=example,dc=com
objectClass: top
objectClass: organizationalunit
ou: daemons
description: Utenti per Daemons
# postfix, daemons, 
example.com
dn: cn=postfix,ou=daemons,dc=example,dc=com
cn: postfix
sn: postfix
objectClass: Person
userPassword:: XXXXXXXXXXXXXXXXX
# courier, daemons, 
example.com
dn: cn=courier,ou=daemons,dc=example,dc=com
cn: courier
sn: courier
objectClass: Person
userPassword:: XXXXXXXXXXXXXXXXX
Ed un utente tipo.
# extended LDIF
#
# LDAPv3
# base <> with scope sub
# filter: uid=pippo
# requesting: ALL
#
dn: uid=pippo,ou=people,dc=example,dc=com
objectClass: top
objectClass: posixAccount
objectClass: shadowAccount
objectClass: qmailuser
objectClass: Person
objectClass: OrganizationalPerson
objectClass: inetOrgPerson
objectClass: courierMailAccount
ou: people
uidNumber: 500
gidNumber: 100
homeDirectory: /mailstore/pippo
mailMessageStore: /mailstore/pippo/Maildir/
uid: pippo
cn: Pippo
givenName: Pippo
sn: Paperino
mailbox: Maildir/
mail: 
pi...@example.com
mailAlternateAddress: 
pippo.p...@example.com
mailAlternateAddress: 
pape...@example.com
accountStatus: active
mailQuota: 204800000S
shadowMax: 99999
shadowWarning: 7
shadowLastChange: 10000
loginShell: /bin/rbash


 userPassword:: XXXXXXXXXXXXXXXXX
Vorrei approfittare della tua gentilezza chiedendoti come hai creato
questa lista. Io, con phpldamadmin, ottengo risultato un pò diversi.
Grazie 10000 volte!!!


 questa lista. Io, con phpldamadmin, ottengo risultato un pò diversi.
A mano.


Ecco il mio slapd.conf:
allow bind_v2
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/authldap.schema
include         /etc/ldap/schema/misc.schema
schemacheck     on
pidfile         /var/run/slapd/slapd.pid
argsfile        /var/run/slapd.args
loglevel        50000 # Non mi č stato molto utile
modulepath  /usr/lib/ldap
moduleload  back_bdb
backend     bdb
checkpoint 512 30
database        bdb
suffix          "dc=casa,dc=it"
directory       "/var/lib/ldap"
rootdn  "cn=admin,dc=casa,dc=it"
rootpw  secret
index objectClass,uidNumber,uid eq
lastmod         on
access to attrs=userPassword
        by dn="cn=admin,dc=casa,dc=it" write
        by anonymous auth
        by self write
        by * read
access to *
        by dn="cn=admin,dc=casa,dc=it" write
        by * read
access to dn.base="dc=casa,dc=it"
        by * read
access to dn.base="ou=people,dc=casa,dc=it"
        by * read
Guarda se noti qualche errore perchč sta query_filter continua a non
trovarmi nulla, nonostante abbia arato il db di LDAP e l'abbia ricreato
partendo da uqello che mi hai dato.
Grazie
Ciao


UUUUAAAAAAAA!!!!!!!
Ho parlato troppo presto ...
FUNZIONAAAAAAAAA!!!!!!!
Ti giuro che è quasi superstizione, a quanto pare ricreando il db daccapo
seguendo il tuo esempio, come ho risistemato il 
main.cf
 ( perchè l'avevo
sputtanato per le varie prove ) ho fatto un postmap -v -q mi ha subito
stampato l'indirizzo emal dell'utente di prova che avevo inserito nel ramo
people.
VITTORIA!!!!!!!!
Dimmi dove abiti che ti mando un regalo per Natale :-)
Ciao


 Dimmi dove abiti che ti mando un regalo per Natale :-)
Se vuoi realmente farmi un regalo ... fallo a chi se lo merita :-)
http://www.debian.org/donations
:-)


Ciao THe_ZiPMaN non prendermi a calci se sono petulante, ma facendo varie
prove mi sono accorto che le mail indirizzate a, per esempio,
pi...@casa.it
, arrivano, viene trovata la casella pippo nell'LDAP, ma il
"local" di postfix, mi tratta pippo come se fosse un utente di sistema (
che ovviamente non esiste ) quindi mi rimanda indietro la mail con
status=bounced (unknown user:pippo ).
Se l'utente esiste nell'LDAP, come mai postfix lo cerca nel sistema?
Non dovrò mica andare a modificare i pam, passwd, shadow per fargli
cercare gli utenti nell'LDAP come se fossero locali ( che sarebbe comunque
una gran figata, ma non è quello che devo fare ora )!!!
Ciao e perdona la mia insistenza.


 una gran figata, ma non è quello che devo fare ora )!!!
Hai due scelte:
a) configuri che gli utenti ldap siano anche utenti di sistema (dovrebbe
bastare aggiungere ldap a nsswitch.conf
b) usi virtual al posto di local
Io inizialmente avevo optato per la seconda, poi ho convertito tutto
alla prima perché è molto più semplice da gestire (e tra le altre cose
ti permette di utilizzare maildrop o procmail per il delivery della posta).
La cosa importante è che non consenti i login agli utenti di LDAP o che
ti accerti che non abbiano password banali (è comunque sconsigliabile
dato che pop3 e imap in genere vengono usati in chiaro e quindi le
password sono facilmente sniffabili).


Riciao THe_ZiPMaN ho optato per la modifica dell'nsswitch e del pam. Ora
mi riconosce gli utenti su ldap come fossero di sistema. Direi che va bene
così, ovviamente dovrò stare molto + attento a mettere in sicurezza tutto
il sistema.
Grazie ancora per il prezioso aiuto.


 il sistema.
Ti consiglio di abilitare solo le versioni sicure dei servizi di posta
(imaps su 993 e pop3s su 995) disabilitando o bloccando con iptables le
corrispondenti non sicure, e di autorizzare l'autenticazione smtp solo
su smtps o mediante TLS.
Giusto per non far transitare pwd in chiaro.


 ldapaccounts_bind_pw = password
puoi farlo anche senza bindarti se il campo mail non e' protetto in
lettura da acl, cosa che e' vera nelle configurazioni di default.