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