lunedì 13 giugno 2011

Mailbox Virtuali con Dovecot, Postfix e Active Directory

Seguendo questa piccola guida realizzeremo un sistema di posta basato su Dovecot e Postfix, su server Linux, con autenticazione e gestione delle informazioni utente tramite Active Directory.



Il prodotto finito sarà funzionante ma estremamente semplice: solo IMAP e SMTP, nessun filtraggio dei contenuti, nessuna implementazione di comunicazione sicura. Diciamo che sarà una buona base per ulteriori implementazioni.

Premesse
  • Le configurazioni lato linux qui proposte sono realizzate su CentOS.
  • Il mio dominio Windows è BRICK.LOCAL. Sostituitelo con il vostro nome di dominio nei file di configurazione.
  • In Active Directory abbiamo un utente testuser con password testpassword.
  • Il mio indirizzamento di rete è 192.168.98.0/24
  • I DNS devono essere configurati correttamente.
  • Gli orologi del Domain Controller Active Directory e del server Linux devono essere sincronizzati, o deve esserci una differenza massima di 5 minuti.
  • Tenete d'occhio il file /var/log/maillog, è pieno di informazioni utili!
  • Dotatevi di un browser LDAP (JXPlorer, ADSI Edit o Softerra LDAP Browser).

1. Installazione dei Pacchetti

Installiamo i pacchetti necessari:

yum install postfix dovecot krb5-workstation pam-krb5

2. Configurazione di Kerberos

Configuriamo kerberos per autenticarsi con Active Directory:
Modifichiamo il file  /etc/krb5.conf

 
[logging]
default = FILE:/var/log/krb5libs.log
kdc = FILE:/var/log/krb5kdc.log
admin_server = FILE:/var/log/kadmind.log 

[libdefaults]
default_realm = BRICK.LOCAL
dns_lookup_realm = true
dns_lookup_kdc = true

[realms]
BRICK.LOCAL = {
kdc = brick.local:88
admin_server = brick.local:749
default_domain = brick.local
}

[domain_realm]
.brick.local = BRICK.LOCAL
brick.local = BRICK.LOCAL

[kdc]
profile = /var/kerberos/krb5kdc/kdc.conf

[appdefaults]
pam = {
debug = false
ticket_lifetime = 36000
renew_lifetime = 36000
forwardable = true
krb4_convert = false
}


Ho messo nel campo kdc il nome di dominio perché nella configurazione standard del DNS di Active directory al nome di dominio corrisponde il primo Domain Controller disponibile. Provate con il comando "nslookup brick.local"

Testiamo poi il funzionamento di kerberos con il comando:

host -t any _kerberos._tcp.brick.local

Se produce una risposta del tipo "_kerberos._tcp.brick.local has SRV record …" è tutto a posto, altrimenti c'è bisogno di ricontrollare la configurazione DNS.

Poi proviamo ad autenticarci:

kinit testuser

Quando ci viene chiesto digitiamo la password. Se il comando non produce nessun output con kerberos abbiamo finito, altrimenti ricontrolliamo la configurazione.



3. Configurazione di Dovecot

Configuriamo l'autenticazione PAM per dovecot, sostituendo il contenuto del file /etc/pam.d/dovecot con:

auth sufficient pam_krb5.so no_user_check validate
account sufficient pam_permit.so



Creiamo un utente vmail:

useradd vmail -m -s /sbin/nologin -d /var/vmail


Annotiamoci uid e gid dell'utente vmail, ci tornerà utile dopo. Lanciamo il comando

getent passwd | grep vmail



che produrrà un output di questo tipo:

vmail:x:501:501:/var/vmail:/sbin/nologin



Per gli utenti di Dovecot 1.x , modifichiamo il file /etc/dovecot.conf

protocols = imap
auth_username_format = %Lu
auth_debug = yes
disable_plaintext_auth = no
ssl_disable = yes
mail_location = maildir:/var/vmail/%n/Maildir
first_valid_uid = 501
last_valid_uid = 501
first_valid_gid = 501
last_valid_gid = 501
valid_chroot_dirs = /var/vmail

protocol lda {
#L'indirizzo del Postmaster per il Local Delivery
        postmaster_address = administrator@brick.local
}

