ตรวจสอบการเข้าถึงข้อมูลบน GCP ด้วย Data Access audit log

การใช้งาน Google Cloud Platform นั้น หากเราต้องการตรวจสอบว่ามีใครเข้ามาทำอะไรกับระบบ หรือเข้ามาทำอะไรกับข้อมูลในระบบบ้าง สามารถตรวจสอบได้จาก Cloud Audit Logs ซึ่งมีข้อมูล log 3 แบบ และระยะเวลาการเก็บ log ดังตารางด้านล่าง



  • Admin Activity เป็น log แสดงการเรียก API หรือการกระทำ ที่เกี่ยวข้องกับการดูแล GCP ที่แก้ไขค่า config หรือ metadata ของ resource ต่างๆ
  • Data Access เป็น log แสดงการอ่านค่า config หรือ metadata ของ resource ต่างๆ รวมถึง การเรียก API ของผู้ใช้ในการ สร้าง แก้ไข อ่าน ข้อมูลที่ผู้ใช้ใส่เข้ามาในระบบ, log ประเภทนี้จะถูกปิดเป็นค่าเริ่มต้น (ยกเว้น BigQuery ที่เปิด Data Access log เป็นค่าเริ่มต้น) เนื่องจาก log สามารถมีขนาดที่ใหญ่มากได้ หากต้องการใช้งานจึงต้องเข้าไปเปิดต่างหาก
  • System Event เป็น log แสดงการแก้ไขค่า config ของ resources โดยระบบของ Google ไม่เกี่ยวข้องกับการกระทำของผู้ใช้งาน

การเปิดใช้ Data Access log

เนื่องจาก Data Access log สำหรับการเข้าถึงข้อมูล ถูกปิดเป็นค่าเริ่มต้น เราจึงต้องเข้ามาตั้งค่าเพื่อเปิด Data Access log หากต้องการ log การเข้าถึงข้อมูลในแต่ละ service โดยสามารถทำตามขั้นตอนคร่าวๆ ดังที่แสดงไว้

ไปที่เมนู IAM & Admin > Audit Logs

รายการ service ที่สามารถเปิด Data Access log ได้

เลือก service ที่ต้องการ (ในที่นี้คือ Google Cloud Storage) และเลือก LOG TYPE ที่ต้องการ และกด SAVE

การ export Data Access log

เนื่องจาก Data Access log มีระยะการเก็บอยู่ใน Logging 30 วัน หากเราต้องการเก็บ log นานกว่านั้น หรือต้องการนำ log ไปวิเคราะห์บนระบบอื่นๆ (เช่น BigQuery) ก็สามารถตั้งค่าเพื่อ export log เก็บไว้ได้ทั้งบน Cloud Storage, BigQuery หรือ integrate กับระบบอื่น ผ่าน Pub/Sub เป็นต้น


ในหน้า Logging ให้เลือก data_access ของ service ที่ต้องการ (ในที่นี้คือ GCS Bucket)

หรือจะเลือก All logs ก็ได้ แต่ให้ตรวจสอบว่ามี data_access รวมอยู่ด้วย

เมื่อระบุ log ที่ต้องการแล้ว กดที่ CREATE SINK และเลือก Sink ที่ต้องการ export log ไปเก็บไว้

การกำหนดระยะเวลาการเก็บ log

หากเรา export log จาก Logging เก็บไว้บน BigQuery เราสามารถกำหนดระยะเวลาการเก็บ log ได้จากการตั้ง table expiration บน BigQuery โดยข้อมูลที่เกินระยะเวลาที่กำหนดไว้จะถูกลบออกโดยอัตโนมัติ

หากเก็บ log บน BigQuery สามารถกำหนดวันหมดอายุของ table ตามระยะเวลาที่ต้องการได้

ตัวอย่าง query เพื่อตรวจสอบ log

เมื่อเราเริ่มเก็บ log แล้ว transaction ที่เข้าข่ายทั้งหมดจะไหลมาอยู่บน BigQuery หากเราต้องการตรวจสอบ event ที่สนใจ สามารถเขียน query ขึ้นมาเพื่อให้ระบบแสดง transaction ที่เป็นประโยชน์กับการตรวจสอบได้ เช่น

ตัวอย่าง query เพื่อแสดงการ export table บน BigQuery เพื่อค้นหา transaction ที่มีคนเอานำข้อมูลออกจาก BigQuery

SELECT
  timestamp ,
  resource.labels.project_id ,
  resource.type ,
 protopayload_auditlog.servicedata_v1_bigquery.jobCompletedEvent.job.jobConfiguration.extract.sourceTable.tableId ,
 protopayload_auditlog.servicedata_v1_bigquery.jobCompletedEvent.job.jobConfiguration.extract.destinationUris ,
  protopayload_auditlog.authenticationInfo.principalEmail,
  protopayload_auditlog.requestMetadata.callerIp,
  protopayload_auditlog.serviceName,
  protopayload_auditlog.methodName,
  protopayload_auditlog.servicedata_v1_bigquery.jobCompletedEvent.eventName ,
FROM
  `project-id.dataset.table`
  WHERE
    protopayload_auditlog.serviceName = 'bigquery.googleapis.com'
    AND protopayload_auditlog.methodName = 'jobservice.jobcompleted'
    AND protopayload_auditlog.servicedata_v1_bigquery.jobCompletedEvent.eventName = 'extract_job_completed'

หรือตัวอย่าง query สำหรับการตรวจสอบการ download object บน Cloud Storage เป็นต้น

SELECT
  timestamp ,
  resource.labels.project_id ,
  resource.labels.bucket_name ,
  resource.labels.location ,
  resource.type ,
  protopayload_auditlog.resourceName ,
  protopayload_auditlog.authenticationInfo.principalEmail,
  protopayload_auditlog.requestMetadata.callerIp,
  protopayload_auditlog.serviceName,
  protopayload_auditlog.methodName,
FROM
  `project-id.dataset.table`
WHERE
  protopayload_auditlog.serviceName = 'storage.googleapis.com'
  AND protopayload_auditlog.methodName = 'storage.objects.get'

ทั้งนี้ query ดังกล่าว เป็นเพียงตัวอย่างเริ่มต้นเท่านั้น หากต้องการตรวจสอบ column อื่นๆ หรือเงื่อนไขอื่นๆ จาก log ก็สามารถเขียน query สำหรับตอบโจทย์นั้นๆ ได้เช่นกัน

ความคิดเห็น

โพสต์ยอดนิยมจากบล็อกนี้

การเรียกใช้งาน Google Apps Script

ลดเวลาการเรียก API ใน Apps Script ด้วย fecthAll

ออกแบบระบบให้คุยข้าม module กันได้ ด้วย Pub/Sub