Following system colour scheme Selected dark colour scheme Selected light colour scheme

Python Enhancement Proposals

PEP 740 – Index-Unterstützung für digitale Bestätigungen

Autor:
William Woodruff <william at yossarian.net>, Facundo Tuesca <facundo.tuesca at trailofbits.com>, Dustin Ingram <di at python.org>
Sponsor:
Donald Stufft <donald at stufft.io>
PEP-Delegate:
Donald Stufft <donald at stufft.io>
Discussions-To:
Discourse thread
Status:
Final
Typ:
Standards Track
Thema:
Packaging
Erstellt:
08-Jan-2024
Post-History:
02-Jan-2024, 29-Jan-2024
Resolution:
17-Jul-2024

Inhaltsverzeichnis

Wichtig

Diese PEP ist ein historisches Dokument. Die aktuelle, kanonische Spezifikation finden Sie unter Index-Hosting von Bestätigungen, die auf der PyPA-Specs-Seite gepflegt wird.

×

Siehe den PyPA-Spezifikations-Update-Prozess, um Änderungen vorzuschlagen.

Wichtig

Diese PEP ist ein historisches Dokument. Die aktuelle, kanonische Dokumentation finden Sie nun unter PyPI - Digitale Bestätigungen.

×

Siehe PEP 1, um Änderungen vorzuschlagen.

Zusammenfassung

Diese PEP schlägt eine Sammlung von Änderungen vor, die sich auf den Upload und die Verteilung digital signierter Bestätigungen und Metadaten zu deren Überprüfung auf einem Python-Paket-Repository wie PyPI beziehen.

Diese Änderungen haben zwei Unterkomponenten:

Diese PEP gibt keine Policy-Empfehlung bezüglich obligatorischer digitaler Bestätigungen bei Release-Uploads oder deren anschließender Verifizierung durch installierende Clients wie pip ab.

Rationale und Motivation

Der Wunsch nach digitalen Signaturen auf Python-Paketen wurde wiederholt sowohl von Paketbetreuern als auch von nachgelagerten Benutzern geäußert.

  • Betreuer möchten die Integrität und Authentizität ihrer Paket-Uploads nachweisen;
  • Einzelne nachgelagerte Benutzer möchten die Paketintegrität und -authentizität überprüfen, ohne zusätzlichem Vertrauen in die Ehrlichkeit ihres Index.
  • "Massen"-nachgelagerte Benutzer (wie Betriebssystem-Distributionen) möchten ähnliche Überprüfungen durchführen und möglicherweise ihre eigenen nachgelagerten Paket-Ökosysteme neu darstellen oder gegensignieren.

Dieser Vorschlag zielt darauf ab, jeden der oben genannten Anwendungsfälle zu berücksichtigen.

Zusätzlich identifiziert dieser Vorschlag die folgenden Motivationen:

  • Überprüfbare Herkunft für Python-Paket-Distributionen: Viele Python-Pakete enthalten derzeit *unauthentifizierte* Herkunftsmetadaten, wie z. B. URLs für Quell-Hosts. Ein kryptografisches Bestätigungsformat könnte starke *authentifizierte* Verbindungen zwischen diesen Paketen und ihren Quell-Hosts ermöglichen, wodurch sowohl der Index als auch nachgelagerte Benutzer kryptografisch verifizieren können, dass ein Paket von seinem beanspruchten Quell-Repository stammt.
  • Erhöhung der Angreiferanforderungen: Ein Angreifer, der ein Python-Paket übernehmen möchte, kann anhand der Dimensionen *Sophistication* (anfängliche bis hochentwickelte) und *Targeting* (opportunistisch bis gezielt) beschrieben werden.

    Digitale Bestätigungen stellen zusätzliche Anforderungen an die Sophistication: Der Angreifer muss ausreichend raffiniert sein, um Zugriff auf private Signaturmaterialien (oder Signaturidentitäten) zu erhalten.

  • Index-Überprüfbarkeit: Im Status Quo ist die einzige vom Index bereitgestellte Bestätigung eine optionale PGP-Signatur pro Release-Datei (siehe PGP-Signaturen). Diese Signaturen werden vom Index nicht auf Korrektheit oder Gültigkeit geprüft (und können auch nicht geprüft werden), da der Index keinen Mechanismus zur Identifizierung des richtigen öffentlichen Schlüssels für die Signatur hat. Diese PEP überwindet diese Einschränkung, indem sie sicherstellt, dass Herkunftsobjekte alle Metadaten enthalten, die der Index zur Überprüfung der Gültigkeit einer Bestätigung benötigt.

