バックポートビルダーのセキュリティと運用
これはビルドツールであり、ランタイム依存関係ではありません。このページでは、ビルドパイプラインの運用と信頼について説明します。PDF エンジン自体のセキュリティ姿勢については、このページではなくエンジン側のドキュメントで説明しています。
ビルダーは、自身が作成したものではないソースを変換し、自身が開発対象としていないディストリビューションを出力します。そのセキュリティモデルは、この前提から導かれます。信頼境界は、ソースのチェックアウトとツールチェーンです。出力されるアーティファクトは読み取り専用であり、機械的に生成されます。パブリックパッケージと Pro パッケージのライセンス分割は、コード内で固定されています。
ビルダーの入力は、ソースリポジトリと固定されたツールチェーンです。その出力は派生アーティファクトです。次の 3 つの性質が成り立ちます。
- 生成されるディストリビューションは読み取り専用であり、機械的に生成されます。 これはこのリポジトリのブランチとしてではなく、バージョンタグとして公開されます。開発、バグレポート、機能要望は、生成されたツリーではなく、元の
nextpdf/*ソースリポジトリに提出してください。プロジェクトのREADME.mdの注意ブロックと.github/workflows/build.ymlに対して検証済み(リリースは生成されたツリーを一から再生成してコミットおよびタグ付けします)。 - リリーストークンのスコープは狭く設定されています。
secrets.BACKPORT_TRIGGER_TOKENは、リリースタグの時点でソースリポジトリをクローンする操作を認可します。これはソースチェックアウトのステップでのみ参照されます。build.ymlに対して検証済み(GH_TOKENの使用箇所)。 - CI ランナーの分離は意図的です。 信頼されたイベントはセルフホストの PHP ランナーで実行され、フォークからのプルリクエストと Dependabot の実行は GitHub ホストのランナーに強制的に割り当てられます。信頼されていないコードが、信頼されたランナープールで実行されることはありません。
.github/workflows/0-ci.ymlに対して検証済み(runs-onの条件分岐)。
サプライチェーンの姿勢
「サプライチェーンの姿勢」という見出しのセクション- ツールチェーンは
composer.jsonで制約されています。 Rector^2.0、PHPStan^2.1、PHPUnit^13.0、およびsymfony/polyfill-*一式です。ビルダーは NextPDF のランタイム依存関係を持たないため、NextPDF ランタイムパッケージが侵害されてもビルダーには到達できません。composer.jsonに対して検証済み。 - 依存関係の更新はボット駆動でゲート制御されています。 Dependabot の設定と自動マージワークフローが存在します。Dependabot の実行は GitHub ホストのランナーに固定され、マージ前に完全な CI ゲート(PHPStan、テスト、ドライラン)を通過します。
.github/dependabot.ymlおよび.github/workflows/0-ci.yml、9-dependabot-auto-merge.ymlに対して検証済み。 - 出力はビルド状態を除外します。 リリースアーカイブは
vendor/と.git/を除外して圧縮されるため、公開されるアーティファクトにはビルダー自身の依存関係ツリーではなく、ソースと生成されたマニフェストが含まれます。build.ymlに対して検証済み(zip ... -x '*/vendor/*' '*/.git/*')。 - 静的解析がビルドコードをゲート制御します。
composer analyseは、いずれかの永続ブランチへのプッシュおよびプルリクエストのたびに、rector/rulesとscriptsに対してレベル 10 で PHPStan を実行します。これはいかなるドライランよりも前に実行されます。composer.jsonおよび0-ci.ymlに対して検証済み。
構文検証ゲート
「構文検証ゲート」という見出しのセクションビルドスクリプトは、出力の構文チェックをローカルでは行いません。その理由は、ビルドホストがターゲットよりも新しい PHP を実行しているためです。権威あるゲートはリリースワークフロー内にあります。ビルド後、ランナーはターゲットの PHP に切り替えて output/src 全体に対して php -l を実行し、パースエラーまたは致命的なエラーが 1 つでもあればリリースを失敗させます。その後、アーティファクトはインストールされ、検証マトリクス全体で実行されます。PHP 8.1 レーンでは PHP 8.1 から 8.4 まで、PHP 7.4 レーンでは PHP 7.4 と 8.0 です。ターゲットランタイムが拒否するようなディストリビューションは、リリースには到達しません。scripts/build.php(validateOutput())および .github/workflows/build.yml(構文チェックと validate-* ジョブ)に対して検証済み。
これは、パイプラインで実行されるランタイムに限定した、観測済みの動作に基づく保証です。適合性認証ではありません。構文の受理とプロジェクト自身のテストスイートを超えて、変換されたプログラムの正しさを主張するものではありません。
ライセンス分割
「ライセンス分割」という見出しのセクション生成される 2 つのパッケージには異なるライセンスが適用され、scripts/adjust-composer.php で固定されています。
| パッケージ | ライセンスフィールド | 設定箇所 |
|---|---|---|
nextpdf/backport | Apache-2.0 | generatePublicComposer() |
nextpdf/backport-pro | proprietary | generateProComposer() |
ビルダーリポジトリ自体は Apache-2.0 です(composer.jsonlicense)。その CHANGELOG.md には、LGPL-3.0-or-later から Apache-2.0 への過去の再ライセンスが記録されています。その変更より前に公開されたバージョンは引き続き旧ライセンスの下にあり、取得可能なまま維持されます。一方で、新しいバージョンはすべて Apache-2.0 です。Pro ディストリビューションはプロプライエタリであり、PHP 8.1 ターゲット向けにのみ生成され、phpseclib/phpseclib ^3.0 を必要とします。CHANGELOG.md、composer.json、および scripts/adjust-composer.php に対して検証済み。
運用上の保証とその限界
「運用上の保証とその限界」という見出しのセクションコードで強制される範囲に限り、パイプラインが保証する内容は次のとおりです。
- 最初の失敗で停止します。 ビルドは、最初に失敗したステージで名前付きのエラーとともに中止されます。リリースジョブはビルドと検証の成功に依存しているため、不完全なディストリビューションがリリースされることはありません。
scripts/build.php(step())およびbuild.ymlジョブのneedsに対して検証済み。 - ビルドは直列化されます。
cancel-in-progress: falseを指定したbackport-build並行実行グループにより、2 つのソースリリースが同じリリースタグを巡って競合することを防ぎます。build.ymlに対して検証済み。 - 入力は再現可能です。 パイプラインは、ビルド前にすべてのソースリポジトリを正確なリリースタグの時点でクローンします。
build.ymlに対して検証済み(--branch "${TAG}")。
主張していない内容は次のとおりです。
- 構文の受理とテストスイートを超えて、標準への準拠、完全な PHP バージョン互換性、変換されたプログラムの正しさを認証するものではありません。
- ダウングレードは、ランタイムによって強制される不変性を取り除きます(
readonlyの除去)。readonly プロパティへの書き込みをランタイムが拒否することに依存していたコードは、ダウングレードされた出力ではその防御を失います。これは clone-with の安全性のための、文書化された意図的なトレードオフです。/integrations/backport/troubleshooting/. を参照してください。
問題の報告
「問題の報告」という見出しのセクションビルダーのセキュリティ問題は、リポジトリの SECURITY.md に従います。公開 Issue ではなく、GitHub Security Advisory またはセキュリティ連絡先を通じて報告してください。生成された コードの問題は、元のソースリポジトリに報告してください。生成されたツリーは機械的に生成されたものであり、開発対象ではないためです。SECURITY.md およびプロジェクトの README.md に対して検証済み。
次のステップ
「次のステップ」という見出しのセクション- /integrations/backport/overview/ — ビルダーとは何か、何を生成するか。
- /integrations/backport/production-usage/ — リリースパイプラインの運用。