Ga naar inhoud

Beveiliging en operationeel beheer van de backport-builder

Buildtool — GEEN runtime-afhankelijkheid. Deze pagina legt uit hoe je de buildpijplijn bedient en waar je op kunt vertrouwen. De beveiligingspositie van de Portable Document Format (PDF)-engine zelf wordt in de documentatie van de engine beschreven, niet hier.

De builder transformeert broncode die hij niet zelf schrijft en levert een distributie op waarop hij niet ontwikkelt. Uit die grens volgt het beveiligingsmodel. De vertrouwensgrens wordt gevormd door de broncode-checkout en de toolchain. Het opgeleverde artefact is alleen-lezen en machinaal gegenereerd. De licentiescheiding tussen publieke pakketten en Pro-pakketten ligt vast in code.

De builder gebruikt bronrepository’s en de vastgezette toolchain als invoer. Hij produceert een afgeleid artefact. Er gelden drie eigenschappen:

  • De gegenereerde distributie is alleen-lezen en machinaal gegenereerd. Deze wordt gepubliceerd als versietags, niet als branches in deze repository. Ontwikkeling, bugrapporten en functieverzoeken horen thuis in de oorspronkelijke nextpdf/*-bronrepository’s, nooit in de gegenereerde boom. Geverifieerd aan de hand van het waarschuwingsblok in de project-README.md en .github/workflows/build.yml (de release maakt vanaf nul een commit van de gegenereerde boom en tagt die).
  • Het bereik van het release-token is beperkt. secrets.BACKPORT_TRIGGER_TOKEN autoriseert het klonen van de bronrepository’s op de release-tag. Er wordt alleen naar verwezen in de stappen voor de broncode-checkout. Geverifieerd aan de hand van build.yml (GH_TOKEN-gebruik).
  • CI-runners worden bewust gescheiden. Vertrouwde events draaien op self-hosted PHP-runners; pull requests vanuit forks en Dependabot-runs worden uitgevoerd op door GitHub gehoste runners. Onvertrouwde code wordt nooit op de vertrouwde runnerpool uitgevoerd. Geverifieerd aan de hand van .github/workflows/0-ci.yml (de runs-on-voorwaarde).
  • De toolchain is vastgelegd in composer.json. Hij gebruikt Rector ^2.0, PHPStan ^2.1, PHPUnit ^13.0 en de symfony/polyfill-*-set. De builder heeft geen runtime-afhankelijkheid van NextPDF, dus een gecompromitteerd NextPDF-runtimepakket kan de builder niet bereiken. Geverifieerd aan de hand van composer.json.
  • Updates van afhankelijkheden zijn botgestuurd en bewaakt. Er zijn een Dependabot-configuratie en een auto-merge-workflow aanwezig. Dependabot-runs zijn vastgezet op door GitHub gehoste runners en doorlopen vóór het mergen nog steeds de volledige CI-controle (PHPStan, tests, dry-run). Geverifieerd aan de hand van .github/dependabot.yml en .github/workflows/0-ci.yml, 9-dependabot-auto-merge.yml.
  • De uitvoer bevat geen buildstatus. Het release-archief wordt gezipt met vendor/ en .git/ uitgesloten. Het gepubliceerde artefact bevat de broncode en het gegenereerde manifest, niet de eigen afhankelijkheidsboom van de builder. Geverifieerd aan de hand van build.yml (zip ... -x '*/vendor/*' '*/.git/*').
  • Statische analyse bewaakt de buildcode. composer analyse draait PHPStan op niveau 10 over rector/rules en scripts bij elke push en pull request naar een van beide permanente branches. Het draait vóór elke dry-run. Geverifieerd aan de hand van composer.json en 0-ci.yml.

Het buildscript controleert de uitvoer niet lokaal op syntaxis, omdat de buildhost een nieuwere PHP-versie draait dan het doel. De doorslaggevende controle staat in de release-workflow. Na de build schakelt de runner over naar de doelversie van PHP en draait php -l over output/src, waarbij de release mislukt bij elke parse- of fatale fout. Het artefact wordt daarna geïnstalleerd en getest over de validatiematrix — PHP 8.1 tot en met 8.4 voor de PHP 8.1-track, en PHP 7.4 en 8.0 voor de PHP 7.4-track. Een distributie die een doel-runtime zou afwijzen, bereikt geen release. Geverifieerd aan de hand van scripts/build.php (validateOutput()) en .github/workflows/build.yml (de syntaxiscontrole- en validate-*-jobs).

Dit is een garantie op basis van waargenomen gedrag, beperkt tot de runtimes die de pijplijn test. Het is geen conformiteitscertificering. Het doet geen uitspraak over de correctheid van het getransformeerde programma buiten de syntaxisacceptatie en de eigen testsuite van het project.

De twee gegenereerde pakketten hebben verschillende licenties; die zijn vastgelegd in scripts/adjust-composer.php:

PakketLicentieveldIngesteld door
nextpdf/backportApache-2.0generatePublicComposer()
nextpdf/backport-proproprietarygenerateProComposer()

De builder-repository zelf is Apache-2.0 (composer.jsonlicense). De CHANGELOG.md legt een eerdere herlicentiëring van LGPL-3.0-or-later naar Apache-2.0 vast. Versies die vóór die wijziging zijn gepubliceerd, blijven onder de oudere licentie vallen en blijven beschikbaar, terwijl elke nieuwe versie Apache-2.0 is. De Pro-distributie is proprietair, wordt alleen geproduceerd voor het PHP 8.1-doel en vereist phpseclib/phpseclib ^3.0. Geverifieerd aan de hand van CHANGELOG.md, composer.json en scripts/adjust-composer.php.

Wat de pijplijn garandeert, is beperkt tot wat de code afdwingt:

  • Stoppen bij de eerste fout. De build breekt af bij de eerste mislukkende fase met een benoemde fout. Een gedeeltelijke distributie wordt nooit vrijgegeven, omdat de release-jobs afhankelijk zijn van een geslaagde build en validatie. Geverifieerd aan de hand van scripts/build.php (step()) en de build.yml-job needs.
  • Geserialiseerde builds. De concurrency-groep backport-build met cancel-in-progress: false voorkomt dat twee bronreleases met elkaar wedijveren om dezelfde release-tag. Geverifieerd aan de hand van build.yml.
  • Reproduceerbare invoer. De pijplijn kloont elke bronrepository op de exacte release-tag vóór het bouwen. Geverifieerd aan de hand van build.yml (--branch "${TAG}").

Wat de pijplijn niet beweert:

  • Het certificeert geen conformiteit met standaarden, volledige PHP-versiecompatibiliteit of correctheid van het getransformeerde programma buiten de syntaxisacceptatie en de testsuite om.
  • De downgrade verwijdert de door de runtime afgedwongen onveranderlijkheid (het strippen van readonly). Code die erop vertrouwde dat de runtime een schrijfactie naar een readonly-eigenschap zou weigeren, verliest die bescherming in de gedowngradede uitvoer. Dit is een gedocumenteerde, opzettelijke afweging ten gunste van clone-with-veiligheid — zie /integrations/backport/troubleshooting/.

Beveiligingsproblemen in de builder volgen de SECURITY.md van de repository: meld ze via een GitHub Security Advisory of de beveiligingscontactpersoon, niet via een openbaar issue. Meld issues in de gegenereerde code bij de oorspronkelijke bronrepository’s, omdat de gegenereerde boom machinaal wordt geproduceerd en er niet op wordt ontwikkeld. Geverifieerd aan de hand van SECURITY.md en de project-README.md.

  • /integrations/backport/overview/ — wat de builder is en wat hij produceert.
  • /integrations/backport/production-usage/ — hoe je de release-pijplijn bedient.