TDCTF Academy Logo TDCTF ACADEMY

9.3.2 Cloud Storage Security

Cloud Storage Security mencakup praktik pengamanan data yang disimpan di layanan object storage cloud seperti AWS S3, Azure Blob Storage, dan Google Cloud Storage. Object storage adalah target utama penyerang karena sering salah konfigurasi dan menyimpan data sensitif dalam jumlah besar.

Object Storage: AWS S3, Azure Blob, GCP Cloud Storage

Ketiga cloud provider menawarkan layanan object storage dengan konsep yang mirip - data disimpan sebagai objects di dalam buckets atau containers, bukan di struktur file tradisional.

Fitur AWS S3 Azure Blob GCP Cloud Storage
Unit penyimpanan Bucket Storage Account Bucket
Object identifier Key Blob name Object name
Redundansi regional S3 Standard, S3 IA, Glacier Hot, Cool, Archive Standard, Nearline, Coldline, Archive
Global uniqueness Ya (bucket name) Ya (storage account name) Ya (bucket name)
Access control Bucket Policy, ACL, IAM RBAC, SAS Token IAM, ACL

Contoh: Membuat Bucket Aman di AWS S3

# Membuat bucket dengan public access blocked
aws s3api create-bucket \
--bucket perusahaan-prod-data \
--region ap-southeast-1 \
--create-bucket-configuration LocationConstraint=ap-southeast-1 \
--object-ownership BucketOwnerEnforced

Bucket Policies vs ACL

ACL (Access Control List)

ACL adalah mekanisme akses kontrol lama yang mengizinkan akses pada level object. AWS sudah merekomendasikan untuk tidak menggunakan ACL dan beralih ke bucket policy atau IAM.

# Menonaktifkan ACL, beralih ke BucketOwnerEnforced
aws s3api put-bucket-ownership-controls \
--bucket perusahaan-prod-data \
--ownership-controls Rules=[{ObjectOwnership=BucketOwnerEnforced}]

Bucket Policy

Bucket policy adalah dokumen JSON berbasis resource policy yang jauh lebih fleksibel dan aman dibanding ACL.

{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Deny",
"Principal": "*",
"Action": "s3:*",
"Resource": [
"arn:aws:s3:::perusahaan-prod-data",
"arn:aws:s3:::perusahaan-prod-data/*"
],
"Condition": {
"Bool": {
"aws:SecureTransport": "false"
}
}
},
{
"Effect": "Allow",
"Principal": {
"AWS": "arn:aws:iam::123456789012:role/DataAnalyst"
},
"Action": [
"s3:GetObject",
"s3:ListBucket"
],
"Resource": [
"arn:aws:s3:::perusahaan-prod-data",
"arn:aws:s3:::perusahaan-prod-data/*"
]
}
]
}

Key takeaway: Bucket policy + IAM lebih aman, lebih granular, dan lebih mudah di-audit dibanding ACL.

Block Public Access

Fitur paling penting untuk mencegah data terekspos ke publik adalah S3 Block Public Access:

# Menerapkan Block Public Access di level akun (account-level)
aws s3control put-public-access-block \
--account-id 123456789012 \
--public-access-block-configuration \
BlockPublicAcls=true,IgnorePublicAcls=true,BlockPublicPolicy=true,RestrictPublicBuckets=true
Setting Fungsi
BlockPublicAcls Mencegah ACL publik baru
IgnorePublicAcls Mengabaikan semua ACL publik yang sudah ada
BlockPublicPolicy Mencegah bucket policy yang memberikan akses publik
RestrictPublicBuckets Membatasi akses publik hanya dari AWS service/authorized account

Best practice: Aktifkan Block Public Access di level organisasi atau akun, bukan hanya per bucket.

Azure Blob Public Access

# Set storage account ke non-publik
az storage account update \
--name perusahaandata \
--resource-group rg-prod \
--allow-blob-public-access false

GCP Uniform Bucket Level Access

# Wajibkan akses uniform (non-ACL)
gsutil uniformbucketlevelaccess set on gs://perusahaan-prod-data

Encryption at Rest

SSE-S3 (Server-Side Encryption with S3-Managed Keys)

