PEP 761 – Deprecating PGP signatures for CPython artifacts
- Autor:
- Seth Michael Larson <seth at python.org>
- Sponsor:
- Hugo van Kemenade
- Discussions-To:
- Discourse thread
- Status:
- Aktiv
- Typ:
- Prozess
- Erstellt:
- 08-Oct-2024
- Python-Version:
- 3.14
- Post-History:
- 25-Sep-2024, 09-Oct-2024
- Resolution:
- 06-Nov-2024
Zusammenfassung
Seit Python 3.11.0 stellt CPython zwei verifizierbare digitale Signaturen für alle CPython-Artefakte bereit: PGP und Sigstore.
PGPs Design erfordert die Wartung und den Schutz von langfristigen privaten Schlüsseln durch vertrauenswürdige Parteien. PGP's Sicherheit und Ergonomie werden seit vielen Jahren von Sicherheitsexperten kritisiert, wobei das größte Problem darin besteht, dass wenige Alternativen für „Artefaktsignaturen“ vorgeschlagen oder übernommen wurden.
Sigstores Designphilosophie konzentriert sich auf die Ergonomie des Signierens und Verifizierens und verwendet kurzlebige Schlüssel mit fest verbundenen, menschenlesbaren Identitäten über OpenID Connect. Sigstore verfügt sowohl über Entwicklungs- als auch über Übernahmemomentum und wird unter anderem von PyPI, NPM, Homebrew und GitHub übernommen.
Diese PEP schlägt vor, CPython durch eine Deprecation und anschließende Einstellung der Bereitstellung von PGP-Signaturen durch neue Release Manager ausschließlich auf Sigstore für die Signierung von Artefakten umzustellen.
Motivation
CPython-Releases sind Release-Manager-zentriert, wobei eine einzelne Person viele CPython-Releases von der Vorabversion bis zum Ende der Lebensdauer über viele Jahre hinweg wartet.
Die Anforderung an Release Manager, PGP-Private-Schlüssel sieben oder mehr Jahre lang zu warten und zu schützen, ist eine unnötige Belastung im neuen Zeitalter ergonomischer und kurzlebiger Signierschlüssel. Im Vergleich dazu erfordert Sigstore lediglich, dass Release Manager während des Release-Prozesses auf eine Schaltfläche klicken, um sich über ihren Identitätsanbieter per OAuth anzumelden. Die Aufrechterhaltung der Integrität von Konten bei Identitätsanbietern wie GitHub ist bereits eine Erwartung für einen Python Release Manager oder Kernteammitglied, z. B. durch Multi-Faktor-Authentifizierung und starke eindeutige Passwörter.
Begründung
Erwartungen über eine Python-Version hinweg beibehalten
Um nachgelagerte Verifizierer nicht zu beeinträchtigen, dürfen die Erwartungen an die Verfügbarkeit von Verifizierungsmaterialien während des Lebenszyklus einer Feature-Version **nicht** geändert werden.
Release Manager, nicht Releases
Die Einstellung von PGP-Signaturen muss nicht unbedingt an einer „Release-Manager-Grenze“ erfolgen; eine neue Python-Version könnte eine potenzielle Grenze darstellen.
Da die Hauptmotivation für die Deprecation von PGP die Ergonomie ist, ist die Entscheidung, PGP für eine Version fallen zu lassen, während ein Release Manager noch Verpflichtungen zur Bereitstellung von PGP-Signaturen für andere Releases über viele Jahre hinweg hat, keine große Arbeitsersparnis.
Ein neuer Release Manager repräsentiert auch einen neuen PGP-Public-Schlüssel, den nachgelagerte Verifizierer übernehmen müssen. Durch die Wahl, die Änderung während dieser Zeit vorzunehmen, wird die Unterbrechung auf einen Punkt in der nachgelagerten Wartung minimiert, an dem eine Änderung ohnehin notwendig sein wird.
Gordischer Knoten von Signaturmethoden und Verifizierern
CPython, das gleichzeitig PGP- und Sigstore-Signaturen bereitstellt, schafft einen „Gordischen Knoten“, bei dem Verifizierer demotiviert sind, zu einer neuen Signaturmethode zu migrieren, da eine bestehende Signaturmethode ständig und erwartungsgemäß verfügbar ist, wodurch die scheinbare Nachfrage nach der Beibehaltung der bestehenden Signaturmethode aufrechterhalten wird.
Diese Situation verlangsamt die Übernahme neuer Signaturmethoden wie Sigstore sowohl für signaturproduzierende Projekte als auch für signaturverifizierende Ökosysteme, da kein „Bedarf“ geschaffen wird, die Signaturmethode in der Verifizierungswerkzeugkette zu automatisieren und zu integrieren.
Durch die Änderung der Erwartung, welche zukünftigen Signaturmethoden verfügbar sein werden, kann der Anreizknoten durch Anschub der Übernahme der neuen Signaturmethode in nachgelagerten Werkzeugen durchbrochen werden. Diese Änderung an der Verifizierungswerkzeugkette ermöglicht es auch anderen vorgelagerten Projekten, nur noch Sigstore-Signaturen zu veröffentlichen, was zu einer positiven Rückkopplungsschleife der Übernahme führt.
Spezifikation
Da PGP-Schlüssel an die Identität eines Release Managers gebunden sind, wird die Änderung der Verfügbarkeit von PGP-Signaturen an Release Manager gebunden sein und nicht an einzelne Releases (3.13, 3.14 usw.). Diese PEP stellt sowohl eine Deprecation als auch einen Zeitplan für die Einstellung von PGP-Signaturen vor.
Deprecation und Einstellung von PGP-Signaturen
Diese PEP deklariert PGP-Signaturen für zukünftige CPython-Releases als veraltet und empfiehlt Verifizierern, Sigstore zur Verifizierung von CPython-Artefakten als Alternative zu PGP zu verwenden.
Diese PEP enthebt auch zukünftige Release Manager, die keine stabile Python-Version mehr betreuen, der Erwartung, PGP-Signaturen zu veröffentlichen. Zum Zeitpunkt der Erstellung dieser PEP wäre dies Hugo van Kemenade, da 3.14 die nächste Python-Version ohne stabile Veröffentlichung ist.
Releases, die bereits eine stabile Version haben (3.13, 3.12, 3.11 usw.), sind nicht betroffen und werden weiterhin PGP-Signaturen für Artefakte bereitstellen, bis sie ihr Lebensende erreicht haben. Alle vorhandenen PGP-Signaturen funktionieren weiterhin wie erwartet.
Verzögerung der Einstellung von PGP-Signaturen
Diese PEP bietet einen Mechanismus zur Verzögerung der Einstellung von PGP-Signaturen von aktiven und anstehenden CPython-Releases im Falle außergewöhnlicher Umstände. Die Deprecation von PGP-Signaturen kann nicht ohne eine nachfolgende PEP geändert werden.
Der Steering Council KANN zu einem späteren Zeitpunkt nach der Annahme dieser PEP entscheiden, die Einstellung von PGP-Signaturen auf eine zukünftige CPython-Version zu verschieben. Wenn der Steering Council beschließt, die Einstellung von PGP-Signaturen zu verschieben, MÜSSEN alle aktiven Release Manager PGP-Signaturen für ihre betroffenen CPython-Artefakte für den Rest ihrer Amtszeit als Release Manager bereitstellen. Dies beinhaltet alle dazu erforderlichen Schritte, wie z. B. die Erstellung eines neuen PGP-Schlüssels und die Veröffentlichung ihrer Identität auf python.org.
Die Einstellung von PGP-Signaturen wird dann automatisch für den nächsten Release Manager ohne stabile Veröffentlichung geplant und in der Entscheidung des Steering Council hervorgehoben.
Abwärtskompatibilität
Dieser Vorschlag würde die Möglichkeit entfernen, zukünftige CPython-Artefakte mit PGP zu verifizieren. Nachgelagerte Verifizierer, die PGP für CPython-Artefakte verwenden, müssten entweder zu Sigstore wechseln, den Quellcode von CPython auf andere Weise verifizieren oder die Verifizierung für zukünftige CPython-Releases ganz einstellen.
Sicherheitsimplikationen
PGP und Sigstore haben unterschiedliche Sicherheitsmodelle. Durch die Entfernung von PGP-Signaturen bedeutet dies, dass alle Benutzer nur noch die Option haben, sich auf das von Sigstore bereitgestellte Sicherheitsmodell zu verlassen.
Im Allgemeinen besteht das für Artefaktsignaturen erforderliche Sicherheitsmodell darin, erkennen zu können, ob ein gegebenes Artefakt von der erwarteten Quelle stammt und nicht modifiziert wurde, unabhängig von der Sicherheit oder Integrität des Hosting-Dienstes (im Fall von CPython: python.org/downloads).
Sigstores Sicherheitsmodell hängt stärker von zentraler Infrastruktur ab als PGP, wie dem „Public Good“-Signatur-Transparenzprotokoll (Rekor), der Zertifizierungsstelle und dem Transparenzprotokoll (Fulcio) sowie der Sicherheit von OpenID Connect-Identitätsanbietern wie Google und GitHub.
CPygons Entwicklung hängt bereits von der Sicherheit einiger dieser Dienste ab, und die anderen sind besser ausgestattet als jeder einzelne Release Manager, um langfristiges Public-Key-Management bereitzustellen.
Wie man das lehrt
CPython dokumentiert bereits, wie Artefakte mit Sigstore auf Basis der vorab veröffentlichten Identitäten von Release Managern verifiziert werden können. Die Dokumentation wird aktualisiert, um die Deprecation und zukünftigen Erwartungen an PGP-Signaturen anzugeben.
Die Verifizierung von Signaturen von CPython-Artefakten ist nichts, was wir von neuen Python-Benutzern erwarten sollten. Stattdessen wird Sigstore wahrscheinlich Teil einer Build-Pipeline von nachgelagerten Integratoren sein, wie z. B. einer Linux-Distribution, Homebrew, pyenv oder anderen, die CPython programmgesteuert von der Quelle abrufen und bauen.
Abgelehnte Ideen
PGP-Signaturen weiterhin unbegrenzt veröffentlichen
Ein Release Manager zu sein ist bereits eine schwierige, zeitaufwändige und langfristige Verpflichtung, die normalerweise ehrenamtlich geleistet wird. Daher sehen wir die Entfernung von PGP-Schlüsselverwaltungsaufgaben als einen Schritt zur Reduzierung von Burnout und Stress für zukünftige Release Manager und zur Verbesserung der Nachhaltigkeit von CPython.
Entfernen früherer PGP-Signaturen
Diese PEP zielt nicht darauf ab, bestehende Infrastruktur, die auf vorhandenen Python-Versionen basiert, zu beeinträchtigen, sondern ändert lediglich die Erwartungen für zukünftige Python-Versionen. Daher werden alle PGP-Signaturen, die bereits auf python.org verfügbar sind, auch nach der Einstellung von PGP weiterhin verfügbar sein.
Anhang
Unterstützung für Offline-Verifizierung
Während der Vorab-PEP-Diskussion wurde die Frage aufgeworfen, ob die Offline-Verifizierung von Sigstore unterstützt wird. Mithilfe einer Sigstore-Bundle-Datei (.sigstore) unterstützen Sigstore-Clients die vollständige Offline-Verifizierung des Artefakts.
Die Verwendung der Offline-Verifizierung mit Sigstore erfordert die Deaktivierung von Root-of-Trust-Updates und das „Pinnen“ eines Root-of-Trust in einer Datei, die während der Verifizierung verwendet wird.
Das Pinnen eines Root-of-Trust bedeutet, dass Signaturen, die nach der Etablierung eines neuen Root-of-Trust erstellt wurden, mit einem „gepinnten“ früheren Root-of-Trust nicht mehr verifiziert werden können. Neue Root-of-Trusts sind seltene Ereignisse, z. B. wenn der Root-of-Trust kompromittiert wird, und in diesem Fall möchten Verifizierer, dass Signaturen fehlschlagen.
Die Offline-Verifizierung macht auch Widerrufprüfungen unmöglich, aber dies ähnelt dem Modell von PGP, bei dem der Widerruf von Schlüsseln eine Online-Suche erfordert.
Abgesehen von seltenen Ereignissen wie einer Kompromittierung des Root-of-Trust erfordert die Verwendung der Offline-Verifizierung mit Sigstore keine zusätzlichen betrieblichen Anforderungen für Verifizierer.
Unterstützung für eine vorkompilierte ausführbare Datei zur Verifizierung
Während der Diskussion gab es Anfragen nach einer vorkompilierten ausführbaren Datei, die zur Verifizierung von Sigstore-Bundles verwendet werden könnte, ohne dass dafür entweder eine Go-Build-Toolchain installiert werden muss, um sigstore-go aus dem Quellcode zu kompilieren, oder bereits eine funktionierende Python-Installation für sigstore-python vorhanden sein muss.
Cosign ist ein weiteres Sigstore-Projekt, das vorkompilierte eigenständige Binärdateien bereitstellt und die Offline-Verifizierung von Bundles unterstützt.
# Download Cosign
wget https://github.com/sigstore/cosign/releases/download/v2.4.1/cosign-linux-amd64
# For offline verification, also need the Root of Trust. Can be grabbed
# from GitHub at: https://github.com/sigstore/root-signing/blob/main/targets/trusted_root.json
wget https://raw.githubusercontent.com/sigstore/root-signing/refs/heads/main/targets/trusted_root.json
# Download CPython artifacts
wget https://www.python.org/ftp/python/3.13.0/Python-3.13.0.tgz
wget https://www.python.org/ftp/python/3.13.0/Python-3.13.0.tgz.sigstore
./cosign-linux-amd64 verify-blob \
--new-bundle-format \
--certificate-oidc-issuer 'https://#' \
--certificate-identity 'thomas@python.org' \
--bundle ./Python-3.13.0.tgz.sigstore \
# --offline and --trust-root optional for offline verification
--offline \
--trust-root ./trusted_root.json \
./Python-3.13.0.tgz
Urheberrecht
Dieses Dokument wird in die Public Domain oder unter die CC0-1.0-Universal-Lizenz gestellt, je nachdem, welche Lizenz permissiver ist.
Quelle: https://github.com/python/peps/blob/main/peps/pep-0761.rst
Zuletzt geändert: 2024-11-06 19:20:02 GMT