Menu Chiudi

Configurazione Postfix e Dovecot con utenti virtuali connessi tramite LDAP + SIEVE + ACL + QUOTE

Premessa
Nella presente guida, LDAP viene utilizzata da Postfix SOLO per verificare l’esistenza della cassetta postale in cui i messaggi di posta verranno recapitati (come delivery agent verrà utilizzato dovecot).

Postfix si appoggia a dovecot per effettuare l’autenticazione necessaria a gestire il relay verso indirizzi NON locali.

LDAP viene utilizzata da Dovecot per gestire l’autenticazione degli utenti che accedono alle rispettive maildir e per l’autenticazione verso il servizio smtp di postfix.

Premessa
Nella presente guida, LDAP viene utilizzata da Postfix SOLO per verificare l’esistenza della cassetta postale in cui i messaggi di posta verranno recapitati (come delivery agent verrà utilizzato dovecot).

Postfix si appoggia a dovecot per effettuare l’autenticazione necessaria a gestire il relay verso indirizzi NON locali.

LDAP viene utilizzata da Dovecot per gestire l’autenticazione degli utenti che accedono alle rispettive maildir e per l’autenticazione verso il servizio smtp di postfix.

In AD o SAMBA4 è stato creato un apposito utente ADLinux con una password priva di caratteri speciali (es. simbolo del dollaro) che potrebbe creare problemi in fase di autenticazione dei vari servizi.

E’ stato configurato managesieve per dovecot per consentire agli utenti di configurare autonomamente le regole di posta in entrata.

E’ stato configurato il plugin quota per gestire le quote per le cassette postali imap.

La cosa più complessa durante la fase di configurazione di dovecot è stata quella di poter gestire le cassette postali per utenti con un account completamente diverso rispetto all’indirizzo di posta elettronica. es. account: utenteXX e-mail: cognomenome@miodominio.it

Link utili:
http://workaround.org/ispmail/squeeze
http://www.linuxmail.info/postfix-dovecot-ldap-centos-5/ –> sito da cui è tratta questa guida
http://www.jxplorer.org/downloads/users.html –>software per navigare la struttura LDAP
http://wiki.dovecot.org/LDA/Sieve –> sieve plugin per dovecot per la gestione dei filtri Questi sono i repository utilizzati per dovecot

# repository per dovecot completo di plugin sieve
deb http://xi.rename-it.nl/debian/ stable-auto/dovecot-1.2 main

Alcuni comandi utili relativi a postfix

# postfix reload --> postfix/postfix-script: refreshing the Postfix mail system

# postconf
2bounce_notice_recipient = postmaster
access_map_defer_code = 450
access_map_reject_code = 554
address_verify_cache_cleanup_interval = 12h
address_verify_default_transport = $default_transport
address_verify_local_transport = $local_transport
address_verify_map = btree:$data_directory/verify_cache
address_verify_negative_cache = yes
....
....

Installazione

I dischi sono stati configurati nel modo seguente:

fdisk -l

Disk /dev/vda: 10.7 GB, 10737418240 bytes
255 heads, 63 sectors/track, 1305 cylinders
Units = cylinders of 16065 * 512 = 8225280 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disk identifier: 0x000b4534

   Device Boot      Start         End      Blocks   Id  System
/dev/vda1   *           1        1246    10005504   83  Linux
/dev/vda2            1246        1306      477185    5  Extended
/dev/vda5            1246        1306      477184   82  Linux swap / Solaris

Disk /dev/vdb: 32.2 GB, 32212254720 bytes
255 heads, 63 sectors/track, 3916 cylinders
Units = cylinders of 16065 * 512 = 8225280 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disk identifier: 0x000cee29

   Device Boot      Start         End      Blocks   Id  System
/dev/vdb1               1        3917    31455232   83  Linux

Disk /dev/vdc: 34.4 GB, 34359738368 bytes
255 heads, 63 sectors/track, 4177 cylinders
Units = cylinders of 16065 * 512 = 8225280 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disk identifier: 0x000e3e8c

   Device Boot      Start         End      Blocks   Id  System
