ข้ามไปยังเนื้อหา

ความปลอดภัยและการดำเนินงานของตัวสร้าง Backport

เครื่องมือสำหรับบิลด์ — ไม่ใช่ dependency ขณะรันไทม์ หน้านี้อธิบายการดำเนินงานและโมเดลความเชื่อถือของไปป์ไลน์บิลด์ ลักษณะด้านความปลอดภัยของเอนจิน Portable Document Format (PDF) เองบันทึกไว้กับเอนจิน ไม่ใช่ที่นี่

ตัวสร้างแปลงซอร์สโค้ดที่ตนไม่ได้เขียนเอง และสร้างชุดแจกจ่ายที่ไม่ใช่ทรีสำหรับพัฒนาต่อ โมเดลความปลอดภัยของตัวสร้างจึงอิงตามขอบเขตนี้ ขอบเขตความเชื่อถือคือซอร์สโค้ดที่เช็กเอาต์และ toolchain อาร์ติแฟกต์ที่สร้างออกมาเป็นแบบอ่านอย่างเดียวและสร้างขึ้นโดยเครื่อง การแบ่งแยกการอนุญาตให้ใช้สิทธิระหว่างแพ็กเกจสาธารณะและแพ็กเกจ Pro ถูกกำหนดตายตัวไว้ในโค้ด

