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:
- Utilizzando la sintassi LDAP, nel nostro caso CN=adquery,OU=System Users,DC=brick,DC=local
- Utilizzando la la forma utente\DOMINIO, nel nostro caso adquery\BRICK
- 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