Ho avuto in questi giorni la necessità di configurare la quota massima di un utente per un server Imap, che ha come MTA Postfix, e come Imap server Dovecot, che utilizza Mysql come DB di appoggio, e Postfixadmin come ambiente per la gestione degli utenti.
Mi sono imbattuto in una serie di problemi, soprattutto legati alla mancanza di una documentazione organica, e ho sentito la necessità di condividere i passi per la definizione della quota utente. Non ho affrontato il problema della quota del dominio di posta, dato che non ne avevo la necessità.
La versione di postfix e’ la 2.11.0-1ubuntu1, la versione di dovecot e’ la 1:2.2.9-1ubuntu2.1, mentre la versione di Postfixadmin e’ la 2.93
Una guida decente per l’installazione del sistema completo e’ questa:
https://www.exratione.com/2014/05/a-mailserver-on-ubuntu-1404-postfix-dovecot-mysql/
anche se qualche imprecisione l’ho comunque trovata, soprattutto nella gestione della quota e nella installazione di roundcube mail.
Vediamo i passi operativi.
Installiamo tutto il sistema, verificate che sia funzionante senza quota seguendo la guida sopra citata.
Una volta che tutto funziona, attiviamo la quota.
I file da modificare sono i seguenti:
/postfixadmin/config.inc.php
/etc/postfix/mail.cf
/etc/dovecot/dovecot.conf
/etc/dovecot/dovecot-dict-sql.conf.ext
/usr/local/bin/quota-warning.sh
/etc/dovecot/dovecot-sql.conf.ext
/etc/dovecot/conf.d/10-logging.conf
I passi corretti affinché il tutto funzioni sono i seguenti:
File config.inc.php di postfixadm. Abilitare l’uso della quota
$CONF['quota'] = 'YES';
Configurazione di Postfix. Molto semplice, si dice a Postfix di usare il servizio di Dovecot per la verifica della quota. Io ho scelto la porta 12349 per praticità. Quindi nel file main.cf di Postfix:
smtpd_recipient_restrictions =
...
check_policy_service inet:mailstore.example.com:12349, ......
In Postfix non si fa altro.
In Dovecot c’e’ da fare il lavoro grosso…
Alcuni testi consigliano di lavorare sui vari file di configurazione, ma io ho preferito concentrarmi su un unico file, anche se coinvolge concetti differenti. Per cui il file di lavoro è dovecot.conf
Aggiungere le seguenti direttive:
dict {
quota = mysql:/etc/dovecot/dovecot-dict-sql.conf.ext
}
service dict {
unix_listener dict {
group = mail
mode = 0660
user = vmail
}
user = root
}
service quota-warning {
executable = script /usr/local/bin/quota-warning.sh
user = vmail
unix_listener quota-warning {
group = mail
mode = 0660
user = vmail
}
}
mail_plugins=quota
protocol imap {
mail_plugins = $mail_plugins imap_quota
mail_plugin_dir = /usr/lib/dovecot/modules
}
plugin {
quota = dict:User quota::proxy::quota
}
plugin {
quota_rule2 = Trash:storage=+100M
quota_warning = storage=100%% quota-warning +100 %u
quota_warning2 = storage=95%% quota-warning +95 %u
quota_warning3 = storage=80%% quota-warning +80 %u
quota_warning4 = -storage=100%% quota-warning -100 %u # user is no longer over quota
}
# Load Module quota-status and listen on TCP/IP Port for connections.
service quota-status {
executable = quota-status -p postfix
inet_listener {
address = localhost
port = 12349
}
client_limit = 1
}
# Return messages for requests by quota status: success, nouser and overquota.
plugin {
quota_status_success = DUNNO
quota_status_nouser = DUNNO
quota_status_overquota = "552 5.2.2 Mailbox is over quota"
}
Nel file dovecot.conf si fa riferimento ad un paio di file, che sono
file /etc/dovecot/dovecot-dict-sql.conf.ext
# This file is commonly accessed via dict {} section in dovecot.conf
connect = host=localhost dbname=postfix user=postfix password=segreta
map {
pattern = priv/quota/storage
table = quota2
username_field = username
value_field = bytes
}
map {
pattern = priv/quota/messages
table = quota2
username_field = username
value_field = messages
}
E fil file di warning per superamento del limite
file /usr/local/bin/quota-warning.sh okkio che From: To; e Subject: siano alla colonna 0 come da specifiche mail
#!/bin/sh
BOUNDARY="$1"
USER="$2"
MSG=""
if [ "$BOUNDARY" = "+100" ]; then
MSG="Your mailbox is now overfull (>100%). In order for your account to continue functioning properly, you need to remove some emails NOW."
elif [ "$BOUNDARY" = "+95" ]; then
MSG="Your mailbox is now over 95% full. Please remove some emails ASAP."
elif [ "$BOUNDARY" = "+80" ]; then
MSG="Your mailbox is now over 80% full. Please consider removing some emails to save space."
elif [ "$BOUNDARY" = "-100" ]; then
MSG="Your mailbox is now back to normal (<100%)."
fi
echo "From: postmaster@esseciesse.net
To: $USER
Subject: Email Account Quota Warning
Dear User,
$MSG
Best regards,
Your Mail System
" > /tmp/quota.email.$USER
cat /tmp/quota.email.$USER | /usr/lib/dovecot/dovecot-lda -d $USER -o "plugin/quota=maildir:User quota:noenforcing"
rm /tmp/quota.email.$USER
C’è una modifica importante da fare al file di collegamento ad DB, attenzione che è sbagliato come è descritto nell’articolo esposto sopra ( o per lo meno non è aggiornato a questa versione di Postfixadmin)
file /etc/dovecot/dovecot-sql.conf.ext attenzione che e' diverso dallo standard in particolare byte al posto di storage
# Database driver: mysql, pgsql, sqlite
driver = mysql
connect = host=localhost dbname=postfix user=postfix password=segreta
default_pass_scheme = MD5-CRYPT
password_query = \
SELECT CONCAT('*:bytes=', quota) AS userdb_quota_rule, username as user, password, '/var/vmail/%d/%n' as userdb_home, \
'maildir:/var/vmail/%d/%n' as userdb_mail, 150 as userdb_uid, 8 as userdb_gid \
FROM mailbox WHERE username = '%u' AND active = '1'
user_query = \
SELECT '/var/vmail/%d/%n' as home, 'maildir:/var/vmail/%d/%n' as mail, \
150 AS uid, 8 AS gid, concat('*:bytes=', quota) AS quota_rule \
FROM mailbox WHERE username = '%u' AND active = '1'
iterate_query = SELECT username AS user FROM mailbox
Infine per abilitare bene il debug e vedere quello che succede modificare il file 10-logging.conf
file 10-logging.conf
log_path = /var/log/dovecot_log
debug_log_path = /var/log/dovecot_log_debug
auth_verbose = yes
auth_debug_passwords = yes
Con il comando
cd /var/log ;tail -f mail.log mail.err dovecot_log dovecot_log_debug
Si vede bene quello che succede.
Con questo modifiche sono riuscito a modificare correttamente e a far funzionare il quota.
Un ultima nota di attenzione, che mi ha fatto diventare matto. Questa e’ una nota banale, ma se non si capisce si può perdere un sacco di tempo per nulla.
Nel file di configurazione di Postfixadmin si può impostare il maxquota di default per un utente.
Se lo si modifica e si crea un utente, il valore maxquota dell’utente al momento della creazione del DOMINIO (NB..) viene salvato nel DB.
Per cui se si rimodifica tale valore nel file di configurazione, questo nuovo valore lo si vede solo al momento della creazione di un nuovo dominio. Se si vuole cambiare la quota ad un utente già creato, il suo valore di maxquota è associato al dominio, e non all’utente.. Se non sono stato chiaro vuol dire che non avete avuto questo problema. Se invece volte cambiare una quota ad un utente.. sappiate che il suo maxquota è associato al dominio di mail e non all’utente.
TAG: configurazione, dovecot, imap, mysql, postfix, postfixadm, quota