85.1.52. pepsi-quota

Manage and reconcile per-account mailbox quotas

Handbuchabschnitt:

1

85.1.52.1.1. Name

pepsi-quota - Postfach-Quotas je Konto setzen und Postfächer neu vermessen.

85.1.52.1.2. Übersicht

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

GLOBAL-OPTIONS sind -c FILE, -L LOGLEVEL und -v und stehen vor dem Unterbefehl (siehe Global Options).

85.1.52.1.3. Beschreibung

pepsi-quota ist die Operatorschnittstelle zur Tabelle pepsi.mailbox_quota: den Postfachgrenzen je Konto, die pepsi-stage-relay-to-maildir(1) durchsetzt, und der Belegungsabrechnung, mit der sowohl sie als auch pepsi-ingress(1) arbeiten. Es ist keine Stage.

Eine Quota ist eine Eigenschaft eines lokalen Kontos, sodass jeder Datensatz das passwd-Login als Schlüssel hat — nicht eine E-Mail-Adresse und nicht eine uid. Ein Login ist das, womit pepsi-ingress(1) einen Umschlagempfänger zur RCPT-Zeit vergleichen kann, ohne Aliase aufzulösen (was es nicht darf und auch nicht kann), und es bleibt ein Datensatz, wenn mehrere Adressen ein Postfach erreichen.

85.1.52.1.3.1. Richtlinie, Messung, Schätzung

Richtlinie ist [pepsi] MAILBOX_QUOTA (der standortweite Standardwert; fehlt er, bedeutet das unbegrenzt), je Konto durch pepsi-quota set überschrieben und dort, wo das Dateisystem eines durchsetzt, durch die eigene Grenze des Kernels weiter verschärft.

Eine Messung kann nur pepsi-helper-maildir-writer(1) vornehmen, der einzige Prozess, der zum Benutzer wird und ein 0700-Maildir lesen kann. measure und reconcile führen ihn aus; nichts anderes hier berührt ein Postfach.

Die Schätzung sind die Zähler used_* + since_*. Pepsis eigene Zustellungen erhöhen sie, und nichts zieht jemals ab, denn nichts sagt Pepsi, wenn ein Benutzer Mail über IMAP löscht. Die Schätzung ist daher eine obere Schranke der tatsächlichen Belegung — und genau das macht sie als Auslöser sicher („könnte dieses Konto nahe an seiner Grenze sein? dann messen“) und als Urteil unsicher.

Daher die Regel: Nichts lehnt eine Nachricht auf eine Schätzung hin ab, sondern nur auf eine Messung hin.

85.1.52.1.3.2. Warum es reconcile gibt

Ein Konto an seiner Grenze wird von pepsi-ingress(1) bei RCPT abgelehnt. Nehmen Sie an, sein Eigentümer leert danach das Postfach über IMAP. Nichts sagt es Pepsi — und da jede Nachricht abgelehnt wird, läuft nie eine Zustellung, die eine frische Messung vornähme. Das Postfach bliebe für immer geschlossen.

Zwei Dinge verhindern das. pepsi-ingress(1) lehnt nur auf eine Messung hin ab, die jünger ist als [pepsi] MAILBOX_QUOTA_MAX_AGE (standardmäßig 15 Minuten), sodass eine veraltete Zahl die Nachricht durchlässt und der Zustellpfad erneut nachsieht. Und pepsi-quota reconcile, aus cron gestartet, misst die Konten neu, die an ihrer Grenze sind — ein billiger Durchlauf gerade deshalb, weil es nur diese sind.

Ein Standort, der Quotas durchsetzt, muss ihn regelmäßig ausführen. Bei einer Paketinstallation ist das bereits erledigt: pepsi-quota-reconcile.timer startet den Durchlauf fünf Minuten nach dem Booten und danach alle zehn Minuten (Persistent=true, ein verpasster Lauf wird also nachgeholt), und pepsi.target Wants= ihn — der eine Schalter, der die Pipeline startet, startet auch dies. Legen Sie keinen cron-Auftrag daneben; das wären zwei Durchläufe im selben Abstand, von denen jeder den setuid-Helper startet.

Bei einer Quellinstallation ohne systemd ist das Äquivalent:

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

85.1.52.1.4. Unterbefehle

set LOGIN SIZE [–messages N]

Gibt einem Konto seine eigene Grenze und überschreibt damit den standortweiten Standardwert. SIZE nimmt eine einfache Byte-Zahl oder ein K/M/G/T-Suffix in Potenzen von 1024 (2G, 500M, 1048576) oder das Literal none.