Diese PEP schlägt ein generisches Bestätigungsformat vor, das eine Bestätigungserklärung für die Signaturerstellung enthält, mit der Erwartung, dass Indexanbieter das Format mit einer geeigneten Identitätsquelle zur Signaturprüfung annehmen, wie z. B. Trusted Publishing.

Designüberlegungen

Diese PEP identifiziert die folgenden Design-Erwägungen bei der Bewertung sowohl ihrer eigenen vorgeschlagenen Änderungen als auch früherer Arbeiten in denselben oder angrenzenden Bereichen der Python-Paketierung:

  1. Index-Zugänglichkeit: Digitale Bestätigungen für Python-Pakete sind idealerweise direkt aus dem Index selbst als "abgelöste" Ressourcen abrufbar.

    Dies vereinfacht einige Kompatibilitätsprobleme (indem die Notwendigkeit, die Distributionsformate selbst zu ändern, vermieden wird) und vereinfacht auch das Verhalten potenzieller installierender Clients (indem ihnen ermöglicht wird, jede Bestätigung vor dem entsprechenden Paket abzurufen, ohne Entpacken-Streaming zu benötigen).

  2. Verifizierung durch den Index selbst: Zusätzlich zur Ermöglichung der Verifizierung durch installierende Clients ist jede digitale Bestätigung *idealerweise* in irgendeiner Form vom Index selbst verifizierbar.

    Dies erhöht sowohl die Gesamtqualität der an den Index hochgeladenen Bestätigungen (z. B. verhindert es, dass Benutzer versehentlich falsche oder ungültige Bestätigungen hochladen) als auch ermöglicht es UI- und UX-Verbesserungen auf dem Index selbst (wie eine "Herkunfts"-Ansicht für jedes hochgeladene Paket).

  3. Allgemeine Anwendbarkeit: Digitale Bestätigungen sollten für *jedes und jedes* Paket, das an den Index hochgeladen wird, unabhängig von seinem Format (sdist oder wheel) oder seinem internen Inhalt anwendbar sein.
  4. Metadatenunterstützung: Diese PEP bezieht sich auf "digitale Bestätigungen" und nicht nur auf "digitale Signaturen", um die ideale Präsenz zusätzlicher Metadaten innerhalb der kryptografischen Hülle zu betonen.

    Um beispielsweise die Domain-Trennung zwischen dem Namen einer Distribution und ihrem Inhalt zu verhindern, verwendet diese PEP "Statements" aus dem in-toto Projekt, um den Inhalt der Distribution (über den SHA-256-Digest) an ihren Dateinamen zu binden.

Vorangegangene Arbeiten

PGP-Signaturen

PyPI und andere Indizes haben historisch PGP-Signaturen auf hochgeladenen Distributionen unterstützt. Diese konnten während des Uploads bereitgestellt und von installierenden Clients über das Attribut data-gpg-sig in der PEP 503 API, den Schlüssel gpg-sig in der PEP 691 API oder über eine angrenzende URL mit der Endung .asc abgerufen werden.

PGP-Signatur-Uploads sind auf PyPI seit Mai 2023 deaktiviert, nachdem eine Untersuchung ergab, dass die Mehrheit der Signaturen (die selbst einen winzigen Prozentsatz der Gesamt-Uploads ausmachten) keinem öffentlichen Schlüssel zugeordnet oder anderweitig sinnvoll verifiziert werden konnte (siehe eine Untersuchung).

In ihrer früher auf PyPI unterstützten Form erfüllten PGP-Signaturen die Überlegungen (1) und (3) oben, aber nicht (2) (aufgrund der Notwendigkeit von externen Key-Servern und Key-Verteilung) oder (4) (da PGP-Signaturen typischerweise nur über eine Eingabedatei erstellt wurden, ohne zugehörige signierte Metadaten).

Wheel-Signaturen

PEP 427 (und sein lebendes PyPA-Gegenstück) spezifizieren das Wheel-Format.

