Postfix con Ldap e Courier

Supponiamo di dover configurare un mail server che deve gestire parecchie mailbox, vogliamo dare a ciascuno di essi un indirizzo email ed una casella accessibile via pop3 o imap.

La soluzione più semplice è sicuramente quella di creare un utente per ciascuno di essi, la configurazione è sicuramente più veloce e banale, ma per alcuni versi “sporca”.

Avremmo per ciascuno di essi un account che non viene di fatto mai utilizzato, con la propria home directory, con la loro riga in /etc/passwd, insomma un utente a tutti gli effetti ricordatevi almeno di specificargli come shell /bin/false 😉

La soluzione che descrivo in questa pagina utilizza invece le virtual mailbox interrogando un server ldap per avere i parametri necessari alla corretta memorizzazione e consultazione delle mail.

questo documento è stato importato dal vecchio wiki di hierax(dot)net, purtroppo alcune cose vanno sistemate, ci sto lavorando, abbiate pazienza

Io utilizzo Debian e ho descritto tutti i passi che sono necessari per implementare questa soluzione, ho quindi specificato solo le modifiche cha vanno fatte ai file installati da Debian, chiaramente questo può portare problemi ad un utente di un’altra distribuzione nel momento che andrà ad implementare quello che ho descritto…

software utilizzato

mta: postfix
server ldap: slapd
server imap, pop3: courier

installazione di courier

apt-get install courier-ldap

passi preliminari

creiamo l’utente vmail che sarà quello utilizzato per memorizzare le mail virtuali

adduser --system --home /home/vmail --disabled-password vmail

Aggiunta dell'utente di sistema «vmail» con UID 121...
Aggiunta del nuovo utente «vmail» (121) con gruppo «nogroup».
Creazione della directory home «/home/vmail».

ok, l’operazione è andata a buon fine, memorizziamo l’uid che è stato assegnato all’utente 121 in questo caso.

Vediamo come configurare postfix per utilizzare caselle virtuali utilizzando il server ldap

Come prima cosa dobbiamo dire a postfix che vogliamo utilizzare mailbox virtuali, per quali domini le vogliamo utilizzare e dove vogliamo che vada a cercare la informazioni necessarie:

diciamogli che vogliamo che le mail dirette ai domini namuri.it e namuri.com siano mailbox virtuali

virtual_mailbox_domains = namuri.it namuri.com

diciamogli anche che la base di memorizzazione delle mailbox è la cartella /home/vmail/ questo percorso sarà la parte iniziale del percorso che postfix utilizzerà per trovare, creare la mailbox sulla quale memorizzare le mail.

in seguito vedremo come postfix andrà a cercare il resto della path sul server ldap

virtual_mailbox_base = /home/vmail

ora specifichiamo che il “lookup” di ogni singola mailbox virtuale va fatto interrogando
un server ldap:

virtual_mailbox_maps = ldap::/etc/postfix/ldap-virtual-mbox.cf

in questa maniera gli diciamo anche che per le impostazioni relative al server ldap deve consultare il file /etc/postfixldap-virtual-mbox.cf indichieremo i parametri di questo file più in avanti.

indichiamo qual’è il minimo uid valido che postfix può accettare dal “lookup” un valore inferiore a questo viene rifiutato

virtual_minimum_uid = 121

stabiliamo staticamente il gid e l’uid di ciascun destinatario

virtual_uid_maps = static:121
virtual_gid_maps = static:65534

il gid lo troviamo con un:

eagle:/home# cat /etc/group|grep nogroup

come output dovremmo avere un cosa tipo

nogroup:x:65534:

indichiamo il file degli alias virtuali:

virtual_alias_maps = hash:/etc/postfix/virtual

Analizziamo il contenuto di questo file:

postmaster@namuri.it postmaster
postmaster@namuri.com postmaster

E’ importante stabilire un utente valido come postmaster ed e’ conveniente reindirizzarlo all’account reale del postmaster del sistema per evitare di dover creare e controllare periodicamente tutti i postmaster virtuali.

