PEP 759 – Externes Hosten von Wheel-Dateien
- Autor:
- Barry Warsaw <barry at python.org>, Emma Harper Smith <emma at python.org>
- PEP-Delegate:
- Donald Stufft <donald at python.org>
- Discussions-To:
- Discourse thread
- Status:
- Zurückgezogen
- Typ:
- Standards Track
- Thema:
- Packaging
- Erstellt:
- 01-Okt-2024
- Post-History:
- 10-Okt-2024, 31-Jan-2025
- Resolution:
- 31-Jan-2025
Zusammenfassung
Diese PEP schlägt einen Mechanismus vor, mit dem Projekte, die auf pypi.org gehostet werden, Wheel-Artefakte sicher auf externen Websites außerhalb von PyPI hosten können. Diese PEP schlägt ausdrücklich *nicht* das externe Hosten von Projekten, Paketen oder deren Metadaten vor. Diese Funktionalität ist bereits durch das externe Hosten unabhängiger Paketindizes verfügbar. Da diese PEP nur einen Mechanismus bereitstellt, mit dem Projekte die Download-URL für spezifische freigegebene Wheel-Artefakte anpassen können, muss die Abhängigkeitsauflösung, wie sie bereits von gängigen Installer-Tools wie pip und uv implementiert ist, nicht geändert werden.
Diese PEP definiert, was in diesem Kontext als „sicher“ gilt, zusammen mit einem neuen Paket-Upload-Dateiformat namens .rim-Datei. Sie definiert, wie .rim-Dateien die Metadaten beeinflussen, die für die Simple Repository API eines Pakets in den Formaten HTML und JSON zurückgegeben werden, und wie traditionelle Wheels leicht in .rim-Dateien umgewandelt werden können.
PEP zurückgezogen
Diese PEP wurde von den Autoren am 31.01.2025 zurückgezogen. Unserer Einschätzung nach ist die Stimmung im Diskussionsforum, dass, obwohl die Probleme, die diese PEP zu lösen versucht, valide sind, die meisten Leute einen anderen Ansatz bevorzugen würden. Insbesondere ist unsere Einschätzung, dass die meisten Benutzer mehr Kontrolle über die Möglichkeit wünschen, mehrere Indizes anzugeben, wie diese Indizes miteinander interagieren und die Prioritäts- und Vertrauenszuweisungen für diese Indizes. Zum Beispiel könnten Lösungen wie PEP 766 einen besseren Weg nach vorn bieten. Bestehende Notfallmaßnahmen (z. B. Anfragen zur Erhöhung des PyPI-Limits und der Ansatz „wheel-stub“) sind in der Zwischenzeit ausreichend – wenn auch nicht ideal. Die Autoren bedanken sich bei allen, die zu der konstruktiven Diskussion beigetragen haben, und insbesondere bei denen, die ihre Unterstützung für diese PEP öffentlich und privat gezeigt haben.
Begründung
Der Python Package Index, gehostet unter https://pypi.org, legt Standardgrenzen für die Dateigröße von Upload-Artefakten (100 MiB) und die Gesamtgröße des Projekts (10 GiB) fest. Die meisten Projekte können im Laufe ihres Lebens problemlos innerhalb dieser Grenzen bleiben, auch nach Jahren des Uploads. Einige wenige Projekte sind an diese Grenzen gestoßen und haben sowohl Ausnahmen bei der Dateigröße als auch bei der Projektgröße erhalten, was es ihnen ermöglicht, weiterhin neue Releases hochzuladen, ohne drastischere Maßnahmen ergreifen zu müssen, wie z. B. das Entfernen von Dateien, die möglicherweise noch von Benutzern verwendet werden (z. B. durch Versions-Pins).
Eine verwandte Problemumgehung ist der Ansatz „wheel stub“, der einen indirekten Link zwischen PyPI und einem externen Drittanbieter-Paketindex bereitstellt, wo solche Einschränkungen vermieden werden können. Wheel-Stubs sind Quellcodeverteilungen (auch „sdists“ genannt), die ein PEP 517-Build-Backend verwenden, das anstelle der Umwandlung von Quellcode in ein Binär-Wheel eine Logik ausführt, um die URL für ein vorhandenes, extern gehostetes Wheel zu berechnen, das heruntergeladen und installiert werden soll. Dieser Ansatz funktioniert, verschleiert jedoch die Verbindung zwischen PyPI, dem sdist und dem extern gehosteten Wheel, da es keine Möglichkeit gibt, diese Informationen an pip oder ähnliche Tools weiterzugeben.
Historischer Kontext
Im Jahr 2013 schlug PEP 438 einen „abwärtskompatiblen zweiphasigen Übergangsprozess“ vor, um mehrere Aspekte des Hostings von Release-Dateien auf PyPI zu ändern. Wie diese PEP beschreibt, unterstützte PyPI ursprünglich nur die Registrierung von Projekten und Releases, ohne auch das Hosten von Artefaktdateien zu ermöglichen. Daher hosteten die meisten Projekte Release-Datei-Artefakte woanders. Das Artefakt-Hosting wurde später hinzugefügt, aber die Mischung aus extern und PyPI gehosteten Dateien führte zu einer Vielzahl von Usability- und potenziellen sicherheitsrelevanten Problemen. PEP 438 war ein Versuch, mehrere Einrichtungen bereitzustellen, um externes Hosting zu ermöglichen und gleichzeitig eine PyPI-First-Hosting-Präferenz zu fördern.
PEP 438 war komplex, mit drei verschiedenen „Hosting-Modi“, rel-Metadaten in den einfachen HTML-Indexseiten zur Angabe von Hosting-Speicherorten und einem zweiphasigen Übergangsplan, der PyPI und Installer-Tools betraf. PEP 438 wurde schließlich 2015 von PEP 470 zurückgezogen, die anerkennt, dass PEP 438 erfolgreich war…
…mehr Leute dazu gebracht hat, die Repository-Funktionen von PyPI zu nutzen, was insgesamt eine gute Sache ist, angesichts des globalen CDN, das PyPI antreibt und für viele Leute schnellere Zugriffe ermöglicht.
Anstelle des externen Hostings förderte PEP 470 die Verwendung expliziter mehrerer Repositories, die vollständiges Paket-Indexing und Artefakt-Hosting bereitstellen und durch Installer-Tool-Unterstützung ermöglicht werden, wie z. B. pip install --extra-index-url, was es pip ermöglicht, mehrere Repositories im Wesentlichen als ein einziges globales Repository für die Auflösung der Paketinstallation zu behandeln. Da dies seit vielen Jahren der bevorzugte Standard ist, unterstützen alle Python-Paketinstallationswerkzeuge die Abfrage mehrerer Indizes zur Abhängigkeitsauflösung.
Das Problem mit mehreren Indizes
Warum schlägt diese PEP dann eine eingeschränktere Form des externen Hostings vor und wie vermeidet dieser Vorschlag die in PEP 470 dokumentierten Probleme?
Ein bekanntes Problem, das die Konsolidierung mehrerer Indizes ermöglicht, sind Dependency Confusion Attacks, für die Python aufgrund des Algorithmus, den pip install zur Auflösung von Paketabhängigkeiten und bevorzugten Versionen verwendet, besonders anfällig *sein kann*. Das Tool uv adressiert dies, indem es eine zusätzliche Option für die Indexstrategie unterstützt, mit der Benutzer zwischen z. B. einer pip-kompatiblen Strategie und einer eingeschränkteren Strategie wählen können, die solche Dependency-Confusion-Angriffe verhindert.
PEP 708 bietet zusätzliche Hintergründe zu Angriffen durch Abhängigkeitsverwirrung und verfolgt einen anderen Ansatz, um diese zu verhindern. Im Kern erlaubt PEP 708 Repository-Besitzern anzuzeigen, dass Projekte über verschiedene Repositories hinweg verfolgt werden, was es Installern ermöglicht zu bestimmen, wie der globale Paket-Namespace behandelt werden soll, wenn er über mehrere Repositories hinweg kombiniert wird. PEP 708 wurde vorläufig angenommen, vorbehaltlich mehrerer erforderlicher Bedingungen, wie in PEP 708 dargelegt, von denen einige eine unbestimmte Zukunft haben könnten. Wie PEP 708 selbst sagt, wird dies Angriffe durch Abhängigkeitsverwirrung nicht von selbst lösen, ist aber eine Möglichkeit, Installern genügend Informationen zur Verfügung zu stellen, um diese Angriffe zu minimieren.
Während es immer noch valide Anwendungsfälle für die Einrichtung eines völlig unabhängigen Paketindex geben kann (z. B. die Bereitstellung reichhaltigerer Plattformunterstützung für GPUs, bis ein vollständig ausgearbeiteter Variantenvorschlag angenommen wird), verfolgt diese PEP einen anderen, einfacheren Ansatz und ersetzt keine der bestehenden, vorgeschlagenen oder genehmigten Spezifikationen für die Zusammenarbeit von Paketindizes.
Diese PEP bewahrt auch den Kernzweck von PyPI und erlaubt es, dass es der traditionelle, kanonische, zentrale Index für alle Python-Pakete bleibt.
Adressierung von PyPI-Grenzen
Dieser Vorschlag befasst sich auch mit dem Problem der von PyPI auferlegten Größenbeschränkungen, wo es eine Standardgrenze für die Artefaktgröße von 100 MiB und eine Standard-Gesamt-Projektgrößenbeschränkung von 10 GiB gibt. Die meisten Pakete und Artefakte passen problemlos in diese Grenzen, selbst für Pakete, die Binär-Erweiterungsmodule für verschiedene Plattformen enthalten. Eine kleine, aber wichtige Klasse von Paketen überschreitet diese Grenzen regelmäßig und erfordert, dass sie PyPI-Unterstützungs-Tickets für Ausnahmeanfragen stellen. Es ist nicht unbedingt schwierig, eine Lösung für solche Ausnahmen zu erhalten, aber es ist ein spezieller Prozess, der einige Zeit zur Lösung in Anspruch nehmen kann, und die Kriterien für die Gewährung solcher Ausnahmen sind nicht gut dokumentiert.
Reduzierung der betrieblichen Komplexität
Die Einrichtung und Wartung eines gesamten Paketindex kann eine komplexe betriebliche Lösung sein, die sowohl zeit- als auch ressourcenintensiv ist. Dies gilt insbesondere, wenn der Hauptzweck eines solchen Index lediglich darin besteht, Dateigrößenbeschränkungen zu umgehen. Der externe Indexansatz führt auch eine schwierige Benutzererfahrung für Konsumenten von Projekten im externen Index ein, die verstehen müssen, wie CLI-Optionen wie --external-index-url funktionieren, sowie die Sicherheitsauswirkungen solcher Flags. Es wäre sowohl für Produzenten als auch für Konsumenten von großen Wheel-Paketen viel einfacher, einfach einen einfachen Webserver einzurichten und zu warten, der einzelne Dateien ohne eine komplexere API als HTTP GET bereitstellen kann. Eine solche Schnittstelle ist auch leicht zwischenspeicherbar oder hinter einem CDN platziert. Einfache HTTP-Server sind auch viel einfacher auf Sicherheit zu überprüfen, einfacher zu proxieren und benötigen normalerweise viel weniger Ressourcen für Betrieb, Support und Wartung. Selbst etwas wie Amazon S3 könnte verwendet werden, um externe Wheels zu hosten.
Diese PEP schlägt einen Ansatz vor, der eine solche betriebliche Einfachheit bevorzugt.
Spezifikation
Ein neuer Typ von hochladbarer Datei wird definiert, genannt „RIM“ (d. h. .rim) oder „Remote Installable Metadata“-Datei. Der Name erinnert an ein Rad, bei dem der Reifen entfernt wurde, und betont, dass .rim-Dateien leicht aus .whl-Dateien abgeleitet werden können. Der Prozess der Umwandlung eines .whl in ein .rim ist weiter unten beschrieben. Das Dateinamensformat entspricht exakt der Spezifikation des Wheel-Dateinamensformats, außer dass RIM-Dateien die Endung .rim verwenden. Das bedeutet, dass alle Tags, die zur Unterscheidung von .whl-Dateien verwendet werden, auch verschiedene .rim-Dateien unterscheiden, und somit bei der Abhängigkeitsauflösung, genau wie heute .whl-Dateien, verwendet werden können. In dieser Hinsicht sind .whl- und .rim-Dateien austauschbar.
Der Inhalt einer .rim-Datei ist *fast* identisch mit .whl-Dateien. Jedoch **MÜSSEN** .rim-Dateien nur das Verzeichnis .dist-info aus einem Wheel enthalten. Kein anderes übergeordnetes Datei- oder Verzeichnis ist in der .rim-Zip-Datei erlaubt. Das Verzeichnis .dist-info **MUSS** eine einzige zusätzliche Datei enthalten, zusätzlich zu den erlaubten in einem .whl-Datei .dist-info-Verzeichnis: eine Datei namens EXTERNAL-HOSTING.json.
Dies ist eine JSON-Datei, die die folgenden Schlüssel enthält
version- Dies ist die Dateiformatversion, die für diese PEP **MUSS**
1.0sein. owner- Dies **MUSS** den PyPI-Organisationsbesitzer dieser extern gehosteten Datei benennen, aus Gründen, die im Folgenden im Detail erläutert werden.
uri- Dies ist eine einzelne URL, die den Speicherort der physischen
.whl-Datei angibt, die auf einer externen Website gehostet wird. Diese URL **MUSS** dashttps-Schema verwenden. size- Dies ist ein ganzzahliger Wert, der die Größe in Bytes der physischen
.whl-Datei auf dem Remote-Host beschreibt. hashes- Dies ist ein Dictionary im Format, das in PEP 694 beschrieben wird, das verwendet wird, um sowohl den PEP 694 der physischen
.whl-Datei zu erfassen, mit den gleichen Einschränkungen wie in dieser PEP vorgeschlagen. Da diese Hashes nach dem Hochladen auf PyPI unveränderlich sind, dienen sie als kritische Validierung dafür, dass das extern gehostete Wheel nicht beschädigt oder kompromittiert wurde.
Auswirkungen der RIM-Datei
Die einzige Auswirkung einer .rim-Datei ist die Änderung der Download-URL für das Wheel-Artefakt sowohl in der HTML- als auch in der JSON-Oberfläche der Simple Repository API. In der HTML-Seite für einen Paket-Release **MUSS** das Attribut href der Wert des Schlüssels uri sein, einschließlich eines Fragments #<hashname>=<hashvalue>. Dieses Hash-Fragment **MUSS** genau in dem Format vorliegen, das in der ursprünglich in PEP 376 definierten Spezifikation des signierten Wheel-Dateiformats in der Datei .dist-info/RECORD beschrieben ist. Die exakt gleichen Regeln für die Auswahl des Hash-Algorithmus und der Kodierung werden hier verwendet.
Ebenso muss im JSON-Response der Schlüssel url, der auf die Download-Datei verweist, der Wert des Schlüssels uri sein, und das Dictionary hashes **MUSS** mit Werten, die aus dem oben bereitgestellten Dictionary hashes gefüllt sind, enthalten sein.
In allen anderen Aspekten sollte ein konformer Paketindex .rim-Dateien genauso behandeln wie .whl-Dateien, mit einigen anderen kleineren Ausnahmen, wie unten aufgeführt. Zum Beispiel können .rim-Dateien gelöscht und „yanked“ (gemäß PEP 592) werden, genau wie jede .whl-Datei, mit exakt denselben Semantiken (d. h. Löschungen sind permanent). Wenn ein .rim gelöscht wird, **DARF** ein Index nicht zulassen, dass eine übereinstimmende .whl- oder .rim-Datei (neu) hochgeladen wird.
Verfügbarkeitsreihenfolge
Extern gehostete Wheels **MÜSSEN** verfügbar sein, bevor die entsprechende .rim-Datei auf PyPI hochgeladen wird, da sonst eine Race Condition beim Veröffentlichen eingeführt wird, obwohl diese Anforderung für .rim-Dateien, die bei einer PEP 694 gestaffelten Veröffentlichung hochgeladen werden, **GGF. GELOCKERT WERDEN KANN**.
Wheels können RIMs überschreiben
Indizes **MÜSSEN** .rim-Dateien ablehnen, wenn eine übereinstimmende .whl-Datei mit exakt denselben Dateinamens-Tags bereits existiert. Indizes **KÖNNEN** jedoch eine .whl-Datei akzeptieren, wenn eine übereinstimmende .rim-Datei existiert, solange diese .rim-Datei nicht gelöscht oder "yanked" wurde. Dies erlaubt Uploadern, eine extern gehostete Wheel-Datei durch eine im Index gehostete Wheel-Datei zu ersetzen, das Gegenteil ist jedoch verboten. Da die Standardeinstellung darin besteht, Wheels im selben Paketindex zu hosten, der die Paketmetadaten enthält, ist es nicht erlaubt, eine vorhandene Wheel-Datei nach dem Hochladen „herunterzustufen“. Wenn ein .whl ein .rim ersetzt, **MUSS** der Index Download-URLs für das Paket über seinen eigenen gehosteten Dateidienst bereitstellen. Beim Hochladen der überschreibenden .whl-Datei **MUSS** der Paketindex den Hash aus der vorhandenen .rim-Datei validieren, und diese Hashes müssen übereinstimmen, andernfalls **MUSS** der überschreibende Upload abgelehnt werden.
PyPI API-Bump nicht notwendig
Es ist wahrscheinlich, dass die Änderungen rückwärtskompatibel genug sind, dass ein Anstieg der PyPI-Repository-Version nicht notwendig ist. Da .rim-Dateien im Wesentlichen nur Änderungen an der Upload-API sind, können Paket-Resolver und Paket-Installer weiterhin mit den APIs funktionieren, die sie schon immer unterstützt haben.
Resilienz des externen Hostings
Eines der Hauptanliegen, das zur Rücknahme von PEP 438 in PEP 470 führte, war die potenzielle Verwirrung der Benutzer, wenn ein externer Index verschwand. Aus PEP 470:
Diese Verwirrung entsteht dadurch, dass Endbenutzer von Projekten nicht erkennen, ob ein Projekt auf PyPI gehostet wird oder ob es auf einen externen Dienst angewiesen ist. Dies äußert sich oft, wenn der externe Dienst ausfällt, PyPI aber nicht. Die Leute sehen, dass PyPI funktioniert und andere Projekte funktionieren, aber dieses eine spezielle Projekt nicht. Sie erkennen oft nicht, wen sie kontaktieren müssen, um dies zu beheben, oder welche Schritte sie unternehmen können.
Obwohl das Problem, dass ein externer Wheel-Hosting-Dienst ausfällt, von dieser PEP nicht direkt gelöst wird, gibt es mehrere Schutzmaßnahmen, um die potenzielle Belastung für PyPI-Administratoren erheblich zu reduzieren.
Diese PEP schlägt daher vor, dass
- Das externe Hosten von Wheels ist nur für Pakete erlaubt, die von Organisationskonten besessen werden. Externes Hosten ist eine einstellung für die gesamte Organisation.
- Organisationskonten erhalten nicht automatisch die Fähigkeit, Wheels extern zu hosten; diese Funktion **MUSS** von PyPI-Administratoren nach eigenem Ermessen explizit aktiviert werden. Da dies keine häufige Anfrage sein wird, erwarten wir nicht, dass der Aufwand auch nur annähernd so belastend ist wie die PEP 541-Lösungen, Anfragen zur Kontowiederherstellung oder sogar Anfragen zur Erhöhung der Datei-/Projektgröße. Anfragen zum externen Hosten werden auf die gleiche Weise behandelt wie diese Anfragen, d. h. über den PyPI GitHub Support Tracker.
- Organisationskonten, die externes Wheel-Hosting anfordern, **MÜSSEN** ihre eigene Support-Kontakt-URI registrieren, sei es eine
mailto-URI für eine Kontaktadresse oder die URL zum Support-Tracker der Organisation. Eine solche Kontakt-URI ist für Organisationen optional, die sich nicht für externes Wheel-File-Hosting entscheiden.
In Kombination mit dem Schlüssel owner in der Datei EXTERNAL-HOSTING.json ermöglicht dies, dass Installer-Tools bei Downloadfehlern eindeutig von den PyPI-Support-Administratoren direkt an die Support-Administratoren der Organisation weitergeleitet werden können.
Obwohl die genauen Mechanismen zum Speichern und Abrufen dieser organisationsspezifischen Support-URL separat definiert werden, nehmen wir zum Beispiel an, dass ein Paket foo seine Wheel-Dateien extern auf https://foo.example.com <https://foo.example.com> hostet und dieser Host nicht mehr erreichbar wird. Wenn ein Installer-Tool versucht, das Wheel des Pakets foo herunterzuladen und zu installieren, schlägt der Download-Schritt fehl. Der Installer wäre dann in der Lage, PyPI abzufragen, um dem Endbenutzer eine nützliche Fehlermeldung anzuzeigen.
- Der Installer lädt die
.rim-Datei herunter und liest den Schlüsselowneraus der DateiEXTERNAL-HOSTING.jsoninnerhalb des.rim-Zip-Archivs. - Der Installer fragt PyPI nach der Support-URI für den Organisationsbesitzer des extern gehosteten Wheels.
- Daraufhin würde eine informative Fehlermeldung angezeigt, z. B.:Die extern gehostete Wheel-Datei
foo-....whlkonnte nicht heruntergeladen werden. Bitte wenden Sie sich zur Hilfe an support@foo.example.com. Melden Sie dies nicht den PyPI-Administratoren.
Demontage von Wheels
Es ist im Allgemeinen sehr einfach, aus einer vorhandenen .whl-Datei eine .rim-Datei zu erstellen. Dies könnte effizient von einem PEP 518 Build-Backend mit einer zusätzlichen Kommandozeilenoption oder einem separaten Werkzeug erfolgen, das eine .whl-Datei als Eingabe nimmt und die zugehörige .rim-Datei erstellt. Um die Analogie zu vervollständigen, wird der Vorgang der Umwandlung eines .whl in ein .rim als „Dismounting“ (Demontage) bezeichnet. Die Schritte, die ein solches Werkzeug ausführen würde, sind:
- Akzeptieren der Quell-
.whl-Datei, des Organisationsbesitzers des Pakets, der URL, unter der das.whlgehostet wird, und der Support-URI zur Meldung von Download-Problemen als Eingabe. Diese könnten tatsächlich in derpyproject.toml-Datei erfasst werden, aber diese Spezifikation liegt außerhalb des Umfangs dieser PEP. - Entpacken Sie die
.whlund erstellen Sie das.rim-Zip-Archiv. - Lassen Sie aus der
.rim-Datei jeden Pfad in der.whlweg, der **NICHT** im Verzeichnis.dist-infoverwurzelt ist. - Berechnen Sie den Hash der Quell-
.whl-Datei. - Fügen Sie die Datei
EXTERNAL-HOSTING.jsonmit den oben beschriebenen JSON-Schlüsseln und -Werten zum.rim-Archiv hinzu.
Änderungen an Werkzeugen
Theoretisch sollten Installer-Tools keine Änderungen benötigen, da sie, wenn sie das herunterzuladende und zu installierende Wheel identifiziert haben, einfach die Download-URLs konsultieren, die von PyPIs Simple API zurückgegeben werden. In der Praxis können Tools wie pip und uv jedoch eingeschränkte Listen von Hosts haben, von denen sie Downloads zulassen, wie z. B. die eigene Domäne pythonhosted.org von PyPI.
In diesem Fall müssen solche Tools diese Einschränkungen lockern, aber die genaue Richtlinie dafür überlässt sich den Installer-Tools selbst. Beliebige Ansätze können implementiert werden, wie z. B. das Herunterladen der .rim-Datei und die Überprüfung der Metadaten in EXTERNAL-HOSTING.json, oder einfach das Vertrauen in externe Downloads für jedes Wheel mit einem übereinstimmenden Prüfsumme. Sie könnten auch PyPI nach dem Organisationsbesitzer und der Support-URI des Projekts abfragen, bevor sie dem Download vertrauen. Sie könnten den Benutzer warnen, wenn extern gehostete Wheel-Dateien angetroffen werden, und/oder die Verwendung einer Kommandozeilenoption zum Aktivieren zusätzlicher Download-Hosts erfordern. Jede dieser Überprüfungsrichtlinien könnte in Konfigurationsdateien gewählt werden.
Installer-Tools sollten wahrscheinlich auch bessere Fehlermeldungen liefern, wenn extern gehostete Wheels nicht heruntergeladen werden können, z. B. weil ein Host nicht erreichbar ist. Wie oben beschrieben, könnten solche Tools genügend Metadaten von PyPI abfragen, um klare und eindeutige Fehlermeldungen zu liefern, die Benutzer auf die externe Hosting-Support-E-Mail-Adresse oder den Issue-Tracker des Pakets verweisen.
Beschränkungen für externe Hosting-Dienste
Die folgenden Einschränkungen führen zu zuverlässigen und kompatiblen externen Wheel-Hosting-Diensten
- Externe Wheels **MÜSSEN** über HTTPS bedient werden, mit einem Zertifikat, das von Mozillas Stammzertifikatsspeicher signiert ist. Dies gewährleistet die Kompatibilität mit pip und uv. Zum Zeitpunkt der Erstellung verwendet
pip24.2 auf Python 3.10 oder neuer den Systemzertifikatsspeicher zusätzlich zum Mozilla-Speicher, der vom Drittanbieter-Paket certifi bereitgestellt wird.uvverwendet den Mozilla-Speicher, der von der webpki-roots-Kiste bereitgestellt wird, jedoch nicht den System-Speicher, es sei denn, das Flag--native-tlswird verwendet [1]. *Die PyPI-Administratoren können diese Anforderung in Zukunft ändern, aber die Kompatibilität mit gängigen Installern wird nicht beeinträchtigt.* - Externe Wheel-Hosts **SOLLTEN** ein Content Delivery Network (CDN) verwenden, genau wie PyPI es tut.
- Externe Wheel-Hosts **MÜSSEN** sich zu einer stabilen URL für alle von ihnen gehosteten Wheels verpflichten.
- Extern gehostete Wheels **DÜRFEN NICHT** von einem externen Wheel-Host entfernt werden, es sei denn, die entsprechende
.rim-Datei wurde zuvor von PyPI gelöscht, und **DÜRFEN NICHT** externe Wheels für "yanked" Releases entfernen. - Externe Wheel-Hosts **MÜSSEN** HTTP Range Requests unterstützen.
- Externe Wheel-Hosts **SOLLTEN** das HTTP/2-Protokoll unterstützen.
Sicherheit
Mehrere Faktoren, wie in diesem Vorschlag beschrieben, sollten Sicherheitsbedenken bei extern gehosteten Wheels mindern, wie z. B.:
- Wheel-Datei-Prüfsummen **MÜSSEN** in
.rim-Dateien enthalten sein und können nach dem Hochladen nicht mehr geändert werden. Da die auf PyPI gespeicherte Prüfsumme unveränderlich und erforderlich ist, ist es nicht möglich, eine externe Wheel-Datei zu fälschen, selbst wenn die besitzende Organisation die Kontrolle über ihre Hosting-Domäne verliert. - Extern gehostete Wheels **MÜSSEN** über HTTPS bedient werden.
- Um extern gehostete Wheels bedienen zu können, **MÜSSEN** Organisationen von den PyPI-Administratoren genehmigt werden.
Wenn Benutzer Malware oder Schwachstellen in PyPI-gehosteten Projekten identifizieren, können sie dies nun über die Meldefunktionen für Malware auf PyPI melden, wie auch in diesem Blogbeitrag beschrieben. Derselbe Prozess kann zur Meldung von Sicherheitsproblemen in extern gehosteten Wheels verwendet werden, und derselbe Behebungsansatz sollte verwendet werden. Darüber hinaus, da Organisationen mit aktiviertem externem Hosting eine Support-Kontakt-URI bereitstellen **MÜSSEN**, kann diese URI in einigen Fällen verwendet werden, um das Sicherheitsproblem an die hostende Organisation zu melden. Eine solche organisationsweite Meldung ist für Malware nicht sinnvoll, könnte aber tatsächlich ein sehr nützlicher Weg sein, um Sicherheitslücken in extern gehosteten Wheels zu melden.
Abgelehnte Ideen
Mehrere Ideen wurden in Betracht gezogen und abgelehnt.
- Anforderung digitaler Signaturen auf extern gehosteten Wheel-Dateien, entweder zusätzlich zu oder anstelle von Hashes. Wir halten dies für unnötig, da die Prüfsummenanforderung ausreichen sollte, um zu validieren, dass die Metadaten auf PyPI für ein Wheel exakt mit dem heruntergeladenen Wheel übereinstimmen. Die zusätzliche Komplexität der Schlüsselverwaltung überwiegt jeden zusätzlichen Nutzen, den solche digitalen Signaturen mit sich bringen könnten.
- Hash-Überprüfung bei Uploads von
.rim-Dateien. PyPI *könnte* überprüfen, ob der Hash in der hochgeladenen.rim-Datei mit dem extern gehosteten Wheel übereinstimmt, bevor es den Upload akzeptiert. Dies erfordert jedoch das Herunterladen des externen Wheels und die Durchführung der Prüfsumme, was auch impliziert, dass der Upload der.rim-Datei erst akzeptiert werden kann, nachdem diese externe.whl-Datei heruntergeladen und verifiziert wurde. Dies erhöht die PyPI-Bandbreite und verlangsamt die Upload-Abfrage, obwohl PEP 694 Entwurfs-Uploads diese Bedenken potenziell mildern könnten. Dennoch ist der Nutzen wahrscheinlich nicht die zusätzliche Komplexität wert. - Regelmäßige Überprüfung der Download-URLs durch den Index. PyPI könnte versuchen, periodisch sicherzustellen, dass der externe Wheel-Host oder die externe
.whl-Datei selbst noch verfügbar ist, z. B. über eine HTTP HEAD-Anfrage. Dies ist wahrscheinlich übertrieben und ohne Angabe der Dateiprüfsumme in der Antwort [2], bietet möglicherweise keinen großen zusätzlichen Nutzen. - Diese PEP könnte es einer Organisation ermöglichen, alternative Download-Hosts bereitzustellen, sodass ein sekundärer verfügbar ist, falls der primäre ausfällt. Wir glauben, dass DNS-basierte Replikation eine weitaus bessere, bekannte Technik ist und wahrscheinlich ohnehin viel widerstandsfähiger ist.
.rim-Datei-Ersetzung. Während.whl-Dateien bestehende.rim-Dateien ersetzen dürfen, solange a) die.rim-Datei nicht gelöscht oder zurückgezogen wurde, b) die Prüfsummen übereinstimmen, erlauben wir nicht das Ersetzen von.whl-Dateien durch.rim-Dateien, noch erlauben wir, dass eine.rim-Datei eine bestehende.rim-Datei überschreibt. Letzteres könnte eine Technik sein, um die Hosting-URL für ein extern gehostetes.whlzu ändern; wir halten dies jedoch nicht für eine gute Idee. Es gibt andere Möglichkeiten, eine externe Host-URL zu "reparieren", wie oben beschrieben, und wir möchten keine Massen-Neu-Uploads bestehender.rim-Dateien fördern.
Fußnoten
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-0759.rst
Zuletzt geändert: 2025-01-31 18:51:56 GMT