Table des matières

Dovecot et les Quotas

Maintenant que Dovecot est configuré, notamment avec dovecot-lmtp , on va installer un plugin pour gérer les “Quotas”.

On verra aussi comment ajuster les Quota selon les utilisateurs.

~~READMORE~~

Préalable

Il faut mettre en place la livraison via “Dovecot-LDA” ou “Dovecot-LMTP”, parce que le calcul d'un Quota ce fait aussi au moment de la livraison des e-mails.

Postfix → Dovecot-LMTP → plugin-Quota → Livraison dans la “Maildir”.

Plugin Quota

configurer

Dans local.conf :

mail_plugins = $mail_plugins quota

plugin {
  quota = maildir:User Quota
  quota_rule = *:storage=1G
  quota_rule2 = Drafts:storage=+10%%
  quota_rule3 = Trash:storage=+10%%
  quota_rule4 = Junk:storage=+10%%
  quota_rule5 = Archive:storage=+25%%
  quota_rule6 = Sent:storage=+25%%
  quota_exceeded_message = Quota exceeded.
}

Et dans les sections protocol imap et protocol imaps , ajouter aussi:

mail_plugins = $mail_plugins imap_quota

… qui est un autre plugin adapté pour le protocole IMAP.

Donc, on a:

Voir plus loin pour avoir des messages d'avertissements.

Tester

Quand on test le “plein”, on a en retour:

<userXXX@mail.local.eez.fr> (expanded from <userXXX@tjaouen.fr>): host
  mail.eez.fr[private/dovecot-lmtp] said: 552 5.2.2
  <userXXX@mail.local.eez.fr> Quota exceeded. (in reply to end of DATA
  command)

C'est violent… non ?

Adapter selon l'utilisateur

Pour que les quotas soient different selon les utilisateurs, il faut utiliser les “extra fields”.
Or, les “extra fields” sont un concept inconnu du fichier /etc/passwd qui vient avec l'authentification PAM.

Par défaut, on a simplement, actuellement (dans conf.d/auth-system.conf.ext) :

userdb {
  driver = passwd
}

On va ajouter une autre base au format passwd-file , déclaré avant , qui sera d'abord consultée avant la base passwd.

Créer d'abord un fichier passwd-file vide:

# touch /etc/dovecot/userdb-passwd-file

Ensuite on va désactiver le fichier conf.d/10-auth.conf (qui charge conf.d/auth-system.conf.ext) comme cela:

# mv conf.d/10-auth.conf{,-DISABLED}

Maintenant, on peut refaire la configuration a notre façon, en ajoutant dans local.conf :

# --- passdb et userdb ----------------------------------------
# Voir fichier: conf.d/10-auth.conf-DISABLED

auth_mechanisms = plain

passdb {
  driver = pam
}

# -------------------------------------------------------
# D'abord le fichier au format "passwd-file"
# si le compte n'existe pas, regarde dans "passwd"
# -------------------------------------------------------

# first passwd-file
userdb {
  driver = passwd-file
  args = username_format=%u /etc/dovecot/userdb-passwd-file
}

# fallback to PAM
userdb {
  driver = passwd
}

# -------------------------------------------------------------

Le fichier passwd-file est juste une copie des lignes des comptes mails du fichier /etc/passwd , avec un champ supplémentaire à la fin, pour les “extra fields”.

Exemple de fichier passwd-file :

# ----------------------------------
# userdb-passwd-file pour Dovecot
# ----------------------------------
thierry:x:2000:100:,,,:/home/thierry:/bin/false:userdb_quota_rule=*:storage=10G
pirate:x:2001:100:,,,:/home/pirate:/bin/false:userdb_quota_rule=*:storage=300M
# ----------------------------------
# EOF

On voit l'ajout de “userdb_quota_rule=*:storage=10G” .

Bien sur, c'est nécessaire uniquement pour les quelques utilisateurs qui ont besoin d'une configuration particulière.

:!: Sauf pour le dernier champ “extra fields”: *tout* les autres champs doivent être identique a ce qu'il y a dans /etc/passwd

Quota-Warning

On peut faire en sorte que les utilisateurs soient informés lorsque ils dépassent certains quotas.

Dans mon exemple, les avertissements a propos des quotas seront simplement ajoutés à un fichier texte.
Un autre scripte, réveillé par CRON , ira consulter ce fichier et enverra les mails (ou pas) d'informations au utilisateurs.

Dans local.conf, on ajoute :

plugin {
  quota_warning = storage=100%% quota-warning %u "CRIT" "ATTENTION: Boite de messages pleine à 100%%"
  quota_warning2 = storage=95%% quota-warning %u "CRIT" "ATTENTION: Boite de messages remplie à plus de 95%%"
  quota_warning3 = storage=90%% quota-warning %u "WARN" "ATTENTION: Boite de messages remplie à plus de 90%%"
  quota_warning4 = storage=85%% quota-warning %u "WARN" "ATTENTION: Boite de messages remplie à plus de 85%%"
  quota_warning5 = storage=80%% quota-warning %u "WARN" "ATTENTION: Boite de messages remplie à plus de 80%%"
  quota_warning6 = -storage=100%% quota-warning %u "INFO" "Boite de messages en dessous du seuil de 100%%"
  quota_warning7 = -storage=90%% quota-warning %u "INFO" "Boite de messages en dessous du seuil de 90%%"
  quota_warning8 = -storage=80%% quota-warning %u "INFO" "Boite de messages en dessous du seuil de 80%%"
}
service quota-warning {
  executable = script /usr/local/bin/dovecot-new-quota-warning.sh
  # use some unprivileged user for executing the quota warnings
  user = nobody
  group = staff
  unix_listener quota-warning {
    group = users
    mode = 0660
  }
}