Dieses Format enthält Vorkehrungen für digitale Signaturen, die direkt in das Wheel eingebettet sind, entweder im JWS- oder S/MIME-Format. Diese Signaturen werden über eine PEP 376 RECORD erstellt, die modifiziert wurde, um einen kryptografischen Digest für jede im Wheel aufgezeichnete Datei einzuschließen.

Obwohl Wheel-Signaturen vollständig spezifiziert sind, scheinen sie nicht weit verbreitet zu sein; die offiziellen Wheel-Tools haben die Unterstützung für Signaturerstellung und -prüfung in 0.32.0 (veröffentlicht 2018) als veraltet erklärt (in 0.32.0).

Darüber hinaus erfüllen Wheel-Signaturen keine der oben genannten Überlegungen (aufgrund der "angehängten" Natur der Signaturen, der fehlenden Verifizierbarkeit im Index selbst und der Unterstützung nur für Wheels).

Spezifikation

Änderungen am Upload-Endpunkt

Die aktuelle Upload-API ist nicht standardisiert. Wir schlagen jedoch die folgenden Änderungen vor:

  • Zusätzlich zu den aktuellen Top-Level-Feldern content und gpg_signature soll der Index ein zusätzliches Multipart-Formularfeld namens attestations akzeptieren.
  • Das neue Feld attestations soll ein JSON-Array sein.
  • Das Array attestations soll ein oder mehrere Elemente enthalten, von denen jedes ein JSON-Objekt darstellt, das eine einzelne Bestätigung enthält.
  • Jedes Bestätigungsobjekt MUSS vom Index verifizierbar sein. Wenn der Index eine Bestätigung in attestations nicht verifizieren kann, MUSS der Upload abgelehnt werden. Das Format von Bestätigungsobjekten ist unter Bestätigungsobjekte definiert und der Prozess zur Verifizierung von Bestätigungen ist unter Bestätigungsprüfung definiert.

Indexänderungen

Einfacher Index

Die folgenden Änderungen werden an der Simple Repository API vorgenommen:

  • Wenn eine hochgeladene Datei eine oder mehrere Bestätigungen hat, kann der Index eine Herkunftsdatei bereitstellen, die Bestätigungen enthält, die mit einer gegebenen Distribution verknüpft sind. Das Format der Herkunftsdatei soll ein JSON-kodifiziertes Herkunftsobjekt sein, das die Bestätigungen der Datei enthält.

    Der Speicherort der Herkunftsdatei wird vom Index über das Attribut data-provenance signalisiert.

  • Wenn eine Herkunftsdatei vorhanden ist, kann der Index ein Attribut data-provenance in seinem Datei-Link enthalten. Der Wert des Attributs data-provenance soll eine vollqualifizierte URL sein, die signalisiert, dass die Herkunft der Datei unter dieser URL zu finden ist. Diese URL muss einen sicheren Ursprung darstellen.

    Die folgende Tabelle enthält Beispiele für Release-Dateien-URLs, data-provenance-Werte und ihre resultierenden Herkunftsdateien-URLs.

    Dateiname data-provenance Herkunfts-URL
    https://example.com/sampleproject-1.2.3.tar.gz https://example.com/sampleproject-1.2.3.tar.gz.provenance https://example.com/sampleproject-1.2.3.tar.gz.provenance
    https://example.com/sampleproject-1.2.3.tar.gz https://other.example.com/sampleproject-1.2.3.tar.gz/provenance https://other.example.com/sampleproject-1.2.3.tar.gz/provenance
    https://example.com/sampleproject-1.2.3.tar.gz ../relative (ungültig: keine vollqualifizierte URL)
    https://example.com/sampleproject-1.2.3.tar.gz http://unencrypted.example.com/provenance (ungültig: kein sicherer Ursprung)
  • Der Index kann die Herkunftsdatei modifizieren. Zum Beispiel kann der Index das Hinzufügen zusätzlicher Bestätigungen und Verifizierungsmaterialien erlauben, wie z. B. Bestätigungen von Drittanbieter-Prüfern oder anderen Diensten.

    Siehe Änderungen an Herkunftsobjekten für eine zusätzliche Diskussion von Gründen, warum sich die Herkunft einer Datei ändern kann.

JSON-basierte einfache API