none ist nicht dasselbe wie unset: Es bedeutet ausdrücklich unbegrenzt und ist der Weg, ein einzelnes Konto von einer standortweiten Quota auszunehmen, während unset dessen Vererbung wiederherstellt.

--messages wegzulassen lässt die Nachrichtenzahl-Grenze [pepsi] MAILBOX_QUOTA_COUNT erben; eine Byte-Quota zu setzen hebt sie nicht stillschweigend auf. --messages 0 hebt sie ausdrücklich auf. Beachten Sie, dass dies eine Eigenschaft des gespeicherten Datensatzes ist, nicht des Befehls: set schreibt den ganzen Datensatz, --messages bei einem Konto wegzulassen, das bereits eine ausdrückliche Nachrichtengrenze trug, verwirft diese Grenze also und gibt sie an die Vererbung zurück. Wiederholen Sie --messages, wenn Sie für ein solches Konto eine Byte-Quota anheben; der ausgegebene Datensatz zeigt in beiden Fällen das Ergebnis.

Ein Login ohne passwd-Eintrag löst eine Warnung aus, wird aber angenommen — das Konto kann danach angelegt werden.

unset LOGIN

Lässt die eigenen Grenzen des Kontos fallen, sodass es den standortweiten Standardwert wieder erbt. Die Belegungsabrechnung bleibt erhalten.

show LOGIN

Zeigt die Grenzen und die Belegung eines Kontos. Ein Konto ohne Datensatz ist kein Fehler: Es gibt den geerbten Standardwert und „nie vermessen“ aus.

list [–full]

Listet jedes Konto auf, über das Pepsi Buch geführt hat, die älteste Messung zuerst. Mit --full nur die an oder über ihrer Grenze — und eine leere Auflistung gibt dann (no accounts at or over their limit) statt (no accounts) aus, was der eine Fall ist, den zu unterscheiden sich lohnt.

measure LOGIN

Vermisst dieses Postfach jetzt neu und speichert das Ergebnis.

reconcile [–all]

Misst die Konten neu, die an oder über ihrer Grenze sind. Mit --all auch die, deren Messung lediglich veraltet ist. Ein nicht vermessbares Postfach (etwa ein seit der letzten Zustellung gelöschtes Konto) wird im Journal vermerkt, und der Durchlauf geht weiter; der Exit-Status ist ungleich null, wenn eines fehlschlug.

remove LOGIN

Vergisst das Konto vollständig — seine Grenzen und seine Abrechnung. Die nächste Zustellung legt den Datensatz neu an und misst frisch, sodass dies auch der Knopf „diese Zahlen sind falsch, fang von vorn an“ ist.

85.1.52.1.5. Globale Optionen

Diese globalen Optionen stehen vor dem Unterbefehl (ein nachgestelltes Flag wird abgelehnt).

-c FILE, –config FILE

Liest die Konfiguration aus FILE, statt die Standardorte zu durchsuchen. Anders als bei pepsi-whitelist(1) wird dies unter dem setgid-Bit nicht abgelehnt: Die unter Privileges beschriebene Prüfung des Aufrufers läuft zuerst, sodass nur root und das Dienstkonto pepsi überhaupt so weit kommen, sie zu lesen.

-L LOGLEVEL, –log LOGLEVEL

Setzt die Log-Ausführlichkeit. LOGLEVEL ist eines von error, warn, info, debug oder trace (Standardwert: info).

-v, –verbose

Zeigt Log-Meldungen aus allen Quellen, einschließlich Drittanbieter-Bibliotheken.

-h, –help

Gibt eine Verwendungsübersicht aus und beendet sich.

-V, –version

Gibt die Version aus und beendet sich.

85.1.52.1.6. Ausgabe

list, show, set und measure geben je Konto eine Zeile aus:

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

Die gezeigte Belegung ist die Messung plus alles seither Zugestellte, und das ist die Zahl, auf die der Zustellpfad reagiert. measured ist ein Alter statt eines Zeitstempels, weil die Frage, die es beantwortet, lautet, ob die Zahl noch glaubwürdig ist: Eine Ablehnung bei RCPT beruht darauf, dass eine Messung frisch ist.

85.1.52.1.7. Privilegien

pepsi-quota wird set-group-id auf die Gruppe pepsi-maildir installiert (Modus 2550, Eigentümer pepsi:pepsi-maildir — ausführbar für den Eigentümer und nicht für alle, weil das setgid-Bit die Schranke vor dem setuid-root-Helper ist und das Ausführungsrecht auch nicht aus den Gruppenbits kommen kann, da pepsi bewusst kein Mitglied ist), aus demselben Grund wie pepsi-stage-relay-to-maildir(1): measure und reconcile führen den messenden Helper 4750 root:pepsi-maildir aus, und das Dienstkonto pepsi ist bewusst kein Mitglied dieser Gruppe — das setgid-Bit auf den wenigen durchgelassenen Programmen ist die Schranke. Das ist es, was einem unbeaufsichtigten reconcile aus cron erlaubt, Postfächer zu vermessen, ohne root zu sein.