creiamo subito l’hash del file

eagle:/home/franam# postmap /etc/postfix/virtual

file ldap-virtual-mbox.cf

aggiungiamo le seguenti righe al file:

version = 3

specifichiamo che vogliamo venga utilizzato esclusivamente il protocollo versione 3

search_base = ou=mail,ou=people,dc=hierax,dc=net

diamo la base di ricerca

#result_attribute = mailbox

in caso di neccessità possiamo specificare una chiave di ricerca differente dal default (maildrop)

query_filter = (mail=%s)

#bind = yes
#bind_dn = cn=admin,dc=hierax,dc=net
#bind_pw = password

queste tre per ora le teniamo commentate, di solito non è necessario fare il bind con permessi di amministrazione al server ldap, questo perché gli unici parametri che interessano a postfix sono pubblici.

timeout = 10

il tempo di timeout al server ldap

host = localhost
server_port = 389

queste ultime due sono autocommentanti… 😉

installazione e configurazione di slapd

per quanto riguarda l’installazione

apt-get install slapd

ci verrà chiesto il nostro dominio DNS per configurare il base DN della directory LDAP, nel mio caso accetto la risposta suggerita hierax.net.

il nome della nostra “organizzation” che verrà memorizzata nella directory ldap.

inseriamo un password di amministratore, ci servirà per ogni modifica alla directory ldap ed è locale all’amministrazione della struttura stessa

la domanda successiva è abbastanza cruciale, ci viene chiesto di il backend di memorizzazion del DB, abbiamo tre scelte:

  1. BDB – è la scelta raccomandata in quanto supporta anche LDBM che sta per essere rimosso
  2. HDB – è la nuova generazione anche se ha problemi con verione 2.2 di OpenLDAP
  3. LDBM

un’altra opzione interessante è la scelta di abilitare o meno il supporto per il protocollo LDAPv2, l’impostazione di default è di non abilitarlo per ora sceglieremo di dare retta alla debian… 🙂 tenendo in considerazione il fatto che alcuni plugin di squirrelmail (quello per abilitare il cambio password agli utenti ad esempio) lavora esclusivamente con il protocollo versione 2.

popoliamo l’albero LDAP

ora avete due scelte,

  1. utilizzare un browser grafico per creare il vostro albero di autenticazione
  2. utilizzare dei file di testo standard ldiff e poi dare il comando testuale per aggiornare il server

io tenterò di spiegare la procedura testuale in quanto quella grafica è abbastanza banale

dunque partiamo dal presupposto che il nostro server slapd sia funzionante e che durante l’installazione
ci sia stato chiesto di creare un utente amministratore del server ldap

ad esempio, noi abbiamo creato l’amministratore cn=admin,dc=hierax,dc=net

cn indica common name e dc=hierax,dc=net indica la root del server ldap

poi supponiamo di voler creare la nostra struttura ldap in questa maniera:


dc=namuri,dc-it
|--people
|--mail
|--namuri.it
| |--francesco
| |--antonio
|
|--namuri.com
|--caterina

la prima cosa che vogliamo creare è quindi la suddivisione people immediatamente sotto la root
iniziamo col crearci il file che daremo in pasto al comando ldapadd chiamiamo il nostro file mail.ldiff

dn: ou=people, dc=hierax, dc=net
ou: people
objectClass: top
objectClass: organizationalUnit

come prova diamo in pasto il file al nostro “fido” server ldap

ldapadd -c -x -D "cn=admin,dc=hierax,dc=net" -W -f mail.ldiff

analizziamo la sintassi del comando:

-c: diciamo al comando di continuare anche se riscontra un errore (utile in seguito)
-x: usiamo l’autenticazione “semplice” invece di quella sasl (in seguito spero di poter approfondire questo aspetto)
-D: indichiamo al server le nostre credenziali
in questo caso ci stiamo, per così dire, loggando al nostro server come utente admin
-W: vogliamo che la password ci venga richiesta, non ci piace scriverla sulla stessa riga di comando
il flag -w si comporta in questa maniera (si aspetta che la password venga specificata in chiaro dopo il flag)
-f: il file che vogliamo dargli in pasto

