85.1.56. pepsi-helper-dot-forward¶
run a single user’s ~/.forward as that user
- Handbuchabschnitt:
1
85.1.56.1.1. Name¶
pepsi-helper-dot-forward - privilegierter Helper, der das ~/.forward eines lokalen Benutzers verarbeitet, nachdem er zu diesem Benutzer gewechselt ist.
85.1.56.1.2. Übersicht¶
pepsi-helper-dot-forward TARGET-UID [–pipe] [–file] < message
85.1.56.1.3. Beschreibung¶
pepsi-helper-dot-forward ist ein minimaler, sicherheitsgehärteter Helper, der genau die ~/.forward-Datei eines lokalen Benutzers ausführt. Er existiert, damit ein vertrauenswürdiger, aber unprivilegierter Aufrufer (ein Mitglied der pepsi-forward-Gruppe, in der Praxis pepsi-stage-dot-forward(1)) das ~/.forward jedes lokalen Benutzers als dieser Benutzer verarbeiten lassen kann — und nichts anderes.
Der Helper wird setuid-root installiert, im Besitz von root:pepsi-forward mit Modus 4750. Nur Mitglieder der pepsi-forward-Gruppe dürfen ihn ausführen; wenn sie es tun, führt der Kernel ihn mit einer effektiven uid von root aus. Mit der numerischen uid des Zielbenutzers als seinem einzigen Positionsargument und der rohen Nachricht auf der Standardeingabe tut der Helper Folgendes:
löst den passwd-Eintrag des Zielbenutzers auf und verweigert uid
0/ das Loginrootsowie jede uid unterhalb von/etc/login.defsUID_MIN(Standardwert1000);wechselt vollständig und unwiderruflich zum Zielbenutzer — installiert die ergänzenden Gruppen des Benutzers, dann die gid, dann die uid (real, effektiv und gespeichert) — und verifiziert, dass root nicht wiedererlangt werden kann, genau wie es pepsi-helper-maildir-writer(1) und pepsi-helper-auto-pay(1) tun;
weigert sich zu handeln — Exit
3—, wenn das Heimatverzeichnis oder das~/.forwardselbst nicht der Ziel-uid gehört oder für die Gruppe oder für alle schreibbar ist (mode & 0o022). Das ist die Regel von sendmail/postfix-local: die Datei benennt|command- und/file-Direktiven, die der Helper als dieser Benutzer ausführt, jeder andere, der das Verzeichnis schreiben kann, könnte also eine dort ablegen. Beachten Sie, dass dies am Heimatverzeichnis geprüft wird, bevor nach dem~/.forwardgesucht wird; auf einem Host mit gruppenschreibbaren Heimatverzeichnissen wird das Konto also selbst dann abgelehnt, wenn es gar kein~/.forwardhat;wenn der Benutzer keine
~/.forward-Datei hat, beendet er sich mit1(die Stage geht dann zu ihrer nächsten Stage über);andernfalls liest er
~/.forwardund handelt an jeder nicht leeren, nicht mit#beginnenden Zeile als der Benutzer: eine bloße Adresse wird als Weiterleitungsadresse gesammelt, und eine als\namegeschriebene wird mit ihrem Marker gesammelt, was die aufrufende Stage als sendmails „an diesen Namen zustellen und nicht weiter expandieren“ liest;|commandleitet die Nachricht an/bin/sh -c commandweiter (nur mit –pipe);/absolute/pathhängt die Nachricht an diese Datei an (nur mit –file). Eine Direktive, deren Art nicht aktiviert war oder deren Ausführung fehlschlägt, ist ein Fehler. Ein|commandwird mit einer bereinigten Umgebung ausgeführt —HOMEundUSER/LOGNAMEauf den Zielbenutzer gesetzt, ein festerPATHund die Shell-übernehmenden VariablenIFS/BASH_ENV/ENV/CDPATHentfernt —, sodass die geerbte Umgebung des Zustell-Agenten den Befehl nicht beeinflussen kann.
Ein |command läuft in seiner eigenen Prozessgruppe und bekommt 300 Sekunden; nach Ablauf erhält die gesamte Gruppe ein SIGKILL (die Gruppe, weil eine Pipe-Direktive routinemäßig forkt) und der Lauf wird als Fehler gemeldet. Eine /path-Direktive öffnet das Ziel mit O_NOFOLLOW|O_NONBLOCK und verweigert alles, was keine reguläre Datei ist, sodass eine FIFO oder ein Symlink den Helper nicht unbegrenzt blockieren kann. Ohne diese Grenzen könnte jedes lokale Konto einen Dispatcher-Worker für die Lebensdauer der Pipeline verkeilen, indem es schlicht |sleep infinity in sein ~/.forward schreibt.
Eine Direktive darf in doppelten Anführungszeichen geschrieben werden — die Form, die die Dokumentation von procmail und maildrop den Benutzern nahelegt, "|IFS=' ' && exec /usr/bin/procmail -f- || exit 75 #bob" — und eine Zeile darf mehrere durch Komma getrennte Einträge tragen, wie es die Grammatik der rechten Seite der Alias-Datenbank erlaubt, die .forward erbt. Eine Lage umgebender doppelter Anführungszeichen wird entfernt, bevor die Direktive klassifiziert wird, und ein Komma innerhalb doppelter Anführungszeichen teilt nicht.
Die Nachricht wird nur dann von der Standardeingabe gelesen, wenn eine |pipe//file-Direktive, die sie verbraucht, laufen darf (d. h. wenn –pipe oder –file angegeben ist).
85.1.56.1.4. Argumente¶
- TARGET-UID
Die numerische Benutzer-ID, deren
~/.forwardverarbeitet wird. Sie muss einen passwd-Eintrag haben; uid0/ dasroot-Konto sowie jede uid unterhalb von/etc/login.defsUID_MINwerden verweigert.- –pipe
Erlaubt
|command-Direktiven (die Stage übergibt dies, wenn ihrALLOW_PIPEaktiv ist).- –file
Erlaubt
/path-Datei-Anhänge-Direktiven (die Stage übergibt dies, wenn ihrALLOW_FILEaktiv ist).
85.1.56.1.5. Exit-Status¶
- 0
Das
~/.forwardwurde erfolgreich verarbeitet. Die von ihm benannten Weiterleitungsadressen (möglicherweise keine) werden eine pro Zeile auf die Standardausgabe geschrieben.- 1
Der Benutzer hat kein
~/.forward. Der Aufrufer geht zu seiner nächsten Stage über.- 2
Die Verarbeitung schlug fehl — ein Pipe-Befehl beendete sich mit einem Wert ungleich null (außer
75) oder wurde durch ein Signal beendet, eine Datei konnte nicht geschrieben werden, oder eine deaktivierte Direktive wurde angefordert. Eine menschenlesbare Diagnose wird zur Aufnahme in den Bounce auf die Standardausgabe geschrieben. Dies ist ein dauerhafter Fehler dieses Empfängers.- 3
Ein betrieblicher Fehler des Hosts, nicht der Zustellung: der Helper ist nicht setuid-root installiert, die Ziel-uid hat keinen passwd-Eintrag oder die passwd-Abfrage selbst schlug fehl (ein NSS-/LDAP-Ausfall), das Konto ist
rootoder liegt unterUID_MIN, das Heimatverzeichnis ist nicht absolut, oder das Heimatverzeichnis oder das~/.forwardselbst gehört nicht ausschließlich dem Zielbenutzer (es gehört ihm nicht oder ist für die Gruppe oder für alle schreibbar). Die Diagnose geht sowohl auf die Standardausgabe als auch auf die Standardfehlerausgabe. Der Aufrufer muss dies als wiederholbar behandeln — die Nachricht bleibt in der Warteschlange, statt für einen Zustand einen Bounce zu erzeugen, den der Operator beheben kann.Der Fall des unsicheren Heimatverzeichnisses ist eine Eigenschaft des Kontos, nicht der Nachricht: mit
chmod 0775 ~aliceendet jede Nachricht analicehier und bleibt in der Warteschlange, und keine davon erreicht die lokale Zustellung.chmod g-w,o-wauf dem Heimatverzeichnis (und auf~/.forward) behebt das.Ein
|command, das darum bittet, erneut versucht zu werden, endet ebenfalls mit 3: eines, das mit75endet (EX_TEMPFAIL, was procmail und maildrop für ein gesperrtes Postfach oder eine volle Platte melden), eines, das über das Limit von 300 Sekunden hinaus läuft, und eines, das gar nicht gestartet werden kann. Die eigene Diagnose des Befehls geht auf beide Ausgabeströme. Direktiven weiter vorn in der Datei haben dann bereits gewirkt und wirken bei der Wiederholung erneut, wie unter jedem Zustellagenten, der mitten in einer.forwardaufschiebt.
Wenn es von einem Benutzer aufgerufen wird, der kein Mitglied der pepsi-forward-Gruppe ist, weigert sich der Kernel, das Binärprogramm überhaupt auszuführen; der Helper selbst läuft nie.
85.1.56.1.6. Sicherheit¶
Die Mitgliedschaft in der pepsi-forward-Gruppe ist die Schranke der Zugriffskontrolle. Der Helper führt beliebige Befehle aus und schreibt beliebige Dateien nur als der unprivilegierte Zielbenutzer, niemals als root: Er gibt Privilegien vollständig ab, bevor er das ~/.forward liest oder eine der Dateien des Benutzers berührt, und weigert sich, für das root-Konto zu handeln.
85.1.56.1.7. Siehe auch¶
pepsi-stage-dot-forward(1), pepsi-helper-maildir-writer(1), pepsi-dispatch(1), pepsi.conf(5)
85.1.56.1.8. Fehler¶
Melden Sie Fehler an den Pepsi-Issue-Tracker.