ไม่ควรมอง Trusted Publishing ของ PyPI เป็นสัญญาณความน่าเชื่อถือของแพ็กเกจ
(blog.yossarian.net)- “ความน่าเชื่อถือ” ใน Trusted Publishing ไม่ได้หมายความว่ามนุษย์ควรเชื่อถือแพ็กเกจนั้นได้ แต่หมายถึงความสัมพันธ์ด้านการยืนยันตัวตนสำหรับการอัปโหลด ระหว่าง ตัวตนของเครื่อง ภายนอก เช่น CI/CD กับ package index
- การทำงานของ PyPI สร้างอยู่บน OIDC federation โดยออก credential สำหรับการเผยแพร่ที่มีอายุสั้นและขอบเขตแคบ แทน API token ระยะยาว เพื่อลดการเปิดเผย credential ที่มีอายุยาวและสิทธิ์เกินจำเป็น
- หลังจาก PyPI เปิดตัวในปี 2023 แนวทางนี้แพร่ไปยัง npm, RubyGems, crates.io, NuGet ฯลฯ แต่ความซับซ้อนของ data model, การจัดการที่แตกต่างกันตามผู้ให้บริการ OIDC และความเป็นไปได้ที่ CI/CD จะถูกเจาะยังคงอยู่
- PyPI ไม่เน้นสถานะ Trusted Publishing ด้วย เครื่องหมายถูกสีเขียว บนหน้าโปรเจกต์ แต่แสดงเป็น metadata แบบ Yes/No ธรรมดาในรายละเอียดไฟล์เท่านั้น เพื่อลดโอกาสถูกเข้าใจผิดว่าเป็นสัญญาณด้านความปลอดภัย
- Trusted Publishing และ PyPI attestations บอกได้เพียงว่าเป็นการยืนยันตัวตนสำหรับการอัปโหลด หรือมีการเซ็นตามตัวตนของเครื่องหรือไม่ และไม่สามารถใช้ตัดสินความปลอดภัยหรือคุณภาพของแพ็กเกจได้ จนกว่าจะมีการเชื่อถือตัวตนนั้นแยกต่างหาก
ขอบเขตของความน่าเชื่อถือที่ Trusted Publishing จัดการ
- Trusted Publishing ไม่ใช่ฟีเจอร์ที่บอกให้มนุษย์เชื่อถือแพ็กเกจ แต่เป็นวิธีการยืนยันตัวตนที่จัดการ ความน่าเชื่อถือระหว่างเครื่อง
- หากมอง Trusted Publishing เป็นประเด็นว่ามนุษย์เชื่อถือได้หรือไม่ได้ ก็ถือว่าเป็นการจัดหมวดหมู่ผิด
- แก่นสำคัญคือการสร้างความสัมพันธ์ด้านความน่าเชื่อถือเพื่อยืนยันตัวตนสำหรับการอัปโหลด ระหว่างตัวตนของเครื่องภายนอก เช่น workflow ของ CI/CD กับตัวตนของโปรเจกต์ใน package index
โครงสร้าง Trusted Publishing ของ PyPI
- “Trusted Publishing” เป็นคำที่ PyPI ใช้อธิบายวิธีการยืนยันตัวตนบน OpenID Connect federation
- PyPI เปิดตัวสิ่งนี้ในปี 2023 และหลังจากนั้น npm, RubyGems, crates.io, NuGet ฯลฯ ก็รับไปใช้ด้วย
- จุดเริ่มต้นมาจากปัญหาสองข้อ
- API token ของ index ซึ่งเป็น credential ระยะยาว จัดการให้ปลอดภัยได้ยาก และผู้ใช้มักกำหนดสิทธิ์ขั้นต่ำกับระยะเวลาหมดอายุได้ยาก จึงมีแนวโน้มถูกตั้งค่าให้มีสิทธิ์เกินจำเป็น
- ผู้ใช้จำนวนมากสร้าง credential เพื่อใส่ไว้ในแพลตฟอร์ม CI/CD และแพลตฟอร์ม CI/CD เองก็มีกลไกผ่าน OIDC เพื่อพิสูจน์การควบคุมตัวตนของเครื่องเฉพาะเจาะจง
- ผู้ใช้ลงทะเบียน Trusted Publisher ซึ่งเป็นตัวตนของเครื่อง CI/CD ไว้ครั้งเดียวใน package index และเมื่อ CI/CD แสดง identity token ทาง index จะตรวจสอบและออก credential สำหรับการเผยแพร่ที่มีอายุสั้นและขอบเขตแคบให้
ข้อดีและข้อจำกัดที่ยังเหลืออยู่
- วิธีใช้ credential ที่มีอายุสั้นและกำหนดขอบเขตในตัวเองถือเป็นแนวทางที่ประสบความสำเร็จอย่างมากสำหรับผู้ใช้ PyPI
- ผู้ใช้ชอบแนวทางที่ไม่ต้องจัดการ credential เองเมื่อไม่จำเป็น
- โปรเจกต์โอเพนซอร์สขนาดใหญ่และองค์กรต่าง ๆ ชอบคุณสมบัติที่สิทธิ์ในการเผยแพร่ผูกกับ ตัวตนของแหล่งที่มา ไม่ใช่กับ maintainer รายบุคคล
- Trusted Publishing ยังมีความซับซ้อนเชิงโครงสร้างเหลืออยู่
- “pending publishers” ของ PyPI ช่วยแก้ปัญหาโปรเจกต์ที่ยังไม่มีอยู่จริง แต่ทำให้ data model ซับซ้อนขึ้น และสร้างความสับสนให้ผู้ใช้มากกว่า Trusted Publishing ทั่วไป
- ผู้ให้บริการ OIDC สามารถใส่ค่าหลากหลายลงใน claim set นอกเหนือจาก claim บางส่วนที่ใช้ร่วมกันได้ ทำให้ index ต้องจัดการรูปแบบเฉพาะของผู้ให้บริการแต่ละรายแยกกัน
- ด้วยเหตุนี้ ตัวตนของเครื่องจึงไม่สามารถใช้แทนกันได้ระหว่าง OIDC IdP ต่าง ๆ และเป็นหนึ่งในเหตุผลที่ PyPI เพิ่มผู้ให้บริการ Trusted Publishing รายใหม่อย่างค่อยเป็นค่อยไป
- หาก workflow ของ CI/CD ถูกเจาะ ผู้โจมตีอาจรั่วไหล credential ของ Trusted Publishing หรือ OIDC ID token ที่เป็นเมล็ดตั้งต้นของมันได้
- คล้ายกับกรณีที่มี credential ระยะยาวอยู่ใน workflow แต่ credential ของ Trusted Publishing ไม่มีความเสี่ยงด้านขอบเขตและอายุการใช้งานแบบเดียวกัน
- PyPI ลดความเสี่ยงจากการเจาะ CI/CD โดยปฏิเสธการแลก token สำหรับตัวตนของเครื่องที่สอดคล้องกับ trigger ที่ถูกนำไปใช้ในทางที่ผิดได้ง่าย เช่น
pull_request_target
เหตุผลที่ไม่ใช่สัญญาณความน่าเชื่อถือของแพ็กเกจ
- Trusted Publishing เป็นเพียง วิธีการยืนยันตัวตน และไม่ได้ให้ข้อมูลว่าแพ็กเกจปลอดภัยหรือไม่ มีคุณภาพสูงหรือไม่ หรือน่าใช้หรือไม่
- PyPI เป็น index สาธารณะ ทุกคนจึงอัปโหลดได้ และทุกคนก็สามารถใช้ Trusted Publisher เพื่ออัปโหลดได้
- แม้ใช้ Trusted Publisher ก็ยังอัปโหลดมัลแวร์หรือโค้ดที่มีช่องโหว่ได้
- ในแง่นี้เหมือนกับ API token ซึ่งเป็นวิธีการยืนยันตัวตนสำหรับอัปโหลดแบบอื่นของ PyPI
- Trusted Publishing ไม่ใช่ข้อบังคับใน PyPI และในอนาคตก็ไม่อาจกลายเป็นข้อบังคับได้
- การบังคับให้ผู้ใช้ใช้ Trusted Publishing เป็นไปไม่ได้ในเชิงวิศวกรรม และไม่พึงประสงค์ทั้งในเชิงเทคนิคและสังคม
- Trusted Publishing จะเป็นตัวเลือกเสมอ
วิธีที่ UI ของ PyPI ลดความเข้าใจผิด
- PyPI ระมัดระวังไม่ให้ผู้ใช้เข้าใจสถานะ Trusted Publishing ผิดว่าเป็นสัญญาณความน่าเชื่อถือของแพ็กเกจ
- บนหน้าโปรเจกต์ไม่มี เครื่องหมายถูกสีเขียว ที่แสดงสถานะ Trusted Publishing
- เครื่องหมายถูกสีเขียวสำหรับสถานะที่ผู้ใช้ควบคุมได้ จะใช้เฉพาะกับลิงก์ที่ PyPI พิสูจน์ได้ว่ามาจากแหล่งเดียวกับตัวแพ็กเกจเอง
- URL ที่ผ่านการตรวจสอบพิสูจน์ได้เพียงว่า ณ เวลาที่ตรวจสอบ URL นั้นอยู่ภายใต้การควบคุมของเจ้าของแพ็กเกจ PyPI และไม่ได้หมายถึงความปลอดภัยเพิ่มเติมของ URL หรือโปรเจกต์
- สถานะ Trusted Publishing ของไฟล์เฉพาะจะแสดงในรายละเอียดไฟล์เป็นค่า Yes/No ธรรมดา
- พื้นที่ metadata ของไฟล์ไม่ได้ถูก render ให้ดูเหมือนข้อมูลสำคัญต่อการตัดสินความน่าเชื่อถือของผู้ใช้
- แม้แต่ JSON blob ที่มาจาก user agent ของ upload client ก็ยังไม่ได้ render อย่างเหมาะสม
การแยกออกจาก attestations
- ประเด็นนี้แยกต่างหากจาก attestations ของ PyPI
- attestations ในปัจจุบันก็ใช้ตัวตนของเครื่อง OIDC แต่ไม่ใช่ สัญญาณความน่าเชื่อถือ
- attestation คล้ายกับการเซ็นบนตัวตนของเครื่อง แต่เนื่องจากทุกคนสามารถอัปโหลดไปยัง PyPI ได้ ทุกคนจึงสามารถเซ็นด้วยตัวตนของเครื่องที่ตนควบคุมได้
- การมี Trusted Publisher ไม่ได้หมายความว่าจะต้องมี attestation เสมอไป และการมี attestation ก็ไม่ได้หมายความว่าผู้ใช้ปลายทางควรเชื่อถือตัวตนใดตัวตนหนึ่ง
- โมเดลความน่าเชื่อถือของ attestation ใน PyPI ก็บันทึกเรื่องนี้ไว้ในเอกสารเช่นกัน
1 ความคิดเห็น
ความคิดเห็นบน Lobste.rs
เป็นบทความที่ดี Trusted Publishing กับ การรับรอง (attestation) ให้การรับประกันที่แตกต่างกันต่อโหมดความล้มเหลวที่ต่างกัน และทั้งสองอย่างก็แยกจากสิ่งที่ผู้ใช้ส่วนใหญ่เรียกว่า “ความไว้วางใจ”
ที่ Trusted Publishing เป็นไปได้ ก็เพราะในช่วง 15 ปีที่ผ่านมา โปรเจกต์โอเพนซอร์สจำนวนมากย้ายจากการ โฮสต์เอง เช่น เมลลิงลิสต์, Git repository, bug tracker, build server ไปอยู่บน forge แบบรวมศูนย์
ตอนนี้เมื่อข้อเสียของ forge แบบรวมศูนย์ชัดเจนขึ้น โปรเจกต์ต่าง ๆ ก็เริ่มกลับมาพิจารณาการโฮสต์เองอีกครั้ง
ในทศวรรษ 2010 ความสะดวกและผลของโซเชียลเน็ตเวิร์กผลักให้โปรเจกต์เข้าไปอยู่ใน forge แบบรวมศูนย์ แต่ตอนนี้มีปัจจัยที่ผูกโปรเจกต์ไว้มากขึ้นมาก รวมถึง Trusted Publishing ด้วย
อย่าไว้ใจผู้มีอำนาจ — จงส่งเสริมการกระจายศูนย์
— "The Hacker Ethics", Hackers: Heroes of the Computer Revolution (Steven Levy, 1984)
มีความย้อนแย้งอยู่เล็กน้อยในการเรียกการยืนยันตัวตนแบบสหพันธ์ว่าเป็นรูปแบบหนึ่งของการผูกติด
ในช่วงเวลาใกล้เคียงกันราว 25 ปีก่อน ก็มี ASF อยู่ด้วย แต่ ASF ก็มีภาระด้าน governance มากเช่นกัน ก่อนหน้านั้นมีโครงการ GNU ซึ่งเน้นอุดมการณ์ซอฟต์แวร์เสรีมากกว่า และให้ความสำคัญกับบริการโฮสต์โปรเจกต์อย่างเป็นระบบน้อยกว่า เพราะ GNU มีมาก่อนที่จะมีแนวคิดชัดเจนว่าโปรเจกต์ซอฟต์แวร์เสรีต้องการบริการแบบใด
โปรเจกต์ซอฟต์แวร์เสรีในทศวรรษ 1990 มักอยู่บนบริการ time-sharing ของมหาวิทยาลัย หรือบนเซิร์ฟเวอร์ colocation ของเพื่อน เช่น PuTTY หรือ Hyperreal.org ที่เคยโฮสต์ Apache httpd ก่อนยุค ASF
มีโปรเจกต์ไม่มากที่เติบโตจนถึงขั้นคุ้มค่ากับการมีโครงสร้างพื้นฐานของตัวเอง และโฮสติ้งราคาถูกก็เพิ่งเป็นไปได้ค่อนข้างไม่นานมานี้