se tutto va come previsto:

franam@eagle:~$ ldapadd -x -D "cn=admin,dc=hierax,dc=net" -W -f mail.ldiff
Enter LDAP Password:
adding new entry "ou=people, dc=hierax,dc=net"

ora editiamo di nuovo il nostro file mail.ldiff

dn: ou=people, dc=hierax, dc=net
ou: people
objectClass: top
objectClass: organizationalUnit

dn: ou=mail, ou=people, dc=hierax, dc=net
ou: mail
objectClass: top
objectClass: organizationalUnit

dn: ou=namuri.it, ou=mail, ou=people, dc=hierax, dc=net
ou: namuri.it
objectClass: top
objectClass: organizationalUnit

dn: ou=namuri.com, ou=mail, ou=people, dc=hierax, dc=net
ou: namuri.com
objectClass: top
objectClass: organizationalUnit

ripetendo ldapadd, se tutto va bene dovremmo aver creato la struttura seguente:

Immagine:struttura_ldap.jpeg

ora dobbiamo creare gli utenti, con i loro attributi quali mailbox, password e compagnia danzante… 😉

e quì è necessario andare a configurare il nostro server ldap, infatti la configurazione di default, almeno con la debian
non installa lo schema che ci interessa.

ogni elemento che inseriamo nel server ldap ha bisogno di essere dichiarato a priori, dobbiamo cioè spiegare al server
che tipo di elementi “accettare” e come sono fatti, in questo caso vogliamo utilizzare elementi di classe ldapauth

gli schemi che il server può utilizzare sono memorizzati in /etc/ldap/schema/
quindi noi dobbiamo creare il file nella debian viene installato in /usr/share/doc/courier-ldap/authldap.schema
con il pacchetto courier-ldap

per comodità  allego un esempio:

#$Id: authldap.schema,v 1.5 2004/04/18 15:54:38 mrsam Exp $
#
# OID prefix: 1.3.6.1.4.1.10018
#
# Attributes: 1.3.6.1.4.1.10018.1.1
#
# Depends on: nis.schema, which depends on cosine.schema

attributetype ( 1.3.6.1.4.1.10018.1.1.1 NAME 'mailbox'
DESC 'The absolute path to the mailbox for a mail account in a non-default location'
EQUALITY caseExactIA5Match
SYNTAX 1.3.6.1.4.1.1466.115.121.1.26 SINGLE-VALUE )

attributetype ( 1.3.6.1.4.1.10018.1.1.2 NAME 'quota'
DESC 'A string that represents the quota on a mailbox'
EQUALITY caseExactIA5Match
SYNTAX 1.3.6.1.4.1.1466.115.121.1.26 SINGLE-VALUE )

attributetype ( 1.3.6.1.4.1.10018.1.1.3 NAME 'clearPassword'
DESC 'A separate text that stores the mail account password in clear text'
EQUALITY octetStringMatch
SYNTAX 1.3.6.1.4.1.1466.115.121.1.40{128})

attributetype ( 1.3.6.1.4.1.10018.1.1.4 NAME 'maildrop'
DESC 'RFC822 Mailbox - mail alias'
EQUALITY caseIgnoreIA5Match
SUBSTR caseIgnoreIA5SubstringsMatch
SYNTAX 1.3.6.1.4.1.1466.115.121.1.26{256} )

attributetype ( 1.3.6.1.4.1.10018.1.1.5 NAME 'mailsource'
DESC 'Message source'
EQUALITY caseIgnoreIA5Match
SUBSTR caseIgnoreIA5SubstringsMatch
SYNTAX 1.3.6.1.4.1.1466.115.121.1.26 )

