Configurare la quota per un utente virtuale utilizzando Postfix, Dovecot, Mysql e Postfixadm

scs ingegneria dei sistemi quota

 

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.

scs ingegneria dei sistemi postfix

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…scs ingegneria dei sistemi dovecot

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

© 2018 SCS di Alberto Montanari & C. s.a.s. | Pricacy Policy - Cookie Policy