ตัวสร้างรับซอร์ส repository และ toolchain ที่ตรึงเวอร์ชันไว้เป็นอินพุต แล้วสร้างอาร์ติแฟกต์ที่เป็นผลสืบเนื่อง คุณสมบัติสามประการต่อไปนี้เป็นจริงเสมอ:

  • ชุดแจกจ่ายที่สร้างขึ้นเป็นแบบอ่านอย่างเดียวและสร้างขึ้นโดยเครื่อง เผยแพร่เป็นแท็กเวอร์ชัน ไม่ใช่เป็นสาขาของ repository นี้ การพัฒนา การรายงานบั๊ก และคำขอฟีเจอร์ให้ส่งไปยังซอร์ส repository nextpdf/* ต้นทาง ไม่ใช่ส่งไปยังทรีที่สร้างขึ้น ตรวจสอบยืนยันได้จากบล็อกคำเตือนใน README.md ของโปรเจกต์ และ .github/workflows/build.yml (การรีลีสจะคอมมิตและแท็กทรีที่สร้างขึ้นใหม่ตั้งแต่ต้น)
  • โทเค็นการรีลีสมีขอบเขตแคบ secrets.BACKPORT_TRIGGER_TOKEN อนุญาตให้โคลนซอร์ส repository ที่แท็กการรีลีส มีการอ้างอิงโทเค็นนี้เฉพาะในขั้นตอนการเช็กเอาต์ซอร์สเท่านั้น ตรวจสอบยืนยันได้จาก build.yml (การใช้งาน GH_TOKEN)
  • การแบ่งแยก runner ของ continuous integration (CI) เป็นการออกแบบโดยเจตนา เหตุการณ์ที่เชื่อถือได้จะรันบน PHP runner ที่โฮสต์เอง ส่วน pull request จาก fork และการรันของ Dependabot จะถูกบังคับให้รันบน runner ที่ GitHub โฮสต์ โค้ดที่ไม่น่าเชื่อถือจะไม่ทำงานบนพูล runner ที่เชื่อถือได้เลย ตรวจสอบยืนยันได้จาก .github/workflows/0-ci.yml (เงื่อนไข runs-on)
  • toolchain ถูกจำกัดไว้ใน composer.json โดยใช้ Rector ^2.0, PHPStan ^2.1, PHPUnit ^13.0 และชุด symfony/polyfill-* ตัวสร้างไม่มี dependency ขณะรันไทม์ของ NextPDF ดังนั้นแพ็กเกจรันไทม์ของ NextPDF ที่ถูกบุกรุกจึงไม่สามารถเข้าถึงตัวสร้างได้ ตรวจสอบยืนยันได้จาก composer.json
  • การอัปเดต dependency ขับเคลื่อนด้วยบอตและมีด่านตรวจ มีการกำหนดค่า Dependabot และเวิร์กโฟลว์การ auto-merge การรันของ Dependabot ถูกตรึงให้รันบน runner ที่ GitHub โฮสต์ และยังคงต้องผ่านด่าน CI แบบเต็ม (PHPStan, การทดสอบ, dry-run) ก่อนการ merge ตรวจสอบยืนยันได้จาก .github/dependabot.yml และ .github/workflows/0-ci.yml, 9-dependabot-auto-merge.yml
  • เอาต์พุตไม่รวมสถานะการบิลด์ ไฟล์อาร์ไคฟ์การรีลีสถูกบีบอัดเป็น zip โดยไม่รวม vendor/ และ .git/ อาร์ติแฟกต์ที่เผยแพร่จะบรรจุซอร์สโค้ดและ manifest ที่สร้างขึ้น ไม่ใช่ทรี dependency ของตัวสร้างเอง ตรวจสอบยืนยันได้จาก build.yml (zip ... -x '*/vendor/*' '*/.git/*')
  • การวิเคราะห์แบบสถิตเป็นด่านตรวจโค้ดการบิลด์ composer analyse รัน PHPStan ที่ระดับ 10 บน rector/rules และ scripts ในทุกการ push และ pull request ไปยังสาขาถาวรทั้งสองสาขา การวิเคราะห์นี้รันก่อน dry-run ใดๆ ตรวจสอบยืนยันได้จาก composer.json และ 0-ci.yml

สคริปต์การบิลด์ไม่ตรวจสอบไวยากรณ์ของเอาต์พุตในเครื่อง เนื่องจากโฮสต์การบิลด์รัน PHP ที่ใหม่กว่าเป้าหมาย ด่านตรวจที่ถือเป็นเกณฑ์ชี้ขาดอยู่ในเวิร์กโฟลว์การรีลีส หลังการบิลด์ runner จะสลับไปใช้ PHP เป้าหมายและรัน php -l ทั่วทั้ง output/src โดยจะทำให้การรีลีสล้มเหลวหากพบ parse error หรือ fatal error ใดๆ จากนั้นอาร์ติแฟกต์จะถูกติดตั้งและทดสอบใช้งานทั่วทั้งเมทริกซ์การตรวจสอบ — PHP 8.1 ถึง 8.4 สำหรับเลน PHP 8.1 และ PHP 7.4 กับ 8.0 สำหรับเลน PHP 7.4 ชุดแจกจ่ายที่รันไทม์เป้าหมายปฏิเสธจะไม่ไปถึงขั้นรีลีส ตรวจสอบยืนยันได้จาก scripts/build.php (validateOutput()) และ .github/workflows/build.yml (จ็อบ syntax-check และ validate-*)

นี่คือการรับประกันจากพฤติกรรมที่สังเกตได้ ซึ่งจำกัดขอบเขตอยู่ที่รันไทม์ที่ไปป์ไลน์ทดสอบใช้งาน ไม่ใช่การรับรองความสอดคล้องตามมาตรฐาน ไม่ได้ยืนยันความถูกต้องของโปรแกรมที่แปลงแล้วนอกเหนือจากการยอมรับไวยากรณ์และชุดทดสอบของโปรเจกต์เอง

แพ็กเกจที่สร้างขึ้นทั้งสองชุดมีการอนุญาตให้ใช้สิทธิที่แตกต่างกัน ซึ่งกำหนดตายตัวไว้ใน scripts/adjust-composer.php:

แพ็กเกจฟิลด์การอนุญาตให้ใช้สิทธิกำหนดโดย
nextpdf/backportApache-2.0generatePublicComposer()
nextpdf/backport-proproprietarygenerateProComposer()

repository ของตัวสร้างเองใช้ Apache-2.0 (composer.jsonlicense) CHANGELOG.md ของ repository นี้บันทึกการเปลี่ยนการอนุญาตให้ใช้สิทธิครั้งก่อนจาก 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 job needs
  • การบิลด์แบบอนุกรม กลุ่มการทำงานพร้อมกัน (concurrency group) backport-build ที่มี cancel-in-progress: false ป้องกันไม่ให้การรีลีสซอร์สสองรายการแย่งชิงแท็กการรีลีสเดียวกัน ตรวจสอบยืนยันได้จาก build.yml
  • อินพุตที่ทำซ้ำได้ ไปป์ไลน์โคลนซอร์ส repository ทุกตัวจากแท็กการรีลีสที่ตรงกันแน่นอนก่อนการบิลด์ ตรวจสอบยืนยันได้จาก build.yml (--branch "${TAG}")

สิ่งที่ไม่ได้กล่าวอ้าง:

  • ไม่ได้รับรองความสอดคล้องตามมาตรฐาน ความเข้ากันได้กับเวอร์ชัน PHP อย่างเต็มรูปแบบ หรือความถูกต้องของโปรแกรมที่แปลงแล้วนอกเหนือจากการยอมรับไวยากรณ์และชุดทดสอบ
  • การดาวน์เกรดจะลบการไม่ให้เปลี่ยนแปลงที่บังคับใช้ขณะรันไทม์ออกไป (การถอด readonly ออก) โค้ดที่อาศัยรันไทม์ในการปฏิเสธการเขียนลงพร็อพเพอร์ตี readonly จะสูญเสียการป้องกันนั้นไปในเอาต์พุตที่ถูกดาวน์เกรด นี่คือการแลกเปลี่ยนที่จงใจและมีการบันทึกไว้เพื่อความปลอดภัยของ clone-with — ดู /integrations/backport/troubleshooting/

สำหรับปัญหาด้านความปลอดภัยในตัวสร้าง ให้ปฏิบัติตาม SECURITY.md ของ repository: รายงานผ่าน GitHub Security Advisory หรือผู้ติดต่อด้านความปลอดภัย ไม่ใช่ผ่าน issue สาธารณะ ปัญหาในโค้ดที่ สร้างขึ้น ให้แจ้ง issue กับซอร์ส repository ต้นทาง เนื่องจากทรีที่สร้างขึ้นนั้นสร้างโดยเครื่องและไม่ได้ใช้เป็นพื้นที่พัฒนา ตรวจสอบยืนยันได้จาก SECURITY.md และ README.md ของโปรเจกต์

  • /integrations/backport/overview/ — ตัวสร้างคืออะไรและสร้างสิ่งใดออกมา
  • /integrations/backport/production-usage/ — วิธีดำเนินงานไปป์ไลน์การรีลีส