PlusMagi's Blog By Pitt Phunsanit Database Shell Script: เจาะลึกความแตกต่างระหว่าง Real, Effective, Saved UIDs

Shell Script: เจาะลึกความแตกต่างระหว่าง Real, Effective, Saved UIDs

ในโลกของการพัฒนาแอปพลิเคชันที่ต้องมีการเชื่อมต่อฐานข้อมูลอย่างปลอดภัย การทำความเข้าใจว่าใครกำลังเรียกใช้คำสั่ง และด้วยสิทธิ์ระดับใด เป็นสิ่งสำคัญอย่างยิ่งยวด แนวคิดเรื่อง User ID (UID) ที่เราคุ้นเคยในระบบปฏิบัติการ Unix/Linux อย่าง Real, Effective, และ Saved UIDs คือหลักการพื้นฐานของการจำกัดขอบเขตอำนาจ (Principle of Least Privilege) ซึ่งหลักการนี้ก็ถูกนำมาปรับใช้ในระบบฐานข้อมูลอย่าง PostgreSQL เพื่อให้มั่นใจว่าข้อมูลของคุณจะถูกเข้าถึงได้อย่างปลอดภัย

💡 แนวคิดหลัก: การจำกัดสิทธิ์ใน PostgreSQL (RUID vs EUID)

แม้ว่า PostgreSQL จะไม่ใช่ระบบปฏิบัติการ แต่ก็มีกลไกที่จำลองหลักการของ RUID/EUID ผ่านการจัดการ Role (บทบาท) และสิทธิ์การเข้าถึง (Privileges) โดยทั่วไปแล้ว เราสามารถเปรียบเทียบสถานะเหล่านี้ได้ดังนี้:

  • Real User ID (RUID) $\rightarrow$ เจ้าของ Role (Owner Role): คือบทบาทที่เป็นเจ้าของวัตถุ (Object) นั้นๆ อย่างแท้จริง เช่น เจ้าของตาราง (Table Owner) หรือ Schema Owner ซึ่งเป็นผู้ที่สร้างและมีสิทธิ์ควบคุมสูงสุด
  • Effective User ID (EUID) $\rightarrow$ บทบาทที่กำลังใช้งาน (Current Session Role): คือบทบาทที่ผู้ใช้กำลังเชื่อมต่อและรันคำสั่งอยู่ ณ ขณะนั้น (เช่น ใช้คำสั่ง `SET ROLE` หรือเชื่อมต่อด้วย `psql -U user`)
  • Saved/Supplementary UIDs $\rightarrow$ สมาชิก Role (Group Membership): คือกลุ่มบทบาทที่ผู้ใช้คนนั้นเป็นสมาชิกอยู่ ซึ่งทำให้ได้รับสิทธิ์เพิ่มเติมจากบทบาทเหล่านั้น

🔑 การตรวจสอบสิทธิ์ผู้ใช้ใน PostgreSQL

เราสามารถใช้ฟังก์ชันของ PostgreSQL เพื่อตรวจสอบว่าเซสชันปัจจุบันกำลังทำงานภายใต้บทบาทใด และบทบาทนั้นมีสิทธิ์อะไรบ้าง นี่คือตัวอย่างการตรวจสอบบทบาทที่กำลังใช้งาน (Effective Role) และการดูสิทธิ์ของ Role อื่นๆ:

SQL

-- 1. ตรวจสอบบทบาทที่กำลังใช้งาน (Effective Role) ในเซสชันนี้<br>SELECT current_user, current_setting('role') AS effective_role;<br><br>-- 2. ตรวจสอบว่าผู้ใช้คนนี้เป็นสมาชิกของ Role ใดบ้าง (Supplementary/Group Privileges)<br>SELECT rolname, rolsuper, rolinherit FROM pg_roles WHERE rolname IN ('app_user', 'analyst');<br><br>-- 3. การจำกัดสิทธิ์ (Principle of Least Privilege): กำหนดให้ Role A เข้าถึงได้เฉพาะ Schema X<br>GRANT SELECT ON SCHEMA app_schema TO app_user;<br>REVOKE DELETE ON app_schema FROM app_user;<br>

🛡️ การประยุกต์ใช้เพื่อความปลอดภัยสูงสุด

การเข้าใจความแตกต่างระหว่างเจ้าของ Role (RUID) และบทบาทที่กำลังใช้งาน (EUID) ช่วยให้เราสามารถออกแบบระบบที่ปลอดภัยยิ่งขึ้น ตัวอย่างเช่น หากเรามีตารางข้อมูลลูกค้า (customer_data) เราควรให้ Role A เป็นเจ้าของ (Owner) และให้ Role B (นักวิเคราะห์) มีสิทธิ์แค่ `SELECT` เท่านั้น โดยไม่ให้สิทธิ์ `DROP` หรือ `ALTER` เพื่อจำลองหลักการจำกัดอำนาจที่เข้มงวดที่สุด

✅ บทสรุป

การจัดการสิทธิ์ใน PostgreSQL ไม่ได้จำกัดอยู่แค่การสร้างผู้ใช้ แต่คือการกำหนดขอบเขตอำนาจให้ชัดเจน การใช้ `GRANT` และ `REVOKE` อย่างระมัดระวัง รวมถึงการเข้าใจว่า Role ใดเป็นเจ้าของ (Owner) และ Role ใดเป็นผู้ปฏิบัติงาน (Effective User) จะช่วยยกระดับความปลอดภัยของฐานข้อมูลของคุณได้อย่างมีนัยสำคัญ ทำให้ระบบของคุณมีความทนทานต่อการโจมตีและการเข้าถึงข้อมูลโดยไม่ได้รับอนุญาต

Exit mobile version