/dev/vdc1               1        4178    33552384   83  Linux
mount | grep vd
/dev/vda1 on / type ext3 (rw,errors=remount-ro)
/dev/vdb1 on /home type ext4 (rw)
/dev/vdc1 on /var type ext4 (rw)

NB. le cartelle /home e /var sono state messe su dischi separati per gestire futuri problemi di spazio disco.

Note relative a jxplorer

host: IP_DEL_SERVER_LDAP
port: 389
protocol: LDAP v3
base dn: dc=DOMINIO,dc=LOCALE
security level: user + password
user dn: DOMINIO\ADlinux
password: PASSWORD

Creazione di un account per gestire i file degli utenti virtuale

Per prima cosa è necessario creare un utente unix che sarà l’owner di tutti i file per ogni singolo utente virtuale proveniente da LDAP. Creiamo l’utente vmail al quale impediamo di accedere alla shell

# adduser --shell /usr/sbin/nologin vmail
Aggiunta dell'utente «vmail» ...
Aggiunta del nuovo gruppo «vmail» (1001) ...
Aggiunta del nuovo utente «vmail» (1001) con gruppo «vmail» ...
Creazione della directory home «/home/vmail» ...
Copia dei file da «/etc/skel» ...
Immettere nuova password UNIX: 
Reimmettere la nuova password UNIX: 
passwd: password aggiornata correttamente
Modifica delle informazioni relative all'utente vmail
Inserire il nuovo valore o premere INVIO per quello predefinito
	Nome completo []: vmail
	Stanza n° []: 
	Numero telefonico di lavoro []: 
	Numero telefonico di casa []: 
	Altro []: 
Le informazioni sono corrette? [S/n] S

Prendiamo nota degli uid e gid del nuovo utente, ci serviranno per la configurazione di DOVECOT

# cat /etc/passwd | grep vmail
vmail:x:1001:1001:vmail,,,:/home/vmail:/usr/sbin/nologin

Installiamo e configuriamo postfix per l’integrazione tramite LDAP

apt-get install postfix
apt-get install postfix-ldap

Postfix, gira in ambiente “chrooted”, per risolvere i problemi connessi all’interrogazione da parte di postfix a ldap tramite LDAPS è necessario che postfix riesca ad accedere a due particolari device (nello specifico /dev/random e /dev/urandom).

mkdir /var/spool/postfix/dev 
cp -a /dev/random /var/spool/postfix/dev 
cp -a /dev/urandom /var/spool/postfix/dev

In realtà si è successivamente scelto di NON utilizzare il protocollo LDAPS in quanto rallenta notevolmente tutte le interrogazioni fatte verso il database LDAP. Questo NON comporta particolari problemi di sicurezza se il server LDAP da interrogare è connesso direttamente allo stesso switch di rete del server di posta elettronica. Se si riscontrano problemi con l’accesso a LDAP/LDAPS dal server di posta è possibile eseguire dei test nel modo seguente

Inizio dei test !
—————–
Configurare il file /etc/ldap/ldap.conf

URI ldap://IP_DEL_SERVER_LDAP/
BASE=dc=DOMINIO,dc=LOCALE

# questo parametro serve solo se utilizzate ldaps al posto di ldap
TLS_REQCERT never
# apt-get install ldap-utils
# ldapsearch -x -H ldap://IP_DEL_SERVER_LDAP -D 'cn=ADlinux,cn=users,dc=DOMINIO,dc=LOCALE' -w "PASSWORD" -a never -b 'cn=users,dc=DOMINIO,dc=LOCALE'

Fine dei test !
—————

Creiamo il file /etc/postfix/ldap-users.cf che servirà a postfix SOLO per poter capire se i messaggi dovranno essere passati a DOVECOT o se dovrà essere fatto il relay verso un altro server smpt.

