ป้ายกำกับ: Schema Audit

Linux: ตรวจหาไฟล์แปลกปลอม ปรับแต่ง (Custom Files) ทั่วทั้งระบบLinux: ตรวจหาไฟล์แปลกปลอม ปรับแต่ง (Custom Files) ทั่วทั้งระบบ

ในฐานะ System Architect ที่ดูแลระบบฐานข้อมูลขนาดใหญ่ การเผชิญหน้ากับ ‘ข้อมูลแปลกปลอม’ หรือ ‘Object ที่ถูกปรับแต่ง’ โดยไม่ทราบที่มา เป็นปัญหาคลาสสิกที่อาจนำไปสู่ความไม่เสถียรของระบบได้ ไม่ว่าจะเป็นไฟล์คอนฟิกที่ถูกเพิ่มเข้ามานอกเหนือจากกระบวนการปกติ หรือ Object ในฐานข้อมูลที่ถูกสร้างขึ้นโดยผู้ใช้รายอื่นโดยไม่มีการบันทึก

สำหรับระบบฐานข้อมูล PostgreSQL การดูแลความสมบูรณ์ (Integrity) ไม่ได้หมายถึงการสแกนไฟล์ระบบ แต่หมายถึงการตรวจสอบความสอดคล้องของโครงสร้างข้อมูล (Schema) และ Object ต่างๆ ที่ถูกสร้างขึ้นใน Catalog ของระบบ การตามหา Object ที่ไม่ใช่ส่วนหนึ่งของ Core System Schema จึงเป็นทักษะสำคัญที่ Senior DBA ต้องมี

🔍 หลักการตรวจสอบ Object ที่ถูกเพิ่มแต่งใน PostgreSQL

เมื่อเราพูดถึง ‘Custom Files’ ในบริบทของ PostgreSQL เรากำลังพูดถึง Object ต่างๆ เช่น ตาราง (Tables), มุมมอง (Views), หรือ Extensions ที่ถูกสร้างขึ้นใน Schema ที่ไม่เป็นมาตรฐาน หรือ Object ที่ถูกแก้ไขค่า Configuration ในระดับ Instance โดยที่เราไม่ทราบว่าใครเป็นผู้ทำ

เราสามารถใช้ System Catalog ของ PostgreSQL เพื่อดึงข้อมูลเหล่านี้ออกมาได้ โดยการ Query ข้อมูลจากตารางระบบ เช่น pg_class หรือ pg_settings ซึ่งเป็นแหล่งข้อมูลที่เก็บ metadata ทั้งหมดของฐานข้อมูล

🛠️ ตัวอย่างการค้นหา Object ที่ไม่ใช่ระบบ (Non-System Objects)

คำสั่ง SQL ต่อไปนี้เป็นตัวอย่างการ Query เพื่อค้นหา Object ต่างๆ (ตาราง, View, Extension) ที่อยู่ใน Schema ที่ไม่ใช่ Schema ระบบหลัก (เช่น pg_catalog) ซึ่งมักจะเป็น Object ที่ผู้ใช้หรือแอปพลิเคชันภายนอกสร้างขึ้นมาเอง

SQL

-- Query เพื่อค้นหา Object ที่ถูกสร้างขึ้นใน Schema ของผู้ใช้ (Custom Objects) -- SELECT c.relname AS object_name, CASE c.relkind WHEN 'r' THEN 'TABLE' WHEN 'v' THEN 'VIEW' WHEN 'e' THEN 'EXTENSION' ELSE 'OTHER' END AS object_type, pg_get_userbyid(c.relowner) AS owner FROM pg_class c WHERE c.relnamespace != pg_namespace AND c.relname NOT IN ('pg_toast', 'pg_extension') ORDER BY object_type, object_name;

คำอธิบาย:

  • pg_class: คือ Catalog ที่เก็บ metadata ของ Object ทั้งหมดในฐานข้อมูล
  • c.relnamespace != pg_namespace: เป็นการกรองเพื่อข้าม Schema ระบบหลัก
  • c.relname NOT IN (...): เป็นการกรองเพื่อข้าม Object ระบบที่จำเป็น

⚙️ การตรวจสอบ Configuration ที่ถูกปรับแต่ง (Custom Settings)

นอกจาก Object แล้ว การตรวจสอบค่า Configuration ที่ถูกปรับแต่งก็สำคัญไม่แพ้กัน เราสามารถใช้ pg_settings เพื่อดูว่ามี Parameter ใดบ้างที่ถูกตั้งค่าแตกต่างจากค่า Default หรือค่าที่กำหนดไว้ในไฟล์ postgresql.conf

SQL

-- Query เพื่อแสดงค่า Configuration ที่ถูกตั้งค่าในระดับ Instance -- SELECT name, setting, source FROM pg_settings WHERE source = 'default' AND setting != 'some_expected_value';

✅ บทสรุป: การรักษาความสมบูรณ์ของข้อมูล

การตรวจสอบ Object และ Configuration ที่ถูกเพิ่มแต่งด้วยการ Query System Catalog ไม่เพียงแต่ช่วยให้เราค้นหา ‘ไฟล์แปลกปลอม’ ในเชิง Metadata เท่านั้น แต่ยังช่วยให้เราเข้าใจถึงเส้นทางการเปลี่ยนแปลงของระบบได้ด้วย

ในฐานะ Senior Architect การป้องกันที่ดีที่สุดคือการใช้ Version Control สำหรับ Schema (เช่น Flyway หรือ Liquibase) และการเปิดใช้งานระบบ Auditing (เช่น pgAudit) เพื่อให้ทุกการเปลี่ยนแปลง Object หรือ Configuration ถูกบันทึกอย่างชัดเจน ทำให้เราสามารถระบุตัวผู้สร้างและช่วงเวลาที่เกิดการเปลี่ยนแปลงได้อย่างแม่นยำ