85.1.52. pepsi-quota

Manage and reconcile per-account mailbox quotas

Section du manuel:

1

85.1.52.1.1. Nom

pepsi-quota - définir les quotas de boîte aux lettres par compte et remesurer les boîtes aux lettres.

85.1.52.1.2. Synopsis

pepsi-quota [GLOBAL-OPTIONS] set LOGIN SIZE [–messages N]
pepsi-quota [GLOBAL-OPTIONS] unset LOGIN
pepsi-quota [GLOBAL-OPTIONS] show LOGIN
pepsi-quota [GLOBAL-OPTIONS] list [–full]
pepsi-quota [GLOBAL-OPTIONS] measure LOGIN
pepsi-quota [GLOBAL-OPTIONS] reconcile [–all]
pepsi-quota [GLOBAL-OPTIONS] remove LOGIN

Les GLOBAL-OPTIONS sont -c FILE, -L LOGLEVEL et -v, et précèdent la sous-commande (voir Options globales).

85.1.52.1.3. Description

pepsi-quota est l’interface de l’opérateur vers la table pepsi.mailbox_quota : les limites de boîte aux lettres par compte que pepsi-stage-relay-to-maildir(1) applique, et la comptabilité d’occupation dont cette étape et pepsi-ingress(1) se servent toutes deux. Ce n’est pas une étape.

Un quota est une propriété d’un compte local : chaque ligne est donc indexée sur le login passwd — non sur une adresse e-mail, et non sur un uid. Un login est ce à quoi pepsi-ingress(1) peut comparer un destinataire d’enveloppe au moment du RCPT sans résoudre d’alias (ce qu’il ne doit pas faire, et ne peut pas), et cela reste une seule ligne lorsque plusieurs adresses atteignent une même boîte aux lettres.

85.1.52.1.3.1. Politique, mesure, estimation

La politique est [pepsi] MAILBOX_QUOTA (la valeur par défaut du site ; son absence signifie illimité), redéfinie par compte via pepsi-quota set, et resserrée davantage par la limite propre du noyau là où le système de fichiers en applique une.

La mesure ne peut être prise que par pepsi-helper-maildir-writer(1), l’unique processus qui devient l’utilisateur et peut lire un Maildir en 0700. measure et reconcile l’exécutent ; rien d’autre ici ne touche à une boîte aux lettres.

L”estimation, ce sont les compteurs used_* + since_*. Les remises propres de Pepsi s’y ajoutent et rien ne soustrait jamais, car rien n’indique à Pepsi qu’un utilisateur supprime du courrier par IMAP. L’estimation est donc une borne supérieure de l’occupation réelle — ce qui la rend précisément sûre comme déclencheur (« ce compte pourrait-il être proche de sa limite ? alors mesurer ») et non sûre comme verdict.

D’où la règle : rien ne refuse un message sur une estimation, seulement sur une mesure.

85.1.52.1.3.2. Pourquoi reconcile existe

Un compte à sa limite est refusé au RCPT par pepsi-ingress(1). Supposons que son propriétaire vide ensuite la boîte aux lettres par IMAP. Rien ne l’indique à Pepsi — et puisque chaque message est refusé, aucune remise ne s’exécute jamais pour prendre une mesure fraîche. La boîte aux lettres resterait fermée à jamais.

Deux choses l’empêchent. pepsi-ingress(1) ne refuse que sur une mesure plus récente que [pepsi] MAILBOX_QUOTA_MAX_AGE (15 minutes par défaut), de sorte qu’un chiffre périmé laisse passer le message et que le chemin de remise regarde à nouveau. Et pepsi-quota reconcile, lancé depuis cron, remesure les comptes qui sont à leur limite — un balayage bon marché précisément parce qu’il ne concerne que ceux-là.

Un site qui applique des quotas doit l’exécuter périodiquement. Sur une installation par paquet, c’est déjà fait : pepsi-quota-reconcile.timer lance le balayage cinq minutes après le démarrage puis toutes les dix minutes (Persistent=true, de sorte qu’une exécution manquée est rattrapée), et pepsi.target le Wants= — l’unique interrupteur qui démarre le pipeline démarre celui-ci aussi. N’ajoutez pas de tâche cron à côté ; cela ferait deux balayages au même intervalle, chacun engendrant le helper setuid.

Sur une installation depuis les sources sans systemd, l’équivalent est

