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
# mutt
set folder=imap://UTENTE@DOMINIO.LOCALE/
set spoolfile=imap://UTENTE@DOMINIO.LOCALE/
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