9.5.1 Cloud Logging
Cloud Logging adalah praktik sentralisasi log dari seluruh layanan cloud - compute, network, storage, database, hingga API calls - ke satu platform untuk keperluan audit, forensik, deteksi ancaman, dan compliance. Di lingkungan cloud-native, setiap tindakan pengguna, API call, dan perubahan infrastruktur harus tercatat secara immutable dan tamper-proof.
Arsitektur Centralized Logging
Centralized logging di cloud mengikuti arsitektur log pipeline dengan tiga tahap utama:
- Generation - Layanan cloud menghasilkan log (API calls, metrics, events)
- Aggregation - Log dikirim ke sentral storage (S3, Azure Blob, GCS) atau SIEM
- Analysis & Alerting - Log diproses, dianalisis, dan dijadikan dasar alert
flowchart LR
subgraph Sumber
A[AWS EC2 / Lambda]
B[Azure VM / Functions]
C[GCP Compute / Cloud Run]
end
subgraph Aggregator
D[CloudWatch Logs / S3]
E[Azure Monitor Logs]
F[GCP Cloud Logging]
end
subgraph SIEM
G[Splunk / ELK / Wazuh]
end
A --> D
B --> E
C --> F
D --> G
E --> G
F --> G
AWS CloudTrail - Audit Trail untuk AWS API
AWS CloudTrail mencatat setiap API call yang dilakukan terhadap AWS infrastructure - baik dari AWS Management Console, AWS CLI, SDK, maupun API langsung.
CloudTrail Event Types
| Tipe Event | Deskripsi | Contoh |
|---|---|---|
| Management Events | Operasi terhadap resource AWS | CreateVpc, DeleteBucket,
AttachRolePolicy |
| Data Events | Operasi di dalam resource | GetObject di S3, Invoke di
Lambda |
| Insights Events | Deteksi aktivitas abnormal | IAM user call rate anomali |
Konfigurasi CloudTrail Trail
# Membuat trail dengan bucket tujuan
aws cloudtrail create-trail \
--name production-audit-trail \
--s3-bucket-name my-audit-logs-bucket \
--is-multi-region-trail \
--enable-log-file-validation \
--kms-key-id alias/cloudtrail-key
# Mengaktifkan log file validation (SHA-256)
aws cloudtrail update-trail \
--name production-audit-trail \
--enable-log-file-validation
# Mengaktifkan Insights untuk deteksi anomali
aws cloudtrail put-insight-selectors \
--trail-name production-audit-trail \
--insight-selectors '[{"InsightType": "ApiCallRateInsight"}]'
Log File Validation
CloudTrail secara opsional menandatangani setiap log file dengan SHA-256 hashing dan RSA signing menggunakan kunci publik AWS. Ini memastikan integritas log - tidak ada yang bisa mengubah log tanpa terdeteksi.
# Validasi digest file secara manual
aws cloudtrail validate-logs \
--trail-arn arn:aws:cloudtrail:ap-southeast-1:123456789012:trail/production-audit-trail \
--start-time 2026-07-20T00:00:00Z \
--end-time 2026-07-21T00:00:00Z
CloudTrail Lake
CloudTrail Lake menyediakan SQL-based query tanpa perlu menunggu log masuk ke S3:
-- Mencari semua aktivitas DeleteBucket dalam 7 hari terakhir
SELECT eventSource, eventName, userIdentity.arn, sourceIPAddress
FROM cloudtrail_logs
WHERE eventName LIKE 'Delete%'
AND eventTime > '2026-07-15 00:00:00'
ORDER BY eventTime DESC
Azure Monitor Logs - Log Analytics Workspace
Azure Monitor Logs menggunakan Log Analytics Workspace sebagai repositori sentral untuk log dari Azure resources, on-premise servers, dan aplikasi.
Membuat Log Analytics Workspace
# Azure CLI
az monitor log-analytics workspace create \
--resource-group security-rg \
--workspace-name security-audit-workspace \
--location southeastasia \
--sku PerGB2018
# Mengirim log dari resources ke workspace
az monitor diagnostic-settings create \
--resource /subscriptions/xxx/resourceGroups/prod-rg/providers/Microsoft.Network/networkSecurityGroups/prod-nsg \
--name nsg-audit-diagnostics \
--workspace security-audit-workspace \
--logs '[{"category": "NetworkSecurityGroupRuleCounter", "enabled": true}]'
Kusto Query Language (KQL) untuk Threat Hunting
KQL adalah bahasa query utama di Azure Monitor Logs:
// Mendeteksi multiple failed login di VM
SigninLogs
| where TimeGenerated > ago(1h)
| where ResultType == "50057" // User account is disabled
| summarize FailedAttempts = count() by UserPrincipalName, IPAddress
| where FailedAttempts > 5
| project UserPrincipalName, IPAddress, FailedAttempts
// Audit perubahan di Azure Policy
AzureActivity
| where OperationName contains "policy"
| where ActivityStatus == "Succeeded"
| project TimeGenerated, Caller, OperationName, Resource
GCP Cloud Logging - Log Router & Logs Explorer
GCP Cloud Logging menggunakan Log Router untuk mengatur aliran log ke berbagai tujuan termasuk BigQuery, Cloud Storage, dan Pub/Sub.
Konfigurasi Log Sink ke BigQuery
# Buat dataset BigQuery untuk log audit
bq mk --dataset my_project:audit_logs
# Buat log sink yang mengirimkan semua log Admin Activity
gcloud logging sinks create admin-activity-sink \
bigquery.googleapis.com/projects/my_project/datasets/audit_logs \
--log-filter="LOG_ID(\"cloudaudit.googleapis.com/activity\")" \
--description="Sink untuk audit admin activity"
# Mengirim log ke Pub/Sub untuk SIEM real-time
gcloud logging sinks create realtime-siem-sink \
pubsub.googleapis.com/projects/my_project/topics/siem-logs \
--log-filter="severity>=WARNING"
Jenis Log Audit di GCP
| Jenis Log | Deskripsi | Retention Default |
|---|---|---|
| Admin Activity | Operasi administratif (create/modify/delete resource) | 400 hari |
| Data Access | Operasi baca/tulis data user | 400 hari (jika diaktifkan) |
| System Event | Tindakan non-manusia oleh GCP | 400 hari |
| Policy Denied | Log akses yang ditolak IAM policy | 400 hari |
Log Retention Policies
Setiap cloud provider memiliki kebijakan retensi yang berbeda. Best practice adalah menyimpan log sesuai kebutuhan compliance (misalnya PCI DSS mewajibkan 1 tahun, SOC 2 minimal 6 bulan).
AWS - S3 Lifecycle + Object Lock
# Lifecycle policy untuk log S3
aws s3api put-bucket-lifecycle-configuration \
--bucket my-audit-logs-bucket \
--lifecycle-configuration '{
"Rules": [
{
"Id": "LogRetention",
"Status": "Enabled",
"Filter": {"Prefix": "AWSLogs/"},
"Transitions": [
{"Days": 30, "StorageClass": "STANDARD_IA"},
{"Days": 90, "StorageClass": "GLACIER"}
],
"Expiration": {"Days": 365}
}
]
}'
# S3 Object Lock - immutability untuk compliance
aws s3api put-object-lock-configuration \
--bucket my-audit-logs-bucket \
--object-lock-configuration '{
"ObjectLockEnabled": "Enabled",
"Rule": {
"DefaultRetention": {
"Mode": "GOVERNANCE",
"Days": 365
}
}
}'
Azure - Data Retention di Log Analytics
# Set retention policy di workspace
az monitor log-analytics workspace update \
--resource-group security-rg \
--workspace-name security-audit-workspace \
--retention-time 365 # dalam hari
GCP - Retention di Log Bucket
# Create a custom log bucket dengan retention 1 tahun
gcloud logging buckets create security-log-bucket \
--location=global \
--retention-days=365 \
--description="Audit log bucket with 1 year retention"
Log Encryption - Enkripsi Log at Rest
Semua log harus dienkripsi at rest dan in transit:
AWS CloudTrail + KMS
# Buat KMS key untuk CloudTrail
aws kms create-key --description "CloudTrail Log Encryption Key"
# Aktifkan SSE-KMS di trail
aws cloudtrail update-trail \
--name production-audit-trail \
--kms-key-id arn:aws:kms:ap-southeast-1:123456789012:key/xxxxx-xxxx-xxxx-xxxx-xxxxxxxx
Azure - CMK untuk Log Analytics
Azure Log Analytics mendukung Customer-Managed Keys (CMK) melalui Azure Key Vault:
# Assign managed identity ke workspace
az monitor log-analytics workspace update \
--resource-group security-rg \
--workspace-name security-audit-workspace \
--type SystemAssigned
# Enkripsi workspace dengan customer key
az monitor log-analytics workspace update \
--resource-group security-rg \
--workspace-name security-audit-workspace \
--key-vault-uri https://myvault.vault.azure.net/keys/logkey
Cross-Account Log Aggregation
Di organisasi dengan banyak akun (multi-account AWS, multiple subscriptions Azure), log harus diagregasi ke satu akun sentral.
AWS - Centralized Logging dengan Organization Trail
# Buat Organization Trail dari management account
aws cloudtrail create-trail \
--name org-audit-trail \
--s3-bucket-name central-audit-logs-123456789012 \
--is-organization-trail \
--enable-log-file-validation
# S3 Bucket Policy - izinkan member account menulis log
aws s3api put-bucket-policy \
--bucket central-audit-logs-123456789012 \
--policy '{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Principal": "*",
"Action": "s3:PutObject",
"Resource": "arn:aws:s3:::central-audit-logs-123456789012/AWSLogs/*/CloudTrail/*",
"Condition": {
"StringEquals": {"s3:x-amz-acl": "bucket-owner-full-control"}
}
}
]
}'
Azure - Cross-Subscription Diagnostic Settings
# Diagnostic setting mengirim log ke Log Analytics Workspace sentral
resource "azurerm_monitor_diagnostic_setting" "cross_sub" {
name = "central-audit"
target_resource_id = azurerm_key_vault.prod.id
log_analytics_workspace_id = data.azurerm_log_analytics_workspace.central.id
log {
category = "AuditEvent"
enabled = true
retention_policy {
days = 365
enabled = true
}
}
}
SIEM Integration
SIEM (Security Information and Event Management) adalah platform yang mengkorelasi log dari berbagai sumber untuk mendeteksi ancaman.
1. Splunk - Integration dengan AWS CloudTrail
# Splunk HTTP Event Collector (HEC) - kirim log dari Lambda
curl -k https://splunk.internal:8088/services/collector \
-H "Authorization: Splunk xxxxx-xxxx-xxxx-xxxx-xxxxxxxx" \
-d '{
"event": {
"source": "cloudtrail",
"eventName": "CreateUser",
"userIdentity": "arn:aws:iam::123456789012:user/admin",
"sourceIPAddress": "203.0.113.42"
},
"sourcetype": "aws:cloudtrail"
}'
2. ELK Stack (Elasticsearch + Logstash + Kibana)
Logstash configuration untuk membaca CloudTrail dari S3:
# /etc/logstash/conf.d/cloudtrail.conf
input {
s3 {
bucket => "central-audit-logs-123456789012"
region => "ap-southeast-1"
prefix => "AWSLogs/123456789012/CloudTrail/"
type => "cloudtrail"
codec => "json"
}
}
filter {
json {
source => "message"
}
date {
match => [ "eventTime", "ISO8601" ]
}
}
output {
elasticsearch {
hosts => ["https://elastic.internal:9200"]
index => "cloudtrail-%{+YYYY.MM.dd}"
user => "logstash"
password => "${ELASTIC_PASSWORD}"
}
}
3. Wazuh - Open Source SIEM
Wazuh dapat menerima log dari AWS via S3 bucket integration:
# Konfigurasi Wazuh Agent untuk membaca CloudTrail
echo '[cloudtrail]
enabled=yes
bucket=arn:aws:s3:::central-audit-logs-123456789012
interval=10m
run_on_start=yes' > /var/ossec/etc/shared/cloudtrail.conf
CloudTrail Insights - Deteksi Aktivitas Abnormal
CloudTrail Insights secara otomatis mendeteksi pola aktivitas abnormal menggunakan machine learning:
// Contoh Insights Event - API call rate anomaly
{
"eventVersion": "1.08",
"insightDetails": {
"insightType": "ApiCallRateInsight",
"insightDuration": 1800,
"baselineAverage": 2.5,
"insightAverage": 47.3,
"insightEndTime": "2026-07-20T14:30:00Z",
"insightStartTime": "2026-07-20T14:00:00Z",
"insightValue": 44.8,
"baselineValue": 2.5,
"insightSeverity": "HIGH",
"associatedEventsSummary": [
{
"eventSource": "iam.amazonaws.com",
"eventName": "CreateAccessKey"
}
]
}
}
Konfigurasi alert untuk CloudTrail Insights via CloudWatch:
{
"AlarmName": "CloudTrail-Insights-High-Severity",
"MetricName": "InsightEventCount",
"Namespace": "AWS/CloudTrail",
"Statistic": "Sum",
"Period": 300,
"EvaluationPeriods": 1,
"Threshold": 1,
"ComparisonOperator": "GreaterThanOrEqualToThreshold",
"AlarmActions": ["arn:aws:sns:ap-southeast-1:123456789012:security-alerts"]
}
Alerting dari Log Patterns
AWS - CloudWatch Logs Metric Filter + Alarm
# Buat metric filter untuk mendeteksi root login
aws logs put-metric-filter \
--log-group-name "CloudTrail/DefaultLogGroup" \
--filter-name "RootLoginDetected" \
--filter-pattern '{ ($.userIdentity.type = "Root") && ($.eventType = "AwsApiCall") }' \
--metric-transformations \
metricName=RootLoginCount,metricNamespace=SecurityMetrics,metricValue=1
# Buat alarm
aws cloudwatch put-metric-alarm \
--alarm-name "Root-Activity-Alert" \
--alarm-description "Root user melakukan API call" \
--metric-name RootLoginCount \
--namespace SecurityMetrics \
--statistic Sum \
--period 300 \
--threshold 0 \
--comparison-operator GreaterThanThreshold \
--evaluation-periods 1 \
--alarm-actions arn:aws:sns:ap-southeast-1:123456789012:security-team
Azure - Log Search Alert
# Buat scheduled query alert untuk failed SSH attempts
az monitor scheduled-query create \
--name "Failed-SSH-Alert" \
--resource-group security-rg \
--description "Alert ketika failed SSH login > 10 dalam 5 menit" \
--action-groups "/subscriptions/xxx/resourceGroups/security-rg/providers/microsoft.insights/actionGroups/security-team" \
--evaluation-frequency 5 \
--window-size 5 \
--severity 2 \
--query "
Syslog
| where Facility == 'auth' and SeverityLevel == 'err'
| where SyslogMessage has 'Failed password'
| summarize FailedCount = count() by Host, SourceIP = extract('from ([^ ]+)', 1, SyslogMessage)
| where FailedCount > 10
"
Verifikasi
# AWS - cek integritas log CloudTrail
aws cloudtrail validate-logs \
--trail-arn arn:aws:cloudtrail:ap-southeast-1:123456789012:trail/production-audit-trail \
--start-time "2026-07-15T00:00:00Z"
# Azure - query log workspace
az monitor log-analytics query \
--workspace security-audit-workspace \
--query "AuditLogs | count"
# GCP - cek log sink
gcloud logging sinks describe admin-activity-sink