attributetype ( 1.3.6.1.4.1.10018.1.1.6 NAME 'virtualdomain'
DESC 'A mail domain that is mapped to a single mail account'
EQUALITY caseIgnoreIA5Match
SUBSTR caseIgnoreIA5SubstringsMatch
SYNTAX 1.3.6.1.4.1.1466.115.121.1.26 )

attributetype ( 1.3.6.1.4.1.10018.1.1.7 NAME 'virtualdomainuser'
DESC 'Mailbox that receives mail for a mail domain'
EQUALITY caseIgnoreIA5Match
SUBSTR caseIgnoreIA5SubstringsMatch
SYNTAX 1.3.6.1.4.1.1466.115.121.1.26 )

attributetype ( 1.3.6.1.4.1.10018.1.1.8 NAME 'defaultdelivery'
DESC 'Default mail delivery instructions'
EQUALITY caseExactIA5Match
SYNTAX 1.3.6.1.4.1.1466.115.121.1.26 )

#
# Objects: 1.3.6.1.4.1.10018.1.2
#

objectclass ( 1.3.6.1.4.1.10018.1.2.1 NAME 'CourierMailAccount' SUP top AUXILIARY
DESC 'Mail account object as used by the Courier mail server'
MUST ( mail $ homeDirectory $ uidNumber $ gidNumber )
MAY ( mailbox $ uid $ cn $ gecos $ description $ loginShell $ quota $ userPassword $ clearPassword $ defaultdelivery) )

objectclass ( 1.3.6.1.4.1.10018.1.2.2 NAME 'CourierMailAlias' SUP top AUXILIARY
DESC 'Mail aliasing/forwarding entry'
MUST ( mail $ maildrop )
MAY ( mailsource $ description ) )

objectclass ( 1.3.6.1.4.1.10018.1.2.3 NAME 'CourierDomainAlias' SUP top AUXILIARY
DESC 'Domain mail aliasing/forwarding entry'
MUST ( virtualdomain $ virtualdomainuser )
MAY ( mailsource $ description ) )

authldap.schema

poi dobbiamo aggiungere la seguente linea al file /etc/ldap/slapd.conf

include /etc/ldap/schema/authldap.schema

facciamo un restart del server slapd

eagle:/etc/ldap# /etc/init.d/slapd restart

ora siamo pronti per continuare ad editare il nostro file ldiff, aggiungiamo la seguente sezione:

dn: uid=francesco, ou=namuri.it, ou=mail, ou=people, dc=hierax, dc=net
mailbox: /namuri.it/francesco/
sn: francesco
userPassword: {SSHA}j5dBBfmVOvw0xLMhK0zC7+WscG8X9nC7
uidNumber: 1001
gidNumber: 1001
mail: francesco@namuri.it
objectClass: top
objectClass: CourierMailAccount
objectClass: person
uid: francesco
cn: francesco
homeDirectory: /home/vmail

dn: uid=antonio, ou=namuri.it, ou=mail, ou=people, dc=hierax, dc=net
mailbox: /namuri.it/antonio/
sn: antonio
userPassword: {SSHA}j5dBBfmVOvw0xLMhK0zC7+WscG8X9nC7
uidNumber: 1001
gidNumber: 1001
mail: antonio@namuri.it
objectClass: top
objectClass: CourierMailAccount
objectClass: person
uid: antonio
cn: antonio
homeDirectory: /home/vmail

dn: uid=caterina, ou=namuri.com, ou=mail, ou=people, dc=hierax, dc=net
mailbox: /namuri.it/caterina/
sn: caterina
userPassword: {SSHA}j5dBBfmVOvw0xLMhK0zC7+WscG8X9nC7
uidNumber: 1001
gidNumber: 1001
mail: caterina@namuri.com
objectClass: top
objectClass: CourierMailAccount
objectClass: person
uid: caterina
cn: caterina
homeDirectory: /home/vmail

stiamo cioè creando glia elementi che ci interessano, creiamo l’utente francesco e antonio all’interno di /dc=hierax, dc=net/ou=people/ou=mail/ou=namuri.it/

