ช่องโหว่ด้านความปลอดภัยของ JWT จุดประกายการถกเถียงเรื่องการใช้งาน Row-Level Security ใน PostgreSQL

ทีมชุมชน BigGo
ช่องโหว่ด้านความปลอดภัยของ JWT จุดประกายการถกเถียงเรื่องการใช้งาน Row-Level Security ใน PostgreSQL

ส่วนขยาย PostgreSQL เชิงทดลองใหม่ที่ใช้ JSON Web Tokens (JWT) สำหรับ row-level security ได้จุดประกายการถกเถียงอย่างเข้มข้นเกี่ยวกับช่องโหว่ด้านความปลอดภัยของ JWT และแนวทางทางเลือกอื่นๆ ส่วนขยาย jwt_context ที่พัฒนาโดย Tomas Vondra มีเป้าหมายเพื่อแก้ไขปัญหา connection pooling กับ role-based row-level security แบบดั้งเดิม แต่ผู้เชี่ยวชาญด้านความปลอดภัยกำลังยกธงแดงเตือนเกี่ยวกับแนวทางนี้

Row-level security (RLS) ใน PostgreSQL แบบดั้งเดิมอาศัย database roles สำหรับสร้าง trusted contexts อย่างไรก็ตาม แนวทางนี้สร้างความท้าทายกับ connection pooling และต้องการให้ผู้ดูแลระบบฐานข้อมูลจัดการ roles สำหรับผู้ใช้แอปพลิเคชันแต่ละคน ส่วนขยายใหม่นี้พยายามแก้ไขปัญหาเหล่านี้โดยใช้ JWT tokens ที่มีลายเซ็นทางการเข้ารหัสเพื่อสร้างความไว้วางใจโดยไม่ต้องอาศัย authentication-based roles

ข้อกังวลด้านความปลอดภัยขึ้นสู่เวทีหลัก

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

โอ้ ดูสิ การตั้งค่าทั่วไปสำหรับช่องโหว่ JWT แบบคลาสสิก... คุณควรพิจารณาอย่าใช้ JWT สำหรับการออกแบบใหม่ที่ไม่จำเป็นต้องทำงานร่วมกับ JWT ตั้งแต่แรก

โครงสร้างโค้ดของส่วนขยาย jwt_context ดูเหมือนจะเป็นไปตามรูปแบบที่ในอดีตนำไปสู่การละเมิดความปลอดภัยในการใช้งาน JWT อื่นๆ ช่องโหว่เหล่านี้ได้ส่งผลกระทบต่อแพลตฟอร์มหลักรวมถึง Firebase และ npm packages ต่างๆ ซึ่งแสดงให้เห็นว่าแม้แต่องค์กรที่มีชื่อเสียงก็สามารถตกเป็นเหยื่อของปัญหาความปลอดภัยที่เกี่ยวข้องกับ JWT ได้

การเปรียบเทียบความปลอดภัยระหว่าง JWT กับ PASETO

  • ปัญหาของ JWT: การโจมตีแบบสับสนอัลกอริธึม, ช่องโหว่การเปลี่ยนคีย์แบบสมมาตร/อสมมาตร, การละเมิดความปลอดภัยในอดีตใน Firebase และแพ็กเกจ npm
  • ข้อได้เปรียบของ PASETO: ออกแบบมาเพื่อหลีกเลี่ยงข้อผิดพลาดทางการเข้ารหัส, ปลอดภัยกว่าโดยค่าเริ่มต้น, กำจัดการโจมตีแบบสับสนอัลกอริธึม
  • ผลกระทบต่อประสิทธิภาพ: การใช้งานความปลอดภัยระดับแถวสามารถใช้ประสิทธิภาพของเซิร์ฟเวอร์ฐานข้อมูลได้ถึง 30%

แนวทางทางเลือกได้รับความสนใจ

การถกเถียงได้เน้นย้ำ PASETO (Platform-Agnostic Security Tokens) ในฐานะทางเลือกที่ปลอดภัยกว่า JWT ต่างจาก JWT ที่ PASETO ได้รับการออกแบบตั้งแต่เริ่มต้นเพื่อหลีกเลี่ยงข้อผิดพลาดทางการเข้ารหัสที่รบกวนการใช้งาน JWT สมาชิกชุมชนหลายคนแสดงความประหลาดใจที่ได้เรียนรู้เกี่ยวกับทางเลือกเหล่านี้ ซึ่งบ่งชี้ถึงช่องว่างความรู้ในชุมชนนักพัฒนาเกี่ยวกับปัญหาความปลอดภัยของ JWT