Die folgenden Änderungen werden an der JSON Simple API vorgenommen:

  • Wenn eine hochgeladene Datei eine oder mehrere Bestätigungen hat, kann der Index einen Schlüssel provenance im Wörterbuch file für diese Datei einfügen.

    Der Wert des Schlüssels provenance soll entweder ein JSON-String oder null sein. Wenn provenance nicht null ist, soll es eine URL zur zugehörigen Herkunftsdatei sein.

    Siehe Anhang 3: Erwägungen zur Größe der einfachen JSON-API für eine Erklärung der technischen Entscheidung, den SHA-256-Digest in die JSON-API einzubetten, anstatt des gesamten Herkunftsobjekts.

Diese Änderungen erfordern eine Versionsänderung der JSON-API:

  • Die api-version soll Version 1.3 oder neuer angeben.

Bestätigungsobjekte

Ein Bestätigungsobjekt ist ein JSON-Objekt mit mehreren erforderlichen Schlüsseln; Anwendungen oder Unterzeichner können zusätzliche Schlüssel einfügen, solange alle explizit aufgeführten Schlüssel vorhanden sind. Das erforderliche Layout eines Bestätigungsobjekts ist unten als Pseudocode angegeben.

@dataclass
class Attestation:
    version: Literal[1]
    """
    The attestation object's version, which is always 1.
    """

    verification_material: VerificationMaterial
    """
    Cryptographic materials used to verify `envelope`.
    """

    envelope: Envelope
    """
    The enveloped attestation statement and signature.
    """


@dataclass
class Envelope:
    statement: bytes
    """
    The attestation statement.

    This is represented as opaque bytes on the wire (encoded as base64),
    but it MUST be an JSON in-toto v1 Statement.
    """

    signature: bytes
    """
    A signature for the above statement, encoded as base64.
    """

@dataclass
class VerificationMaterial:
    certificate: str
    """
    The signing certificate, as `base64(DER(cert))`.
    """

    transparency_entries: list[object]
    """
    One or more transparency log entries for this attestation's signature
    and certificate.
    """

Ein vollständiges Datenmodell für jedes Objekt in transparency_entries ist in Anhang 2: Datenmodelle für Transparency Log Entries enthalten. Bestätigungsobjekte sollten ein oder mehrere Transparency Log Entries enthalten und können zusätzliche Schlüssel für andere Quellen signierter Zeit enthalten (wie eine RFC 3161 Time Stamping Authority oder einen Roughtime Server).

Bestätigungsobjekte sind versioniert; diese PEP spezifiziert Version 1. Jede Version ist an eine einzige kryptografische Suite gebunden, um unnötige kryptografische Agilität zu minimieren. In Version 1 ist die Suite wie folgt:

  • Zertifikate werden als X.509-Zertifikate spezifiziert und entsprechen dem Profil in RFC 5280.
  • Der Nachrichten-Signatur-Algorithmus ist ECDSA, mit der P-256-Kurve für öffentliche Schlüssel und SHA-256 als kryptografische Digest-Funktion.

Zukünftige PEPs können diese Suite (und die Gesamtform des Bestätigungsobjekts) durch Auswahl einer neuen Versionsnummer ändern.

Generierung von Bestätigungserklärungen und Signaturen

Die *Bestätigungserklärung* ist die eigentliche Behauptung, die innerhalb des Bestätigungsobjekts kryptografisch signiert wird (d. h. envelope.statement).

Die Bestätigungserklärung wird als v1 in-toto Statement-Objekt in JSON-Form kodiert. Bei Serialisierung wird die Erklärung als undurchsichtiger Binärblob behandelt, um die Notwendigkeit der Kanonisierung zu vermeiden. Ein Beispiel für eine JSON-kodierte Erklärung finden Sie in Anhang 4: Beispiel für eine Bestätigungserklärung.

Zusätzlich zur Tatsache, dass es sich um ein v1 in-toto Statement handelt, wird die Bestätigungserklärung auf folgende Weise eingeschränkt:

  • Das in-toto subject darf nur ein einzelnes Subjekt enthalten.
  • subject[0].name ist der Dateiname der Distribution, der ein gültiger Dateiname für eine Source Distribution oder Wheel Distribution sein muss.
  • subject[0].digest muss einen SHA-256-Digest enthalten. Andere Digests können vorhanden sein. Die Digests müssen als hexadezimale Zeichenketten dargestellt werden.
  • Die folgenden predicateType-Werte werden unterstützt:

Die Signatur über diese Erklärung wird mit dem v1 DSSE-Signaturprotokoll erstellt, mit einem PAYLOAD_TYPE von application/vnd.in-toto+json und einem PAYLOAD_BODY der obigen JSON-kodierten Erklärung. Kein anderer PAYLOAD_TYPE ist zulässig.

Herkunftsobjekte

Der Index stellt hochgeladene Bestätigungen zusammen mit Metadaten, die bei deren Überprüfung helfen können, in Form von JSON-serialisierten Objekten bereit.

Diese *Herkunftsobjekte* sind über die Simple Index- und die JSON-basierte Simple API wie oben beschrieben verfügbar und haben das folgende Layout:

{
    "version": 1,
    "attestation_bundles": [
      {
        "publisher": {
          "kind": "important-ci-service",
          "claims": {},
          "vendor-property": "foo",
          "another-property": 123
        },
        "attestations": [
          { /* attestation 1 ... */ },
          { /* attestation 2 ... */ }
        ]
      }
    ]
}

oder, als Pseudocode:

@dataclass
class Publisher:
    kind: string
    """
    The kind of Trusted Publisher.
    """

    claims: object | None
    """
    Any context-specific claims retained by the index during Trusted Publisher
    authentication.
    """

    _rest: object
    """
    Each publisher object is open-ended, meaning that it MAY contain additional
    fields beyond the ones specified explicitly above. This field signals that,
    but is not itself present.
    """

@dataclass
class AttestationBundle:
    publisher: Publisher
    """
    The publisher associated with this set of attestations.
    """

    attestations: list[Attestation]
    """
    The set of attestations included in this bundle.
    """

@dataclass
class Provenance:
    version: Literal[1]
    """
    The provenance object's version, which is always 1.
    """

    attestation_bundles: list[AttestationBundle]
    """
    One or more attestation "bundles".
    """
  • version ist 1. Wie Bestätigungsobjekte sind auch Herkunftsobjekte versioniert, und diese PEP definiert nur Version 1.
  • attestation_bundles ist ein erforderliches JSON-Array, das ein oder mehrere "Bundles" von Bestätigungen enthält. Jedes Bundle entspricht einer Signaturidentität (wie z. B. einer Trusted Publishing-Identität) und enthält ein oder mehrere Bestätigungsobjekte.

    Wie im Publisher-Modell angegeben, ist jedes AttestationBundle.publisher-Objekt spezifisch für seinen Trusted Publisher, muss aber mindestens Folgendes enthalten:

    • Einen Schlüssel kind, der eine JSON-Zeichenkette sein muss, die die Art des Trusted Publishers eindeutig identifiziert.
    • Einen Schlüssel claims, der ein JSON-Objekt sein muss, das alle kontextspezifischen Ansprüche enthält, die der Index während der Authentifizierung des Trusted Publishers gespeichert hat.

    Alle anderen Schlüssel im Publisher-Objekt sind vom Publisher spezifisch. Ein vollständiges illustratives Beispiel eines Publisher-Objekts ist in Anhang 1: Beispiel für die Darstellung vertrauenswürdiger Publisher enthalten.

    Jedes Array von Bestätigungsobjekten ist eine Obermenge des Arrays attestations, das beim Upload über das Feld attestations bereitgestellt wurde, wie in Änderungen am Upload-Endpunkt und Änderungen an Herkunftsobjekten beschrieben.

Änderungen an Herkunftsobjekten

Herkunftsobjekte sind nicht unveränderlich und können sich im Laufe der Zeit ändern. Gründe für Änderungen am Herkunftsobjekt umfassen, sind aber nicht beschränkt auf:

  • Hinzufügen neuer Bestätigungen für eine bereits vorhandene Signaturidentität: Der Index kann wählen, zusätzliche Bestätigungen von bereits vorhandenen Signaturidentitäten zuzulassen, wie z. B. neuere Bestätigungsversionen für bereits hochgeladene Dateien.
  • Hinzufügen neuer Signaturidentitäten und zugehöriger Bestätigungen: Der Index kann wählen, Bestätigungen von anderen Quellen als dem Uploader der Datei zu unterstützen, wie z. B. Drittanbieter-Prüfer oder den Index selbst. Diese Bestätigungen können asynchron durchgeführt werden, was erfordert, dass der Index sie nachträglich in das Herkunftsobjekt einfügt.

Bestätigungsprüfung

