Menemukan Siapa yang Menghapus Resource AWS: Investigasi CloudTrail Event History
EC2 instance tiba-tiba hilang dari console, tidak ada yang mengaku melakukannya, dan tidak ada tiket perubahan yang tercatat — ini bukan skenario hipotetis, ini terjadi di lingkungan produksi nyata. Ketika sebuah instance 'terminated' tanpa penjelasan, langkah pertama investigasi adalah CloudTrail Event History untuk melacak siapa yang menjalankan aksi TerminateInstances.
TL;DR: Investigasi CloudTrail untuk TerminateInstances
| Langkah | Aksi | Yang Dicari |
|---|---|---|
| 1 | Buka CloudTrail Event History | Filter berdasarkan Event Name: TerminateInstances |
| 2 | Identifikasi event yang cocok | Timestamp, User Identity, Source IP |
| 3 | Baca detail event JSON | Field userIdentity, requestParameters, sourceIPAddress |
| 4 | Verifikasi via AWS CLI | Konfirmasi instance ID yang di-terminate |
Bagaimana CloudTrail Merekam Aksi EC2
CloudTrail mencatat setiap API call yang dilakukan terhadap layanan AWS sebagai sebuah 'event'. Ketika seseorang menekan tombol 'Terminate Instance' di console atau menjalankan perintah CLI, EC2 menerima API call TerminateInstances — dan CloudTrail merekam event tersebut beserta konteks lengkapnya: siapa yang memanggil, dari mana, kapan, dan dengan parameter apa.
Yang penting dipahami: CloudTrail Event History menyimpan management events secara default selama 90 hari tanpa konfigurasi tambahan. Ini berarti untuk insiden yang terjadi dalam 90 hari terakhir, data sudah tersedia — tidak perlu setup trail tambahan terlebih dahulu.
- API Call masuk — Aksi
TerminateInstancesdipanggil melalui Console, CLI, atau SDK. - EC2 memproses request — Instance berpindah ke state
shutting-downlaluterminated. - CloudTrail merekam event — Event disimpan di Event History dengan metadata lengkap termasuk identitas pemanggil.
- Event tersedia untuk query — Dapat diakses via Console atau CLI dalam beberapa menit setelah aksi terjadi.
Struktur Event CloudTrail yang Perlu Dipahami
Sebelum mulai investigasi, kenali field-field kritis dalam event JSON CloudTrail. Ini yang membedakan investigasi cepat dari yang memakan waktu berjam-jam.
- userIdentity — Identitas pemanggil: bisa IAM user, assumed role, AWS service, atau root account.
- eventTime — Waktu UTC saat API call terjadi.
- sourceIPAddress — IP asal request. Jika dari console AWS, nilainya bisa berupa service endpoint.
- requestParameters — Parameter yang dikirim, termasuk instance ID yang di-terminate.
- responseElements — Respons dari EC2, termasuk konfirmasi state perubahan instance.
- errorCode / errorMessage — Jika aksi gagal, field ini berisi alasannya.
Investigasi TerminateInstances via CloudTrail Event History
Ada dua jalur investigasi: melalui AWS Management Console untuk pencarian cepat visual, dan melalui AWS CLI untuk hasil yang lebih presisi dan bisa di-script. Keduanya mengakses data yang sama.
Jalur 1: AWS Management Console
Cara paling cepat untuk investigasi awal. Buka CloudTrail di region yang sama dengan instance yang hilang — CloudTrail Event History bersifat regional.
- Navigasi ke CloudTrail → Event History di AWS Console.
- Pada dropdown filter, pilih 'Event name'.
- Ketik
TerminateInstancesdi kolom pencarian. - Atur rentang waktu sesuai perkiraan insiden terjadi.
- Klik event yang muncul, lalu pilih 'View event' untuk melihat JSON lengkap.
Di dalam JSON event, cari bagian userIdentity. Jika pelakunya adalah IAM user biasa, field type akan bernilai IAMUser dan field userName berisi nama user tersebut. Jika menggunakan assumed role, type akan bernilai AssumedRole dan detail role serta session ada di dalam sessionContext.
Jalur 2: AWS CLI — Pencarian Terstruktur
CLI memberikan kontrol lebih besar, terutama saat perlu memfilter berdasarkan instance ID spesifik atau mengekspor hasilnya untuk analisis lebih lanjut.
Perintah dasar untuk mencari event TerminateInstances:
aws cloudtrail lookup-events \
--lookup-attributes AttributeKey=EventName,AttributeValue=TerminateInstances \
--region us-east-1 \
--output json
Perintah di atas mengembalikan semua event TerminateInstances dalam 90 hari terakhir di region tersebut. Jika environment memiliki banyak aksi terminate, output bisa panjang. Tambahkan filter waktu untuk mempersempit:
aws cloudtrail lookup-events \
--lookup-attributes AttributeKey=EventName,AttributeValue=TerminateInstances \
--start-time 2024-01-15T00:00:00Z \
--end-time 2024-01-16T23:59:59Z \
--region us-east-1 \
--output json
Untuk langsung mengekstrak informasi identitas pemanggil dan instance yang terdampak, kombinasikan dengan jq:
aws cloudtrail lookup-events \
--lookup-attributes AttributeKey=EventName,AttributeValue=TerminateInstances \
--region us-east-1 \
--output json | jq '.Events[] | {
eventTime: .EventTime,
user: .Username,
sourceIP: (.CloudTrailEvent | fromjson | .sourceIPAddress),
userType: (.CloudTrailEvent | fromjson | .userIdentity.type),
instanceIds: (.CloudTrailEvent | fromjson | .requestParameters.instancesSet.items[].instanceId)
}'
Bayangkan CloudTrail seperti CCTV gedung — rekaman selalu berjalan di background. Masalahnya bukan apakah rekaman ada, tapi apakah kamu tahu cara memutar ulang footage yang tepat pada timestamp yang benar.
Membaca Output Event: Identifikasi Pelaku
Ini bagian yang paling kritis. Output JSON event CloudTrail untuk TerminateInstances memiliki struktur seperti berikut:
🔽 Klik untuk melihat contoh struktur JSON event CloudTrail
{
'eventVersion': '1.08',
'userIdentity': {
'type': 'AssumedRole',
'principalId': 'AROAEXAMPLEID:session-name',
'arn': 'arn:aws:sts::123456789012:assumed-role/DevOpsRole/session-name',
'accountId': '123456789012',
'sessionContext': {
'sessionIssuer': {
'type': 'Role',
'principalId': 'AROAEXAMPLEID',
'arn': 'arn:aws:iam::123456789012:role/DevOpsRole',
'accountId': '123456789012',
'userName': 'DevOpsRole'
},
'attributes': {
'creationDate': '2024-01-15T10:00:00Z',
'mfaAuthenticated': 'false'
}
}
},
'eventTime': '2024-01-15T14:32:11Z',
'eventSource': 'ec2.amazonaws.com',
'eventName': 'TerminateInstances',
'awsRegion': 'us-east-1',
'sourceIPAddress': '203.0.113.45',
'userAgent': 'aws-cli/2.x.x',
'requestParameters': {
'instancesSet': {
'items': [
{
'instanceId': 'i-0abcd1234efgh5678'
}
]
}
},
'responseElements': {
'instancesSet': {
'items': [
{
'instanceId': 'i-0abcd1234efgh5678',
'currentState': {
'code': 32,
'name': 'shutting-down'
},
'previousState': {
'code': 16,
'name': 'running'
}
}
]
}
}
}
Dari contoh di atas, bisa dibaca dengan jelas: role DevOpsRole dengan session name tertentu melakukan terminate terhadap instance i-0abcd1234efgh5678 pada pukul 14:32 UTC dari IP 203.0.113.45 menggunakan AWS CLI. Field mfaAuthenticated: false juga menjadi catatan penting untuk audit keamanan.
Aksi oleh IAM user langsung"] B -->|"AssumedRole"| D["Cek sessionContext.sessionIssuer.userName
Aksi via role assumption"] B -->|"Root"| E["Root account digunakan
Red flag — eskalasi segera"] B -->|"AWSService"| F["Cek field: invokedBy
Aksi oleh AWS service otomatis"] C --> G["Identifikasi lengkap"] D --> G E --> G F --> G
- userIdentity.type = IAMUser — Aksi dilakukan langsung oleh IAM user. Cek field
userName. - userIdentity.type = AssumedRole — Aksi dilakukan via role assumption. Cek
sessionContext.sessionIssuer.userNameuntuk nama role, danprincipalIduntuk session identifier. - userIdentity.type = Root — Aksi dilakukan oleh root account. Ini red flag serius yang perlu ditindaklanjuti segera.
- userIdentity.type = AWSService — Aksi dipicu oleh AWS service lain (misalnya Auto Scaling). Cek field
invokedBy.
Skenario Nyata: Misdiagnosis yang Sering Terjadi
Tim mendapat alert bahwa instance production tiba-tiba hilang. Asumsi pertama: ada yang salah klik di console. Investigasi CloudTrail menunjukkan event TerminateInstances dengan userIdentity.type: AWSService dan invokedBy: autoscaling.amazonaws.com.
Kesimpulan awal salah total. Bukan human error — Auto Scaling Group melakukan scale-in karena kebijakan scaling terpicu oleh penurunan CPU. Instance yang di-terminate adalah instance yang 'seharusnya' dihapus menurut konfigurasi ASG, tapi tidak ada yang menyadari bahwa termination protection tidak diaktifkan pada instance tersebut.
Pelajarannya: selalu baca field userIdentity.type sebelum menarik kesimpulan. Aksi yang tampak seperti human error sering kali adalah automated action dari service AWS lain. Bedakan keduanya sebelum eskalasi ke manajemen.
Pencarian Berdasarkan Resource ID Spesifik
Jika sudah tahu instance ID yang hilang, bisa langsung filter berdasarkan resource tersebut. CLI lookup-events mendukung filter berdasarkan ResourceName:
aws cloudtrail lookup-events \
--lookup-attributes AttributeKey=ResourceName,AttributeValue=i-0abcd1234efgh5678 \
--region us-east-1 \
--output json
Perintah ini mengembalikan semua event yang melibatkan instance ID tersebut, tidak hanya TerminateInstances — termasuk StartInstances, StopInstances, dan modifikasi lainnya. Berguna untuk membangun timeline lengkap aktivitas pada instance tersebut sebelum dihapus.
Perlu diingat: lookup-events hanya dapat mengembalikan maksimal 50 hasil per request dan mendukung pagination via --next-token. Untuk dataset besar atau pencarian historis lebih dari 90 hari, perlu menggunakan CloudTrail Lake atau S3 bucket yang dikonfigurasi sebagai trail destination.
IAM Permission yang Diperlukan untuk Investigasi
Untuk menjalankan investigasi ini, akun yang digunakan memerlukan permission berikut:
{
'Version': '2012-10-17',
'Statement': [
{
'Effect': 'Allow',
'Action': [
'cloudtrail:LookupEvents'
],
'Resource': '*'
}
]
}
Action cloudtrail:LookupEvents tidak mendukung resource-level restriction dan memerlukan 'Resource': '*' — ini adalah batasan yang terdokumentasi di AWS Service Authorization Reference untuk CloudTrail. Prinsip least privilege tetap diterapkan dengan membatasi action hanya pada LookupEvents, bukan memberikan akses penuh ke CloudTrail.
Langkah Selanjutnya Setelah Menemukan Pelaku
Menemukan siapa yang melakukan terminate hanyalah langkah pertama. Tindakan lanjutan bergantung pada konteks:
- Jika human error — Evaluasi apakah instance tersebut seharusnya dilindungi dengan EC2 termination protection. Aktifkan protection pada instance-instance kritis.
- Jika automated action (ASG/service) — Review konfigurasi Auto Scaling policy dan pastikan instance yang tidak boleh di-terminate memiliki protection yang tepat.
- Jika aksi tidak sah — Segera revoke credentials yang terlibat, audit permission IAM entity tersebut, dan aktifkan GuardDuty jika belum aktif.
- Untuk pencegahan jangka panjang — Pertimbangkan setup CloudTrail trail ke S3 untuk retensi lebih dari 90 hari, dan buat CloudWatch alarm untuk event
TerminateInstancespada resource kritis.
Wrap-Up: Investigasi CloudTrail TerminateInstances
CloudTrail Event History adalah sumber kebenaran pertama untuk investigasi aksi TerminateInstances pada EC2. Data tersedia secara default selama 90 hari tanpa konfigurasi tambahan. Kunci investigasi yang efektif adalah membaca field userIdentity.type dengan benar — membedakan antara IAM user, assumed role, root account, dan AWS service sebelum menarik kesimpulan.
Untuk environment produksi, jangan andalkan hanya Event History — setup CloudTrail trail ke S3 untuk retensi jangka panjang dan pertimbangkan CloudTrail Lake untuk kemampuan query yang lebih powerful. Dokumentasi lengkap tersedia di AWS CloudTrail User Guide — Viewing Events.
Glosarium
| Istilah | Penjelasan |
|---|---|
| CloudTrail Event History | Fitur bawaan CloudTrail yang menyimpan management events selama 90 hari terakhir tanpa konfigurasi trail tambahan. |
| TerminateInstances | API action EC2 yang menghapus instance secara permanen. Berbeda dengan StopInstances yang hanya menghentikan instance. |
| userIdentity | Field dalam event CloudTrail yang berisi informasi lengkap tentang identitas yang melakukan API call, termasuk type, ARN, dan session context. |
| AssumedRole | Tipe userIdentity yang menunjukkan aksi dilakukan oleh principal yang menggunakan STS AssumeRole untuk mendapatkan temporary credentials. |
| Management Events | Kategori CloudTrail event yang mencatat operasi manajemen pada AWS resources, seperti create, modify, dan delete actions. |
Komentar
Posting Komentar