PlusMagi's Blog By Pitt Phunsanit Cloud Computing,Database กำหนดสิทธิ์การเข้าถึงไฟล์และไดเรกทอรีตามหลักสิทธิ์ขั้นต่ำ (Least Privilege)

กำหนดสิทธิ์การเข้าถึงไฟล์และไดเรกทอรีตามหลักสิทธิ์ขั้นต่ำ (Least Privilege)

ในโลกของระบบฐานข้อมูลที่ซับซ้อน การรักษาความปลอดภัยของข้อมูล (Data Security) ถือเป็นหัวใจสำคัญที่สุด การกำหนดสิทธิ์การเข้าถึงที่ถูกต้องจึงไม่ใช่แค่ข้อแนะนำ แต่เป็นกลไกป้องกันความเสียหายที่ขาดไม่ได้ หากระบบใดมีการมอบสิทธิ์ที่มากเกินความจำเป็น (Over-privileged) เมื่อเกิดการโจมตีขึ้น ผู้โจมตีจะสามารถใช้สิทธิ์เหล่านั้นในการเคลื่อนที่ในระบบ (Lateral Movement) และเข้าถึงข้อมูลที่ละเอียดอ่อนได้

หลักการสำคัญที่ต้องนำมาใช้คือ หลักสิทธิ์ขั้นต่ำ (Principle of Least Privilege – PoLP) ซึ่งกำหนดให้ผู้ใช้งาน (User), บทบาท (Role), หรือแอปพลิเคชัน แต่ละตัว จะได้รับสิทธิ์ในการเข้าถึงทรัพยากร (เช่น ตาราง, Schema, ฟังก์ชัน) เท่าที่จำเป็นต่อการปฏิบัติภารกิจที่ได้รับมอบหมายเท่านั้น ห้ามมอบสิทธิ์ใด ๆ ที่เกินขอบเขตการทำงานโดยเด็ดขาด

💡 Least Privilege คืออะไรและทำไมต้องใช้ใน PostgreSQL?

ในบริบทของ PostgreSQL, การใช้ PoLP หมายถึงการจำกัดสิทธิ์ผ่านการจัดการ Role และ Schema อย่างเข้มงวด แทนที่จะให้ผู้ใช้ทุกคนมีสิทธิ์เข้าถึงฐานข้อมูลทั้งหมด เราจะสร้าง Role เฉพาะสำหรับแต่ละแอปพลิเคชันหรือฟังก์ชันงาน และมอบสิทธิ์เฉพาะที่จำเป็นเท่านั้น

การดำเนินการนี้ช่วยลด พื้นที่ผิวของการโจมตี (Attack Surface) ได้อย่างมหาศาล หากแอปพลิเคชันส่วนหน้าถูกแฮ็กด้วย Role ที่มีสิทธิ์จำกัด ผู้โจมตีก็จะถูกจำกัดขอบเขตความเสียหาย (Damage Limitation) ไม่ให้เข้าถึงข้อมูลสำคัญอื่น ๆ ได้

⚙️ การกำหนดสิทธิ์ขั้นต่ำด้วย PostgreSQL Syntax

การควบคุมสิทธิ์ใน PostgreSQL อาศัยคำสั่ง GRANT และ REVOKE อย่างแม่นยำ เราต้องกำหนดสิทธิ์ให้เฉพาะ Role ที่ต้องการเท่านั้น และต้องระบุ Object (เช่น Schema หรือ Table) อย่างเจาะจง ไม่ใช่การให้สิทธิ์ทั้งฐานข้อมูล

ตัวอย่างการจำกัดสิทธิ์สำหรับแอปพลิเคชัน (App User)

สมมติว่าเรามี Role ชื่อ reporting_service ซึ่งมีหน้าที่เพียงแค่เรียกดูข้อมูล (SELECT) จากตารางรายงานเท่านั้น ไม่ควรมีสิทธิ์ในการแก้ไขหรือลบข้อมูล

SQL

-- 1. สร้าง Role สำหรับบริการรายงาน (กำหนดสิทธิ์ขั้นต่ำ) --
CREATE ROLE reporting_service LOGIN PASSWORD 'secure_pass';

-- 2. มอบสิทธิ์ SELECT เฉพาะตารางที่จำเป็นเท่านั้น --
GRANT SELECT ON TABLE project_data.report_summary TO reporting_service;

-- 3. ป้องกันสิทธิ์อื่น ๆ ที่เกินจำเป็น (ป้องกันการ INSERT/UPDATE/DELETE) --
-- (โดยปกติถ้าไม่ได้ GRANT จะไม่มีสิทธิ์อยู่แล้ว แต่การระบุชัดเจนช่วยเน้นย้ำ)
REVOKE INSERT, UPDATE, DELETE ON TABLE project_data.report_summary FROM reporting_service;

-- 4. ทดสอบการเข้าถึง (User นี้ทำได้แค่ SELECT เท่านั้น) --
-- SELECT * FROM project_data.report_summary;

จากตัวอย่างข้างต้น เราได้จำกัด reporting_service ให้มีสิทธิ์เพียง SELECT เท่านั้น แม้ว่า Role นี้จะถูกบุกรุก ผู้โจมตีก็จะไม่สามารถใช้คำสั่ง UPDATE หรือ DELETE ได้เลย

✅ บทสรุปและแนวปฏิบัติที่ดีที่สุด

การนำหลัก Least Privilege มาใช้ในการจัดการสิทธิ์ของ PostgreSQL ไม่ใช่แค่การเขียนโค้ด แต่คือการปรับกระบวนทัศน์ด้านความปลอดภัยทั้งหมด ควรมีการทบทวนสิทธิ์ (Permission Audit) อย่างสม่ำเสมอ โดยเฉพาะเมื่อมีการเพิ่มฟังก์ชันใหม่หรือมีการเปลี่ยนแปลงโครงสร้างข้อมูล เพื่อให้มั่นใจว่าทุก Role ได้รับสิทธิ์ที่จำเป็นและไม่มีสิทธิ์ที่เกินความจำเป็นหลงเหลืออยู่ การทำเช่นนี้จะช่วยยกระดับความมั่นคงปลอดภัยของระบบฐานข้อมูลของคุณได้อย่างยั่งยืน