PostgreSQL โดดเด่นกว่า OpenFGA: ทีมหนึ่งปฏิวัติระบบการอนุญาตอย่างไร

ทีมชุมชน BigGo
PostgreSQL โดดเด่นกว่า OpenFGA: ทีมหนึ่งปฏิวัติระบบการอนุญาตอย่างไร

PostgreSQL โดดเด่นกว่า OpenFGA: ทีมหนึ่งปฏิวัติระบบการอนุญาตอย่างไร

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

ฝันร้ายเรื่องการซิงโครไนซ์ที่จุดประกายนวัตกรรม

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

ผู้แสดงความคิดเห็นหนึ่งคนอธิบายปัญหาพื้นฐานของระบบการอนุญาตที่ได้รับแรงบันดาลใจจาก Zanzibar ได้อย่างสมบูรณ์แบบ:

นี่คือปัญหาพื้นฐานของระบบการอนุญาตทั้งหมดที่ได้รับแรงบันดาลใจจาก Zanzibar ซึ่งต้องการรวมศูนย์ข้อมูลการอนุญาตทั้งหมด

ทีมค้นพบว่าการรักษาฐานข้อมูลแยกสองแห่งหมายความว่าพวกเขาไม่สามารถใช้คุณสมบัติพื้นฐานของ PostgreSQL เช่น การลบแบบต่อเนื่อง ธุรกรรม และข้อจำกัดคีย์ต่างประเทศได้ เมื่อข้อกำหนดการปฏิบัติตาม GDPR บังคับให้พวกเขาต้องดำเนินการลบบัญชีผู้ใช้ พวกเขาต้องเผชิญกับความจริงอันเจ็บปวดที่ว่าระบบการอนุญาตของพวกเขาไม่สามารถลบแบบต่อเนื่องได้โดยอัตโนมัติเหมือนกับฐานข้อมูลหลักของพวกเขา

ปัญหาการค้นหาและการอนุญาต

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

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

ความคิดเห็นนี้เน้นยึงถึงความตึงเครียดทางสถาปัตยกรรมระหว่างบริการเฉพาะทางและระบบแบบรวม一的 นักพัฒนาได้อภิปรายถึงโซลูชันต่าง ๆ ตั้งแต่แนวทางการกรองล่วงหน้าและการกรองภายหลัง ไปจนถึงมุมมองที่สำคัญยิ่งขึ้นที่ซับซ้อนมากขึ้นซึ่งทำให้ข้อมูลการอนุญาตกลับมาเป็นปกติในฐานข้อมูลแอปพลิเคชัน

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

การเปรียบเทียบแนวทางการอนุญาตสิทธิ์

แนวทาง ชื่อเต็ม ลักษณะสำคัญ กรณีการใช้งานที่เหมาะสม
RBAC Role-Based Access Control ผู้ใช้มีบทบาทที่มีสิทธิ์ที่กำหนดไว้ล่วงหน้า แอปพลิเคชันแบบง่ายที่มีลำดับชั้นของบทบาทที่ชัดเจน
PBAC Policy-Based Access Control นโยบายแบบ JSON/YAML กำหนดเกณฑ์การเข้าถึง การกำกับดูแล API ระบบองค์กร
ABAC Attribute-Based Access Control การเข้าถึงขึ้นอยู่กับคุณลักษณะของผู้ใช้/ทรัพยากร/สภาพแวดล้อม ความต้องการด้านความปลอดภัยแบบละเอียด
ReBAC Relationship-Based Access Control การเข้าถึงขึ้นอยู่กับความสัมพันธ์ระหว่างเอนทิตี แอปพลิเคชันแบบทำงานร่วมกันเช่น Google Drive

โซลูชัน PostgreSQL: ความเรียบง่ายพบกับพลัง

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

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

ปฏิกิริยาของชุมชนต่อแนวทางนี้มีความหลากหลายแต่โดยทั่วไปเป็นไปในทางบวก นักพัฒนาบางคนแสดงความประหลาดใจกับประสิทธิผลของการเก็บตรรกะในฐานข้อมูล และตั้งข้อสังเกตว่ามันสดชื่นเสมอที่ได้เห็นเมื่อมันสามารถทำงานได้แม้จะมีแนวโน้มในปัจจุบันที่ favore บริการภายนอก คนอื่น ๆ ขอให้อัปเดตเกี่ยวกับประสิทธิภาพในระยะยาว โดยเฉพาะอย่างยิ่งรอบ ๆ โอเวอร์เฮดเชิงคำนวณของการสร้างความสัมพันธ์การอนุญาตตามความต้องการ

ส่วนประกอบการใช้งาน PostgreSQL

  • ตาราง authz_model: เก็บคำจำกัดความของสคีมาการอนุญาต พร้อมกับกฎเกี่ยวกับประเภท ความสัมพันธ์ และการสืบทอด
  • วิว authz_relationship: คำนวณ relationship tuples แบบออนดีมานด์จากตารางฐานข้อมูลที่มีอยู่
  • ฟังก์ชัน check_permission: ประเมินคำสั่งการอนุญาตแบบเรียกซ้ำเทียบกับโมเดล
  • สคริปต์ยูทิลิตี้: จัดการการย้ายสคีมาและเวิร์กโฟลว์การพัฒนา

อนาคตของระบบการอนุญาต

กรณีศึกษานี้ทำให้เกิดคำถามสำคัญเกี่ยวกับเวลาที่จะใช้บริการการอนุญาตเฉพาะทางเทียบกับโซลูชันฐานข้อมูลแบบรวม一的 สำหรับแอปพลิเคชันขนาดเล็กถึงขนาดกลาง แนวทางของ PostgreSQL ให้ข้อได้เปรียบที่น่าสนใจในด้านความเรียบง่ายและความสม่ำเสมอของข้อมูล อย่างไรก็ตาม เมื่อแอปพลิเคชันขยายขนาดไปสู่ฐานผู้ใช้จำนวนมากด้วยโครงสร้างสิทธิ์ที่ซับซ้อน ความสามารถในการขยายขนาดเฉพาะทางของระบบเช่น OpenFGA และ SpiceDB อาจกลายเป็นสิ่งจำเป็น

การอภิปรายยังเปิดเผยโซลูชันที่เกิดขึ้นใหม่ซึ่งเชื่อมต่อทั้งสองโลก เช่น ฟังก์ชัน wrapper ข้อมูลต่างประเทศที่อนุญาตให้ PostgreSQL JOIN กับบริการการอนุญาตภายนอกโดยธรรมชาติ และแนวทางการทำให้เป็นวัตถุที่ซิงค์ข้อมูลการอนุญาตกลับเข้าสู่ฐานข้อมูลแอปพลิเคชัน

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

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

อ้างอิง: How we rewrote OpenFGA in pure Postgres