อัพเดทบริการ AWS CloudTrail ในปี 2024
บทความนี้แปลมาจากบทความที่เป็นภาษาญี่ปุ่นที่ชื่อว่า AWS入門ブログリレー2024〜AWS CloudTrail編〜 โดยเจ้าของบทความนี้คือ คุณ 芦沢 広昭
AWS CloudTrail
AWS CloudTrail เป็นบริการที่บันทึก action ที่ดำเนินการ AWS accounts, users, roles, และ บริการ AWS ต่างๆ ในรูปแบบเหตุการณ์ (Event)
ในที่นี้ คำว่า "action" หมายถึง request (การสื่อสาร) ไปยัง AWS API
เมื่อคุณใช้ AWS คุณอาจไม่เคยตระหนักถึงการมีอยู่ของ API มากนัก นั่นเป็นเพราะ AWS มีเครื่องมือต่างๆ ที่ทำให้การใช้ API ง่ายขึ้น ดังต่อไปนี้
- AWS Management Console: สามารถใช้งาน AWS API ผ่านเว็บเบราว์เซอร์ได้
- AWS CLI: สามารถใช้งาน AWS API ผ่านทาง command line ได้
- AWS SDK: สามารถใช้งาน AWS API ผ่านภาษาโปรแกรมมิ่งเช่น Java หรือ Python ได้
เริ่มต้น
การบันทึกของ CloudTrail จะถูกเปิดใช้งานโดยค่าเริ่มต้นเมื่อสร้างบัญชี
สามารถตรวจสอบเหตุการณ์ที่บันทึกไว้ได้จาก CloudTrail > Event history
Event history สามารถดูเหตุการณ์ย้อนหลัง 90 วันที่ผ่านมาได้ผ่านการใช้งาน GUI
สามารถกรองเหตุการณ์ได้โดยใช้ Lookup attributes และ Timestamp และยังสามารถใช้ตัวกรองทั้งสองพร้อมกันได้อีกด้วย
ในรายละเอียด คุณสามารถตรวจสอบข้อมูลที่ใช้บ่อยได้ เช่น event time, ชื่อผู้ใช้ที่ดำเนินการ, ชื่อเหตุการณ์ที่ดำเนินการ, แหล่งที่มาของเหตุการณ์ (API ของบริการไหน), AWS access key, และIP address ต้นทางของ request
บันทึก event สามารถดูเนื้อหาของ event ในรูปแบบ JSON ได้โดยตรง
CloudTrail Event
Event ที่ CloudTrail บันทึกมีทั้งหมด 3 ประเภทดังนี้
- Management Event
- Data Event
- Insights Event
Management Event
การดำเนินการจัดการกับ resource ภายในบัญชี AWS ซึ่งการบันทึก event นี้จะถูกเปิดใช้งานโดยค่าเริ่มต้นและสามารถตรวจสอบได้จาก event history
ตัวอย่างของ event ที่ถูกบันทึกมีดังนี้
- IAM AttachRolePolicy
- การสร้าง VPC
- การสร้าง CloudTrail trail
Event สามารถแบ่งออกเป็นสองประเภท ได้แก่ read event ที่ไม่ทำการเปลี่ยนแปลง resource และ write event ที่อาจทำการเปลี่ยนแปลง resource ได้ โดยในการตั้งค่าการบันทึก log สามารถตั้งค่าให้บันทึกเฉพาะ event เดียวหรือทั้ง 2 event ก็ได้
นอกจากนี้ management event ยังรวมถึงการทำ automatic key rotation ของ KMS และการลงชื่อเข้าใช้ management console ซึ่งไม่ใช่ non-API activity ที่ถูกบันทึกไว้
อ้างอิง: Non-API events captured by CloudTrail
Data Event
การดำเนินการ API ที่ดำเนินการบนหรือภายใน resource
ตัวอย่างของเหตุการณ์ที่บันทึกไว้มีดังนี้:
- การดำเนินการ API กับ object ภายใน S3 bucket (S3 GetObject, DeleteObject, PutObject)
- การเรียกใช้ Lambda function (Lambda Invoke)
ในการรับ data event จำเป็นต้องเปิดใช้งานการบันทึก event โดยใช้ trail หรือ event data store
เนื่องจากลักษณะของ event ที่มักจะดำเนินการมีจำนวนมาก ทำให้จำนวน event ที่บันทึกอาจมีปริมาณมาก ดังนั้นจึงแนะนำให้ใช้การตั้งค่า Event Selector เพื่อเลือกประเภทของ event ที่จะบันทึกพร้อมกับการตั้งค่าการบันทึก log ใน Event Selector คุณสามารถเลือก event ที่จะบันทึกตามค่า resources.type ของ event ได้
เนื่องจาก data event ก็มีแนวคิดของ read event และ write event เช่นกัน ดังนั้นขึ้นอยู่กับข้อกำหนดในการตรวจสอบ การจำกัดปริมาณของ log ที่บันทึกเป็นหนึ่งในวิธีการควบคุมปริมาณ log เช่น การบันทึกเฉพาะ write data event เท่านั้น ก็เป็นแนวทางที่มีประสิทธิภาพในการลดปริมาณ log ที่ได้รับ
Insights Event
ผลจากการวิเคราะห์ CloudTrail management event อย่างต่อเนื่องจะบันทึก API activity ที่ผิดปกติที่ตรวจพบ โดยจะเปิดใช้งานร่วมกับ trails และ event data store ที่บันทึก management event
Insight Events จะถูกบันทึกเมื่อเปิดใช้งานฟีเจอร์เสริมของ CloudTrail ที่เรียกว่า CloudTrail Insights
CloudTrail Insights จะทำการตรวจสอบและวิเคราะห์ management event อย่างต่อเนื่อง เมื่อพบAPI calls หรือ API error rate จะตรวจจับเป็น activity ที่ผิดปกติและส่งไปยัง insight event
Event ที่ไม่สามารถบันทึกได้ด้วย CloudTrail
CloudTrail บันทึก event จำนวนมาก แต่ก็ยังมีบริการบางอย่างที่ไม่ได้รับการสนับสนุนในการบันทึก event เช่นกัน
- บริการที่อยู่ในขั้นตอน preview
- บริการที่ยังไม่เปิดให้ใช้งานทั่วไป (GA)
- บริการที่ไม่มี public API
หากต้องการตรวจสอบว่าบริการใดบ้างที่ได้รับการสนับสนุนโดย CloudTrail สามารถดูได้ที่ AWS service topics for CloudTrail
CloudTrail log
ในบันทึกเหตุการณ์ของ CloudTrail จะมีข้อมูลที่สำคัญดังนี้
- ใคร (Who)
- เมื่อไหร่ (When)
- ที่ไหน (Where)
- คำขออะไร (What Request)
- การตอบสนองอย่างไร (What Response)
ลองตรวจสอบไฟล์โดยใช้ตัวอย่างจาก CloudTrail log file examples
{"Records": [{
"eventVersion": "1.08",
"userIdentity": {
"type": "IAMUser",
"principalId": "EXAMPLE6E4XEGITWATV6R",
"arn": "arn:aws:iam::123456789012:user/Mateo",
"accountId": "123456789012",
"accessKeyId": "AKIAIOSFODNN7EXAMPLE",
"userName": "Mateo",
"sessionContext": {
"sessionIssuer": {},
"webIdFederationData": {},
"attributes": {
"creationDate": "2023-07-19T21:11:57Z",
"mfaAuthenticated": "false"
}
}
},
"eventTime": "2023-07-19T21:17:28Z",
"eventSource": "ec2.amazonaws.com",
"eventName": "StartInstances",
"awsRegion": "us-east-1",
"sourceIPAddress": "192.0.2.0",
"userAgent": "aws-cli/2.13.5 Python/3.11.4 Linux/4.14.255-314-253.539.amzn2.x86_64 exec-env/CloudShell exe/x86_64.amzn.2 prompt/off command/ec2.start-instances",
"requestParameters": {
"instancesSet": {
"items": [
{
"instanceId": "i-EXAMPLE56126103cb"
},
{
"instanceId": "i-EXAMPLEaff4840c22"
}
]
}
},
"responseElements": {
"requestId": "e4336db0-149f-4a6b-844d-EXAMPLEb9d16",
"instancesSet": {
"items": [
{
"instanceId": "i-EXAMPLEaff4840c22",
"currentState": {
"code": 0,
"name": "pending"
},
"previousState": {
"code": 80,
"name": "stopped"
}
},
{
"instanceId": "i-EXAMPLE56126103cb",
"currentState": {
"code": 0,
"name": "pending"
},
"previousState": {
"code": 80,
"name": "stopped"
}
}
]
}
},
"requestID": "e4336db0-149f-4a6b-844d-EXAMPLEb9d16",
"eventID": "e755e09c-42f9-4c5c-9064-EXAMPLE228c7",
"readOnly": false,
"eventType": "AwsApiCall",
"managementEvent": true,
"recipientAccountId": "123456789012",
"eventCategory": "Management",
"tlsDetails": {
"tlsVersion": "TLSv1.2",
"cipherSuite": "ECDHE-RSA-AES128-GCM-SHA256",
"clientProvidedHostHeader": "ec2.us-east-1.amazonaws.com"
},
"sessionCredentialFromConsole": "true"
}]}
ส่วนแรกของ UserIdentity ใน CloudTrail log จะประกอบด้วยข้อมูลที่ระบุว่า "ใคร (Who)"
อ้างอิง: CloudTrail userIdentity element(https://docs.aws.amazon.com/awscloudtrail/latest/userguide/cloudtrail-event-reference-user-identity.html)
"userIdentity": {
"type": "IAMUser",
"principalId": "EXAMPLE6E4XEGITWATV6R",
"arn": "arn:aws:iam::123456789012:user/Mateo",
"accountId": "123456789012",
"accessKeyId": "AKIAIOSFODNN7EXAMPLE",
"userName": "Mateo",
"sessionContext": {
"sessionIssuer": {},
"webIdFederationData": {},
"attributes": {
"creationDate": "2023-07-19T21:11:57Z",
"mfaAuthenticated": "false"
}
}
สามารถทราบข้อมูลเกี่ยวกับ API activity log ได้ดังนี้
- AWS account : 123456789012 (userIdentity.accountId)
- IAM user : Mateo's IAM credentials (userIdentity.arn)
- Credential ถูกออกโดยไม่มีการตรวจสอบ MFA เมื่อวันที่ 19 กรกฎาคม 2023 เวลา 21:11:57 UTC (userIdentity.sessionContext.attributes)
ต่อไปคือข้อมูลเกี่ยวกับ when และ where ดังนี้
"eventTime": "2023-07-19T21:17:28Z",
"eventSource": "ec2.amazonaws.com",
"eventName": "StartInstances",
"awsRegion": "us-east-1",
"sourceIPAddress": "192.0.2.0",
"userAgent": "aws-cli/2.13.5 Python/3.11.4 Linux/4.14.255-314-253.539.amzn2.x86_64 exec-env/CloudShell exe/x86_64.amzn.2 prompt/off command/ec2.start-instances",
- API activity นี้เสร็จสิ้นเมื่อวันที่ 19 กรกฎาคม 2023 เวลา 21:17:28 UTC (eventTime)
- API ที่เรียกใช้คือ StartInstances กับ ec2.amazonaws.com (eventSource, eventName)
- Region ที่ดำเนินการคือ Northern Virginia (us-east-1) (awsRegion)
- IP address ต้นทางของ request คือ "192.0.2.0" (sourceIPAddress)
- Request ถูกดำเนินการจาก CloudShell (userAgent)
วิธีการบันทึก log
ในการตั้งค่าเริ่มต้นของ CloudTrail ไม่สามารถตรวจสอบ log ที่มีอายุมากกว่า 90 วันบน event history ได้
นอกจากนี้ ยังไม่มีการบันทึกลงในที่จัดเก็บข้อมูลที่ผู้ใช้สามารถเข้าถึงได้โดยตรง เช่น S3 และไม่ได้บันทึกเหตุการณ์อื่นนอกเหนือจากประวัติการดำเนินการที่เรียกว่า management event ซึ่งเกี่ยวข้องกับ AWS resource
เพื่อให้เป็นไปตามข้อกำหนดในการเก็บรักษา management event เป็นเวลานานกว่า 90 วัน จำเป็นต้องทำการส่งออกข้อมูลไปยังที่จัดเก็บภายนอก และต้องตั้งค่าการบันทึกและการรับ event อื่นๆ นอกเหนือจาก management event แยกต่างหาก
วิธีการบันทึกล็อกในปัจจุบันมีสองวิธี:
- Trails
- Event Data Store
Trails
Trail เป็นกลไกที่ CloudTrail ใช้ในการจับและบันทึก API activity ที่บันทึกไว้
อ้างอิง: Working with CloudTrail trails
สามารถเลือกประเภทของ CloudTrail log ที่จะบันทึกใน trail ได้ตามต้องการ โดยแต่ละ trail สามารถบันทึก event หลายประเภทได้
-Management Event
-Data Event
-Insights Event
Log จะถูกส่งไปยัง S3 bucket ที่กำหนดใน trail การส่งสามารถทำได้ทั้งในบัญชี AWS เดียวกันกับ trail หรือใน S3 bucket ที่อยู่ในบัญชี AWS อื่น
ขอบเขตการบันทึก log ของ trail สามารถกำหนดได้เป็นแบบ Multi-Region ซึ่งครอบคลุมทุก region ที่ใช้งานอยู่ หรือแบบ Single Region ซึ่งครอบคลุมเฉพาะ region ที่กำหนดเท่านั้น
เมื่อสร้าง trail จาก AWS Management Console จะเป็น multi-region trail และหากต้องการสร้าง single-region trail จำเป็นต้องสร้าง trail ผ่าน AWS CLI หรือ API tool อื่นๆ
ในสภาพแวดล้อมของ AWS Organizations สามารถใช้ trail ของ organization ได้ เมื่อใช้ trail ของ organization จะมีการสร้างสำเนา management account's trail ให้กับทุกบัญชีสมาชิกภายใน AWS Organizations โดยอัตโนมัติ
ใน organization trail ไม่มีฟังก์ชันที่สามารถระบุบัญชี AWS หรือ region เฉพาะเพื่อคัดลอก trail ได้ ดังนั้นจะต้องสร้าง trail ให้กับทุกบัญชีใน organization ทั้งหมด
AWS Control Tower เป็นบริการที่สามารถ deploy และจัดการสภาพแวดล้อม AWS multi-account ได้อย่างปลอดภัย ได้มีการเพิ่มตัวเลือกในการจัดการ trail ขององค์กรด้วย CloudTrail ตั้งแต่เวอร์ชัน 3.0 เป็นต้นไป
Event Data Store
Event Data Store คือที่เก็บข้อมูลเฉพาะสำหรับการรวบรวม CloudTrail event ซึ่งเป็นข้อกำหนดเบื้องต้นในการใช้ CloudTrail Lake โดยที่ไม่ใช่ S3
เมื่อสร้าง Event Data Store สามารถเลือกประเภทของ event ที่ต้องการจะรวบรวมได้
- CloudTrail event
- Config setting
- Events outside AWS
Event Data Store เป็นแบบไม่สามารถแก้ไขได้ (immutable) และผู้ใช้ไม่สามารถลบข้อมูลได้เอง ข้อมูลที่บันทึกจะถูกลบโดยอัตโนมัติหลังจากที่ผ่านระยะเวลาที่กำหนด
retention period สามารถกำหนดได้เมื่อสร้าง Event Data Store แต่ช่วงเวลาที่สามารถเลือกได้จะขึ้นอยู่กับ purchase Option (Pricing) ที่กำหนดเป็นพารามิเตอร์แยกต่างหาก
Purchase Option | Default Retention Period | Minimum Retention Period | Maximum retention period |
---|---|---|---|
One-year extendable retention pricing | 366 วัน (ประมาณ 1 ปี) | 7 วัน | 3653 วัน (ประมาณ 10 ปี) |
Seven-year retention pricing | 2557 วัน (ประมาณ 7 ปี) | 7 วัน | 2557 วัน (ประมาณ 7 ปี) |
Event Data Store จำเป็นต้องใช้ AWS Organizations เช่นเดียวกับ trails และมีตัวเลือกในการเปิดใช้งาน organizational level
อย่างไรก็ตาม การเปิดใช้งาน Event Data Store ใน organizational level จะไม่สามารถระบุบัญชี AWS หรือ region เฉพาะได้ เช่นเดียวกับ trail ดังนั้นจะต้องตั้งค่าให้กับทุกบัญชีที่อยู่ภายใต้ trail ทั้งหมดเท่านั้น
วิธีการบันทึก log แบบอื่นๆ
เมื่อใช้บริการ Amazon Security Lake สามารถรวบรวม CloudTrail event และ log ต่างๆ ของ AWS ไปยัง S3 bucket ได้ บริการนี้จะทำการจัดเก็บข้อมูลที่รวบรวมไว้ให้เป็นระเบียบ และให้บริการการเข้าถึง log ข้ามบัญชี
หากมีความต้องการที่จะรวบรวม log อื่นๆ ของ AWS นอกเหนือจาก CloudTrail log ไปยัง S3 bucket ที่กำหนด ควรใช้ Amazon Security Lake
Security Lake แตกต่างจากสองฟังก์ชันที่กล่าวถึงก่อนหน้านี้ โดยสามารถระบุเป้าหมายการรวบรวม log ตามบัญชี AWS และ region ได้ Security Lake จึงมีความยืดหยุ่นมากกว่าในการรวบรวม log
Log Security
เพื่อให้ CloudTrail log เป็น audit trail ที่น่าเชื่อถือ
ใน CloudTrail มีฟังก์ชัน integrity validation ที่ช่วยให้มั่นใจว่า log ที่ถูกเก็บรักษาไม่ได้ถูกแก้ไขหรือลบ โดยการตรวจสอบความสมบูรณ์นี้จะทำอย่างต่อเนื่อง
Integrity validation จะสร้าง digest file ที่มี hash ของ log ในโฟลเดอร์แยกต่างหากจาก log file
digest file ช่วยให้มั่นใจว่า log file ไม่ได้ถูกแก้ไขหลังจากที่ถูกส่งไปแล้ว
เพื่อเพิ่มความปลอดภัยของ log ไม่เพียงแต่ใช้ฟังก์ชันของ CloudTrail เท่านั้น การใช้ฟังก์ชันความปลอดภัยของ S3 bucket ที่เป็นที่เก็บ log ก็มีประสิทธิภาพเช่นกัน
การใช้ Object Lock จะช่วยป้องกันการแก้ไข log และ trail แม้จะมีสิทธิ์ระดับสูงเช่น root user (compliance mode)
วิธีการตรวจสอบ event
มีหลายวิธีในการตรวจสอบ CloudTrail log แต่ละวิธี location ที่เก็บ log และวิธีการตรวจสอบที่แตกต่างกัน
หลักๆ มี 3 ประเภท โดยสรุปในรูปแบบ "วิธีการตรวจสอบ: วิธีการส่ง log และ log location" ดังนี้
- Event History: CloudTrail management events ที่เปิดใช้งานโดยค่าเริ่มต้น
- การใช้ Amazon Athena: CloudTrail event ที่ถูกบันทึกลงใน S3 bucket โดย trail
- การใช้ CloudTrail Lake Query Editor: CloudTrail event ที่ถูกรวบรวมใน Event Data Store ของ CloudTrail Lake
Event History
เนื่องจากได้แนะนำในส่วน "วิธีการเริ่มต้น" แล้ว จึงจะขอข้ามรายละเอียดเบื้องต้นไป
event history มักถูกใช้สำหรับการแก้ไขปัญหาที่เกี่ยวข้องกับ AWS ภายใน 90 วันที่ผ่านมา หรือเมื่อต้องการค้นหา event อย่างรวดเร็ว
การใช้ Amazon Athena
Amazon Athena เป็นบริการ interactive query ที่ใช้ SQL เพื่อวิเคราะห์ข้อมูลใน S3 bucket
เมื่อต้องการค้นหา event ที่เกิดขึ้นก่อน 90 วันหรือทำการค้นหา advanced log ด้วย SQL ควรใช้ Athena
การ query จะมีค่าใช้จ่าย แต่สามารถวิเคราะห์ CloudTrail event ที่บันทึกไว้ใน S3 bucket โดยใช้ trail ได้
หากเลือกสร้าง Athena table จาก event history ระบบจะสร้าง table query ของข้อมูลที่บันทึกไว้ใน S3 โดยอัตโนมัติ ทำให้สามารถสร้าง Athena table ได้ง่ายดาย
เมื่อย้ายไปที่ console ของ Athena จะพบว่า table ได้ถูกสร้างขึ้นแล้ว สามารถดำเนินการ query เพื่อวิเคราะห์ log ที่บันทึกไว้ใน S3 ได้
หากต้องการทราบข้อมูลเพิ่มเติมเกี่ยวกับ Amazon Athena สามารถดูเพิ่มเติมได้ที่บทความด้านล่างนี้
การใช้ CloudTrail Lake Query Editor
เมื่อใช้ CloudTrail Lake Query Editor สามารถ query กับ CloudTrail log ที่ถูกเก็บไว้ใน Event Data Store ได้
ใน Query Editor มีตัวอย่าง query มากกว่า 200 ประเภทตามวัตถุประสงค์ต่างๆ เมื่อเลือกตัวอย่าง query จะถูกสร้างขึ้นโดยอัตโนมัติ ทำให้ใช้งานได้สะดวก
เมื่อเลือก Run queries จาก dashboard จะถูกดำเนินการกับ log ใน Event Data Store ภายในช่วงเวลาที่กำหนด และ dashboard จะถูกสร้างขึ้นโดยอัตโนมัติ
กรณีการใช้งานจะคล้ายกับการใช้ Athena แต่เนื่องจากต้องใช้ Event Data Store (CloudTrail Lake) เป็นพื้นฐาน ดังนั้นผู้ที่ไม่ได้ใช้จะไม่สามารถใช้งานได้ สำหรับผู้ที่ใช้ CloudTrail Lake อยู่แล้ว สามารถใช้งานได้เต็มที่ และสำหรับผู้ที่ต้องการเริ่มใช้ ควรเปิดใช้งาน Event Data Store ก่อน
ค่าบริการ
ค่าบริการในการส่ง log จะแตกต่างกันไปตามประเภทของ CloudTrail event ดังนี้
ประเภทของเหตุการณ์ | ค่าใช้จ่าย |
---|---|
Management event ที่ส่งไปยัง S3 | 2.00 USD ต่อ 100,000 event |
Data event ที่ส่งไปยัง S3 | 0.10 USD ต่อ 100,000 event |
CloudTrail Insights Event | 0.35 USD ต่อ 100,000 event ที่วิเคราะห์ตามประเภทของ event |
CloudTrail Lake มีโครงสร้างค่าบริการที่แตกต่างจาก CloudTrail event ปกติ โดยมีการรวมค่าบริการในการนำเข้าข้อมูลและค่าบริการในการ retention ไว้ด้วยกัน ซึ่งเป็นจุดเด่นของบริการนี้
Type/Purchase Options | One-year extendable retention pricing | Seven-year retention pricing |
---|---|---|
Data ingestion | 0.75 USD/GB (Management event/Data event), 0.50 USD/GB (AWS log อื่นๆ/non-AWS log) | ~5TB/เดือน: 2.5 USD/GB, 20TB/เดือน: 1 USD/GB, 25TB/เดือน: 0.50 USD/GB |
Data retention | ฟรีในปีแรก (รวมอยู่ในค่าบริการการนำเข้า), ตั้งแต่ปีที่ 2: 0.023 USD/GB (ต่อเดือน) | ฟรี 7 ปี (รวมอยู่ในค่าบริการการนำเข้า) |
นอกจากนี้ ยังมีขอบเขตการใช้งานฟรีดังต่อไปนี้
- การบันทึก default CloudTrail management event และการใช้ event history
- 30 วันแรกสำหรับการเริ่มใช้ CloudTrail Lake
- trail ที่บันทึก CloudTrail management event หนึ่งรายการต่อ region
trail สามารถใช้งานได้ฟรีหนึ่งรายการต่อ region ดังนั้นควรตั้งค่า trail ในทุกบัญชี AWS และเก็บ log ในระยะยาว
สรุป
AWS CloudTrail เป็นบริการที่สำคัญมากๆตัวนึง เนื่องจากมีหน้าที่หลักๆคือการเก็บ log นอกจากนั้นยังสามารถนำ log มาวิเคราะห์โดยใช้ query ในบริการของตัวเองหรือใช้ร่วมกับ Amazon Athena ก็ได้เช่นกัน
บทความต้นฉบับ
- AWS入門ブログリレー2024〜AWS CloudTrail編〜(ภาษาญี่ปุ่น)