la sezione userPassword la possiamo generare con l’utility slappasswd, facciamo un esempio:

eagle:/home/franam/works/ldap# slappasswd
New password:
Re-enter new password:
{SSHA}j5dBBfmVOvw0xLMhK0zC7+WscG8X9nC7

diamo il comando, vediamo che succede:

ldapadd -c -x -D “cn=admin,dc=hierax,dc=net” -W -f mailserver.ldiff

franam@eagle:~$ ldapadd -c -x -D “cn=admin,dc=hierax,dc=net” -W -f people.ldiff
Enter LDAP Password:
adding new entry “ou=people, dc=hierax,dc=net”
ldap_add: Already exists (68)

adding new entry “ou=mail, ou=people, dc=hierax, dc=net”
ldap_add: Already exists (68)

adding new entry “ou=namuri.it, ou=mail, ou=people, dc=hierax, dc=net”
ldap_add: Already exists (68)

adding new entry “uid=francesco, ou=namuri.it, ou=mail, ou=people, dc=hierax, dc=net”

adding new entry “uid=antonio, ou=namuri.it, ou=mail, ou=people, dc=hierax, dc=net”

adding new entry “uid=caterina, ou=namuri.com, ou=mail, ou=people, dc=hierax, dc=net”

franam@eagle:~$

tutto ok quindi, abbiamo creato i nostri utenti raggiungendo questa struttura:

Immagine:struttura_ldap_finale.jpeg

ora postfix è in grado di memorizzare correttamente le email indirizzate a questi utenti.

[edit]
configuriamo courier

ok, se tutto fin quì è andato a buon fine abbiamo il nostro buon postfix che riesce a ricevere le mail ed a inoltrarle nella giusta casella postale. 😉

ora vediamo come configurare courier per autenticarsi tramite l’ldap.

facciamo le seguenti modifiche ai file di configurazione:

/etc/courier/authdaemonrc

authmodulelist=”authldap”

/etc/courier/authldaprc

LDAP_BASEDN dc=hierax, dc=net
LDAP_AUTHBIND 1
LDAP_GLOB_UID vmail
LDAP_GLOB_GID nogroup

diamo un restart dei demoni in questione e proviamo a configurare evolution per scaricare la posta, se avete seguito le istruzioni passo passo ed io non ho dimenticato nulla dovrebbe funzionare tutto alla grande.
[edit]
dubbi e chiarimenti

1. courier di default interroga ldap per individuare l’elemento ldap che gli interessa utilizzando il campo mail, per questo motivo dobbiamo configurare il nostro client EMAIL, utilizzando come login il nostro indirizzo email completo (es. pinco_palla@tiscali.it). Possiamo chiaramente modificare il comportamento scegliendo a nostro piacimento il campo da ricercare, chiaramente ci saranno i pro ed i contro. Consideriamo che il campo mail è sicuramente univoco.

[edit]
FAQ

* non riesco a connettermi al server ldap

forse siete dei maniaci della sicurezza come me e potreste avere un /etc/hosts.deny che non accetta nulla da nessuno ricordatevi di aggiungere

ALL: 127.0.0.1

ad /etc/hosts.allow

* quando do “in pasto”ad ldapadd il file maill.ldiff ottengo strani errori

controlla che nel file non ci siano spazi all’inizio della riga

* authldap: INVALID LDAP_GLOB_GID/ UID ed errori simili

attenzione al fatto che courier come altri demoni è molto suscettibile agli spazi alle fine della riga di configurazione, mi è capitato di impazzire non capendo quale fosse il problema senza accorgermi di aver dimenticato un TAB alla fine di una riga… 😐

* non ho la debian, come faccio?

file di configurazione
/etc/postfix/main.cf
/etc/postfix/ldap-virtual-mbox.cf
/etc/ldap/slapd.conf
/etc/courier/authdaemonrc
/etc/courier/authldaprc

Leave a Reply

Your email address will not be published. Required fields are marked *