ทำไมระบบจัดการสิทธิ์ถึงเป็นเรื่องปวดหัวของมือใหม่
เวลาเราเริ่มฝึกเขียนโปรแกรมโดยเฉพาะการทำเว็บแอปพลิเคชัน เรามักจะโฟกัสที่การสร้างฟีเจอร์ให้ทำงานได้จริง แต่พอแอปเริ่มใหญ่ขึ้น เราจะเริ่มเจอคำถามสำคัญว่า ใครมีสิทธิ์ทำอะไรได้บ้าง ซึ่งเรื่องนี้ในวงการเราเรียกว่า Access Control (การควบคุมการเข้าถึงข้อมูล)
ลองนึกภาพว่าคุณสร้างแอปโซเชียลมีเดียขึ้นมาหนึ่งตัว คุณต้องคอยเช็กว่าคนนี้เป็นเจ้าของโพสต์ไหม หรือคนนี้เป็นแค่คนอ่านทั่วไป หากเราเขียนโค้ดจัดการสิทธิ์เหล่านี้กระจัดกระจายไปทั่ว ทั้งในฐานข้อมูล ทั้งในโค้ดฝั่งเซิร์ฟเวอร์ มันจะกลายเป็น Technical Debt (หนี้ทางเทคนิค หรือภาระจากการเขียนโค้ดที่ไม่เป็นระเบียบ) ที่ตามมาหลอกหลอนเราในอนาคต
การจัดการสิทธิ์ที่ซับซ้อนมักจะซ่อนอยู่ใน Database (ฐานข้อมูล) หรือนโยบายความปลอดภัยที่เรียกว่า RLS (Row Level Security หรือการจำกัดสิทธิ์เข้าถึงข้อมูลเป็นรายแถว) ซึ่งถ้าเรามองไม่เห็นภาพรวม เราก็มักจะเผลอปล่อยให้คนที่ไม่ควรเห็นข้อมูล เข้าไปดูข้อมูลลับของคนอื่นได้ง่ายๆ โดยไม่รู้ตัว
รู้จักกับ Permetra ตัวช่วยมองเห็นโครงสร้างความปลอดภัย
Permetra คือเครื่องมือแบบ Open-source (ซอฟต์แวร์ที่เปิดเผยโค้ดต้นฉบับให้ทุกคนนำไปใช้หรือพัฒนาต่อได้) ที่ผมกำลังสร้างขึ้นมาเพื่อแก้ปัญหาเรื่องการมองไม่เห็นเส้นทางการเข้าถึงข้อมูลใน Supabase (แพลตฟอร์มฐานข้อมูลบนคลาวด์ที่ช่วยให้เราสร้างแอปได้เร็วขึ้น)
หลักการของมันคือการเปลี่ยนความสัมพันธ์ที่ยุ่งเหยิงระหว่าง ผู้ใช้, บทบาท, ตารางข้อมูล และนโยบายความปลอดภัย ให้กลายเป็น Graph (โครงสร้างข้อมูลแบบเครือข่ายที่มีจุดเชื่อมต่อกัน) เหมือนกับแผนที่ที่ทำให้เราเห็นว่า เส้นทางไหนบ้างที่เชื่อมไปถึงข้อมูลสำคัญของเราได้
เป้าหมายคือการทำให้โปรแกรมเมอร์มือใหม่หรือแม้แต่ทีมงานมืออาชีพ สามารถเข้าใจความปลอดภัยของตัวเองได้ด้วยตาเปล่า ไม่ต้องคอยนั่งไล่เช็กคำสั่ง SQL (ภาษาที่ใช้คุยกับฐานข้อมูล) ทีละบรรทัดเหมือนที่ผ่านมา เพราะการเห็นภาพรวมจะช่วยให้เราตรวจจับช่องโหว่ได้ก่อนที่ปัญหาจะเกิดขึ้นจริง
เริ่มต้นสร้างโปรเจกต์ด้วยการวิเคราะห์ความสัมพันธ์
ในการเขียนโปรแกรมเพื่อสร้างเครื่องมือวิเคราะห์ เราต้องเริ่มจากการดึงข้อมูลออกมาจากระบบก่อน ใน Supabase เราสามารถใช้ Client Library (ชุดคำสั่งสำเร็จรูปที่เตรียมไว้ให้เราเรียกใช้) เพื่อดึงข้อมูล Metadata หรือโครงสร้างตารางออกมา เพื่อนำไปวาดเป็นแผนผัง
ตัวอย่างการดึงข้อมูลเพื่อมาทำความเข้าใจสิทธิ์ในฐานข้อมูลเบื้องต้น คุณสามารถลองเขียนโค้ดในฝั่ง Node.js (สภาพแวดล้อมที่รัน JavaScript นอกเบราว์เซอร์) เพื่อดึงรายชื่อตารางและนโยบายความปลอดภัยออกมาได้ดังนี้
// ดึงข้อมูลนโยบาย RLS จากฐานข้อมูล
const { data, error } = await supabase
.from('policies')
.select('*');
if (error) console.error('เกิดข้อผิดพลาด:', error);
else console.log('นโยบายที่พบ:', data);
โค้ดส่วนนี้ใช้คำสั่ง supabase.from เพื่อระบุตารางที่เราต้องการดึงข้อมูล จากนั้นใช้ .select('*') เพื่อเลือกเอาทุกอย่างออกมา แล้วตรวจสอบว่ามี error (ข้อผิดพลาด) หรือไม่ก่อนจะแสดงผลลัพธ์ออกมาให้เราเห็น
ผลลัพธ์ที่ได้จะเป็นรายการของนโยบายความปลอดภัยทั้งหมดในฐานข้อมูลของคุณ ซึ่งถ้าคุณมีนโยบายที่เขียนไว้ไม่ถูกต้อง หรือเปิดกว้างเกินไป คุณจะเห็นมันได้ทันทีจากข้อมูลชุดนี้ที่ดึงออกมาได้
ปัญหาที่มือใหม่มักพลาดเมื่อทำระบบความปลอดภัย
ความผิดพลาดที่พบบ่อยที่สุดคือการ Over-permissioning (การให้สิทธิ์มากเกินความจำเป็น) เช่น การตั้งค่าให้ทุกคนสามารถอ่านข้อมูลในตารางผู้ใช้ได้ทั้งหมดเพียงเพราะกลัวว่าแอปจะพัง ซึ่งจริงๆ แล้วเราควรจำกัดให้เข้าถึงได้แค่ข้อมูลของตัวเองเท่านั้น
อีกจุดหนึ่งคือการลืมตรวจสอบ Tenant Isolation (การแยกข้อมูลระหว่างผู้ใช้งานหรือองค์กรออกจากกัน) ถ้าคุณทำแอปที่มีหลายบริษัทใช้งานร่วมกัน คุณต้องมั่นใจว่าบริษัท A จะไม่มีทางเห็นข้อมูลของบริษัท B ได้เลย แม้จะอยู่ในฐานข้อมูลเดียวกันก็ตาม
การใช้เครื่องมืออย่าง Permetra จะช่วยให้คุณเห็นเส้นทางเหล่านี้ได้ชัดเจนขึ้น หากคุณเห็นเส้นที่เชื่อมต่อผิดพลาดในกราฟ คุณจะรู้ตัวทันทีว่าต้องกลับไปแก้ RLS Policy (นโยบายความปลอดภัยรายแถว) ตรงไหน เพื่ออุดรอยรั่วก่อนที่จะ Deploy งานขึ้นเซิร์ฟเวอร์จริง
วิธีฝึกฝนเพื่อเป็นโปรแกรมเมอร์ที่ใส่ใจความปลอดภัย
การเป็นโปรแกรมเมอร์ที่เก่งไม่ได้วัดกันแค่ว่าเขียนโค้ดเร็วแค่ไหน แต่วัดกันที่การเขียนโค้ดที่ปลอดภัยและตรวจสอบได้ คุณควรเริ่มจากการทำโปรเจกต์เล็กๆ ของตัวเอง แล้วลองตั้งคำถามเสมอว่า "ถ้ามีคนพยายามเข้าถึงข้อมูลนี้โดยไม่ได้รับอนุญาต เขาจะทำได้ไหม"
ลองฝึกใช้เครื่องมือจำลองหรือ Visualizer (เครื่องมือช่วยแสดงภาพข้อมูล) เพื่อดูว่าข้อมูลในแอปของคุณไหลไปทางไหนบ้าง การมองเห็นภาพจะช่วยให้คุณจำศัพท์เทคนิคและหลักการทำงานได้แม่นยำขึ้น มากกว่าการอ่านตำราเพียงอย่างเดียว
หากคุณสนใจเรื่องความปลอดภัยของฐานข้อมูล ผมแนะนำให้ลองศึกษาเรื่อง Principle of Least Privilege (หลักการให้สิทธิ์ขั้นต่ำที่จำเป็น) ซึ่งเป็นหัวใจสำคัญของโปรแกรมเมอร์ทุกคน ไม่ว่าคุณจะเพิ่งเริ่มหัดเขียนโค้ดหรือเป็นมืออาชีพแล้วก็ตาม
สรุปและก้าวต่อไป
การสร้าง Permetra คือการเดินทางของผมในการทำให้เรื่องความปลอดภัยที่ดูยาก เข้าใจได้ง่ายขึ้นสำหรับทุกคน การที่คุณเข้าใจว่าสิทธิ์ในแอปทำงานอย่างไร จะทำให้คุณก้าวข้ามจากมือใหม่ไปสู่การเป็น Software Engineer (วิศวกรซอฟต์แวร์) ที่มีคุณภาพและรอบคอบ
หากคุณกำลังทำโปรเจกต์ด้วย Supabase อยู่ตอนนี้ ลองใช้เวลาสักนิดสำรวจดูว่านโยบายความปลอดภัยของคุณรัดกุมพอหรือยัง การทดลองใช้เครื่องมือใหม่ๆ หรือแม้แต่การมีส่วนร่วมในโปรเจกต์ Open-source จะช่วยให้คุณเก่งขึ้นอย่างรวดเร็ว
สุดท้ายนี้ หากใครสนใจอยากร่วมทดสอบหรือให้คำแนะนำเกี่ยวกับ Permetra สามารถติดตามความเคลื่อนไหวได้ตลอดเวลา ยิ่งคุณได้ลองลงมือทำและเจอปัญหาด้วยตัวเอง คุณจะยิ่งค้นพบว่าการเขียนโปรแกรมไม่ใช่เรื่องน่ากลัว แต่เป็นเรื่องสนุกที่ท้าทายความคิดสร้างสรรค์ของเราอยู่เสมอครับ
ที่มา: I’m building Permetra an open-source access graph for Supabase — DEV Community