ความปลอดภัยและการดำเนินงานของตัวสร้าง 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/backport | Apache-2.0 | generatePublicComposer() |
nextpdf/backport-pro | proprietary | generateProComposer() |
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.ymljobneeds - การบิลด์แบบอนุกรม กลุ่มการทำงานพร้อมกัน (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/ — วิธีดำเนินงานไปป์ไลน์การรีลีส