# Default encryption dengan AES-256
aws s3api put-bucket-encryption \
--bucket perusahaan-prod-data \
--server-side-encryption-configuration \
'{"Rules":[{"ApplyServerSideEncryptionByDefault":{"SSEAlgorithm":"AES256"}}]}'

SSE-KMS (AWS KMS - Managed Keys)

Menggunakan KMS memberikan kontrol lebih: key rotation, audit trail (CloudTrail), dan pemisahan akses:

# Membuat KMS key
aws kms create-key --description "S3 Encryption Key - Production"

# Mengaktifkan automatic key rotation
aws kms enable-key-rotation --key-id alias/s3-prod-key

# Menerapkan SSE-KMS di bucket
aws s3api put-bucket-encryption \
--bucket perusahaan-prod-data \
--server-side-encryption-configuration \
'{"Rules":[{"ApplyServerSideEncryptionByDefault":{"SSEAlgorithm":"aws:kms","KMSMasterKeyID":"alias/s3-prod-key"}}]}'

SSE-C (Customer-Provided Keys)

Hanya gunakan jika Anda perlu membawa kunci enkripsi sendiri. Anda mengelola kunci, S3 menggunakan kunci tersebut untuk enkripsi/dekripsi:

# Upload dengan SSE-C
aws s3api put-object \
--bucket perusahaan-prod-data \
--key laporan-keuangan.pdf \
--body laporan.pdf \
--sse-customer-algorithm AES256 \
--sse-customer-key g8Tp0pQqMx1Wz2Yr4N6s7b9DfHjKlMnQ=

Azure Blob Encryption

# Mengaktifkan infrastruktur encryption di Azure
az storage account update \
--name perusahaandata \
--resource-group rg-prod \
--require-infrastructure-encryption true

GCP CMEK (Customer-Managed Encryption Keys)

# Membuat key ring dan kunci di Cloud KMS
gcloud kms keyrings create storage-keyring --location global
gcloud kms keys create storage-key \
--keyring storage-keyring \
--location global \
--purpose encryption

# Menerapkan CMEK di bucket
gsutil kms encryption \
-k projects/perusahaan/locations/global/keyRings/storage-keyring/cryptoKeys/storage-key \
gs://perusahaan-prod-data

Encryption in Transit

AWS S3 mendukung HTTPS/TLS secara default. Untuk memastikan tidak ada request HTTP yang lolos, gunakan bucket policy dengan kondisi aws:SecureTransport:

{
"Effect": "Deny",
"Principal": "*",
"Action": "s3:*",
"Resource": "arn:aws:s3:::perusahaan-prod-data/*",
"Condition": {
"Bool": {
"aws:SecureTransport": "false"
}
}
}

Versioning, MFA Delete, dan Object Lock

Versioning

Versioning menyimpan semua versi object, termasuk yang di-delete - melindungi dari penghapusan tidak sengaja dan ransomware:

# Mengaktifkan versioning
aws s3api put-bucket-versioning \
--bucket perusahaan-prod-data \
--versioning-configuration Status=Enabled

MFA Delete

MFA Delete mewajibkan autentikasi multi-faktor untuk operasi destructive (menonaktifkan versioning, menghapus versi object):

# Mengaktifkan MFA Delete (harus menggunakan root user atau IAM dengan MFA)
aws s3api put-bucket-versioning \
--bucket perusahaan-prod-data \
--versioning-configuration Status=Enabled,MFADelete=Enabled \
--mfa "arn:aws:iam::123456789012:mfa/root-account-mfa 123456"

Common misconfig: MFA Delete sering tidak diaktifkan, membuat bucket rentan terhadap penghapusan massal oleh penyerang yang memiliki akses IAM.

Object Lock (WORM - Write Once Read Many)

Object Lock mencegah object dihapus atau ditimpa untuk jangka waktu tertentu - penting untuk compliance (SEC Rule 17a-4, FINRA):

# Mengaktifkan Object Lock saat pembuatan bucket (tidak bisa diubah nanti)
aws s3api create-bucket \
--bucket perusahaan-arsip \
--region ap-southeast-1 \
--create-bucket-configuration LocationConstraint=ap-southeast-1 \
--object-lock-enabled-for-bucket

# Menerapkan retention policy governance mode
aws s3api put-object-lock-configuration \
--bucket perusahaan-arsip \
--object-lock-configuration \
'{"ObjectLockEnabled":"Enabled","Rule":{"DefaultRetention":{"Mode":"GOVERNANCE","Days":365}}}'

