Mengamankan data di cloud: enkripsi at rest dan in transit dengan KMS, envelope encryption, perbedaan AWS managed key vs customer managed key, key policy dan rotation, block public access untuk S3, serta data classification yang menentukan tingkat proteksi tiap dataset

Setelah di episode 5 kita mengeraskan workload — golden image, IMDSv2, Session Manager — sekarang kita sampai pada aset yang menjadi alasan semua lapisan itu ada: data. Firewall, IAM, dan hardening adalah benteng; data adalah harta yang dibentengi.
Mengapa episode ini penting? Karena kebocoran data adalah dampak akhir dari hampir semua insiden, dan regulasi (GDPR, UU PDP) menetapkan konsekuensi finansial langsung padanya. Kabar baiknya: di cloud, enkripsi yang dulu mahal dan rumit kini bisa jadi default — asal kalian tahu mana yang perlu dikunci lebih keras.
Dua keadaan data yang butuh perlindungan berbeda:
| Keadaan | Ancaman Utama | Kontrol |
|---|---|---|
| In transit | Intersepsi, MITM | TLS 1.2+, mTLS antar-service |
| At rest | Disk dicuri/snapshot bocor | AES-256 via KMS/managed key |
Praktik minimum 2026: TLS wajib untuk semua endpoint (tolak versi lama), dan encryption by default untuk semua storage service — S3, EBS, RDS, EFS, Redshift semuanya mendukung satu baris konfigurasi.
KMS mengelola key induk (CMK) di dalam HSM yang tidak pernah keluar. Untuk objek besar, cloud memakai envelope encryption: data dienkripsi dengan data key, dan data key itu sendiri dienkripsi dengan CMK.
Pola ini menjawab pertanyaan penting: siapa yang boleh mendekripsi bukan ditentukan siapa yang punya akses bucket, melainkan oleh key policy. Itulah lapisan kontrol kedua yang membuat eksfiltrasi mentah tetap tak berguna.
Perbedaan dua jenis key:
| Jenis Key | Siapa Kelola | Kapan Dipakai |
|---|---|---|
AWS managed key (aws/s3) | AWS otomatis | Default; rotasi otomatis; tanpa kontrol granular |
| Customer managed key (CMK) | Kalian (policy, rotasi, audit) | Data sensitif, kebutuhan regulasi, cross-account |
Aturan praktis: mulai dengan AWS managed key untuk umum, naikkan ke CMK untuk data terklasifikasi sensitif — karena CMK memberi kalian key policy, audit trail per-pemakaian, dan rotation schedule yang bisa dipertanggungjawabkan.
Key policy adalah dokumen IAM yang menempel pada CMK — dan ia wajib mengizinkan pemilik akun, kalau tidak, key bisa jadi tak terkelola sama sekali. Contoh CMK untuk tim pembayaran:
{
"Version": "2012-10-17",
"Statement": [
{
"Sid": "EnableIAMUserPermissions",
"Effect": "Allow",
"Principal": {"AWS": "arn:aws:iam::123456789012:root"},
"Action": "kms:*",
"Resource": "*"
},
{
"Sid": "AllowPaymentsTeamUse",
"Effect": "Allow",
"Principal": {"AWS": "arn:aws:iam::123456789012:role/payments-runtime"},
"Action": ["kms:Decrypt", "kms:GenerateDataKey"],
"Resource": "*"
},
{
"Sid": "DenyWithoutTLS",
"Effect": "Deny",
"Principal": "*",
"Action": "kms:*",
"Resource": "*",
"Condition": {"Bool": {"kms:ViaService": "s3.ap-southeast-1.amazonaws.com", "Bool": {"aws:SecureTransport": "false"}}}
}
]
}Aktifkan rotasi tahunan untuk CMK — material lama dipertahankan untuk dekripsi data lama, sementara operasi baru pakai material baru:
aws kms enable-key-rotation --key-id alias/payments-data
aws kms get-key-rotation-status --key-id alias/payments-dataS3 adalah lokasi paling sering bocor di seluruh cloud. Tiga pengaman berlapis:
GetObject lewat HTTP.aws s3control put-public-access-block \
--account-id 123456789012 \
--public-access-block-configuration BlockPublicAcls=true,IgnorePublicAcls=true,BlockPublicPolicy=true,RestrictPublicBuckets=true{
"Version": "2012-10-17",
"Statement": [{
"Sid": "DenyInsecureTransport",
"Effect": "Deny",
"Principal": "*",
"Action": "s3:*",
"Resource": [
"arn:aws:s3:::payments-docs-prod",
"arn:aws:s3:::payments-docs-prod/*"
],
"Condition": {"Bool": {"aws:SecureTransport": "false"}}
}]
}Warning
Enkripsi default S3 (sejak Januari 2023) membuat objek terenkripsi otomatis — tapi jangan merasa aman begitu saja. Jika key-nya AWS managed dan policy bucket longgar, penyerang yang mencuri kredensial valid tetap bisa membaca data. Enkripsi mengunci data dari disk, policy mengunci data dari orang.
Tidak semua data setara. Klasifikasi menentukan di mana kalian investasikan CMK, logging ketat, dan review manual:
| Level | Contoh | Kontrol Minimum |
|---|---|---|
| Publik | Dokumentasi produk | Integritas & availability saja |
| Internal | Diagram arsitektur | Akses internal, TLS |
| Rahasia | Data pelanggan agregat | CMK, akses role spesifik, audit log |
| Sangat rahasia | PII, kartu kredit, kredensial | CMK + rotation ketat, private endpoint, akses break-glass, DLP |
Tag klasifikasi ini sebaiknya hidup sebagai tag resource (data-class=restricted) sehingga bisa dipakai CSPM untuk menegakkan kontrol sesuai level — pola yang akan kita otomasi di episode 7 dan 11.
Rakit semuanya untuk satu bucket data sensitif:
resource "aws_kms_key" "docs" {
description = "CMK for restricted docs"
enable_key_rotation = true
deletion_window_in_days = 30
}
resource "aws_s3_bucket" "docs" {
bucket = "payments-docs-prod"
}
resource "aws_s3_bucket_server_side_encryption_configuration" "docs" {
bucket = aws_s3_bucket.docs.id
rule {
apply_server_side_encryption_by_default {
kms_master_key_id = aws_kms_key.docs.arn
sse_algorithm = "aws:kms"
}
bucket_key_enabled = true # hemat biaya KMS request hingga 99%
}
}
resource "aws_s3_bucket_public_access_block" "docs" {
bucket = aws_s3_bucket.docs.id
block_public_acls = true
block_public_policy = true
ignore_public_acls = true
restrict_public_buckets = true
}Verifikasi bahwa objek benar-benar terenkripsi dengan CMK kalian:
aws s3api head-object --bucket payments-docs-prod --key laporan/q1.pdf \
--query '{SSE:ServerSideEncryption,Key:SSEKMSKeyId}'Inti yang harus dibawa pulang:
Di episode 7 selanjutnya kita bicara tentang mesin yang menemukan kesalahan kita sebelum penyerang: CSPM dan misconfiguration — Security Hub, Defender for Cloud, CIS benchmark, dan cara remediation yang efisien. Sampai jumpa!