Eventarc: Trigger Cloud Run ด้วย Cloud Audit Logs ผ่าน Eventarc แบบพิสดาร

Redbulls Thailand
Google Cloud Thailand
4 min readApr 28, 2023

#event-driven #eventarc #pubsub #integration #appdev

ลองสมมุติว่า เราเป็นหนึ่งในทีม Security ที่ต้องการ Monitor Security Event ที่สำคัญๆ เช่นมี ผู้ใช้งานสร้างและ Download Service Account Key ออกมาใช้งาน จริงๆไม่ใช่เรื่องแปลกสำหรับ Dev ที่จะใช้ Service Account ที่ผูก Permission/Roles เพื่อเข้าถึงการ GCP Resources แต่สำหรับ Production Environment นั้น วิธีการ Download Service Account อาจจะสร้างความเสี่ยงให้กับระบบได้ ได้โดยเฉพาะถ้า Service Account ตัวนี้ถูกขโมย หรือ copy ออกไปจากเครื่องเราโดยผู้ไม่ประสงค์ดี

จริงๆแล้ว เราสามารถเข้าถึง History “ใครทำอะไร บน resources GCP ตัวไหน เมื่อไหร่” ผ่าน Cloud Audit Logs อยู่แล้ว และ เราก็สามารถ Filter Log ตัวนี้เพื่อทำเป็น Metric แล้ว Alert ไปยังผู้เกี่ยวข้องได้ วิธีนี้เราจะเรียกว่า Log-based Metrics & Alert

Cloud Audit Log — Access Logs

แต่มันก็จะดูธรรมดาไป วันนี้ก็เรยอยากจะมาแชร์วิธีที่ได้ผลลัพธ์เหมือนกันแต่ผ่าน Eventarc Trigger โดยใช้ท่า Cloud Audit Logs เป็น Event Provider. ท่านี้ครอบจักรวาล และ พิศดารกว่า และ มีความยืดหยุ่นเหมือนเราใช้ Cloud Pub/Sub เป็น Event Provider

DEMO Steps:

Demo Architecture — Cloud Audit Logs Trigger Cloud Run via Eventarc

ขั้นแรก: เตรียม Pre-reqให้พร้อม

#############################################################
# Pre-requisite Step:
#############################################################
# Enable required Google Cloud API services
gcloud services enable eventarc.googleapis.com
gcloud services enable run.googleapis.com

# ประกาศ Environment Variables และ ใช้ GCP project ปัจจุบัน
REGION=us-central1
SERVICE_NAME=hello
PROJECT_ID=$(gcloud config get-value project)
SERVICE_ACCOUNT=eventarc-trigger-sa

# สร้าง Service Accountเพื่อไว้ใช้กับ Eventarc
gcloud iam service-accounts create $SERVICE_ACCOUNT

# Deploy Hello World Cloud Run เพื่อไว้ใช้เป็น Eventarc Target
gcloud run deploy $SERVICE_NAME \
--allow-unauthenticated \
--image=gcr.io/cloudrun/hello \
--region=$REGION

ขั้นที่สอง: สร้าง Eventarc ตาม Demo Architecture

ก่อนอื่นเรยเนื่องจากเราต้องไป Enable Data Access Audit Logs เพิ่มเติม อันนี้มีค่าใช้จ่ายน่ะ. เพราะมีหลายๆ Events รวมถึง Use Case นี้ Default Audit Logs ไม่เพียงพอต่อการจับ Event บน Method ที่สนใจ

Enable Data Access Audit Logs

เนื่องจาก Event ที่สนในของเรานั้นมาจาก Cloud IAM ซึ่งมันเป็น IAM เป็น Global Services, ดังนั้นจุดที่ควรระวัง (Test แล้วถึงเพิ่งรู้ -_-) ก็ Parameter — location ต้องเป็น global !! ไม่อย่างงั้น Event ไม่เข้า Eventarc น่ะครับ. แต่ถ้าเป็นจาก Services อื่นที่ไม่ใช่ Global Services ก็ระบุให้ตรงตาม Region นั้นๆ

#############################################################
# Main Step: Trigger Cloud Run ด้วย Cloud Storage ผ่าน Eventarc
#############################################################
# ประกาศ Environment Variables ที่จำเป็นต้องการใช้ Cloud Audit Logs & Eventarc Trigger
TRIGGER_NAME=trigger-auditlog-iam

# สร้าง Eventarc Trigger
# จาก Event Type จาก Cloud Storage เมื่อไหร่ก็ตามที่ file มีการเปลี่ยนแปลงใน Bucket
# แล้วให้ Trigger Target คือ Hello World Cloud Run
# โดยอนุญาติให้ใช้ Service Account ของ Eventarc Trigger ได้เท่านั้น