unix_listener quota-warning créé un pipe : il faut que les comptes mails (qui sont dans le groupe users chez moi) aient le droits d'écrire dedans.

Le script /usr/local/bin/dovecot-new-quota-warning.sh :

#!/bin/bash

# dovecot-new-quota-warning.sh <USER> <LEVEL> <MESSAGE...>
#  USER=compte (not e-email)
#  LEVEL=CRIT|WARN|INFO
#  MESSAGE=...

QUOTA_USER="${1}"
QUOTA_LEVEL="${2}"
shift 2
QUOTA_MESSAGE="$*"

[ -n "${QUOTA_USER}" ] || exit 0
[ -n "${QUOTA_LEVEL}" ] || exit 0
[ -n "${QUOTA_MESSAGE}" ] || exit 0

WORK_DIR="/var/local/dovecot-quota-warning"
FILE_DEST="msg.new"
DATE_NOW=$( LANG=C date --utc )

[ -d "${WORK_DIR}" ] || mkdir -p "${WORK_DIR}"

echo -e "${DATE_NOW}\t${QUOTA_USER}\t${QUOTA_LEVEL}\t${QUOTA_MESSAGE}" >> "${WORK_DIR}/${FILE_DEST}"

exit 0

# --------------------------------
# EOF

Comme c'est nobody , dans le group staff qui va écrire dans /var/local/dovecot-quota-warning , il faut bien s'assurer qu'il en a les droits:

chmod g+w /var/local/dovecot-quota-warning

Maintenant, le petit script /usr/local/bin/dovecot-parse-quota-warning.sh qui va envoyer les mails d'avertissements:

#!/bin/bash

LDA="/usr/lib/dovecot/dovecot-lda"

[ -x "${LDA}" ] || exit 0

WORK_DIR="/var/local/dovecot-quota-warning"
FILE_NEW="msg.new"
FILE_CUR="msg.cur"

[ -f "${WORK_DIR}/${FILE_NEW}" ] || exit 0

mv -f "${WORK_DIR}/${FILE_NEW}" "${WORK_DIR}/${FILE_CUR}" || exit 1

arg_split() {
  __DATE=$1
  __USER=$2
  __LEVEL=$3
  shift 3
  __MESSAGE="$*"
}

while read -r LINE
do
  OLDIFS=$IFS
  IFS=$'\t'
  arg_split ${LINE}
  IFS=$OLDIFS

  # remove quotes
  __LEVEL="${__LEVEL%\"}"
  __LEVEL="${__LEVEL#\"}"
  __MESSAGE="${__MESSAGE%\"}"
  __MESSAGE="${__MESSAGE#\"}"

  NIVEAU=${__LEVEL}
  [ "${__LEVEL}" = "WARN" ] && NIVEAU="Avertissement"
  [ "${__LEVEL}" = "CRIT" ] && NIVEAU="Seuil CRITIQUE"
  [ "${__LEVEL}" = "INFO" ] && NIVEAU="Information"

  MAIL_FROM="postmaster@<MON_DOMAIN>"      ; # <---- FIXME
  MAIL_SUBJECT="[Quota] ${NIVEAU}"

  cat << __EndOfData__ | "${LDA}" -d "${__USER}" -o "plugin/quota=maildir:User quota:noenforcing"
From: ${MAIL_FROM}
Subject: ${MAIL_SUBJECT}
Date: $( LANG=C date )
Content-Type: text/plain; charset="utf-8"

Bonjour,

*** Ceci est un message automatique ***

Votre attention est requise à propos de l'espace alloué pour le stockage de vos messages.

Date: $( date --date="${__DATE}" )
Compte: ${__USER}
Niveau d'alerte: ${NIVEAU}
Message:
"
${__MESSAGE}
"

Cordialement
Le Robot sur le serveur de Eez.fr.

-- 
S'il fallait tolérer aux autres tout ce qu'on se permet à soi-même, la vie ne serait plus tenable.
Georges Courteline, La philosophie de Georges Courteline
__EndOfData__

done < <( cat "${WORK_DIR}/${FILE_CUR}" )

# ------------
# EOF

… ce script va faire sont traitement toutes le 5 minutes… par exemple dans CRON:

*/5 * * * * /usr/local/bin/dovecot-parse-quota-warning.sh >/dev/null

Divers

Connaître le quota d'un utilisateur:

# doveadm quota get -u <USER>

Recalculer le quota:

# doveadm quota recalc -u <USER>

Sources