การจัดการ Role และสิทธิ์การเข้าถึง (Permissions) ใน PostgreSQL
ในบทที่แล้ว เราได้เรียนรู้เกี่ยวกับชนิดข้อมูลต่างๆ ใน PostgreSQL ซึ่งเป็นพื้นฐานสำคัญในการออกแบบฐานข้อมูล ในบทนี้ เราจะมาเรียนรู้เกี่ยวกับการจัดการ Role และสิทธิ์การเข้าถึง (Permissions) ซึ่งเป็นส่วนสำคัญในการรักษาความปลอดภัยของฐานข้อมูลของเรา การจัดการ Role และ Permissions ที่ดีจะช่วยให้เราสามารถควบคุมการเข้าถึงข้อมูลได้อย่างละเอียด ป้องกันการเข้าถึงโดยไม่ได้รับอนุญาต และรักษาความถูกต้องของข้อมูล
Role คืออะไร?
ใน PostgreSQL, Role คือ entity ที่สามารถเป็นเจ้าของ objects ในฐานข้อมูล (เช่น ตาราง, views, sequences) และสามารถมีสิทธิ์การเข้าถึง objects เหล่านั้นได้ Role สามารถเป็นได้ทั้ง:
- User: Role ที่สามารถ login เข้าสู่ฐานข้อมูลได้ (โดยทั่วไปคือผู้ใช้งาน)
- Group: Role ที่ใช้เพื่อจัดกลุ่ม users และให้สิทธิ์การเข้าถึงร่วมกัน (ไม่สามารถ login ได้โดยตรง)
การแยก Role ออกเป็น User และ Group ช่วยให้การจัดการสิทธิ์การเข้าถึงง่ายขึ้น เมื่อมีผู้ใช้งานใหม่ เราเพียงแค่เพิ่มผู้ใช้งานนั้นเข้าสู่ Group ที่เหมาะสม สิทธิ์การเข้าถึงก็จะถูกถ่ายทอดไปยังผู้ใช้งานใหม่โดยอัตโนมัติ
การสร้าง Role
เราสามารถสร้าง Role ได้โดยใช้คำสั่ง CREATE ROLE ใน psql หรือเครื่องมือจัดการฐานข้อมูลอื่นๆ
-- สร้าง User Role ชื่อ 'john' พร้อม password
CREATE ROLE john WITH LOGIN PASSWORD 'secure_password';
-- สร้าง Group Role ชื่อ 'developers'
CREATE ROLE developers;
คำอธิบาย:
CREATE ROLE john: สร้าง Role ชื่อ 'john'WITH LOGIN: ระบุว่า Role นี้สามารถ login เข้าสู่ฐานข้อมูลได้PASSWORD 'secure_password': กำหนด password สำหรับ Role นี้ (ควรใช้ password ที่แข็งแกร่ง)CREATE ROLE developers: สร้าง Role ชื่อ 'developers' ซึ่งในกรณีนี้เป็น Group Role (โดย default จะไม่สามารถ login ได้)
เหตุผลเชิงออกแบบ:
- การกำหนด password ให้กับ User Role เป็นสิ่งจำเป็นเพื่อความปลอดภัย หากไม่มี password ใครก็ตามที่รู้ username สามารถเข้าถึงฐานข้อมูลได้
- การใช้ Group Role ช่วยลดความซ้ำซ้อนในการกำหนดสิทธิ์การเข้าถึง หากมีผู้ใช้งานหลายคนที่ต้องการสิทธิ์เดียวกัน เราสามารถกำหนดสิทธิ์ให้กับ Group Role แล้วเพิ่มผู้ใช้งานเหล่านั้นเข้าสู่ Group แทนที่จะต้องกำหนดสิทธิ์ให้กับผู้ใช้งานแต่ละคน
การกำหนดสิทธิ์การเข้าถึง (Permissions)
PostgreSQL ใช้คำสั่ง GRANT และ REVOKE เพื่อจัดการสิทธิ์การเข้าถึง objects ในฐานข้อมูล สิทธิ์การเข้าถึงต่างๆ ได้แก่:
SELECT: อนุญาตให้อ่านข้อมูลจากตารางหรือ viewINSERT: อนุญาตให้เพิ่มข้อมูลใหม่ลงในตารางUPDATE: อนุญาตให้แก้ไขข้อมูลในตารางDELETE: อนุญาตให้ลบข้อมูลออกจากตารางUSAGE: อนุญาตให้ใช้ sequence หรือ functionCREATE: อนุญาตให้สร้าง objects ใหม่ (เช่น ตาราง, view)CONNECT: อนุญาตให้เชื่อมต่อกับฐานข้อมูลTEMPORARYหรือTEMP: อนุญาตให้สร้าง temporary tablesEXECUTE: อนุญาตให้ execute function หรือ procedureALL PRIVILEGES: อนุญาตให้ทำทุกอย่าง (สิทธิ์สูงสุด)
ตัวอย่างการใช้งาน:
-- ให้สิทธิ์ SELECT บนตาราง 'products' แก่ User Role 'john'
GRANT SELECT ON TABLE products TO john;
-- ให้สิทธิ์ INSERT, UPDATE, DELETE บนตาราง 'orders' แก่ Group Role 'developers'
GRANT INSERT, UPDATE, DELETE ON TABLE orders TO developers;
-- ให้สิทธิ์ USAGE บน sequence 'product_id_seq' แก่ User Role 'john'
GRANT USAGE ON SEQUENCE product_id_seq TO john;
-- ยกเลิกสิทธิ์ SELECT บนตาราง 'products' จาก User Role 'john'
REVOKE SELECT ON TABLE products FROM john;
คำอธิบาย:
GRANT SELECT ON TABLE products TO john: ให้สิทธิ์SELECTบนตารางproductsแก่ User RolejohnGRANT INSERT, UPDATE, DELETE ON TABLE orders TO developers: ให้สิทธิ์INSERT,UPDATE, และDELETEบนตารางordersแก่ Group RoledevelopersREVOKE SELECT ON TABLE products FROM john: ยกเลิกสิทธิ์SELECTบนตารางproductsจาก User Rolejohn
เหตุผลเชิงออกแบบ:
- การให้สิทธิ์เฉพาะที่จำเป็น (principle of least privilege) เป็นแนวทางปฏิบัติที่ดีในการรักษาความปลอดภัยของฐานข้อมูล ไม่ควรให้สิทธิ์
ALL PRIVILEGESกับ Role ใดๆ หากไม่จำเป็น - การใช้ Group Role ช่วยให้การจัดการสิทธิ์ง่ายขึ้น และลดข้อผิดพลาดที่อาจเกิดขึ้นจากการกำหนดสิทธิ์ให้กับผู้ใช้งานแต่ละคน
การจัดการ Role
เราสามารถแก้ไข Role ได้โดยใช้คำสั่ง ALTER ROLE
-- เปลี่ยน password ของ User Role 'john'
ALTER ROLE john WITH PASSWORD 'new_secure_password';
-- เพิ่ม User Role 'john' เข้าสู่ Group Role 'developers'
GRANT developers TO john;
-- ลบ User Role 'john' ออกจาก Group Role 'developers'
REVOKE developers FROM john;
-- เปลี่ยน superuser status ของ Role
ALTER ROLE john WITH SUPERUSER; -- ให้สิทธิ์ superuser
ALTER ROLE john WITH NOSUPERUSER; -- ยกเลิกสิทธิ์ superuser
คำอธิบาย:
ALTER ROLE john WITH PASSWORD 'new_secure_password': เปลี่ยน password ของ User RolejohnGRANT developers TO john: เพิ่ม User Rolejohnเข้าสู่ Group RoledevelopersREVOKE developers FROM john: ลบ User Rolejohnออกจาก Group RoledevelopersALTER ROLE john WITH SUPERUSER: ให้สิทธิ์ superuser แก่ User Rolejohn(ข้อควรระวัง: ควรให้สิทธิ์นี้เฉพาะ Role ที่จำเป็นเท่านั้น)ALTER ROLE john WITH NOSUPERUSER: ยกเลิกสิทธิ์ superuser จาก User Rolejohn
เหตุผลเชิงออกแบบ:
- การเปลี่ยน password เป็นประจำช่วยลดความเสี่ยงจากการถูกโจมตี
- การเพิ่ม/ลบ User Role ออกจาก Group Role เป็นวิธีที่ง่ายและมีประสิทธิภาพในการจัดการสิทธิ์การเข้าถึง
- การให้สิทธิ์ superuser ควรทำด้วยความระมัดระวัง เนื่องจาก Role ที่มีสิทธิ์นี้สามารถทำทุกอย่างในฐานข้อมูลได้
แนวปฏิบัติที่ดีในการจัดการ Role และ Permissions
- Principle of Least Privilege: ให้สิทธิ์เฉพาะที่จำเป็นเท่านั้น
- ใช้ Group Roles: จัดกลุ่ม users และให้สิทธิ์ผ่าน Group Roles
- ตรวจสอบสิทธิ์เป็นประจำ: ตรวจสอบสิทธิ์การเข้าถึงและปรับปรุงตามความจำเป็น
- ใช้ Role ที่มีสิทธิ์ superuser อย่างระมัดระวัง: ให้สิทธิ์ superuser เฉพาะ Role ที่จำเป็นเท่านั้น
- บันทึกการเปลี่ยนแปลงสิทธิ์: บันทึกการเปลี่ยนแปลงสิทธิ์การเข้าถึงเพื่อตรวจสอบย้อนหลัง
- ตั้งชื่อ Role ให้สื่อความหมาย: ทำให้ง่ายต่อการเข้าใจบทบาทและหน้าที่ของ Role
- ใช้ password ที่แข็งแกร่ง: สำหรับ User Roles ที่สามารถ login ได้
สรุป:
การจัดการ Role และสิทธิ์การเข้าถึง (Permissions) เป็นส่วนสำคัญในการรักษาความปลอดภัยของฐานข้อมูล PostgreSQL การสร้างและจัดการ Role อย่างถูกต้อง การกำหนดสิทธิ์การเข้าถึงที่เหมาะสม และการปฏิบัติตามแนวทางปฏิบัติที่ดี จะช่วยให้เราสามารถควบคุมการเข้าถึงข้อมูลได้อย่างละเอียด ป้องกันการเข้าถึงโดยไม่ได้รับอนุญาต และรักษาความถูกต้องของข้อมูล ในบทถัดไป เราจะเริ่มต้นเรียนรู้เกี่ยวกับ SQL Queries เบื้องต้น ซึ่งเป็นหัวใจสำคัญของการทำงานกับฐานข้อมูล