อย่ามอง Trusted Publishing ว่าเป็นสัญญาณความน่าเชื่อถือของแพ็กเกจ
(blog.yossarian.net)- “ความน่าเชื่อถือ” ใน Trusted Publishing ไม่ได้หมายความว่ามนุษย์ควรเชื่อถือแพ็กเกจนั้น แต่หมายถึงความสัมพันธ์ด้านการยืนยันตัวตนสำหรับการอัปโหลดระหว่าง ตัวตนของเครื่อง ภายนอก เช่น CI/CD กับดัชนีแพ็กเกจ
- การใช้งานของ PyPI ทำงานอยู่บน OIDC federation และออกข้อมูลรับรองสำหรับการเผยแพร่ที่มีอายุสั้นและขอบเขตจำกัด แทน API token ระยะยาว เพื่อลดการรั่วไหลของข้อมูลรับรองที่มีอายุยาวและมีสิทธิ์เกินจำเป็น
- หลังจาก PyPI เปิดตัวในปี 2023 แนวทางนี้ก็ขยายไปยัง npm, RubyGems, crates.io, NuGet และอื่น ๆ แต่ความซับซ้อนของโมเดลข้อมูล การจัดการที่แตกต่างกันไปตามผู้ให้บริการ OIDC และความเป็นไปได้ที่ CI/CD จะถูกเจาะยังคงมีอยู่
- PyPI ไม่ได้เน้นสถานะ Trusted Publishing ด้วย เครื่องหมายถูกสีเขียว บนหน้าโปรเจกต์ แต่แสดงเพียงเมทาดาทา Yes/No แบบเรียบง่ายในรายละเอียดไฟล์ เพื่อลดโอกาสที่จะถูกเข้าใจผิดว่าเป็นสัญญาณด้านความปลอดภัย
- ทั้ง Trusted Publishing และ PyPI attestations บอกได้เพียงเรื่องการยืนยันตัวตนในการอัปโหลด หรือการลงนามบนฐานของตัวตนเครื่องเท่านั้น และไม่สามารถใช้ตัดสินความปลอดภัยหรือคุณภาพของแพ็กเกจได้ หากยังไม่ได้เชื่อถือตัวตนนั้นเป็นการเฉพาะ
ขอบเขตของความเชื่อถือที่ Trusted Publishing จัดการ
- Trusted Publishing ไม่ใช่ฟีเจอร์ที่บอกให้คนเชื่อถือแพ็กเกจ แต่เป็นวิธีการยืนยันตัวตนที่จัดการกับ ความเชื่อถือระหว่างเครื่อง
- หากมอง Trusted Publishing ว่าเป็นเรื่องว่าเชื่อถือได้สำหรับมนุษย์หรือไม่ ก็ถือว่าเป็นการจัดหมวดหมู่ผิด
- แกนสำคัญคือการสร้างความสัมพันธ์แห่งความเชื่อถือสำหรับการยืนยันตัวตนการอัปโหลด ระหว่างตัวตนของเครื่องภายนอกอย่างเวิร์กโฟลว์ CI/CD กับตัวตนของโปรเจกต์บนดัชนีแพ็กเกจ
โครงสร้าง Trusted Publishing ของ PyPI
- “Trusted Publishing” เป็นคำที่ PyPI ใช้อธิบายวิธีการยืนยันตัวตนบน OpenID Connect federation
- PyPI เปิดตัวสิ่งนี้ในปี 2023 และหลังจากนั้น npm, RubyGems, crates.io, NuGet ก็ได้นำไปใช้เช่นกัน
- จุดตั้งต้นคือปัญหาสองข้อ
- API token ของดัชนีซึ่งเป็น ข้อมูลรับรองระยะยาว นั้นจัดการให้ปลอดภัยได้ยาก และผู้ใช้ก็มักกำหนดสิทธิ์ขั้นต่ำกับวันหมดอายุได้ยาก ทำให้มักถูกตั้งค่าเกินสิทธิ์ที่จำเป็น
- ผู้ใช้จำนวนมากสร้างข้อมูลรับรองเพื่อนำไปใส่ในแพลตฟอร์ม CI/CD และแพลตฟอร์ม CI/CD เองก็มีกลไกผ่าน OIDC สำหรับพิสูจน์การควบคุมตัวตนของเครื่องบางตัวอยู่แล้ว
- ผู้ใช้ลงทะเบียน Trusted Publisher ซึ่งเป็นตัวตนเครื่องของ CI/CD กับดัชนีแพ็กเกจเพียงครั้งเดียว จากนั้นเมื่อ CI/CD แสดง identity token ดัชนีก็จะตรวจสอบและออกข้อมูลรับรองสำหรับการเผยแพร่ที่มีอายุสั้นและขอบเขตจำกัดให้
ข้อดีและข้อจำกัดที่ยังคงอยู่
- วิธีใช้ข้อมูลรับรองที่มีอายุสั้นและกำหนดขอบเขตได้ในตัว ถูกมองว่าเป็นแนวทางที่ประสบความสำเร็จอย่างมากสำหรับผู้ใช้ PyPI
- ผู้ใช้ชอบวิธีที่ไม่ต้องจัดการข้อมูลรับรองด้วยตนเองเมื่อไม่จำเป็น
- โปรเจกต์โอเพนซอร์สขนาดใหญ่และองค์กรต่าง ๆ ชอบคุณสมบัติที่สิทธิ์ในการเผยแพร่ผูกกับ ตัวตนของซอร์ส แทนที่จะผูกกับเมนเทนเนอร์รายบุคคล
- Trusted Publishing เองก็ยังมีความซับซ้อนเชิงโครงสร้างอยู่
- “pending publishers” ของ PyPI ช่วยแก้ปัญหาโปรเจกต์ที่ยังไม่มีอยู่ แต่ทำให้โมเดลข้อมูลซับซ้อนขึ้น และสร้างความสับสนให้ผู้ใช้มากกว่า Trusted Publishing แบบทั่วไป
- ผู้ให้บริการ OIDC สามารถใส่ค่าหลากหลายลงใน claim set ได้นอกเหนือจาก claim กลางบางส่วน ทำให้ดัชนีต้องรองรับรูปแบบเฉพาะของแต่ละผู้ให้บริการแยกกัน
- ด้วยเหตุนี้ ตัวตนของเครื่องจึงไม่สามารถใช้แทนกันได้ระหว่าง OIDC IdP ต่าง ๆ และนี่ก็เป็นหนึ่งในเหตุผลที่ PyPI เพิ่มผู้ให้บริการ Trusted Publishing รายใหม่อย่างค่อยเป็นค่อยไป
- หากเวิร์กโฟลว์ CI/CD ถูกเจาะ ผู้โจมตีก็อาจขโมยข้อมูลรับรองของ Trusted Publishing หรือ OIDC ID token ที่เป็นต้นทางของมันได้
- เรื่องนี้คล้ายกับกรณีที่มีข้อมูลรับรองระยะยาวอยู่ในเวิร์กโฟลว์ แต่ข้อมูลรับรองของ Trusted Publishing ไม่มีความเสี่ยงด้านขอบเขตและอายุการใช้งานในระดับเดียวกัน
- PyPI ลดความเสี่ยงจากการถูกเจาะของ CI/CD โดยปฏิเสธการแลก token สำหรับตัวตนเครื่องที่สอดคล้องกับ trigger ที่ถูกนำไปใช้ในทางที่ผิดได้ง่าย เช่น
pull_request_target
เหตุใดจึงไม่ใช่สัญญาณความน่าเชื่อถือของแพ็กเกจ
- Trusted Publishing เป็นเพียง วิธีการยืนยันตัวตน เท่านั้น และไม่ได้ให้ข้อมูลว่าแพ็กเกจนั้นปลอดภัย มีคุณภาพสูง หรือควรใช้งานหรือไม่
- PyPI เป็นดัชนีสาธารณะ ดังนั้นใครก็อัปโหลดได้ และใครก็ใช้ 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 แบบเรียบง่ายในหน้ารายละเอียดไฟล์
- พื้นที่เมทาดาทาของไฟล์ไม่ได้ถูกแสดงผลในลักษณะที่ชวนให้มองว่าเป็นข้อมูลสำคัญต่อการตัดสินความเชื่อถือของผู้ใช้
- แม้แต่ JSON blob ที่มาจาก user agent ของไคลเอนต์อัปโหลดก็ไม่ได้ถูกแสดงผลอย่างเด่นชัดเช่นกัน
ความแตกต่างจาก 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
มีโปรเจกต์ไม่มากที่เติบโตจนถึงขั้นคุ้มค่ากับการมีโครงสร้างพื้นฐานของตัวเอง และโฮสติ้งราคาถูกก็เพิ่งเป็นไปได้ค่อนข้างไม่นานมานี้