ความปลอดภัย (Security) เป็นหัวใจสำคัญในการใช้งานฐานข้อมูล PostgreSQL โดยเฉพาะเมื่อระบบต้องรองรับข้อมูลที่มีความอ่อนไหว เช่น ข้อมูลลูกค้า การเงิน หรือข้อมูลภายในองค์กร บทความนี้จะอธิบาย Best Practices ด้าน Security ได้แก่ TLS/SSL
, Encryption
, และ Row-Level Security (RLS)
1. การใช้ TLS/SSL
TLS (Transport Layer Security) หรือ SSL เป็นการเข้ารหัสข้อมูลที่ส่งระหว่าง Client ↔ Server เพื่อป้องกันการดักฟัง (Sniffing) และ Man-in-the-middle attack
การตั้งค่าใน postgresql.conf
# เปิดใช้งาน SSL ssl = on ssl_cert_file = 'server.crt' ssl_key_file = 'server.key' ssl_ca_file = 'rootCA.crt'
การตั้งค่าใน pg_hba.conf
# บังคับใช้ SSL hostssl all all 0.0.0.0/0 cert clientcert=1
2. การเข้ารหัสข้อมูล (Encryption)
PostgreSQL รองรับการเข้ารหัสข้อมูลได้หลายระดับ เช่น – Encryption at Rest (เข้ารหัสไฟล์ฐานข้อมูล) – Encryption in Transit (TLS) – Column-level Encryption ผ่าน Extension เช่น pgcrypto
ตัวอย่างการใช้ pgcrypto
CREATE EXTENSION pgcrypto; -- เก็บข้อมูลเข้ารหัส INSERT INTO users (id, name, email, secret_data) VALUES (1, 'Alice', '[email protected]', pgp_sym_encrypt('1234-5678-9012-3456', 'encryption-key')); -- อ่านข้อมูลแบบถอดรหัส SELECT id, name, pgp_sym_decrypt(secret_data::bytea, 'encryption-key') AS decrypted_data FROM users;
3. Row-Level Security (RLS)
RLS เป็นฟีเจอร์ที่อนุญาตให้กำหนดสิทธิ์การเข้าถึงข้อมูลในระดับ Row เช่น กำหนดให้ User เห็นเฉพาะข้อมูลของตัวเอง
การเปิดใช้งาน RLS
ALTER TABLE orders ENABLE ROW LEVEL SECURITY;
การสร้าง Policy
CREATE POLICY user_order_policy ON orders FOR SELECT USING (user_id = current_user_id());
ทดสอบการใช้งาน
-- ผู้ใช้ A จะเห็นเฉพาะ Order ของตัวเอง SELECT * FROM orders;
4. Security Best Practices
- บังคับใช้ TLS/SSL ทุกการเชื่อมต่อ
- ใช้
pgcrypto
สำหรับข้อมูลอ่อนไหว - เปิดใช้
Row-Level Security
เมื่อมีหลาย User ใช้ตารางร่วมกัน - จำกัดสิทธิ์ผู้ใช้ตามหลัก Least Privilege
- เปิดการ Audit Log เพื่อตรวจสอบความผิดปกติ
5. ตัวอย่างการตั้งค่า TLS + RLS ร่วมกัน
-- pg_hba.conf hostssl ordersdb app_user 0.0.0.0/0 cert clientcert=1 -- เปิด RLS ALTER TABLE orders ENABLE ROW LEVEL SECURITY; -- Policy CREATE POLICY user_order_policy ON orders FOR SELECT USING (user_id = current_user_id());
สรุป
การเพิ่มความปลอดภัยให้ PostgreSQL ไม่ได้ซับซ้อน แต่ต้องมีการวางแผนที่ดี TLS ช่วยป้องกันข้อมูลระหว่างทาง, Encryption ช่วยป้องกันข้อมูลภายใน, และ Row-Level Security ช่วยป้องกันการเข้าถึงข้อมูลที่ไม่ควรเข้าถึง หากนำทั้งหมดนี้มาใช้ร่วมกัน จะช่วยให้ระบบปลอดภัยและสอดคล้องกับมาตรฐานองค์กร
SEO Keywords
PostgreSQL Security,Postgres TLS Setup,Postgres pgcrypto Encryption,Postgres RLS Example,Database Security Best Practices,Encrypt Data PostgreSQL,Postgres Secure Connection