Die Verifizierung eines Bestätigungsobjekts gegen eine Distributionsdatei erfordert die Verifizierung jeder der folgenden Elemente:

  • version ist 1. Der Verifier muss jede andere Version ablehnen.
  • verification_material.certificate ist ein gültiges Signaturzertifikat, wie es von einer *a priori* vertrauenswürdigen Autorität ausgestellt wurde (wie z. B. einer Root of Trust, die bereits innerhalb des verifizierenden Clients vorhanden ist).
  • verification_material.certificate identifiziert ein geeignetes Signatursubjekt, wie z. B. die Maschinenidentität des Trusted Publishers, der das Paket veröffentlicht hat.
  • envelope.statement ist ein gültiges in-toto v1 Statement, mit einem Subjekt und Digest, die mit dem Dateinamen und Inhalt der Distribution übereinstimmen müssen. Für den Dateinamen der Distribution muss die Übereinstimmung durch Parsen mit dem entsprechenden Format für Source Distribution- oder Wheel Distribution-Dateinamen erfolgen, da das Subjekt der Erklärung gleichwertig, aber normalisiert sein kann.
  • envelope.signature ist eine gültige Signatur für envelope.statement, die zu verification_material.certificate passt, wie sie über das v1 DSSE-Signaturprotokoll rekonstruiert wurde.

Zusätzlich zu den oben genannten erforderlichen Schritten kann ein Verifier zusätzlich verification_material.transparency_entries auf Policy-Basis überprüfen, z. B. indem er mindestens einen Transparency Log Entry oder eine Schwelle von Einträgen verlangt. Bei der Überprüfung von Transparenzeinträgen muss der Verifier bestätigen, dass die Aufnahmezeit für jeden Eintrag innerhalb des Gültigkeitszeitraums des Signaturzertifikats liegt.

Sicherheitsimplikationen

Diese PEP ist hauptsächlich "mechanischer" Natur; sie liefert Layouts für die Strukturierung und Bereitstellung von verifizierbaren digitalen Bestätigungen, ohne übergeordnete Sicherheitspolicies bezüglich der Bestätigungsgültigkeit, Schwellenwerte zwischen Bestätigungen und Ähnlichem zu spezifizieren.

Kryptografische Agilität in Bestätigungen

Algorithmus-Agilität ist eine häufige Quelle für ausnutzbare Schwachstellen in kryptografischen Schemata. Diese PEP schränkt die Algorithmus-Agilität auf zwei Arten ein:

  • Alle Algorithmen sind in einer einzigen Suite spezifiziert, anstatt einer geometrischen Sammlung von Parametern. Dies macht es beispielsweise unmöglich, dass ein Angreifer einen starken Signaturalgorithmus mit einer schwachen Hash-Funktion wählt und damit das gesamte Schema kompromittiert.
  • Bestätigungsobjekte sind versioniert und dürfen nur die für ihre Version spezifizierte algorithmische Suite enthalten. Wenn eine bestimmte Suite zukünftig als unsicher gilt, können Clients wählen, Bestätigungen, die diese Suite enthalten, pauschal abzulehnen oder einzuschränken.

Indexvertrauen

Diese PEP erhöht (oder verringert) das Vertrauen in den Index selbst nicht: Der Index wird immer noch effektiv als vertrauenswürdig angesehen, um unveränderte Paketdistributionen ehrlich zu liefern, da ein unehrlicher Index, der Paketdateien modifizieren könnte, auch Paketbestätigungen unehrlich modifizieren oder weglassen könnte. Infolgedessen ist die Annahme des Indexvertrauens dieser PEP gleichwertig mit der unausgesprochenen Annahme bei früheren Mechanismen wie PGP- und Wheel-Signaturen.

Diese PEP schließt zukünftige Index-Vertrauensmechanismen wie PEP 458 und/oder PEP 480 nicht aus oder schließt sie aus.

Empfehlungen

Diese PEP empfiehlt, erzwingt aber nicht, dass Bestätigungsobjekte eine oder mehrere verifizierbare Quellen für signierte Zeit enthalten, die den behaupteten Gültigkeitszeitraum des Signaturzertifikats bestätigen. Indizes, die diese PEP implementieren, können wählen, diese Anforderung strikt durchzusetzen.

Anhang 1: Beispiel für die Darstellung vertrauenswürdiger Publisher

