Bỏ qua để đến nội dung

Bảo mật và vận hành trình tạo backport

Đây là bộ công cụ build — KHÔNG phải là phụ thuộc lúc chạy. Trang này giải thích cách vận hành và đặt niềm tin vào quy trình build. Tư thế bảo mật của chính engine Portable Document Format (PDF) được ghi lại cùng với engine, không phải tại đây.

Trình tạo backport chuyển đổi mã nguồn mà nó không tự viết và phát hành một bản phân phối không phải là nơi phát triển tiếp của nó. Mô hình bảo mật bắt nguồn từ chính ranh giới đó. Ranh giới tin cậy là bản checkout mã nguồn và toolchain. Sản phẩm phát hành là chỉ đọc và do máy tạo ra. Việc phân tách giấy phép giữa gói công khai và gói Pro được cố định trong mã.

Trình tạo backport nhận các kho mã nguồn và toolchain đã ghim phiên bản làm đầu vào. Nó tạo ra một sản phẩm phái sinh. Ba thuộc tính sau đây luôn đúng:

  • Bản phân phối được tạo ra là chỉ đọc và do máy tạo ra. Nó được phát hành dưới dạng thẻ phiên bản, không phải dưới dạng nhánh của kho này. Việc phát triển, báo lỗi và yêu cầu tính năng được gửi đến các kho mã nguồn nextpdf/* gốc, tuyệt đối không gửi đến cây mã được tạo ra. Đã xác minh dựa trên khối cảnh báo trong README.md của dự án và .github/workflows/build.yml (commit phát hành và gắn thẻ cho cây mã được tạo lại từ đầu).
  • Phạm vi của token phát hành rất hẹp. secrets.BACKPORT_TRIGGER_TOKEN cấp quyền clone các kho mã nguồn tại thẻ phát hành. Token này chỉ được tham chiếu trong các bước checkout mã nguồn. Đã xác minh dựa trên build.yml (cách dùng GH_TOKEN).
  • Việc tách runner tích hợp liên tục (CI) là có chủ đích. Các sự kiện tin cậy chạy trên runner PHP tự lưu trữ; pull request từ fork và các lần chạy Dependabot bị buộc chạy trên runner do GitHub lưu trữ. Mã không tin cậy không bao giờ chạy trên nhóm runner tin cậy. Đã xác minh dựa trên .github/workflows/0-ci.yml (điều kiện runs-on).
  • Toolchain được giới hạn trong composer.json. Toolchain dùng Rector ^2.0, PHPStan ^2.1, PHPUnit ^13.0, và bộ symfony/polyfill-*. Trình tạo backport không có phụ thuộc lúc chạy vào NextPDF, nên một gói runtime NextPDF đã bị xâm phạm không thể tác động đến trình tạo backport. Đã xác minh dựa trên composer.json.
  • Các bản cập nhật phụ thuộc do bot điều khiển và được kiểm soát qua cổng. Cấu hình Dependabot và một workflow tự động merge đều có mặt. Các lần chạy Dependabot được ghim vào runner do GitHub lưu trữ và vẫn phải vượt qua toàn bộ cổng CI (PHPStan, kiểm thử, dry-run) trước khi merge. Đã xác minh dựa trên .github/dependabot.yml, .github/workflows/0-ci.yml, và 9-dependabot-auto-merge.yml.
  • Đầu ra loại trừ trạng thái build. Kho lưu trữ phát hành được nén lại sau khi loại trừ vendor/.git/. Sản phẩm phát hành mang theo mã nguồn và manifest được tạo ra, không phải cây phụ thuộc của riêng trình tạo backport. Đã xác minh dựa trên build.yml (zip ... -x '*/vendor/*' '*/.git/*').
  • Phân tích tĩnh kiểm soát mã build qua cổng. composer analyse chạy PHPStan ở level 10 trên rector/rulesscripts ở mỗi lần push và pull request vào một trong hai nhánh vĩnh viễn. Nó chạy trước mọi lần dry-run. Đã xác minh dựa trên composer.json0-ci.yml.

Script build không kiểm tra cú pháp của đầu ra cục bộ vì máy chủ build chạy phiên bản PHP mới hơn mục tiêu. Cổng có thẩm quyền nằm trong workflow phát hành. Sau khi build, runner chuyển sang PHP mục tiêu và chạy php -l trên toàn bộ output/src, khiến bản phát hành thất bại nếu có bất kỳ lỗi phân tích cú pháp hoặc lỗi nghiêm trọng nào. Sau đó, sản phẩm được cài đặt và kiểm thử trên toàn bộ ma trận kiểm tra — PHP 8.1 đến 8.4 cho làn PHP 8.1, và PHP 7.4 cùng 8.0 cho làn PHP 7.4. Một bản phân phối mà runtime mục tiêu sẽ từ chối thì không thể trở thành bản phát hành. Đã xác minh dựa trên scripts/build.php (validateOutput()) và .github/workflows/build.yml (job kiểm tra cú pháp và validate-*).

Đây là một bảo đảm dựa trên hành vi quan sát được, giới hạn ở các runtime mà quy trình kiểm thử. Đây không phải là chứng nhận tuân thủ. Bảo đảm này không khẳng định tính đúng đắn của chương trình đã chuyển đổi ngoài việc cú pháp được chấp nhận và bộ kiểm thử của chính dự án.

Hai gói được tạo ra mang giấy phép khác nhau, được cố định trong scripts/adjust-composer.php:

GóiTrường giấy phépĐược đặt bởi
nextpdf/backportApache-2.0generatePublicComposer()
nextpdf/backport-proproprietarygenerateProComposer()

Bản thân kho của trình tạo backport là Apache-2.0 (composer.jsonlicense). Tệp CHANGELOG.md của kho ghi lại một lần đổi giấy phép trước đây từ LGPL-3.0-or-later sang Apache-2.0. Các phiên bản phát hành trước thay đổi đó vẫn theo giấy phép cũ và vẫn có thể truy xuất, trong khi mọi phiên bản mới đều là Apache-2.0. Bản phân phối Pro là độc quyền, chỉ được tạo cho mục tiêu PHP 8.1, và yêu cầu phpseclib/phpseclib ^3.0. Đã xác minh dựa trên CHANGELOG.md, composer.json, và scripts/adjust-composer.php.

Các bảo đảm vận hành và giới hạn của chúng

Phần tiêu đề “Các bảo đảm vận hành và giới hạn của chúng”

Những gì quy trình bảo đảm, giới hạn ở những gì mã thực thi:

  • Dừng ngay khi gặp lỗi đầu tiên. Quá trình build hủy bỏ tại giai đoạn thất bại đầu tiên kèm theo lỗi có tên. Một bản phân phối không hoàn chỉnh không bao giờ được phát hành vì các job phát hành phụ thuộc vào việc build và kiểm tra thành công. Đã xác minh dựa trên scripts/build.php (step()) và job build.yml phụ thuộc needs.
  • Các bản build được tuần tự hóa. Nhóm đồng thời backport-build với cancel-in-progress: false ngăn hai bản phát hành mã nguồn tranh chấp cùng một thẻ phát hành. Đã xác minh dựa trên build.yml.
  • Đầu vào có thể tái tạo. Quy trình clone mọi kho mã nguồn tại đúng thẻ phát hành trước khi build. Đã xác minh dựa trên build.yml (--branch "${TAG}").

Những gì nó không tuyên bố:

  • Nó không chứng nhận việc tuân thủ tiêu chuẩn, khả năng tương thích đầy đủ với phiên bản PHP, hay tính đúng đắn của chương trình đã chuyển đổi ngoài việc cú pháp được chấp nhận và bộ kiểm thử.
  • Việc hạ cấp loại bỏ tính bất biến được runtime thực thi (loại bỏ readonly). Mã từng dựa vào runtime để từ chối ghi vào một thuộc tính readonly sẽ mất cơ chế bảo vệ đó trong đầu ra đã hạ cấp. Đây là một sự đánh đổi có chủ đích, đã được ghi lại để đổi lấy độ an toàn của clone-with — xem /integrations/backport/troubleshooting/.

Các vấn đề bảo mật trong trình tạo backport tuân theo SECURITY.md của kho: hãy báo cáo qua GitHub Security Advisory hoặc đầu mối liên hệ bảo mật, không báo cáo qua issue công khai. Hãy gửi issue về mã được tạo ra đến các kho mã nguồn gốc, vì cây mã được tạo ra do máy tạo ra và không phải là nơi phát triển tiếp. Đã xác minh dựa trên SECURITY.mdREADME.md của dự án.

  • /integrations/backport/overview/ — trình tạo backport là gì và nó tạo ra những gì.
  • /integrations/backport/production-usage/ — cách vận hành quy trình phát hành.