Als root ausgeführt wechselt es vor dem Verbinden mit der Datenbank zum Dienstkonto pepsi, der Rolle, der diese Datensätze gehören — und behält dabei die Gruppe pepsi-maildir. Aus seinem Timer als pepsi gestartet liefert das setgid-Bit diese Gruppe und es findet überhaupt keine Abgabe statt; sie über die Abgabe hinweg zu behalten ist es, was measure für einen Operator, der es als root tippt, ebenso funktionieren lässt wie aus cron. Der Lauf als root gewinnt dadurch nichts, was der Lauf aus dem Timer nicht ohnehin schon hat.

make install richtet das Bit ein (sein Schritt install-quota-tool), sofern es als root läuft und die Gruppe existiert; andernfalls gibt es die genauen Befehle aus.

Da das setgid-Bit diese Schranke ist, stellt das Programm dieselbe Regel selbst auf: Sofern der reale Benutzer nicht root oder das Dienstkonto pepsi ist, beendet es sich mit einem Fehler, bevor irgendeine Konfiguration gelesen wird, und — wie die setuid-Krypto-Stages — entfernt es die Umgebungsvariablen, die das Laden der Konfiguration steuern (HOME, XDG_CONFIG_HOME, PG*, TALER_*, PEPSI_*), und legt PATH auf einen sicheren Standardwert fest.

Kein unprivilegierter Aufrufer verliert durch diese Ablehnung etwas: jeder Unterbefehl liest oder schreibt pepsi.mailbox_quota, und die Peer-Authentifizierung von PostgreSQL richtet sich nach der effektiven uid, ein Aufrufer, der nicht pepsi ist (oder root, das zu pepsi wird), hätte also nie eine Verbindung aufbauen können.

85.1.52.1.8. Konfiguration

Die Richtlinienoptionen, die dieses Werkzeug liest — MAILBOX_QUOTA, MAILBOX_QUOTA_COUNT, MAILBOX_OVER_QUOTA, MAILBOX_QUOTA_MAX_AGE, MAILBOX_QUOTA_RCPT_CHECK und MAILBOX_FS_QUOTA — liegen alle im Abschnitt [pepsi] und sind in pepsi.conf(5) dokumentiert. Eine weitere, ebenfalls in [pepsi], gehört im Besonderen zu diesem Werkzeug:

MAILBOX_HELPER

(Pfad, optional) Der privilegierte Helper, den dieses Werkzeug für eine Messung ausführt. Standardwert pepsi-helper-maildir-writer, gesucht auf dem PATH des pepsi-quota-Prozesses, sofern nicht als absoluter Pfad angegeben. Es ist dasselbe Binärprogramm, das die Zustell-Stage verwendet, in seinem measure-Modus: ein Maildir ist 0700, es ist also der eine Prozess, der zum Benutzer werden und eines lesen kann.

Setzen Sie sie nur dort, wo der Helper unter diesem Namen nicht erreichbar ist — vor allem bei einer Quellinstallation mit --prefix, deren $PREFIX/bin nicht auf dem PATH des Timers liegt. Halten Sie sie mit der Option HELPER im eigenen [stage-<name>]-Abschnitt der Zustell-Stage im Gleichschritt (pepsi-stage-relay-to-maildir(1)): die beiden benennen dasselbe Programm für zwei verschiedene Aufrufer, nichts gleicht sie gegeneinander ab, und nur wenn das Paar stimmt, sind Zustellung und Abgleich einer Meinung.

85.1.52.1.9. Dateien

pepsi.mailbox_quota

Die Tabelle, die dieses Werkzeug verwaltet: ein Datensatz je Konto, der seine Grenzen, die letzte Messung und das seither Zugestellte trägt. Von pepsi-setup(1) mit dem übrigen Schema angelegt; Datensätze erscheinen von selbst bei der ersten lokalen Zustellung an ein Konto, sodass niemand vorab registriert werden muss.

~/Maildir/maildirsize

Die Maildir++-Größendatei, die der Helper pflegt, in dem Format, das auch Dovecot, Courier und Exim lesen und schreiben.

85.1.52.1.10. Siehe auch

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. Fehler

Melden Sie Fehler an den Pepsi-Issue-Tracker.