Dieser Anhang bietet ein fiktives Beispiel für einen publisher-Schlüssel innerhalb einer einfachen JSON-API project.files[].provenance-Liste:

"publisher": {
    "kind": "GitHub",
    "claims": {
        "ref": "refs/tags/v1.0.0",
        "sha": "da39a3ee5e6b4b0d3255bfef95601890afd80709"
    },
    "repository_name": "HolyGrail",
    "repository_owner": "octocat",
    "repository_owner_id": "1",
    "workflow_filename": "publish.yml",
    "environment": null
}

Anhang 2: Datenmodelle für Transparency Log Entries

Dieser Anhang enthält Pseudocode-Datenmodelle für Transparency Log Entries in Bestätigungsobjekten. Jeder Transparency Log Entry dient als Quelle für signierte Aufnahmezeit und kann online oder offline verifiziert werden.

@dataclass
class TransparencyLogEntry:
    log_index: int
    """
    The global index of the log entry, used when querying the log.
    """

    log_id: str
    """
    An opaque, unique identifier for the log.
    """

    entry_kind: str
    """
    The kind (type) of log entry.
    """

    entry_version: str
    """
    The version of the log entry's submitted format.
    """

    integrated_time: int
    """
    The UNIX timestamp from the log from when the entry was persisted.
    """

    inclusion_proof: InclusionProof
    """
    The actual inclusion proof of the log entry.
    """


@dataclass
class InclusionProof:
    log_index: int
    """
    The index of the entry in the tree it was written to.
    """

    root_hash: str
    """
    The digest stored at the root of the Merkle tree at the time of proof
    generation.
    """

    tree_size: int
    """
    The size of the Merkle tree at the time of proof generation.
    """

    hashes: list[str]
    """
    A list of hashes required to complete the inclusion proof, sorted
    in order from leaf to root. The leaf and root hashes are not themselves
    included in this list; the root is supplied via `root_hash` and the client
    must calculate the leaf hash.
    """

    checkpoint: str
    """
    The signed tree head's signature, at the time of proof generation.
    """

    cosigned_checkpoints: list[str]
    """
    Cosigned checkpoints from zero or more log witnesses.
    """

Anhang 3: Erwägungen zur Größe der einfachen JSON-API

Ein früherer Entwurf dieser PEP erforderte das Einbetten jedes Herkunftsobjekts direkt in den entsprechenden Teil der JSON Simple API.

Die aktuelle Version dieser PEP bettet stattdessen den SHA-256-Digest des Herkunftsobjekts ein. Dies geschieht aus Gründen der Größe und des Netzwerkbandbreitenbedarfs:

  1. Wir schätzen die typische Größe eines Bestätigungsobjekts auf etwa 5,3 KB JSON.
  2. Wir schätzen konservativ, dass Indizes schließlich etwa 3 Bestätigungen pro Release-Datei hosten werden, was etwa 15,9 KB JSON pro kombiniertem Herkunftsobjekt entspricht.
  3. Stand Mai 2024 hat ein durchschnittliches Projekt auf PyPI etwa 21 Release-Dateien. Wir erwarten konservativ, dass dieser Durchschnitt im Laufe der Zeit steigen wird.
  4. Zusammengenommen implizieren diese Zahlen, dass ein typisches Projekt damit rechnen kann, zwischen 60 und 70 Bestätigungen oder etwa 339 KB zusätzlichen JSON in seinem "Projektdetail"-Endpunkt zu hosten.

Diese Zahlen sind in "pathologischen" Fällen, in denen Projekte Hunderte oder Tausende von Releases und/oder Dutzende von Dateien pro Release haben, deutlich schlechter.

Anhang 4: Beispiel für eine Bestätigungserklärung

Gegeben eine Source Distribution sampleproject-1.2.3.tar.gz mit einem SHA-256-Digest von e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855, ist die folgende eine angemessene in-toto Statement, als JSON-Objekt:

{
  "_type": "https://in-toto.io/Statement/v1",
  "subject": [
    {
      "name": "sampleproject-1.2.3.tar.gz",
      "digest": {"sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855"}
    }
  ],
  "predicateType": "https://some-arbitrary-predicate.example.com/v1",
  "predicate": {
    "something-else": "foo"
  }
}

Quelle: https://github.com/python/peps/blob/main/peps/pep-0740.rst

Letzte Änderung: 2024-12-03 18:16:41 GMT