*/10 * * * *  pepsi  pepsi-quota -c /etc/pepsi/pepsi.conf reconcile

85.1.52.1.4. Sous-commandes

set LOGIN SIZE [–messages N]

Donne à un compte sa propre limite, redéfinissant la valeur par défaut du site. SIZE accepte un simple nombre d’octets ou un suffixe K/M/G/T en puissances de 1024 (2G, 500M, 1048576), ou le littéral none.

none n’est pas la même chose qu”unset : cela signifie explicitement illimité, et c’est ainsi qu’un compte unique est exempté d’un quota valant pour tout le site, tandis qu”unset en rétablit l’héritage.

Omettre --messages laisse la limite en nombre de messages hériter de [pepsi] MAILBOX_QUOTA_COUNT ; définir un quota en octets ne la lève pas silencieusement. --messages 0 la lève explicitement. Notez que c’est une propriété de la ligne stockée, non de la commande : set écrit la ligne entière, si bien qu’omettre --messages sur un compte qui portait déjà une limite de messages explicite abandonne cette limite et la ramène à l’héritage. Répétez --messages lorsque vous relevez un quota en octets sur un tel compte ; la ligne imprimée montre le résultat dans les deux cas.

Un login sans entrée passwd fait l’objet d’un avertissement mais est accepté — le compte peut être créé ensuite.

unset LOGIN

Abandonne les limites propres du compte, de sorte qu’il hérite de nouveau de la valeur par défaut du site. La comptabilité d’occupation est conservée.

show LOGIN

Affiche les limites et l’occupation d’un compte. Un compte sans ligne n’est pas une erreur : il imprime la valeur par défaut héritée et « jamais mesuré ».

list [–full]

Liste chaque compte dont Pepsi a tenu la comptabilité, mesure la plus ancienne d’abord. Avec --full, seulement ceux qui sont à leur limite ou au-delà — et un listage vide imprime alors (no accounts at or over their limit) plutôt que (no accounts), le seul cas qui vaille d’être distingué.

measure LOGIN

Remesure cette boîte aux lettres maintenant et stocke le résultat.

reconcile [–all]

Remesure les comptes qui sont à leur limite ou au-delà. Avec --all, aussi ceux dont la mesure est simplement devenue périmée. Une boîte aux lettres non mesurable (un compte supprimé depuis sa dernière remise, par exemple) est journalisée et le balayage se poursuit ; le code de sortie est non nul si l’une a échoué.

remove LOGIN

Oublie entièrement le compte — ses limites et sa comptabilité. La remise suivante recrée la ligne et mesure à neuf : c’est donc aussi le bouton « ces chiffres sont faux, reprends à zéro ».

85.1.52.1.5. Options globales

Ces options globales précèdent la sous-commande (une option placée après est refusée).

-c FILE, –config FILE

Lit la configuration depuis FILE au lieu de chercher aux emplacements par défaut. Contrairement à pepsi-whitelist(1), ceci n’est pas refusé sous le bit setgid : la vérification de l’appelant décrite sous Privilèges s’exécute d’abord, de sorte que seuls root et le compte de service pepsi vont jusqu’à la lire.

-L LOGLEVEL, –log LOGLEVEL

Règle la verbosité de journalisation. LOGLEVEL vaut error, warn, info, debug ou trace (par défaut : info).

-v, –verbose

Affiche les messages de journal de toutes les sources, y compris les bibliothèques tierces.

-h, –help

Affiche un résumé d’utilisation et quitte.

-V, –version

Affiche la version et quitte.

85.1.52.1.6. Sortie

list, show, set et measure impriment une ligne par compte

alice             1200M/2G (58%)  4213 messages  measured 91s ago (maildirsize)
bob                 14M/unlimited 112 messages   measured never (-) [site default]

L’occupation affichée est la mesure plus tout ce qui a été remis depuis, et c’est le chiffre sur lequel agit le chemin de remise. measured est un âge plutôt qu’un horodatage, parce que la question à laquelle il répond est de savoir si le chiffre vaut encore d’être cru : un refus au RCPT repose sur la fraîcheur d’une mesure.

85.1.52.1.7. Privilèges

