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:
- BDB – è la scelta raccomandata in quanto supporta anche LDBM che sta per essere rimosso
- HDB – è la nuova generazione anche se ha problemi con verione 2.2 di OpenLDAP
- 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,
- utilizzare un browser grafico per creare il vostro albero di autenticazione
- 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 ) )
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