auth default {
        mechanisms = plain login
        passdb pam {
        }
        userdb static {
         args = uid=501 gid=501 home=/var/vmail/%Lu/Maildir/ allow_all_users=yes
        }

socket listen {
        client {
          #Parametri per dovecot-sasl, Postfix utilizza dovecot per inziare una sessione SMTP autenticata
          path = /var/spool/postfix/private/auth
          mode = 0660
          user = postfix
          group = postfix

        master {
          #Impostazioni per LDA
          path = /var/run/dovecot/auth-master
          mode = 0600
          user = vmail
          group = vmail
        }
}

}


Per gli utenti di Dovecot 2.x, dal momento che lo schema dei file di configurazione è cambiato, bisognerà procedere modificando diversi file:


File /etc/dovecot/conf.d/10-auth.conf

auth_username_format = %Lu
auth_debug = yes
ssl = no
first_valid_uid = 501
last_valid_uid = 501
first_valid_gid = 501
last_valid_gid = 501


File /etc/dovecot/conf.d/auth-system.conf.ext 

passdb {
         driver = pam
       }
userdb {
         driver = static
         args = uid=501 gid=501 home=/var/vmail/%Lu allow_all_users=yes
       }


File /etc/dovecot/conf.d/10-master.conf

service auth {
               unix_listener auth-userdb {
                                           mode = 0600
                                           user = vmail
                                           group = vmail
                                         }
               unix_listener /var/spool/postfix/private/auth {
                                           mode = 0660
                                           user = postfix
                                           group = postfix
                                         }
}

File /etc/dovecot/conf.d/15-lda.conf

postmaster_address = administrator@brick.local


Avviamo poi Dovecot con il comando

service dovecot start

Testiamo se l'autenticazione funziona (digitate solo i comandi in grassetto):

telnet localhost 143
Trying 127.0.0.1...
Connected to localhost.localdomain (127.0.0.1).
Escape character is '^]'.
* OK Dovecot ready.
a LOGIN testuser testpassword
a OK Logged in.
a EXAMINE INBOX
* FLAGS (\Answered \Flagged \Deleted \Seen \Draft)
* OK [PERMANENTFLAGS ()] Read-only mailbox.
* 0 EXISTS
* 0 RECENT
* OK [UIDVALIDITY 1307972331] UIDs valid
* OK [UIDNEXT 1] Predicted next UID
a OK [READ-ONLY] Select completed.
a LOGOUT
* BYE Logging out
a OK Logout completed.
Connection closed by foreign host.


Se il server vi risponde come sopra è tutto ok, altrimenti ricontrollate i file di configurazione e spulciatevi i log.

Per configurare Dovecot in modalità Multi-Tenant, fate riferimento a questo articolo


4. Configurazione di Postfix

Per fare in modo che Postfix riconosca se un indirizzo mail è esistente o meno nella nostra organizzazione, impostiamo un lookup su Active Directory tramite LDAP.

Creiamo prima un utente in Active Directory la cui funzione sarà quella di effettuare le query su LDAP.
Io ho creato l'utente adquery con password password e l'ho messo nell'unità organizzativa System Users.

Il bind DN con Active Directory può essere esplicitato in 3 modi:
  1. Utilizzando la sintassi LDAP, nel nostro caso CN=adquery,OU=System Users,DC=brick,DC=local
  2. Utilizzando la la forma utente\DOMINIO, nel nostro caso adquery\BRICK
  3. Utilizzando la forma utente@dominio, nel nostro caso adquery@brick

Creiamo il file /etc/postfix/ldap-users.cf:

server_host = brick.local
search_base = DC=brick,DC=local

bind = yes
bind_dn = adquery@brick.local
bind_pw = querypassword

query_filter = (&(objectclass=person) (mail=%s))
result_attribute = sAMAccountName
version = 3
result_format=%s/Maildir/ 



Configuriamo il delivery transport di Dovecot, aggiungendo in fondo al file /etc/postfix/master.cf

# Dovecot LDA
dovecot unix - n n - - pipe
flags=DRhu user=vmail:vmail argv=/usr/libexec/dovecot/deliver -f ${sender} -d ${recipient}


Modificate il file /etc/postfix/main.cf:

mynetworks_style = subnet
mynetworks = 127.0.0.0/8,192.168.98.0/24

myhostname = mail.brick.local
myorigin = $mydomain

#Autenticazione SASL (postfix utilizza dovecot, che a sua volta si appoggia a Kerberos di Active Directory
smtpd_sasl_type = dovecot
smtpd_sasl_path = private/auth
smtpd_sasl_auth_enable = yes

smtpd_recipient_restrictions = permit_mynetworks, permit_sasl_authenticated,reject_unauth_destination

alias_maps = hash:/etc/aliases
command_directory = /usr/sbin
daemon_directory = /usr/libexec/postfix

# Usiamo dovecot lda per recapitare i messaggi nelle mailbox, il transport dovecot è definito nel file /etc/postfix/master.cf

virtual_transport=dovecot
dovecot_destination_recipient_limit=1

virtual_mailbox_domains = brick.local
virtual_mailbox_base = /home/vmail/
 

#Lo UID e il GID dell'utente vmail, ve lo siete annotati?
virtual_uid_maps = static:501
virtual_gid_maps = static:501

# Controlliamo che l'indirizzo del destinatario sia valido e facciamo in modo che dovecot LDA recapiti il messaggio nella posizione corretta


virtual_alias_maps = ldap:/etc/postfix/ldap-users.cf
virtual_mailbox_maps = ldap:/etc/postfix/ldap-users.cf

Riavviamo Postfix:

service postfix restart


E Proviamo a inviare un messaggio (digitiamo i comandi in grassetto):
telnet localhost 25
Trying 127.0.0.1...
Connected to localhost.localdomain (127.0.0.1).
Escape character is '^]'.
220 mail.brick.local ESMTP Postfix
HELO brick.local
250 mail.brick.local
mail from brick@brick.local
250 2.1.0 Ok
RCPT TO: testuser@brick.local
250 2.1.5 Ok
DATA
354 End data with <CR><LF>.<CR><LF>
Subject: La vispa...
...Teresa avea tra l'erbetta a volo sorpresa gentil farfalletta ...
.

250 2.0.0 Ok: queued as A6DF511804D
quit
221 2.0.0 Bye
Connection closed by foreign host.


Poi controllate sul server IMAP se c'è posta. Se non vi ha scritto nessuno ricontrollate i file di configurazione e buttate un occhio sui log.
Magari, se vi è venuta la sindrome da tunnel carpale a forza di comandi telnet, potete anche configurare il vostro client di posta preferito, così potete testare anche l'autenticazione SMTP. Io vi consiglio Mozilla Thunderbird!

Se tutto funziona, possiamo aggiungere all'avvio automatico Dovecot e Postfix:


chkconfig dovecot on
chkconfig postfix on


Ed ecco pronto il nostro server di posta.

Fonti:
Shami's Blog: FreeBSD, Postfix, Dovecot, and Active Directory
Active Directory and Dovecot PAM Authentication

4 commenti:

  1. Ciao,
    post molto interessante ma ho una difficoltà con dovecot e mi sa che manca qualcosa perchè ricontrollando i vari file di configurazione non trovo errori eppure non mi autentica.
    Avrei a chiederti, vista la tua esperienza, un paio di domande spero veloci per implementare una soluzione come quella che illustri se sei disponibile, grazie.

    RispondiElimina
  2. Strano perché quando realizzo infrastrutture di posta simili prendo come riferimento l'howto e se trovo degli errori correggo :)

    Puoi contattarmi per email o gtalk a r punto bicelli at gmail punto com.

    RispondiElimina
  3. Ciao,
    sto provando a configurare dovecot e postfix come indichi nel post, e funziona tutto correttamente fino all' avvio di postfix. Appena avviato si spegne, e controllando i logs si vede questo errore:
    dovecot postfix/master[3721]: fatal: /etc/postfix/master.cf: line 108: bad transport type: user=vmail:vmail
    Sul file master.cf ho semplicemente aggiunto il codice indicato nel tutorial alla fine.
    Dove potrei verificare altre cause di questo errore ? grazie

    RispondiElimina
    Risposte
    1. Ciao, se hai fatto copia/incolla master.cf non lo ha digerito.
      Prova a riscrivere a mano le modifiche sul file.

      Elimina