pepsi-quota est installé set-group-id sur le groupe pepsi-maildir (mode 2550, propriétaire pepsi:pepsi-maildir — exécutable par le propriétaire et non par tous, car le bit setgid est la barrière devant le helper setuid-root, et le droit d’exécution ne peut pas non plus venir des bits de groupe, pepsi n’en étant délibérément pas membre), pour la même raison que pepsi-stage-relay-to-maildir(1) : measure et reconcile exécutent le helper de mesure 4750 root:pepsi-maildir, et le compte de service pepsi n’est délibérément pas membre de ce groupe — le bit setgid sur les quelques programmes autorisés à passer est la barrière. C’est ce qui permet à un reconcile sans surveillance lancé depuis cron de mesurer des boîtes aux lettres sans être root.

Lancé en root, il descend vers le compte de service pepsi avant de se connecter à la base de données, le rôle propriétaire de ces lignes — en conservant le groupe pepsi-maildir à travers l’abandon. Lancé depuis son timer en tant que pepsi, le bit setgid fournit ce groupe et aucun abandon n’a lieu ; le conserver à travers l’abandon est ce qui fait fonctionner measure pour un opérateur qui le tape en root aussi bien que depuis cron. L’exécution en root ne gagne ainsi rien que celle du timer n’ait déjà.

make install met le bit en place (son étape install-quota-tool) à condition d’être lancé en root et que le groupe existe ; sinon il imprime les commandes exactes.

Le bit setgid étant cette barrière, le programme énonce lui-même la même règle : à moins que l’utilisateur réel ne soit root ou le compte de service pepsi, il sort en erreur avant toute lecture de configuration et — comme les étapes cryptographiques setuid — il retire les variables d’environnement qui orientent le chargement de la configuration (HOME, XDG_CONFIG_HOME, PG*, TALER_*, PEPSI_*) et épingle PATH sur une valeur par défaut sûre.

Aucun appelant non privilégié ne perd quoi que ce soit à ce refus : chaque sous-commande lit ou écrit pepsi.mailbox_quota, et l’authentification par pair de PostgreSQL se fonde sur l’uid effectif, si bien qu’un appelant qui n’est pas pepsi (ou root, qui devient pepsi) n’aurait jamais pu se connecter.

85.1.52.1.8. Configuration

Les options de politique que lit cet outil — MAILBOX_QUOTA, MAILBOX_QUOTA_COUNT, MAILBOX_OVER_QUOTA, MAILBOX_QUOTA_MAX_AGE, MAILBOX_QUOTA_RCPT_CHECK et MAILBOX_FS_QUOTA — résident toutes dans la section [pepsi] et sont documentées dans pepsi.conf(5). Une autre, également dans [pepsi], appartient en propre à cet outil :

MAILBOX_HELPER

(chemin, facultatif) Le helper privilégié que cet outil exécute pour prendre une mesure. Par défaut pepsi-helper-maildir-writer, localisé sur le PATH du processus pepsi-quota à moins d’être donné en chemin absolu. C’est le même binaire qu’utilise l’étape de remise, dans son mode measure : un Maildir est en 0700, c’est donc l’unique processus qui peut devenir l’utilisateur et en lire un.

Ne la définissez que là où le helper n’est pas joignable sous ce nom — principalement une installation depuis les sources avec --prefix dont le $PREFIX/bin n’est pas sur le PATH du timer. Gardez-la en accord avec l’option HELPER de la section [stage-<name>] propre à l’étape de remise (pepsi-stage-relay-to-maildir(1)) : les deux nomment le même programme pour deux appelants différents, rien ne les recoupe, et seule la justesse de la paire fait s’accorder remise et réconciliation.

85.1.52.1.9. Fichiers

pepsi.mailbox_quota

La table que gère cet outil : une ligne par compte, portant ses limites, la dernière mesure et ce qui a été remis depuis. Créée par pepsi-setup(1) avec le reste du schéma ; les lignes apparaissent d’elles-mêmes à la première remise locale vers un compte, personne n’a donc à être pré-enregistré.

~/Maildir/maildirsize

Le fichier de taille Maildir++ que le helper entretient, dans le format que Dovecot, Courier et Exim lisent et écrivent également.

85.1.52.1.10. Voir aussi

pepsi-stage-relay-to-maildir(1), pepsi-helper-maildir-writer(1), pepsi-ingress(1), pepsi-status(1), pepsi.conf(5), maildir(5), quotactl(2)

85.1.52.1.11. Bogues

Signalez les bogues au gestionnaire de tickets de Pepsi.