gcloud eventarc triggers create $TRIGGER_NAME \
--destination-run-service=$SERVICE_NAME \
--destination-run-region=$REGION \
--event-filters="type=google.cloud.audit.log.v1.written" \
--event-filters="serviceName=iam.googleapis.com" \
--event-filters="methodName=google.iam.admin.v1.CreateServiceAccountKey" \
--location=global \
--service-account=$SERVICE_ACCOUNT@$PROJECT_ID.iam.gserviceaccount.com

Credited: Trigger Cloud Run with Eventarc events

เมื่อสร้าง Eventarc Trigger เรียบร้อยแล้ว, Eventarc ก็จะสร้างช่วยสร้าง Cloud Pub/Sub Topic/Subscription ให้อัตโนมัติ เพื่อใช้รับส่ง Event จากต้นทางไป (ในที่นี้คือ Cloud Audit Logs) เพื่อ Trigger ปลายทาง (ก็คือ Cloud Run). ถ้าเป็นถ้าใช้ Cloud Audit Logs เป็นต้นทางก็ง่ายหน่อยเพราะ ไม่ต้องสนใจเรื่อง Permission รอบๆเพิ่มเติม (เหมือนอย่าง ถ้าต้นทางเป็น Cloud Storage, จะต้องให้สิทธิ์ในการ Publish Message ลงใน ​Topic แก่ Cloud Storage Service Account)

Cloud Pub/Sub Topic/Subscription created by Eventarc

บน Cloud Run ก็จะผูก Eventarc Trigger ให้อัตโนมัติ พร้อมกับ อนุญาติให้เฉพาะ Service Account ของ Eventarc สามารถ Trigger Cloud Run ตัวนี้ได้อย่างเดียว

Cloud Run Trigger Configuration created by Eventarc

บน Eventarc Console ก็จะเห็น Resources และ Configurations ใดๆโดย:

  • Event Type = google.cloud.audit.log.v1.written ​ตัวนี้จะเป็นการบอกให้ Eventarc หยิบ Event ที่มาจาก Cloud Audit Logs (หรือดูจาก Infrastructure = Cloud Audit Logs ก็ได้)
  • Event Provider = Cloud IAM, Event = google.iam.admin.v1.CreateServiceAccountKey อันนี้จะต้องเป็นการ Filter แบบเจาะจงว่าจะเอา Method ไหน จาก Cloud IAM APIs (เนื่องจากมีหลาย methods มาก) เพื่อที่จะใช้ Trigger Cloud Run ของเรา

Note: สามารถดูรายละเอียดทุกๆ Event ที่มาจาก Cloud Audit Logs ได้จาก => Eventarc : Event Types

ขั้นสุดท้าย: เริ่มทดสอบ

วิธีทดสอบก็ลองรัน gcloud สร้าง service account key ของ eventarc เองแล้วกัน

gcloud iam service-accounts keys create $SERVICE_ACCOUNT \
--iam-account=$SERVICE_ACCOUNT@$PROJECT_ID.iam.gserviceaccount.com

รอลุ้นอึดใจเดียว Eventarc ก็ Trigger Cloud Run แล้วก็ส่ง CloudEvent ที่ภายใน Payload ก็มี Audit Logs เกี่ยวว่ามี นาย A สร้างรัน method CreateServiceAccountKey บน Service Account ตัวไหน เป็นงัยละ ที่นี้ Security Team ชอบแหละ ^^

Cloud Run Logs: Triggered Event by Eventarc

สรุป

ใน Demo Architecture เป็นการต่อยอดการใช้ Event Type ที่มาจาก ​Cloud Audit Logs โดยสนใจเฉพาะ Event เมื่อมีคนมาสร้าง Service Account Key โดย Event Provider คือ Cloud IAM และ Event (Method: google.iam.admin.v1.CreateServiceAccountKey) แล้วถึงค่อย Trigger Cloud Run. กรณีเป็นการเน้น Use Case เกี่ยวกับ Security Monitoring โดยการใช้ Eventarc เข้ามาประยุกต์แทนท่าเดิม ซึ่งจะต้องเปลี่ยน Cloud Audit Logs ให้เป็น Log-based Metrics แล้วถึงทำ Alert.

เราสามารถประยุกต์ท่านี้กับหลายๆ Method ของ Google Cloud APIs ได้ให้เหมาะการใช้งาน อย่างไรก็ตามการใช้ Cloud Audit Logs มาทำ Eventarc Trigger นั้นมีแนวโน้มที่ต้อง Enable Cloud Audit เพิ่ม Data Access Logs เพิ่มเติม ซึ่งมีค่าใช้จ่าย

ท้ายนี้หวังว่า “Dev สายซิ่ง” ทุกคนก็เริ่มเห็นภาพแนวทางประยุกต์ Eventarc เพิ่มขึ้น

ติดตามต่อได้:

--

--