# cat /etc/postfix/ldap-users.cf 
server_host = ldap://IP_DEL_SERVER_LDAP
version = 3
bind = yes
bind_dn = DOMINIO\ADlinux
bind_pw = **PASSWORD**
search_base = dc=DOMINIO,dc=LOCALE
query_filter = (&(objectclass=person)(|(mail=%s)(othermailbox=%s)))
result_attribute = samaccountname

Creiamo il file /etc/postfix/ldap-groups.cf che servirà a postfix per utilizzare i gruppi LDAP

# cat /etc/postfix/ldap-groups.cf 
server_host = ldap://IP_DEL_SERVER_LDAP
version = 3
bind = yes
bind_dn = DOMINIO\ADlinux
bind_pw = **PASSWORD**
search_base = dc=DOMINIO,dc=LOCALE
query_filter = (&(objectclass=group)(mail=%s))
leaf_result_attribute = mail
special_result_attribute = member

Modifichiamo il file /etc/postfix/main.cf aggiungendo le seguenti righe:

virtual_mailbox_domains = DOMINIO.LOCALE
virtual_mailbox_maps = ldap:/etc/postfix/ldap-users.cf
virtual_alias_maps = ldap:/etc/postfix/ldap-groups.cf
virtual_transport=dovecot
dovecot_destination_recipient_limit=1

togliamo il dominio DOMINIO.LOCALE da mydestination

e le seguenti righe per gestire delegare l’autenticazione smpt a dovecot per impedire il relay

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

Modifichiamo il file /etc/postfix/master.cf aggiungendo le seguenti righe:

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

Riavviare il servizio di postfix

/etc/init.d/postfix restart

Verifichiamo le interrogazioni fatte da postfix verso ldap

postmap -q indirizzoposta@ILMIODOMINIODIPOSTA ldap:/etc/postfix/ldap-users.cf

Installiamo dovecot

apt-get install dovecot-imapd

creiamo il file necessario a dovecot per gestire l’autenticazione tramite LDAP

# cat dovecot-ldap.conf 
# Space separated list of LDAP hosts to use. host:port is allowed too.
hosts = IP_DEL_SERVER_LDAP

# Distinguished Name - the username used to login to the LDAP server.
# Leave it commented out to bind anonymously (useful with auth_bind=yes).
dn = DOMINIO\ADlinux

# Password for LDAP server, if dn is specified.
dnpass = **PASSWORD**

# LDAP library debug level as specified by LDAP_DEBUG_* in ldap_log.h.
# -1 = everything. You may need to recompile OpenLDAP with debugging enabled
# to get enough output.
#debug_level = 0

# Use authentication binding for verifying password's validity. This works by
# logging into LDAP server using the username and password given by client.
# The pass_filter is used to find the DN for the user. Note that the pass_attrs
# is still used, only the password field is ignored in it. Before doing any
# search, the binding is switched back to the default DN.
auth_bind = yes
auth_bind_userdn = DOMINIO\%u

# LDAP protocol version to use. Likely 2 or 3.
ldap_version = 3

# LDAP base. %variables can be used here.
# For example: dc=mail, dc=example, dc=org
base = ou=dc=DOMINIO,dc=LOCALE

# Dereference: never, searching, finding, always
deref = never

# Search scope: base, onelevel, subtree
scope = subtree

# User attributes are given in LDAP-name=dovecot-internal-name list. The
# internal names are:
#   uid - System UID
#   gid - System GID
#   home - Home directory
#   mail - Mail location
#
# There are also other special fields which can be returned, see
# http://wiki2.dovecot.org/UserDatabase/ExtraFields
user_attrs = info=quota_rule=*:bytes=%$,sAMAccountName=mail=maildir:/home/vmail/%$,=home=/home/vmail,mailNickname=sieve=/home/vmail/.%$.dovecot.sieve,description=sieve_dir=/home/vmail/%$/sieve

# Filter for user lookup. Some variables can be used (see # http://wiki2.dovecot.org/Variables for full list):

# %u - username # %n - user part in user@domain, same as %u if there's no domain # %d - domain part in user@domain, empty if user there's no domain user_filter = (&(objectClass=person)(sAMAccountname=%u))

