3. Installation¶
Pepsi kann auf zwei Arten installiert werden. Das Bauen aus dem Quellcode aus dem Cargo-Workspace liefert Ihnen die Binärprogramme und überlässt es Ihnen, die Dienstkonten anzulegen, die Privilegien-Bits zu setzen und die Laufzeitverzeichnisse einzurichten. Das vorgefertigte Debian-Paket erledigt all das für Sie — sein postinst legt die Konten, Gruppen, Verzeichnisse, Overrides für privilegierte Binärprogramme und die Datenbank an — sodass nur noch der standortspezifische Bootstrap (die Konfiguration bearbeiten und pepsi-setup ausführen) zu tun bleibt.
Wählen Sie den Tab für die von Ihnen verwendete Methode. Alles danach — Einrichtung von Schema/Schlüsseln/DNS, Betrieb der Dienste, das Privilegienmodell und der Schema-Lebenszyklus — ist für beide gleich.
3.1. Voraussetzungen¶
PostgreSQL — eine Datenbank, in die Pepsi das einzige
pepsi-Schema installiert. Alle Komponenten verbinden sich mit derselben Datenbank. (Das Debian-Paket hatpostgresqlalsDependsund zieht es für Sie mit herein.)PostgreSQLs
postgresql-contrib– optional und nur für Mailinglisten. Es bringt die Erweiterungpg_trgmmit, die das Mailinglisten-Archiv für die Teilzeichenfolgen- und Fuzzy-Suche benutzt: einen Hostnamen, einen Konfigurationsschlüssel, eine Zeile aus einem Traceback oder einen Namen zu finden, den der Suchende falsch geschrieben hat. Ein Stammform-Wörterbuch wirft genau dieses Material weg, die Volltextsuche kann diese Anfragen daher überhaupt nicht beantworten.Ein Server ohne es installiert und läuft normal. Die Erweiterung wird in einem abgesicherten Block erzeugt, ihr Fehlen ist daher eine Warnung und keine gescheiterte Installation; das Archiv hat dann nur Volltextsuche, und
pepsi-list checksagt, in welchem Modus der Server ist. Es später zu installieren undpepsi-setup runerneut auszuführen schaltet es ein, danach braucht das bestehende Archiv einpepsi-archive reindex, um die Spalte zu füllen, die der Index liest.Das Debian-Paket führt es unter
Recommends, ein voreingestelltesapt installzieht es also mit, und ein Server, der keine Listen betreibt, kann es entfernen.Für echten Mail-Verkehr: öffentliches DNS, das Sie für jede bediente Domain kontrollieren (um DKIM-, SPF- und MTA-STS-Einträge zu veröffentlichen), und die Fähigkeit, den privilegierten SMTP-Port 25 (und 465/587 für Submission) zu binden. Ein Entwicklungs-Build kann vollständig auf unprivilegierten Ports und einer Wegwerf-Datenbank laufen.
3.2. Pepsi installieren¶
Bauen Sie den Workspace, platzieren Sie die Binärprogramme und das SQL mit make install und legen Sie die Systemkonten und Privilegien selbst an (dieselben, die das Paket anlegen würde — siehe Benutzer, Gruppen und Privilegien unten).
Zusätzliche Voraussetzungen
Eine Rust-Toolchain mit
rustc1.93 oder neuer (die Untergrenze legt das mitgeliefertetaler-commonfest;./configurewarnt bei einer älteren), dazu die nativen Build-Abhängigkeiten der Krypto- und Kerberos-Crates:pkg-config,cmake, libclang, nettle, GMP und die Kerberos-Entwicklungsheader (unter Debian:libclang-dev,nettle-dev,libgmp-dev,libkrb5-dev).Das mitgelieferte GNU-Taler-Rust-Submodul, das vor dem ersten Build geholt wird:
git submodule update --init --recursive
Bauen
Pepsi ist ein Cargo-Workspace, dessen Root-Paket (pepsi) jedes Binärprogramm unter src/bin/ besitzt; die pepsi-*-Member-Crates sind Bibliotheken, die die dünnen Binärprogramme aufrufen. Ein Entwicklungs-Build erzeugt eine ausführbare Datei pro Programm:
cargo build --workspace
Ein Release-Build hingegen verlinkt die meisten Programme zu einem einzigen Multi-Call-Binärprogramm pepsi, das das auszuführende Programm anhand des Namens auswählt, unter dem es aufgerufen wird (argv[0]). Dies wird durch das Cargo-Feature unibin ausgewählt (das das make build-Ziel für Sie aktiviert); das Standard-Feature multibin behält die programmweisen Binärprogramme bei, die für Entwicklung und Testsuite verwendet werden:
make build # == cargo build --release --locked \
# --no-default-features --features unibin,crypto-nettle
So oder so führen Sie die programmweisen Namen aus; das Release-Layout installiert sie als Symlinks auf das eine Binärprogramm (siehe Installieren). Einige Programme werden nicht eingefaltet und bleiben eigenständig; die maßgebliche Liste ist STANDALONE_BINARIES im Makefile. Zwei Gründe bringen ein Programm dorthin:
es trägt sein eigenes setuid- oder setgid-Bit, was ein gemeinsames Binärprogramm nicht je Programm kann — die Helper für lokale Zustellung,
~/.forwardund Wallet und ihre aufrufenden Stages, das Smarthost-Relay,pepsi-quota,pepsi-whitelistsowiepepsi-stage-encryptundpepsi-stage-decrypt(beide setuidpepsi-crypto, damit sie das private Schlüsselmaterial erreichen können) — oder eine Site kann ihm eines geben (pepsi-keys);es wird separat ausgerollt oder aufgerufen —
pepsi-setup,pepsi-config,pepsi-stage-detect-language(dessen Sprachmodelle groß sind; dieses Binärprogramm ist selbst multi-call, und ein zweiter$PATH-Symlink,pepsi-detect-language, führt das Offline-Diagnosewerkzeug daraus aus),pepsi-telemetry(das in einem eigenen Paket ausgeliefert wird und auf einem separaten Host läuft) undpepsi-helper-mailbox-scan(daspepsi-whitelistüber seinen Namen ausführt).
Die Programme, auf die sich dieses Kapitel bezieht, sind unten aufgeführt. Dies ist eine Auswahl, kein Inventar: Die maßgeblichen Listen sind FOLDED_BINARIES und STANDALONE_BINARIES im Makefile (BINARIES wird aus diesen beiden abgeleitet und ist selbst nicht bearbeitbar).
pepsi-ingress— eingehender SMTP-Serverpepsi-dispatch— Stage-Dispatcherpepsi-stage-arc,pepsi-stage-srs,pepsi-stage-encrypt,pepsi-stage-decrypt,pepsi-stage-dkim-sign,pepsi-stage-bounce,pepsi-stage-relay-to-internet,pepsi-stage-relay-to-smarthost,pepsi-stage-discard— die Stagespepsi-setup— Einrichtung/Bootstrappepsi-queue— Inspektion/Reparatur der Warteschlangepepsi-status— Gesundheitszusammenfassung der Pipelinepepsi-sendmail— lokale Submission (vom Debian-Paket als/usr/sbin/sendmailinstalliert)
Die Qualitätsschranken, die das Projekt grün hält, sind:
RUSTFLAGS="-D warnings" cargo build --workspace
cargo clippy --workspace --all-targets -- -D warnings
cargo fmt --all -- --check
cargo test --workspace
cargo deny check
make docs
cargo test --workspace benötigt ein erreichbares PostgreSQL, weil die Crate für den Dispatcher-Lebenszyklus den echten Dispatcher gegen eine Datenbank startet. make check ist der Einstiegspunkt, der das absichert – er überspringt diese Suite, statt fehlzuschlagen, wenn keine Datenbank nutzbar ist – und führt außerdem cargo deny check aus; siehe Weitere make-Ziele unten.
Installieren
Ein bloßer Build erzeugt nur Binärprogramme; Pepsi liefert außerdem SQL-Migrationen und eine Beispielkonfiguration, die auf der Platte abgelegt werden müssen. Das Makefile umschließt beides — führen Sie es als root aus, damit es auch die Privilegien-Bits der Binärprogramme setzen kann (andernfalls gibt es die genauen, von Hand auszuführenden chown/chmod aus):
make install PREFIX=/usr/local SYSCONFDIR=/etc DESTDIR=
Besser noch: Führen Sie zuerst ./configure aus und lassen Sie es die Verzeichnisvariablen in config.mk auflösen (das das Makefile vor seinen eigenen Standardwerten liest, sodass gilt, was configure entschieden hat). Jedes Verzeichnis leitet sich von --prefix ab, sodass die Angabe eines Präfixes und sonst nichts die gesamte Installation — Binärprogramme, SQL, config.d-Standardwerte und Nachrichtenvorlagen — darunter verschiebt:
./configure --prefix=/opt/pepsi # templates at /opt/pepsi/share/pepsi/templates
make && make install
--sysconfdir ist die eine Ausnahme, denn eine Konfigurationsdatei muss dort liegen, wo das System sie sucht: Es ist /etc, wenn kein --prefix angegeben wurde (und auch, wenn --prefix=/usr angegeben wurde, da /usr/etc auf keinem System existiert), und sonst $(PREFIX)/etc. Geben Sie --sysconfdir ausdrücklich an, um es in beide Richtungen zu überschreiben.
./configure --help listet alles auf, was es akzeptiert. Neben den GNU-Verzeichnisvariablen (--prefix, --exec-prefix, --bindir, --sbindir, --libexecdir, --sysconfdir, --datarootdir, --datadir, --mandir, --infodir, --docdir) nimmt es entgegen:
--with-templatedir=DIRWohin die Nachrichtenvorlagen kommen; muss mit
[pepsi] TEMPLATE_DIRübereinstimmen. Standardwert ist$(DATADIR)/templates.--with-systemdunitdir=DIR/--with-tmpfilesdir=DIR/--with-sendmail-libdir=DIRDie Unit-Dateien, das
tmpfiles.d-Schnipsel und der Ort, an den der überkommene Link/usr/lib/sendmailkommt.--with-maildir-group=NAME,--with-forward-group=NAME,--with-wallet-group=NAME,--with-token-group=NAME,--with-dispatch-group=NAME,--with-crypto-user=NAME,--with-whitelist-user=NAMEDie lokalen Namen der Konten und Gruppen, die die privilegierten Binärprogramme absichern (siehe Privilegierte Binärprogramme unten). Standardwerte sind
pepsi-maildir,pepsi-forward,pepsi-wallets,pepsi-token,pepsi,pepsi-cryptoundpepsi-whitelist.--enable-docs/--disable-docsOb die Man-Pages und das Info-Handbuch aus den Quellen gerendert oder vorgebaut übernommen werden (was ein Release-Tarball mitliefert). Standardwert ist
auto: an, wennsphinx-build,makeinfound Python mitdocutilsallesamt vorhanden sind.--enable-mta-links/--disable-mta-linksOb
make install/usr/sbin/sendmailund den Rest der Debian-Schnittstelle für Mail-Transport-Agents beansprucht. Standardmäßig aus, sodass eine Quellinstallation den vorhandenen MTA des Systems nicht stillschweigend verdrängen kann; das Debian-Paket übergibtINSTALL_MTA_LINKS=yes, weil seinConflicts: mail-transport-agentdie Ausschließlichkeit bereits garantiert.--with-crypto-backend=FEATUREDas Cargo-Feature für das Sequoia-Krypto-Backend (Standardwert
crypto-nettle).
CARGO=, INSTALL=, SPHINXBUILD=, MAKEINFO=, INSTALL_INFO=, RST2MAN= und PYTHON= werden als VAR=VALUE-Argumente oder aus der Umgebung akzeptiert. Optionen, für die dieser Build keine Verwendung hat (--libdir, --localstatedir, --build, --host, …), werden akzeptiert und ignoriert, sodass ein generischer Paketierungstreiber das Skript unverändert aufrufen kann; nur ein fehlendes cargo ist ein harter Fehler.
make install führt die folgenden Schritte aus:
install-binBaut das (vereinheitlichte) Release-Binärprogramm und installiert es nach
$(DESTDIR)$(PREFIX)/libexec/pepsi/pepsi, erstellt dann einen$(DESTDIR)$(PREFIX)/bin-Symlink pro eingefaltetem Programmnamen, der darauf zeigt (z. B.pepsi-ingress -> ../libexec/pepsi/pepsi). Die siebzehn eigenständigen Programme, die inSTANDALONE_BINARIESim Makefile genannt sind, werden als eigene ausführbare Dateien in$(DESTDIR)$(PREFIX)/bininstalliert. Weil jeder Symlink weiterhin in$(PREFIX)/bin(auf$PATH) liegt, ist die Laufzeit-Herleitung vonDATADIRunten davon unberührt.install-dataKopiert die SQL-Dateien von
pepsi-setup/db/nach$(DESTDIR)$(DATADIR)/sql(wobeiDATADIR = $(PREFIX)/share/pepsi).pepsi-setupliest diese beim Installieren des Schemas; der Standardwert vonSQL_DIRist${DATADIR}/sql. Installiert außerdemcontrib/hosters.txtals$(DATADIR)/hosters.txt, die Liste öffentlicher Hoster, für diepepsi-whitelist import --auto-wildcardnie einen Platzhalter vorschlägt.install-templatesKopiert die Nachrichtenvorlagen (
<name>.<lang>.body— die Zahlungsaufforderung des Anti-Spam, die Bounce-Nachrichtentexte, die Mailinglisten-Hinweise und die übrigen automatischen Antworten) nach$(DESTDIR)$(TEMPLATEDIR), das standardmäßig$(DATADIR)/templatesist. Der Standardwert[pepsi] TEMPLATE_DIRder Binärprogramme ist${DATADIR}/templatesund wird über dieselbe Laufzeitableitung aufgelöst, sodass beide Enden unter jedem Präfix übereinstimmen, ohne dass die Konfiguration einen Pfad nennt.install-configInstalliert die Referenzdatei
pepsi.conf.sampleunter$(DESTDIR)$(SYSCONFDIR)/pepsi/. Sie legt nie einepepsi.confan: Die Vorlage bindet optionale Stages ein, die weitere Einrichtung brauchen, und ist keine funktionierende Konfiguration; die produktive Datei kommt daher vonpepsi-setup --wizard(eine vorhandene wird nie angefasst).install-config-dKopiert
contrib/config.d/*.confnach$(DESTDIR)$(DATADIR)/config.d. Dies sind paketierte Standardwerte, keine conffiles, und sie werden vorpepsi.confgeparst — siehe Konfiguration. Zwei werden mit Pepsi ausgeliefert: die Texte der Abwesenheitsnotiz je Sprache und die Einstellung des S/MIME-Containers (CRYPTO_ALLOW_DOWNGRADE).install-man/install-infoInstalliert die gerenderten roff-Handbuchseiten unter
$(DESTDIR)$(MANDIR)/manNundpepsi.infounter$(DESTDIR)$(INFODIR)(mitinstall-inforegistriert). MitBUILD_DOCS=no— was./configure --disable-docssetzt und was ein Release-Tarball verwendet — werden vorgefertigte Seiten installiert, statt sie zu rendern, und jeder Schritt wird mit einer Meldung übersprungen, wenn keine vorhanden sind.install-docInstalliert
README.md,NEWS,SECURITY.md,AUTHORS,COPYINGund die Lizenztexte ausLICENSES/unter$(DESTDIR)$(DOCDIR), standardmäßig$(DATAROOTDIR)/doc/pepsi.install-systemdInstalliert die systemd-Units aus
debian/systemd/in$(DESTDIR)$(SYSTEMDUNITDIR)(wobei/usr/binund/etc/pepsiauf die konfiguriertenBINDIR/SYSCONFDIRumgeschrieben werden) sowie dastmpfiles.d-Bruchstück, das/run/pepsiseinen Eigentümer und seine ACL gibt – woher die Rechte dieses Verzeichnisses vollständig stammen, denn keine Unit darf es alsRuntimeDirectorydeklarieren (siehe Keine Unit darf es als RuntimeDirectory beanspruchen). Alles wird deaktiviert ausgeliefert.make install INSTALL_ADMIN_UNITS=nolässt die beidenpepsi-setup-apply-Units weg, was dem Nichtinstallieren des Paketspepsi-httpd-adminbei einer Quellinstallation entspricht.
Zusätzlich hängt install von den Zielen für die Privilegien-Bits ab (install-helper, install-maildir-stage, install-forward-*, install-auto-pay-*, install-smarthost-stage, install-whitelist-suid, install-crypto-suid, install-quota-tool), die unten unter Privilegierte Binärprogramme beschrieben sind; jedes gibt das von Hand auszuführende chown/ chmod aus, wenn es nicht als Root läuft oder wenn die Gruppe, die es braucht, nicht existiert.
Überschreiben Sie PREFIX, SYSCONFDIR und DESTDIR passend zum Zielsystem. make uninstall entfernt alles, was make install abgelegt hat (immer einschließlich beider pepsi-setup-apply-Units, unabhängig von INSTALL_ADMIN_UNITS), lässt aber die aktive pepsi.conf an Ort und Stelle.
Weitere make-Ziele
make checkDer Test-Einstiegspunkt, der keine entfernten Konten benötigt: die Datei-Gegenprüfungen der systemd-Units und des Telemetrie-Socket-Pfads, die Workspace-Tests (ohne die Crate für den Dispatcher-Lebenszyklus, die PostgreSQL benötigt), dann – nach bestem Bemühen, übersprungen statt fehlgeschlagen, wenn die Voraussetzung fehlt – die Lebenszyklus-Suite gegen eine lokale
pepsicheck-Datenbank, die Vertragstests der setuid-Helfer, das Skript zur Authentifizierungs-Interoperabilität,cargo deny checkund die Querverweisprüfung des Handbuchs.make integrationtests/make benchmarksDie Live-Pipeline-Skripte unter
tests/, die passwortloses SSH zu den inACCOUNTSgenannten Hosts benötigen (Standardwerttests/test-accounts.ini, angelegt austests/test-accounts.ini.sample);integrationtestsführt zuerst die Thunderbird-Interoperabilitätsschranke aus. Die Benchmarks sind ein eigenes Ziel, weil sie den MTA absichtlich belasten.make docsDas Handbuch für die Quellsprache — ein Alias für
make docs-en, das dessen HTML und dessen PDF baut, dazu die Man-Pages und das Info-Handbuch (beide nur in der Quellsprache).make docs-<lang>baut eine andere Sprache undmake docs-allbaut jede Sprache inDOC_LANGUAGES(en de fr);make htmlbaut allein das HTML jeder Sprache.make dist/make distcheckBauen den Release-Tarball
pepsi-$(VERSION).tar.gz(jede versionierte Datei einschließlich des mitgelieferten Submoduls, dazuconfigureund vorgebaute Dokumentation) und prüfen ihn, indem sie ihn in einen sauberen Baum entpacken undconfigure,make,make check,make installundmake uninstallgegen ein Wegwerf-Präfix ausführen. Der Tarball wird aus dem Arbeitsbaum kopiert; deshalb verweigertmake distdie Arbeit, solange eine versionierte Datei vonHEADabweicht oder das Submodul nicht auf dem inHEADverzeichneten Commit steht (unversionierte Dateien zählen nicht);make dist DIST_ALLOW_DIRTY=yesbaut trotzdem einen Entwicklungs-Tarball.make clean/make distcleancleanführtcargo cleanaus und entfernt die gerenderte Dokumentation;distcleanentfernt zusätzlichconfig.mk,config.statusund alles, wasmake disterzeugt hat.
Bemerkung
DATADIR muss mit dem übereinstimmen, was die Binärprogramme zur Laufzeit berechnen: taler-common leitet ${DATADIR} als <install-prefix>/share/pepsi aus dem Speicherort des Binärprogramms selbst ab. Wenn Sie aus einem Quellcode-Checkout (nicht installiert) ausführen, setzen Sie [pepsi-postgres] SQL_DIR explizit, damit pepsi-setup die Migrationen findet.
Das System vorbereiten
Das postinst des Debian-Pakets führt die folgenden Schritte automatisch aus; bei einer Quellcode-Installation führen Sie sie selbst aus und verwenden dabei das gleiche Konto-, Gruppen-, Modus- und Verzeichnis-Layout, das unten unter Benutzer, Gruppen und Privilegien und Verzeichnisse und Geheimnisse dokumentiert ist. Legen Sie die Konten und Gruppen vor make install an (damit es die Privilegien-Bits setzen kann) und die Datenbankrollen vor pepsi-setup (das das Schema installiert):
Legen Sie die Systemkonten an, jedes
--systemmit/usr/sbin/nologinund Home/var/pepsiund einer privaten Gruppe gleichen Namens, dazu die absichernden Gruppen.debian/pepsi.postinstist die maßgebliche Liste; diese Schleife ist genau sie, übersetzt:for u in pepsi pepsi-ingress pepsi-httpd pepsi-owner \ pepsi-helper-token-refresh pepsi-whitelist pepsi-crypto \ pepsi-keydisc pepsi-config; do addgroup --system "$u" adduser --system --home /var/pepsi --no-create-home \ --ingroup "$u" --shell /usr/sbin/nologin \ --disabled-password "$u" done for g in pepsi-maildir pepsi-forward pepsi-token pepsi-admin \ pepsi-telemetry; do addgroup --system "$g" done # The shared-wallet account owns its wallet databases, so unlike the # service accounts it gets a real home. addgroup --system pepsi-wallets adduser --system --home /var/lib/pepsi-wallets --ingroup pepsi-wallets \ --shell /usr/sbin/nologin --disabled-password pepsi-wallets install -d -o pepsi-wallets -g pepsi-wallets -m 0700 /var/lib/pepsi-wallets # Memberships: telemetry producers, and the SRS secret fragment. adduser pepsi pepsi-telemetry adduser pepsi-ingress pepsi-telemetry adduser pepsi pepsi-ingress
Jedes der letzten vier Konten existiert, weil etwas ohne es nicht arbeiten will:
pepsi-whitelistist das Konto, auf das das CLI für weiße Listen setuid ist,pepsi-cryptoist die einzige Datenbankrolle, dercrypto_identity.private_wrappedgewährt ist, und der Eigentümer des Fragments mit dem Schlüsselverschlüsselungsschlüssel,pepsi-keydiscist die engste Rolle der Installation (sie parst Schlüsselmaterial, das aus dem offenen Internet geholt wurde), undpepsi-configist die einzige Rolle, die die Konfigurationsüberlagerung schreiben darf. Lassen Siepepsi-cryptoaus, undinstall-crypto-suidwarnt lediglich — womit die beiden Krypto-Stages unprivilegiert bleiben und keinen einzigen privaten Schlüssel öffnen können.Legen Sie die neun PostgreSQL-Login-Rollen und die Datenbank an (Peer-Authentifizierung, als
postgres-Superuser) — dieselbe Menge, diedebian/pepsi.postinstanlegt, nämlich jedes Konto, das sich über den Peer-Auth-Socket als es selbst authentifiziert.pepsi-telemetrygehört auch auf einem Knoten dazu, der keine Telemetrie bedient:pepsi-setup runvergibt ihm auf jedem Host Rechte und erledigt seine Datenbankarbeit alspepsi-owner, das eine fehlende Rolle nicht anlegen kann:for r in pepsi-owner pepsi pepsi-ingress pepsi-httpd \ pepsi-whitelist pepsi-config pepsi-crypto pepsi-keydisc \ pepsi-telemetry; do createuser "$r" # createuser takes one role name at a time done createdb -O pepsi-owner pepsi
Führen Sie
make installalsrootaus (siehe oben), damit die setuid/setgid-Bits gesetzt werden; andernfalls setzen Sie sie von Hand gemäß Privilegierte Binärprogramme unten. Jedesinstall-*-Ziel warnt nur, wenn die Gruppe fehlt, die es braucht — ein oben ausgelassenes Konto oder eine ausgelassene Gruppe lässt das entsprechende Programm also stillschweigend unprivilegiert.Legen Sie die Laufzeitverzeichnisse mit den unter Verzeichnisse und Geheimnisse aufgeführten Eigentümern und Modi an.
pepsi-setuplegt/var/pepsi/keysfür Sie an; legen Sie die Smarthost-Geheimnis-Verzeichnisse nur an, wenn Sie einen Smarthost konfigurieren, der sie nutzt.
Das Paket ist der einfachere Weg: Es liefert die Binärprogramme (installiert nach /usr/bin), das SQL-Schema, die Nachrichtenvorlagen, die Handbuchseiten, das GNU-Info-Handbuch und socket-aktivierte systemd-Units, und sein postinst richtet das gesamte System für Sie ein.
Das Paket installieren
Installieren Sie das .deb mit apt, damit seine Abhängigkeiten (einschließlich postgresql) mit hereingezogen werden:
apt install ./pepsi_*.deb
Bei configure führt das postinst automatisch:
legt die zehn Dienstkonten und die sechs absichernden Gruppen —
pepsi-maildir,pepsi-forward,pepsi-token,pepsi-admin,pepsi-telemetryundpepsi-wallets— samt den Mitgliedschaften zwischen ihnen an (dieselben Identitäten, die die Quellcode-Installation von Hand erstellt);legt die
/var/pepsi-Laufzeitverzeichnisse —keys,tokens,token-refresh,tls,krb5— sowie/etc/pepsi/secretsund/etc/pepsi/secrets.dmit den unter Verzeichnisse und Geheimnisse unten dokumentierten Eigentümern und Modi an;setzt die Privilegien-Bits der Binärprogramme über
dpkg-statoverride(die drei setuid-root-Helfer, die setgid-Programme, die sie ausführen dürfen — die beiden Zustell-Stages, die Wallet-Stage undpepsi-quota—, das setgid-Smarthost-Relay, das setuidpepsi-whitelistund die beiden setuid-pepsi-crypto-Stages — siehe Privilegierte Binärprogramme unten); undlegt nach bestem Bemühen die neun PostgreSQL-Login-Rollen (
pepsi-owner,pepsi,pepsi-ingress,pepsi-httpd,pepsi-whitelist,pepsi-config,pepsi-crypto,pepsi-keydisc,pepsi-telemetry) und diepepsi-Datenbank (im Besitz vonpepsi-owner) an, wenn ein lokaler Cluster erreichbar ist — und gibt andernfalls die von Hand anzulegenden Rollen aus.
Der Dienst wird deaktiviert ausgeliefert: Das Paket installiert Pepsi, startet es aber nicht, und überlässt Ihnen den standortspezifischen Bootstrap.
Bemerkung
pepsi ist eines von vier Binärpaketen, die aus dieser Quelle gebaut werden: Die Spracherkennungs-Stage und der Telemetrie-Collector sind aus Größen- und Installationsgründen abgetrennt, und pepsi-httpd-admin — das pepsi Recommends, sodass apt es standardmäßig installiert — trägt den einzigen Mechanismus, mit dem die Browser-Konsole auf diesem Host eine privilegierte Änderung bewirken kann. Dieses eine Paket zu entfernen ist ein unterstützter Härtungsschritt für eine Installation, die vom Terminal aus verwaltet wird. Debian-Pakete beschreibt jedes Paket und diesen Hebel vollständig.
Nachdem das Paket installiert ist
Bei der Erstinstallation kopiert das Paket eine Platzhalter-Konfiguration nach /etc/pepsi/pepsi.conf; spätere Upgrades rühren diese Datei nie an (sie ist keine dpkg-Conffile, sodass ein Upgrade nie anhält, um danach zu fragen). Bearbeiten Sie sie und führen Sie dann den Bootstrap genau wie in den gemeinsamen Schritten unten aus — zum Beispiel:
# 1. edit /etc/pepsi/pepsi.conf (HOSTNAME, ACCEPTED_DOMAINS, domains, TLS)
# 2. install the schema + DKIM keys and print the DNS records:
pepsi-setup --no-certbot run # or: pepsi-setup --wizard
# 3. publish the printed DNS records, then start the pipeline:
systemctl enable --now pepsi.target
Da die Units socket-aktiviert sind, fährt pepsi.target pepsi-ingress, pepsi-httpd und pepsi-dispatch gemeinsam hoch; Sie rufen die serve-Unterbefehle nicht von Hand auf.
3.3. Migration von einem vorhandenen Mailserver¶
Wenn auf diesem Host bereits Postfix, Exim, Sendmail, qmail oder Stalwart läuft, müssen Sie dessen Konfiguration nicht von Hand neu herleiten. Ist keine pepsi.conf vorhanden, erkennt pepsi-setup --wizard, was installiert ist, und bietet an, es zu importieren: Hostname, akzeptierte Domains, Smarthost (mit den aus der Passwortdatei jenes Servers gelesenen Relay-Zugangsdaten), Zustellmethode für lokale Mail, Submission-SASL-Socket, vertrauenswürdige Netze, Nachrichtengrößenbeschränkung, Warteschlangen-Lebensdauer und TLS-Zertifikatspfade kommen alle als vorbelegte Antworten des Interviews an, die Sie dann eine nach der anderen bestätigen oder korrigieren.
Um zu sehen, was eine Migration ergäbe, bevor Sie den Assistenten starten — es wird nichts geschrieben:
pepsi-setup import
Routing-Tabellen werden ebenfalls konvertiert. /etc/aliases, /etc/postfix/virtual, Sendmails virtusertable, qmails .qmail-*-Dateien und ihre Entsprechungen werden zu einer Pepsi-Alias-Map neben der Konfiguration (siehe pepsi-stage-aliases), wobei bloße Alias-Namen in dem von Ihnen gewählten Stil qualifiziert werden. Da Pepsi-Alias-Schlüssel eine Domain tragen müssen, wird postmaster: root standardmäßig für jede akzeptierte Domain zu postmaster@example.org root@example.org.
Alles, was nicht übernommen wird, wird neben der Konfiguration in import-report.txt geschrieben, aufgeteilt danach, was sich nicht parsen ließ, wofür Pepsi keine Entsprechung hat (header_checks, ein Alias, der an einen Befehl zustellt), was angenähert wurde (mbox-Zustellung, die zu Maildir wird) und was der Importer nicht erkannt hat. Ein Import bricht das Setup nie ab — eine nicht lesbare Datei oder eine unbekannte Direktive erzeugt einen Berichtseintrag, keinen Fehler.
Zwei Dinge werden bewusst nicht migriert: eingereihte Mail (lassen Sie die Warteschlange des alten Servers leerlaufen, bevor Sie den MX umstellen) und DKIM-Schlüssel (pepsi-setup run erzeugt frische und gibt die zu veröffentlichenden Einträge aus). Wenn der alte MTA beim Lauf des Assistenten noch Port 25 hält, sagt der Bericht das — halten Sie ihn an und deaktivieren Sie ihn, bevor Sie pepsi-ingress starten.
Siehe pepsi-setup für die Details pro Server, die --alias-style-Auswahlmöglichkeiten und die --expert-Optionen, die die Einstellungen zugänglich machen, nach denen das Interview sonst nicht fragt.
3.3.1. Mailfilter, die bereits auf dem Host laufen¶
Unabhängig von jeder Migration durchsucht der Assistent den Host nach Milter-Daemons — clamav-milter, rspamd, spamass-milter, milter-greylist, milter-regex, mimedefang, amavisd-milter — und bietet jeden gefundenen als Stage an. Einen zu finden bedeutet der Reihe nach dreierlei: Das Paket ist installiert, ein Socket lässt sich aus seiner eigenen Konfiguration lesen (oder aus seiner Unit oder den Pfaden, die seine Distribution mitliefert), und eine echte Milter-Optionsaushandlung mit diesem Socket kommt zustande. Nichts wird allein aufgrund eines installierten Pakets angeboten, und die Aushandlung ist auch der Grund, weshalb das erzeugte ALLOW_ACTIONS genau das gewährt, was dieser Filter verlangt, statt einer Vermutung.
Angenommene Filter werden nach ihrer Aufgabe platziert — Richtlinie und Greylisting, dann Viren, dann Spam, dann Allzweck-Frameworks — nach der Entschlüsselung und vor den Schranken für weiße Liste und Bezahlung. Da Pepsi nach der Annahme einer Nachricht filtert, wird das REJECT eines Filters zu einer erzeugten Discard-Stage geroutet statt gebounct, sodass gefälschte Absender keinen Backscatter erhalten; siehe pepsi-stage-milter. Filter, deren Aufgabe Pepsi bereits erledigt (opendkim, openarc, opendmarc, SPF-Daemons, postsrsd), werden benannt und übersprungen statt angeboten.
3.4. Datenbank, Schlüssel und DNS einrichten¶
Wenn eine Konfigurationsdatei vorhanden ist (siehe Konfiguration), führen Sie das Bootstrap-Werkzeug einmal aus:
pepsi-setup -c /etc/pepsi/pepsi.conf run > pepsi-dns.zone
Dies validiert die gesamte Konfiguration, installiert das pepsi-Schema, erzeugt domainspezifische RSA-2048- und Ed25519-DKIM-Schlüssel unter KEY_DIR (nur falls nicht vorhanden) und gibt die zu veröffentlichenden DNS-Einträge aus (öffentliche DKIM-Schlüssel, eine SPF-Richtlinie aus den konfigurierten PUBLIC_IP-Adressen und einen MTA-STS-Eintrag). Die Operation ist idempotent und kann jederzeit erneut ausgeführt werden; das Upgrade des Schemas auf ein neues Release erledigt pepsi-setup schema (siehe Upgrade). run --reset verwirft das Schema und erstellt es neu (zerstört alle eingereihten Nachrichten; Schlüssel auf der Festplatte bleiben erhalten).
Veröffentlichen Sie die ausgegebenen DNS-Einträge und verifizieren Sie dann das Veröffentlichte gegen das, was Pepsi erwartet:
pepsi-setup -c /etc/pepsi/pepsi.conf check
Siehe pepsi-setup für den vollständigen Einrichtungsablauf.
3.5. Im Browser einrichten¶
Alles Obige lässt sich auch von einem Browser aus erledigen, gegen denselben Code. Der Terminalweg ist der kürzeste Weg auf einer Maschine, auf der Sie eine Shell haben; der Browserweg ist für die, auf denen Sie keine haben, und für Operatoren, die die DNS-Einträge lieber als rot/grüne Checkliste sehen als als Zonendatei.
3.5.1. Die Trennung, und warum¶
Das Setup ist privilegiert: Es schreibt /etc/pepsi/pepsi.conf, übergibt jedes secrets.d-Fragment dem einzigen Konto, das es liest, führt certbot aus, legt Datenbankrollen an und erzeugt Schlüsselmaterial — alles als root. pepsi-httpd, das die Oberfläche bedient, gibt seine Privilegien ab, bevor es eine Verbindung annimmt, und darf sie nie zurückerlangen.
Es handelt also nicht. Es schreibt einen Absichts-Datensatz, der sagt, was wahr sein soll, und ein separates root-Programm — pepsi-setup apply, auf Anforderung gestartet und wieder fort, wenn es nichts zu tun hat — entscheidet wie, tut es und hält fest, was geschehen ist. Root ist nie im Netz. Lesen Sie „Das Vertrauensmodell des Appliers“ in :doc:`programs/pepsi-setup`, bevor Sie das aktivieren: Dort steht genau, was der Applier tun und nicht tun wird, einschließlich der Dinge, die er bewusst nicht kann (es gibt keine Neustart- oder Abschaltaufgabe, und install-schema lehnt reset ab).
3.5.2. Es aktivieren¶
Die Debian-Pakete liefern eine minimale, aber vollständige Konfiguration, einen administrativen Listener auf einem UNIX-Socket und — in pepsi-httpd-admin, das pepsi Recommends und apt daher standardmäßig installiert — die Socket-Unit des Appliers (siehe Debian-Pakete). Drei Schritte:
# systemctl enable --now pepsi-httpd.socket pepsi-setup-apply.socket
# pepsi-setup -c /etc/pepsi/pepsi.conf bootstrap
Der zweite gibt ein Einmal-Token und den curl-Befehl aus, der daraus das erste Administratorkonto macht. Auf der Maschine selbst können Sie ihn ganz überspringen: Ein Mitglied der Gruppe pepsi-admin (und root) wird über SO_PEERCRED auf /run/pepsi/admin.sock identifiziert und braucht überhaupt kein Credential.
Eine weitere Einstellung ist nötig, bevor überhaupt etwas Privilegiertes angefordert werden kann: [pepsi-admin] CONFIG_DB muss eine Verbindung benennen, die sich als Datenbankrolle pepsi-config authentifiziert. Das ist die Grenze: Nur diese Rolle darf Setup-Arbeit in die Warteschlange stellen, und das eigene Konto von pepsi-httpd ist es nicht, sodass eine Kompromittierung der Web-Schicht keine Kompromittierung der Pipeline-Definition ist. Solange sie nicht gesetzt ist, antworten die Setup-Endpunkte mit 503 und sagen es.
3.5.3. Es bedienen¶
Das Interview ist Daten. GET /api/v1/setup/questions liefert die geordneten Schritte und, für jede Frage, ihre Form, ihren Standardwert, ihren Hilfetext und die Bedingung, unter der sie gestellt wird — dasselbe Modell, das pepsi-setup questions ausgibt, und dasselbe, durch das der Terminal-Assistent beschrieben ist, von der Testsuite als gleich zugesichert. Antworten werden mit PUT /api/v1/setup/answers in Entwurfsdatensätze vorbereitet, die kein laufender Prozess sehen kann, sodass eine unterbrochene Sitzung nichts halb konfigurieren kann.
POST /api/v1/setup/tasks fordert dann die privilegierte Hälfte an — die Konfiguration schreiben, Zertifikate beschaffen, das Schema installieren, Schlüssel erzeugen — und GET /api/v1/setup/tasks/{id}?since=<seq> streamt Zeile für Zeile, was der Applier tut.
3.5.4. Was immer einen Texteditor brauchen wird¶
Manche Einstellungen werden ausschließlich aus der Konfigurationsdatei gelesen, und daran wird keine Oberfläche etwas ändern: [pepsi], [pepsi-postgres], [paths] sowie die Listener-Abschnitte für HTTP(S) und Ingress. Sie müssen funktionieren, bevor eine Datenbankverbindung existiert, oder sie sind eine Sicherheitsgrenze — eine Datenbank, die einen lauschenden Socket verschieben oder die Kryptorichtlinie lockern könnte, machte eine Datenbankkompromittierung zu einer Kompromittierung des eigenen TLS und der Ports des MTA.
Also: Einen Submission-Port hinzuzufügen oder einen Listener zu verschieben ist eine Texteditor-und-Neustart-Operation. Ebenso jede Änderung, die die Konsole als restart statt als hot kennzeichnet: Es gibt keinen Neustartknopf, denn ein Knopf, der einen Dienst auf Anforderung neu startet, gäbe die Privilegien der Web-Schicht an jeden weiter, der sie erreicht.
3.5.5. Es skripten¶
Dasselbe Antwortmodell treibt eine unbeaufsichtigte Installation:
pepsi-setup --wizard --answers answers.json -c /etc/pepsi/pepsi.conf
pepsi-setup questions gibt das Schema aus, gegen das diese Datei geschrieben wird. Das ist keine dritte Implementierung des Interviews: Es führt das interaktive aus, mit jeder Frage aus der Datei beantwortet, sodass die Verzweigungen und die Validierung je Feld dieselben sind, die ein Mensch sieht.
3.6. Die Dienste betreiben¶
Zwei langlebige Prozesse müssen dauerhaft laufen:
pepsi-ingress serve— nimmt Mail an (typischerweise unter einem Dienstmanager, optional mit systemd-Socket-Aktivierung für die privilegierten Ports).pepsi-dispatch serve— läuft mit genau einer Instanz pro System; es ist der einzige Prozess, der Stage-Programme startet.
Die Stage-Programme selbst werden vom Dispatcher als persistente PROGRAM worker-Prozesse gestartet, die Nachrichten-IDs von der Standardeingabe lesen; im Produktivbetrieb führen Sie sie nicht von Hand aus (zum Debuggen können Sie eine ID an worker weiterleiten, z. B. echo 42 | pepsi-stage-srs -c /etc/pepsi/pepsi.conf worker).
3.7. Upgrade¶
Ab dem ersten Release, 0.0.0, aktualisiert jedes Release die Datenbank jedes früheren Releases an Ort und Stelle: Die Warteschlange, der Schlüsselspeicher, die Einstellungen und alles andere darin bleiben erhalten, und in der Warteschlange wartende Mail wird vom neuen Release zugestellt. Downgrades werden nicht unterstützt (siehe unten).
Das Vorgehen:
Lesen Sie
NEWSzu dem Release. Es führt geänderte Konfigurationsoptionen auf und alles andere, was von Hand zu erledigen ist.Legen Sie eine Sicherung an (Sicherung und Wiederherstellung), oder aktivieren Sie zumindest den unten beschriebenen automatischen Dump.
Installieren Sie das neue Release. Die Debian-Pakete erledigen den Rest: Sie aktualisieren das Schema und starten die Dienste neu, die liefen. Aus den Quellen:
make install, dannpepsi-setup -c /etc/pepsi/pepsi.conf schemaundsystemctl try-restart pepsi.target.Prüfen Sie mit
pepsi-status, dass sich die Warteschlange leert, und sehen Sie im Journal nach Warnungen (Logs).
Der Rest dieses Abschnitts erklärt, was in Schritt 3 geschieht.
Jedes Pepsi-Programm prüft beim Verbinden mit der Datenbank, dass das Schema aus genau den SQL-Dateien gebaut wurde, mit denen das Programm selbst gebaut wurde. Der Installer hält SHA-256 und Release jeder angewendeten Datei in pepsi.schema_file fest, und ein Programm, das etwas anderes vorfindet – ein älteres Schema, ein neueres oder eines aus anderen Dateien –, hält sofort mit Exit-Status 78 und einer Meldung an, die die Abhilfe nennt, statt mitten in einer Nachricht an der ersten fehlenden Spalte zu scheitern. Der Dispatcher behandelt einen Stage-Worker, der auf diese Weise anhält, als „kann noch nicht laufen“, nicht als Absturz: Die Nachricht, die ihm übergeben wurde, kommt zurück in die Warteschlange und wird nie auf failed gesetzt.
Das Upgrade des Schemas ist ein eigener Schritt:
pepsi-setup -c /etc/pepsi/pepsi.conf schema
Er installiert die Patches, die dieses Release hinzufügt, ersetzt die gespeicherten Funktionen, wendet die Rollenrechte erneut an und tut sonst nichts – keine Zertifikate, Schlüssel oder DNS –, braucht also nur den Abschnitt [pepsi-postgres]. Auf einem Telemetrie-Collector übergeben Sie ihm die Datei des Collectors, /etc/pepsi-telemetry/pepsi-telemetry.conf.
Debian-Pakete führen ihn bei ihrer Aktualisierung automatisch aus, bevor die Dienste neu gestartet werden; eine Neuinstallation bleibt pepsi-setup run überlassen. Schlägt er fehl (etwa weil die Datenbank nicht läuft), wird das Paket trotzdem installiert, ein Hinweis meldet dies, und die Dienste verweigern den Start und werden von systemd erneut versucht – mit zunehmendem Abstand bis zu einmal pro Minute, ohne Startlimit –, bis das Schema passt. Ist die Ursache behoben, genügt es, den obigen Befehl auszuführen; die Dienste kommen von selbst wieder.
Aus den Quellen, nach make install:
pepsi-setup -c /etc/pepsi/pepsi.conf schema
systemctl try-restart pepsi.target
Was die Zurückweisungen bedeuten:
Die Meldung sagt |
Was zu tun ist |
|---|---|
kein |
Eine Neuinstallation: |
älter als dieses Programm |
|
neuer als dieses Programm |
Ein Downgrade, der nicht unterstützt wird. Installieren Sie das neuere Release wieder, oder stellen Sie die vor dem Upgrade angelegte Datenbanksicherung wieder her (siehe unten). |
aus einer anderen Fassung eines Patches gebaut |
Ein veröffentlichter Patch ändert sich nie, dies ist also ein Fehler; bitte melden Sie ihn. Die einzige Ausnahme ist eine Datenbank, die aus einem Entwicklungsstand gebaut wurde (einem Git-Checkout zwischen Releases), bei dem der neueste Patch noch bearbeitet wird: Leeren Sie sie und erstellen Sie sie mit |
gespeicherte Funktionen aus einem anderen Build |
Nur bei Entwicklungs-Builds: |
3.7.1. Downgrades¶
Nicht unterstützt. pepsi-setup weigert sich, das SQL eines älteren Releases über ein neueres Schema zu installieren (Exit-Status 78, nichts geändert), und die Programme des älteren Releases verweigern darauf den Betrieb. Zurück zu einem älteren Release geht es nur, indem Sie eine vor dem Upgrade angelegte Datenbanksicherung wiederherstellen und danach die älteren Pakete installieren.
3.7.2. Sicherung vor einem Schema-Upgrade¶
Eine Sicherung wird nur angelegt, wenn Sie sie aktivieren. Ist sie aktiviert, wird sie nur angelegt, wenn ein Upgrade das Schema tatsächlich ändert: pg_dump sichert das pepsi-Schema (mit den Erweiterungen, die es verwendet) als pepsi-<previous version>-<UTC time>.dump, nur für root lesbar. Schlägt der Dump fehl, wird das Schema nicht aktualisiert. Sicherungen werden nie automatisch gelöscht.
Bei den Debian-Paketen ist es eine debconf-Einstellung, die nur mit Priorität low abgefragt wird:
dpkg-reconfigure -plow pepsi
Antworten Sie mit yes und bestätigen oder ändern Sie das Verzeichnis (Vorgabe /var/backups/pepsi). Unbeaufsichtigt oder vor dem ersten Upgrade:
echo "pepsi pepsi/schema-backup boolean true" | debconf-set-selections
echo "pepsi pepsi/schema-backup-dir string /var/backups/pepsi" | debconf-set-selections
Auf einem Telemetrie-Collector-Host gehören die Fragen zu pepsi-telemetry (pepsi-telemetry/schema-backup, pepsi-telemetry/schema-backup-dir). Sind beide Pakete installiert und verwenden dieselbe Datenbank, legt dasjenige die Sicherung an, das sie zuerst aktualisiert.
Aus den Quellen übergeben Sie das Verzeichnis dem Upgrade-Schritt:
pepsi-setup -c /etc/pepsi/pepsi.conf schema --backup-dir /var/backups/pepsi
Um eine Sicherung wiederherzustellen, stoppen Sie die Dienste, legen die Datenbank leer und im Besitz des Schemaeigentümers neu an und stellen die Sicherung als dieser Eigentümer darin wieder her:
systemctl stop pepsi.target
sudo -u postgres dropdb pepsi
sudo -u postgres createdb -O pepsi-owner pepsi
sudo -u pepsi-owner pg_restore -d pepsi /var/backups/pepsi/pepsi-0.0.0-20261001T000000Z.dump
Installieren Sie danach das Release, aus dem die Sicherung stammt, und starten Sie die Dienste wieder. Alles, was die Datenbank nach der Sicherung erfahren hat – seitdem angenommene Mail, seitdem geänderte Einstellungen –, geht verloren. Die gespeicherten privaten Schlüssel im Dump sind unter dem Schlüsselverschlüsselungsschlüssel in secrets.d verschlüsselt, der nicht in der Datenbank liegt: Bewahren Sie diese Datei auf und sichern Sie sie separat (siehe Sicherung und Wiederherstellung).
3.8. Benutzer, Gruppen und Privilegien¶
Pepsi läuft niemals als root. Die langlebigen Daemons dürfen als Root gestartet werden, damit sie privilegierte Ports binden und nur für Root lesbare TLS-Schlüssel lesen können, aber jeder gibt seine Privilegien an sein eigenes unprivilegiertes Dienstkonto ab, bevor er auch nur eine Verbindung bedient; kann die Abgabe nicht abgeschlossen werden, verweigert der Prozess den Start, statt zu riskieren, als Root zu laufen (siehe pepsi-common::privdrop). Die lokale Zustellung — die in die Postfächer beliebiger Benutzer schreiben muss — ist die eine Operation, die mehr braucht, als das Dienstkonto geben kann, und sie ist auf einen einzigen, eng begrenzten setuid-Helper beschränkt, statt der Pipeline als Ganzes überlassen zu werden.
Unter den mitgelieferten systemd-Units laufen die Daemons überhaupt nie als root: systemd bindet die privilegierten Sockets (Socket-Aktivierung) und startet jeden Prozess direkt unter seinem Dienstkonto. Bleiben die TLS-Schlüssel, die certbot nur für root lesbar hält — also lässt pepsi-setup auch diese von systemd lesen und schreibt pro Unit ein LoadCredential=-Drop-in: systemd öffnet jedes Zertifikat und jeden Schlüssel als root, wenn es die Unit startet, und übergibt dem Dienst eine private Kopie unter $CREDENTIALS_DIRECTORY, wo der Server zuerst nachsieht. Führen Sie pepsi-setup run erneut aus, wann immer Sie ein Zertifikat hinzufügen, verschieben oder entfernen, damit das Drop-in neu erzeugt wird. Siehe pepsi-httpd.
Die oben beschriebene Browser-Einrichtung ist der eine Weg, auf dem etwas anderes als ein Operator an einem Terminal einen root-Prozess laufen lassen kann: pepsi-httpd betätigt einen Türklingel-Socket, und systemd startet ein kurzlebiges root-pepsi-setup apply. Dieser Weg ist das am leichtesten zu entziehende Privileg in Pepsi. Seine beiden systemd-Units sind ein eigenes Debian-Paket, pepsi-httpd-admin, dessen Entsprechung bei einer Quellinstallation make install INSTALL_ADMIN_UNITS=no ist; ohne sie leert nichts pepsi.setup_task, und keine HTTP-Anfrage kann etwas unterhalb von /etc/pepsi ändern, während pepsi-setup auf einem Terminal unverändert weiterarbeitet. Das Paket wieder einzuspielen wirkt nicht rückwirkend auf das, was in seiner Abwesenheit angefordert wurde: Seine Installation leert diese Warteschlange, bevor seine Units scharfgestellt werden. Siehe Die Aufteilung als Härtungshebel.
Die folgenden Konten und Gruppen werden automatisch durch das postinst des Debian-Pakets angelegt; bei einem make install legen Sie sie selbst an (dieselben Namen). Der PostgreSQL-Zugriff erfolgt per Peer-Authentifizierung über den lokalen Socket: Jedes Dienstkonto meldet sich als gleichnamige Datenbankrolle an, sodass nirgends Passwörter gespeichert werden. Eine entfernte Datenbank behält dasselbe Modell bei: eine Login-Rolle je Konto, jede authentifiziert durch ein eigenes Client-Zertifikat oder eine eigene Passwortdatei, die nur dieses Konto lesen kann und die je Rolle mit dem Platzhalter {role} in [pepsi-postgres] CONFIG benannt wird (siehe CONFIG in pepsi.conf(5)). Die Konfigurationsdatei enthält nie ein Passwort.
3.8.1. Dienstkonten¶
Dies sind Systemkonten (--system, /usr/sbin/nologin, Home /var/pepsi), jedes mit einer privaten primären Gruppe gleichen Namens. Die ersten drei sind langlebige Daemons, die nach dem Binden auf ihr Konto wechseln; die übrigen sind keine Daemons in der Pipeline.
Konto |
Läuft als |
Zweck / Zugriff |
|---|---|---|
|
|
Eingehender SMTP-Server. Unter systemd socket-aktiviert (nie root; das TLS-Material kommt als Dienst-Credential); von Hand gestartet bindet er 25/465/587 und liest die TLS-Schlüssel als root und gibt die Rechte dann ab. DB-Rolle |
|
|
HTTP/HTTPS-Server (MTA-STS-Policy + |
|
|
Die Arbeitsidentität der Pipeline. Liest die DKIM-Schlüssel (über die Gruppe |
|
|
Kein Laufzeitdienst. Besitzt die |
|
|
Nur vorhanden, wenn ein Smarthost |
|
|
Verwahrer des privaten Ende-zu-Ende-Schlüsselmaterials. Besitzt |
|
|
Konto, das das setuid-CLI für weiße Listen annimmt, damit gewöhnliche Benutzer ihre eigenen weißen Absenderlisten pflegen können. Seiner Datenbankrolle sind |
|
|
Schlüsselentdeckung (WKD, DANE, VKS, LDAP). Parst Schlüsselmaterial, das aus dem offenen Internet geholt wird, daher ist seine Datenbankrolle die engste in der Installation. Siehe Schlüsselverwaltung. |
|
|
Die einzige Datenbankrolle, die das Overlay |
Die neun PostgreSQL-Login-Rollen — pepsi-owner, pepsi, pepsi-ingress, pepsi-httpd, pepsi-telemetry sowie die eng gefassten Rollen pepsi-whitelist, pepsi-config, pepsi-crypto und pepsi-keydisc — werden vom postinst des Pakets (oder, bei einer manuellen Installation, von Ihnen) angelegt, bevor pepsi-setup das Schema installiert; pepsi-setup gewährt dann jeder, was sie braucht.
3.8.3. Privilegierte Binärprogramme¶
Diese Bits werden von make install gesetzt, wenn es als Root läuft (andernfalls gibt es die genauen, von Hand auszuführenden chown/chmod aus), sowie vom Debian-Paket über dpkg-statoverride, das die maßgebliche Liste ist (debian/pepsi.postinst):
Binärprogramm |
Modus / Eigentümer |
Warum |
|---|---|---|
|
|
Setuid root, damit es in das Postfach jedes lokalen Benutzers schreiben kann; gruppengesperrt, sodass nur |
|
|
Setgid, damit der |
|
|
Dieselbe Gruppe und derselbe Grund: |
|
|
Setuid root, damit es die |
|
|
Setgid, damit der |
|
|
Setuid root, damit es auf das Konto, dem das Wallet gehört (oder auf die eigene uid des Empfängers), herabgehen kann, um |
|
|
Setgid, damit der |
|
|
Setgid, damit der |
|
|
Setuid und absichtlich für alle ausführbar: Jeder lokale Benutzer darf seinen eigenen |
|
|
Setuid, nicht setgid: Die Peer-Authentifizierung von PostgreSQL richtet sich nach der effektiven uid, und |
Jedes andere Binärprogramm wird unprivilegiert installiert, einschließlich pepsi-keys, das aus denselben Gründen eigenständig ist, aber mit 0755 ausgeliefert wird: Ein Binärprogramm, das jeden privaten Schlüssel einer Installation öffnen kann, ist eine weit größere Beute als die eine Tabelle von pepsi-whitelist, sodass es setuid pepsi-crypto zu machen eine Entscheidung je Standort ist statt der Standardwert.
3.8.4. Verzeichnisse und Geheimnisse¶
pepsi-setup und das Paket legen Folgendes unter /var/pepsi (dem Dienst-Home) und /etc/pepsi an. Die setgid-Verzeichnisse (2750) bewirken, dass neue Dateien die Gruppe des Verzeichnisses erben, sodass Token-/TLS-/Kerberos-Material vom Relay gruppenlesbar ist, ohne dass pro Datei ein chgrp nötig wäre.
Pfad |
Eigentümer / Modus |
Inhalt |
|---|---|---|
|
|
Dienst-Home. |
|
|
Domainspezifische private DKIM-Schlüssel: von |
|
|
OAuth-Zugriffstoken-Dateien: vom Refresher geschrieben, vom Smarthost-Relay über die Gruppe |
|
|
Private, rotierte Refresh-Token; niemals gruppenlesbar. |
|
|
Die |
|
|
Die Fragmente, die |
|
|
Mutual-TLS-Client-Zertifikat + -Schlüssel für das Smarthost-Relay ( |
|
|
Kerberos-Credential-Cache für |
|
|
Die Sockets für lokale Einlieferung, Administration, HTTP und den Setup-Applier. Angelegt vom |
|
|
Home des Kontos |
Die Verzeichnisse /var/pepsi/tokens, /var/pepsi/tls und /var/pepsi/krb5 (und das pepsi-helper-token-refresh-Konto) sind nur relevant, wenn Sie einen Smarthost mit dem entsprechenden AUTH-Mechanismus konfigurieren; eine standardmäßige Direkt-zu-MX- oder lokale-Zustellungs-Installation verwendet keines davon.
3.9. Von GNU Mailman migrieren¶
Eine bestehende GNU-Mailman-Installation – 2.1 oder 3 – zieht mit pepsi-list import und pepsi-archive import auf Pepsi um. Lesen Sie die Tabelle unten, bevor Sie anfangen, nicht danach.
Die Verhaltensunterschiede sind eine andere Tabelle, und sie wird hier nicht wiederholt: Erklärte Unterschiede zu GNU Mailman 3 in Mailinglisten sammelt jede Stelle, an der Pepsi absichtlich etwas anderes tut als upstream – die Ein-Klick-Abmeldung, das immer empfängerweise Fan-out, die verschleierten Absenderadressen im Archiv, den Löschgrabstein, die umbenannten X-Mailman-*-Header und das, was einfach fehlt (kein NNTP-Gateway, keine einsteckbaren Archivierer, keine Plugin-API). Zwei Kopien dieser Tabelle würden auseinanderlaufen, und die Kopie, die ein migrierender Betreiber zufällig liest, wäre die veraltete. Dieser Abschnitt handelt nur davon, was der Importer zurücklässt.
3.9.1. Was nicht mitkommt und warum¶
Warum |
|
|---|---|
Passwörter |
Weder die |
Bounce-Punktestände |
Upstream importiert sie ebenfalls nicht: das |
Token in Bearbeitung |
Ein anstehendes Bestätigungs- oder Moderationstoken ist ein Versprechen über einen Ablauf, den es nach der Umstellung nicht mehr geben wird. Wer mitten in einem Abonnement steckt, fragt erneut. |
Topics (2.1) |
Kein Gegenstück in Mailman 3. |
Vorlagen-URIs, die wir nicht abrufen |
Eine |
Alles Weitere, was der Importer nicht verstanden hat, steht in seinem Bericht. Er endet mit einem Fehlerstatus, wenn etwas verloren ging, und das ist der Sinn: eine Migration, die halb funktionierte und mit Null endete, ist eine Migration, die niemand prüft. Nichts wird zurückgerollt, und einen Import erneut auszuführen ist gefahrlos – jeder Schreibvorgang hängt an der Listen-ID, der Adresse oder der Message-ID, ein zweiter Lauf ist also eine Leeroperation.
3.9.2. Die empfohlene Reihenfolge¶
Tun Sie es in dieser Reihenfolge. Der Grund steht in Schritt 4.
Die Konfiguration und die Mitgliederliste importieren, gegen den laufenden alten Server:
pepsi-list import mailman3 --rest http://localhost:8001 \ --user restadmin --password-file /etc/mailman3/rest.pw \ --report /root/mailman-import.txt
Oder, für einen Mailman-2.1-Server, dessen Server schon abgeschaltet ist:
pepsi-list import mailman21 --listdir /var/lib/mailman/lists \ --report /root/mailman-import.txt
Setzen Sie zuerst
--dry-rundavor: es liest alles, meldet alles und schreibt nichts.Das Archiv importieren, je Liste:
pepsi-archive import --list announce@lists.example.org \ --rejects /root/rejected.txt /var/lib/mailman/archives/private/announce.mbox/*.mbox
Threads werden am Ende automatisch wieder zusammengehängt und neu numeriert – ein Import in falscher Reihenfolge lässt sie sonst getrennt, und das ist der Fehler, den dieser Befehl nicht wiederholen soll.
Prüfen.
pepsi-list check --strict, dann die Einstellungen einiger Listen gegen den alten Server stichprobenartig abgleichen. Über REST antworten beide Enden auf/3.1/lists/<id>/config, der Vergleich geht also attributweise und nicht nach Augenmaß.Die IP mit dem Einladungslauf aufwärmen, während der alte Server noch Post zustellt.
pepsi-list invite send --dry-run # the per-domain histogram pepsi-list invite send --rate 200 --limit 500 pepsi-list invite status
Dies ist der Schritt, bei dem der Zeitpunkt zählt. Jedem Mitglied zu sagen, es solle ein Passwort wählen, ist die größte Einzelsendung, die dieser Server je verschicken wird, an eine Adressliste, die er nie geprüft hat, von einer IP ohne Reputation – und genau so wird die Reputation einer neuen Installation am ersten Tag zerstört. Es vor dem MX-Wechsel zu tun bedeutet, dass ein Drosselungs- oder Sperrproblem sichtbar wird, solange es noch nicht tragend ist.
Das Histogramm des Probelaufs ist ein Werkzeug für die Zustellbarkeit und kein Fortschrittsbalken: ein Anbieter, der vierzig Prozent eines migrierten Servers hält, ist die Tatsache, die die Rate bestimmt, und sie ist unsichtbar, solange sie niemand zählt. Einladungen gelten vier Wochen, der Lauf setzt dort fort, wo er aufhörte, und niemand wird abgemeldet, weil er nicht antwortet – ein Mitglied, das nie handelt, behält sein Abonnement und kann sich lediglich nicht anmelden, bis es den Link benutzt oder um einen neuen bittet.
Den MX umschalten und erst dann den alten Server abschalten.
3.9.3. Wenn unser Pickle-Leser strenger ist als ihrer¶
pepsi-list import mailman21 liest config.pck mit einem eigenen Parser, der nichts konstruiert: kein Modul wird nachgeschlagen und kein Aufrufbares aufgerufen, denn eine config.pck kommt vom Server eines anderen, und Pythons pickle.load auf nicht vertrauenswürdiger Eingabe ist das Ausführen beliebigen Codes.
Der Preis dafür ist Strenge. Weigert sich der Leser bei einer Datei – ein Opcode, den er nicht implementiert, ein Protokoll neuer als das, was Python 2 schreiben konnte, eine Ganzzahl zu breit für 64 Bit –, dann sagt er das und nennt die Notluke:
python2 contrib/mm21-export.py /var/lib/mailman/lists/announce/config.pck \
> /root/announce.json
pepsi-list import mailman21 --json /root/announce.json --list announce
Dieses Skript läuft auf dem alten Server, mit dem Python, dem dieser Server ohnehin vertraute, und schreibt dasselbe Wörterbuch als JSON aus. Beide Wege gehen danach durch dieselbe Zuordnung, sie können sich also nicht darüber uneinig sein, was die Datei bedeutet. Eine Migration darf nie daran scheitern, dass unser Parser strenger ist als der, der die Datei geschrieben hat.
3.9.4. Header-Umbenennungen, die ein Benutzer bemerkt¶
Pepsi gibt X-Pepsi-List-* aus, wo Mailman X-Mailman-* ausgab; die Zuordnungstabelle steht in Mailinglisten. Das sind die echten Kosten eines migrierenden Benutzers, denn procmail- und Sieve-Regeln sind gegen diese Namen geschrieben, und es lohnt sich, es ihnen vor dem Wechsel zu sagen und nicht danach.