หมวดหมู่: Security Engineering

Print Auditing & LoggingPrint Auditing & Logging

ในฐานะ System Architect ที่ดูแลระบบฐานข้อมูลระดับองค์กร การทำ Auditing และ Logging ไม่ใช่เพียงแค่การบันทึกกิจกรรม แต่คือกลไกสำคัญในการรักษาความปลอดภัย (Security) และการปฏิบัติตามข้อกำหนด (Compliance) สำหรับ PostgreSQL ซึ่งเป็นระบบฐานข้อมูล Open Source ที่ทรงพลัง การทำความเข้าใจวิธีการติดตามว่าใครทำอะไร เมื่อไหร่ และที่ไหน จึงเป็นสิ่งจำเป็นอย่างยิ่ง

Understanding PostgreSQL Auditing Principles

Auditing คือกระบวนการตรวจสอบและบันทึกเหตุการณ์ที่เกิดขึ้นในระบบอย่างละเอียด เพื่อให้สามารถย้อนรอย (Traceability) การเปลี่ยนแปลงข้อมูลได้ ในบริบทของ PostgreSQL การ Logging สามารถทำได้หลายระดับ ตั้งแต่การบันทึกคำสั่ง SQL ทั้งหมด ไปจนถึงการติดตามการเข้าถึงข้อมูลในระดับแถว (Row-Level) ด้วยการใช้ฟีเจอร์เฉพาะทาง

Key PostgreSQL Methods for Logging

การตรวจสอบกิจกรรมใน PostgreSQL สามารถทำได้หลายวิธี โดยแต่ละวิธีมีจุดเด่นที่แตกต่างกัน:

  1. Using the pgaudit Extension: นี่คือวิธีที่แนะนำที่สุดสำหรับงาน Auditing ระดับมืออาชีพ pgaudit เป็นส่วนขยายที่ออกแบบมาเพื่อบันทึกข้อมูลการตรวจสอบที่ครอบคลุม (เช่น การเข้าสู่ระบบ, การดำเนินการ DDL, และคำสั่ง SELECT ที่ละเอียด) โดยไม่กระทบต่อประสิทธิภาพการทำงานหลักมากนัก
  2. Database Triggers: สำหรับการตรวจสอบที่ต้องการความเฉพาะเจาะจงสูง (เช่น การบันทึกว่าใครแก้ไขข้อมูลในตาราง ‘users’ โดยเฉพาะ) การใช้ TRIGGER ร่วมกับฟังก์ชัน (Function) เป็นวิธีที่ทรงพลังที่สุด เพราะสามารถกำหนด Logic การบันทึกได้เอง
  3. Built-in Logging Parameters: การตั้งค่า log_statement หรือ log_min_duration_statement ในไฟล์ postgresql.conf ช่วยให้เราสามารถบันทึกคำสั่ง SQL ที่ถูกรันออกมาได้ทั้งหมด ซึ่งมีประโยชน์ในการ Debugging และการตรวจสอบเบื้องต้น

Implementing Row-Level Auditing with Triggers

เพื่อแสดงให้เห็นถึงการทำ Auditing ที่เจาะจงถึงระดับแถว (Row-Level) เราจะใช้ตัวอย่างการสร้าง Trigger เพื่อบันทึกการเปลี่ยนแปลงข้อมูลในตารางสมมติชื่อ products

SQL

-- 1. สร้างตารางสำหรับบันทึก Audit Log (Audit Log Table) --------------------
CREATE TABLE product_audit_log (
    log_id SERIAL PRIMARY KEY,
    table_name TEXT NOT NULL,
    operation TEXT NOT NULL, -- INSERT, UPDATE, DELETE
    old_data JSONB,
    new_data JSONB,
    changed_by TEXT DEFAULT CURRENT_USER,
    changed_at TIMESTAMP DEFAULT NOW()
);

-- 2. สร้างฟังก์ชันสำหรับจัดการการบันทึก Log ------------------------------------
CREATE OR REPLACE FUNCTION log_product_changes() RETURNS TRIGGER AS $$
BEGIN
    IF (TG_OP = 'INSERT') THEN
        INSERT INTO product_audit_log (table_name, operation, new_data) VALUES ('products', 'INSERT', to_jsonb(NEW));
        RETURN NEW;
    ELSIF (TG_OP = 'UPDATE') THEN
        INSERT INTO product_audit_log (table_name, operation, old_data, new_data) VALUES ('products', 'UPDATE', to_jsonb(OLD), to_jsonb(NEW));
        RETURN NEW;
    ELSIF (TG_OP = 'DELETE') THEN
        INSERT INTO product_audit_log (table_name, operation, old_data) VALUES ('products', 'DELETE', to_jsonb(OLD));
        RETURN OLD;
    END IF;
    RETURN NULL;
END;$$
LANGUAGE plpgsql;

-- 3. สร้าง Trigger เพื่อเรียกใช้ฟังก์ชันเมื่อมีการเปลี่ยนแปลงข้อมูล -----------------
CREATE TRIGGER product_audit_trigger
AFTER INSERT OR UPDATE OR DELETE ON products
FOR EACH ROW EXECUTE FUNCTION log_product_changes();

-- ตัวอย่างการใช้งาน (การบันทึกข้อมูล)
INSERT INTO products (product_id, name, price) VALUES (1, 'apple', 1.00);
UPDATE products SET price = 1.10 WHERE product_id = 1;

Conclusion: Ensuring Data Integrity and Compliance

การรวมระบบ PostgreSQL เข้ากับกลไก Auditing ที่เหมาะสม ไม่ว่าจะเป็นการใช้ pgaudit หรือการสร้าง Trigger ที่กำหนดเอง จะช่วยให้องค์กรสามารถสร้างหลักฐานการตรวจสอบที่เชื่อถือได้ (Reliable Audit Trail) สิ่งนี้ไม่เพียงแต่ช่วยในการแก้ไขปัญหาความผิดพลาดของข้อมูลเท่านั้น แต่ยังเป็นข้อกำหนดพื้นฐานในการรักษามาตรฐานความปลอดภัยของข้อมูลตามข้อบังคับต่างๆ เช่น GDPR หรือ HIPAA อีกด้วย การวางแผน Logging ที่รอบด้านจึงเป็นหัวใจสำคัญของสถาปัตยกรรมฐานข้อมูลที่แข็งแกร่ง