น่าสนใจที่องค์กรบางแห่งได้ใช้งานโซลูชันที่คล้ายกันสำเร็จแล้ว Neon ซึ่งเป็นบริการ PostgreSQL บนคลาวด์ ได้พัฒนาระบบ JWT-based RLS ของตนเองพร้อมมาตรการความปลอดภัยเพิ่มเติม แนวทางของพวกเขารวมถึงการใช้ JSON Web Keys แบบสุ่มสำหรับการเชื่อมต่อแต่ละครั้ง token IDs แบบ monotonic เพื่อป้องกัน token smuggling และการจัดการ connection pool อย่างเข้มงวดเพื่อป้องกันการใช้ context ซ้ำ

ความท้าทายในการใช้งานจริง

นอกเหนือจากข้อกังวลด้านความปลอดภัยแล้ว การถกเถียงในชุมชนยังเผยให้เห็นความท้าทายเชิงปฏิบัติกับการใช้งาน JWT-based RLS ภาระด้านประสิทธิภาพยังคงเป็นปัญหาสำคัญ โดยนักพัฒนาคนหนึ่งรายงานว่า row-level security ใช้ประมาณ 30% ของประสิทธิภาพเซิร์ฟเวอร์ฐานข้อมูลในการใช้งานของพวกเขาเมื่อสองทศวรรษที่แล้ว

ความเข้ากันได้ของ connection pooling แม้จะได้รับการปรับปรุงด้วยแนวทาง JWT แต่ยังคงต้องการการจัดการอย่างระมัดระวัง ส่วนขยายเก็บ context ใน session-level variables ที่ต้องถูกล้างและคืนค่าอย่างเหมาะสมเมื่อมีการใช้การเชื่อมต่อซ้ำ สิ่งนี้เพิ่มความซับซ้อนให้กับการใช้งาน connection pool และต้องการการปรับเปลี่ยนโครงสร้างพื้นฐานฐานข้อมูลที่มีอยู่

ส่วนขยายในปัจจุบันรองรับเฉพาะฟีเจอร์ JWT พื้นฐานเท่านั้น ขาดมาตรการความปลอดภัยที่สำคัญเช่นความสามารถในการหมดอายุของ token และการหมุนเวียน key สิ่งเหล่านี้ทำให้ไม่เหมาะสมสำหรับสภาพแวดล้อมการใช้งานจริงโดยไม่มีการพัฒนาเพิ่มเติมอย่างมาก

ข้อจำกัดของส่วนขยาย jwt_context

  • อัลกอริทึมที่รองรับ: รองรับเฉพาะ HS256 (HMAC) และ ES256 (ECDSA) เท่านั้น
  • ฟีเจอร์ที่ขาดหายไป: การตรวจสอบการหมดอายุของโทเค็น การจัดการการหมุนเวียนคีย์ การเข้ารหัสข้อมูลในโทเค็น
  • ข้อกำหนดด้านความปลอดภัย: ต้องใช้ระดับสิทธิ์ SUSET สำหรับการกำหนดค่าคีย์ การเข้าถึงแบบ superuser อาจส่งผลเสียต่อความปลอดภัย
  • Connection Pooling: ต้องมีการจัดการ session context และการล้างข้อมูลที่เหมาะสมระหว่างการใช้งานการเชื่อมต่อซ้ำ

การยอมรับในอุตสาหกรรมและแนวโน้มในอนาคต

แม้จะมีข้อกังวลด้านความปลอดภัย แต่ระบบ JWT-based authentication และ authorization ยังคงได้รับการยอมรับอย่างกว้างขวางในอุตสาหกรรม องค์กรจำนวนมากยังคงใช้ JWT tokens เพื่อความสะดวกและการทำงานร่วมกัน โดยมักไม่ทราบถึงความเสี่ยงด้านความปลอดภัยที่แท้จริง การถกเถียงนี้เน้นย้ำถึงความท้าทายที่กว้างขวางกว่าในอุตสaหกรรมเทคโนโลยี: การสร้างสมดุลระหว่างความสะดวกและการมาตรฐานกับแนวปฏิบัติที่ดีด้านความปลอดภัย

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

เนื่องจากส่วนขยายยังคงอยู่ในสถานะทดลอง ความคิดเห็นจากชุมชนอาจมีอิทธิพลต่อทิศทางการพัฒนาในอนาคต ว่านักพัฒนาจะแก้ไขข้อกังวลด้านความปลอดภัยโดยการเปลี่ยนไปใช้รูปแบบ token ทางเลือกหรือใช้มาตรการป้องกันเพิ่มเติมหรือไม่ยังคงต้องติดตามดู

อ้างอิง: Using JWT to establish a trusted context for RLS