imposto i relativi permessi di accesso

chown vmail:vmail dovecot-ldap.conf

creo un link simbolico al file da fare utilizzare a dovecot per l’interrogazione del database LDAP

ln -s dovecot-ldap.conf dovecot-ldapuser.conf

creiamo il file necessario a gestire i parametri per l’utente al posto dell’indirizzo di posta elettronica
(es. utenteXX)

# cat dovecot-ldapuseremail.conf

# Space separated list of LDAP hosts to use. host:port is allowed too.
hosts = IP_DEL_SERVER_LDAP 

# Distinguished Name – the username used to login to the LDAP server.
# Leave it commented out to bind anonymously (useful with auth_bind=yes).
dn = DOMINIO\ADlinux

# Password for LDAP server, if dn is specified.
dnpass = ****PASSWORD****

# LDAP library debug level as specified by LDAP_DEBUG_* in ldap_log.h.
# -1 = everything. You may need to recompile OpenLDAP with debugging enabled
# to get enough output.
#debug_level = 0

# Use authentication binding for verifying password’s validity. This works by
# logging into LDAP server using the username and password given by client.
# The pass_filter is used to find the DN for the user. Note that the pass_attrs
# is still used, only the password field is ignored in it. Before doing any
# search, the binding is switched back to the default DN.
auth_bind = yes
auth_bind_userdn = DOMINIO\%u

# LDAP protocol version to use. Likely 2 or 3.
ldap_version = 3

# LDAP base. %variables can be used here.
# For example: dc=mail, dc=example, dc=org
base = dc=DOMINIO,dc=LOCALE

# Dereference: never, searching, finding, always
deref = never

# Search scope: base, onelevel, subtree
scope = subtree

# User attributes are given in LDAP-name=dovecot-internal-name list. The
# internal names are:
# uid – System UID
# gid – System GID
# home – Home directory
# mail – Mail location
#

# There are also other special fields which can be returned, see
# http://wiki2.dovecot.org/UserDatabase/ExtraFields
user_attrs = info=quota_rule=*:bytes=%$,sAMAccountName=mail=maildir:/home/vmail/%$,=home=/home/vmail,mailNickname=sieve=/home/vmail/.%$.dovecot.sieve,description=sieve_dir=/home/vmail/%$/sieve

# Filter for user lookup. Some variables can be used (see
# http://wiki2.dovecot.org/Variables for full list):
# %u – username
# %n – user part in user@domain, same as %u if there’s no domain
# %d – domain part in user@domain, empty if user there’s no domain
user_filter = (&(objectClass=person)(mail=%u))

questa la configurazione di dovecot:

# dovecot -n # 1.2.17: /etc/dovecot/dovecot.conf # OS: Linux 2.6.32-5-686 i686 Debian 6.0.2 ext4 protocols: imap imaps managesieve disable_plaintext_auth: no login_dir: /var/run/dovecot/login login_executable(default): /usr/lib/dovecot/imap-login login_executable(imap): /usr/lib/dovecot/imap-login login_executable(managesieve): /usr/lib/dovecot/managesieve-login mail_max_userip_connections(default): 0 mail_max_userip_connections(imap): 0 mail_max_userip_connections(managesieve): 10 mail_uid: vmail mail_gid: vmail mail_location: maildir:/home/vmail/%u mail_debug: yes mbox_write_locks: fcntl dotlock mail_executable(default): /usr/lib/dovecot/imap mail_executable(imap): /usr/lib/dovecot/imap mail_executable(managesieve): /usr/lib/dovecot/managesieve mail_plugins(default): acl imap_acl quota imap_quota mail_plugins(imap): acl imap_acl quota imap_quota mail_plugins(managesieve): mail_plugin_dir(default): /usr/lib/dovecot/modules/imap mail_plugin_dir(imap): /usr/lib/dovecot/modules/imap mail_plugin_dir(managesieve): /usr/lib/dovecot/modules/managesieve namespace: type: private separator: / prefix: INBOX/ inbox: yes list: yes subscriptions: yes namespace: type: shared separator: / prefix: Posta Condivisa/%%u/ location: maildir:%%Lh/%%u:INDEX=%Lh/%%u list: children subscriptions: yes namespace: type: public separator: / prefix: Posta pubblica/ location: maildir:/home/vmail/public list: children subscriptions: yes lda: postmaster_address: ced@dominio.locale mail_plugins: sieve acl quota log_path: auth_socket_path: /var/run/dovecot/auth-master auth default: user: vmail verbose: yes debug: yes passdb: driver: ldap args: /etc/dovecot/dovecot-ldap.conf userdb: driver: prefetch userdb: driver: ldap args: /etc/dovecot/dovecot-ldapuser.conf userdb: driver: ldap args: /etc/dovecot/dovecot-ldapuseremail.conf userdb: driver: static args: uid=vmail gid=vmail mail=maildir:/home/vmail/%u home=/home/vmail/%u sieve=/home/vmail/.%u.dovecot.sieve sieve_dir=/home/vmail/%u/sieve socket: type: listen client: path: /var/spool/postfix/private/auth mode: 432 user: postfix group: postfix master: path: /var/run/dovecot/auth-master mode: 384 user: vmail plugin: quota: maildir:User quota quota_rule: *:storage=5G quota_rule2: Trash:storage=100M quota_rule3: Spam:storage=100M quota_warning: storage=99%% /usr/local/bin/quota-warning.sh 99 quota_warning2: storage=95%% /usr/local/bin/quota-warning.sh 95 quota_warning3: storage=80%% /usr/local/bin/quota-warning.sh 80 quota_warning4: storage=70%% /usr/local/bin/quota-warning.sh 70 quota_warning5: storage=60%% /usr/local/bin/quota-warning.sh 60 quota_warning6: storage=50%% /usr/local/bin/quota-warning.sh 50 acl: vfile acl_shared_dict: file:/home/vmail/shared-mailboxes.db

Installare mutt come client di posta ed effettuare un test di invio (se non sei un “mago” con telnet i test NON andranno a buon fine !!):

# apt-get intall mutt

# cat .muttrc
set folder=imap://UTENTE@DOMINIO.LOCALE/
set spoolfile=imap://UTENTE@DOMINIO.LOCALE/

# mutt

l’applicativo mutt viene avviato come utente root, inviare un e-mail di prova a indirizzoposta@ILMIODOMINIODIPOSTA, se tutto è andato a buon fine nella cartella /home/vmail/ verrà creata la cartella NOMEUTENTE/Maildir e le rispettive cartelle standard (cur, new, tmp).

Gestione delle quote per le singole cassette postali

E' stato utilizzato il campo info (il campo note presente nella scheda numeri telefonici di AD, per gestire la dimensione in byte per ogni singolo utente).

Successivamente sono stati modificati i file /etc/dovecot/dovecot-ldap.conf e

/etc/dovecot/dovecot-ldapemail.conf per gestire il parametro quota (vedi sopra).

Questo invece è lo script che viene eseguito durante il superamento delle varie quote.

# ls -lrt /usr/local/bin/quota-warning.sh -rwxr-xr-x 1 root staff 425 25 ott 17.05 /usr/local/bin/quota-warning.sh

# cat /usr/local/bin/quota-warning.sh

#!/bin/bash

PERCENT=$1 FROM="ced@DOMINIO.LOCALE" msg="From: $FROM To: $USER Subject: Attenzione: cassetta postale $PERCENT% di spazio disponibile Content-Type: text/plain; charset=UTF-8 La cassetta postale $USER ha raggiunto la percentuale $PERCENT% di spazio disponibile." echo -e "$msg" | /usr/lib/dovecot/deliver -f ${FROM} -d ${USER} echo -e "$msg" | /usr/lib/dovecot/deliver -f ${FROM} -d ${FROM} exit 0

WordPress Appliance - Powered by TurnKey Linux