Mode Object Lock:

Mode Deskripsi
GOVERNANCE Object tidak bisa dihapus kecuali oleh user dengan permission s3:BypassGovernanceRetention
COMPLIANCE Object tidak bisa dihapus oleh siapa pun - termasuk root user - selama retention period

Bucket Logging

Mengaktifkan akses logging untuk semua operasi di bucket:

# Membuat bucket log terpisah (bucket B)
aws s3 mb s3://perusahaan-s3-logs

# Mengaktifkan server access logging di bucket A ke bucket B
aws s3api put-bucket-logging \
--bucket perusahaan-prod-data \
--bucket-logging-status \
'{"LoggingEnabled":{"TargetBucket":"perusahaan-s3-logs","TargetPrefix":"s3-access-logs/"}}'

AWS CloudTrail untuk S3 Events

# Membuat trail untuk data events
aws cloudtrail put-event-selectors \
--trail-name s3-data-trail \
--event-selectors '[{"ReadWriteType":"All","IncludeManagementEvents":true,"DataResources":[{"Type":"AWS::S3::Object","Values":["arn:aws:s3:::perusahaan-prod-data/"]}]}]'

Common Misconfigurations

1. Public Bucket

Masalah: Bucket terkonfigurasi sebagai publik, data sensitif bisa diakses siapa pun.

Deteksi:

# Scan bucket publik dengan AWS CLI
aws s3api get-bucket-policy-status --bucket perusahaan-prod-data

# Audit dengan tools seperti S3Scanner
git clone https://github.com/sa7mon/S3Scanner.git
cd S3Scanner
pip install -r requirements.txt
python3 s3scanner.py --bucket perusahaan-prod-data

2. Unencrypted Data

Masalah: Data disimpan tanpa enkripsi (SSE disabled).

Deteksi dengan AWS Config:

# Managed rule untuk deteksi bucket tanpa enkripsi
aws configservice put-config-rule \
--config-rule '{"ConfigRuleName":"s3-bucket-encryption-enabled","Source":{"Owner":"AWS","SourceIdentifier":"S3_BUCKET_SERVER_SIDE_ENCRYPTION_ENABLED"}}'

3. MFA Delete Disabled

Tanpa MFA Delete, penyerang yang memiliki akses IAM - bahkan terbatas - bisa menghapus versi object. Selalu aktifkan MFA Delete untuk bucket production.

Data Classification

Implementasi klasifikasi data otomatis dengan Amazon Macie atau Azure Purview:

# Mengaktifkan Amazon Macie untuk deteksi data sensitif
aws macie2 enable-macie \
--region ap-southeast-1

# Menjalankan classification job
aws macie2 create-classification-job \
--name "Prod-S3-Scan" \
--job-type SCHEDULED \
--s3-job-definition bucketDefinitions=[{accountId=123456789012,buckets=[perusahaan-prod-data]}] \
--schedule-frequency DAILY

Macie secara otomatis mendeteksi:

  • PII (NIK, passport, nomor telepon, alamat email)
  • Credentials (API key, password, secret key)
  • Financial data (nomor kartu kredit, rekening bank)
  • Medical records (sesuai regulasi HIPAA)
  • Custom identifiers (internal ID, NIP, dll.)

Tagging Berdasarkan Classification

# Tag bucket berdasarkan level data
aws s3api put-bucket-tagging \
--bucket perusahaan-prod-data \
--tagging 'TagSet=[{Key=DataClassification,Key=Confidential},{Key=Compliance,Key=PII}]'

Verifikasi

# Cek konfigurasi Block Public Access
aws s3control get-public-access-block --account-id 123456789012

# Cek bucket encryption
aws s3api get-bucket-encryption --bucket perusahaan-prod-data

# Cek versi bucket logging
aws s3api get-bucket-logging --bucket perusahaan-prod-data

# Simulasi akses publik dengan IAM policy simulator
aws iam simulate-principal-policy \
--policy-source-arn arn:aws:iam::123456789012:role/DataAnalyst \
--action-names s3:GetObject \
--resource-arns arn:aws:s3:::perusahaan-prod-data/laporan.pdf

Referensi

PADA HALAMAN INI