Keamanan API Cloud — Kenapa API Key yang Bocor Bisa Bikin Tagihan AWS Kamu Meledak
Hari itu gue buka email, ngeliat subject dari AWS: “Your AWS Billing Alert — $643.27”. Gue baca ulang. $643.27. Itu sekitar 10 jutaan rupiah lebih. Limit billing alert yang gue set cuma $50 — jadi harusnya gue dapet notifikasi jauh-jauh hari sebelumnya kan? Ternyata enggak. Karena skrip mining cryptocurrency yang bertebaran di sepuluh region berbeda itu nyala serempak dalam waktu 4 jam. Empat jam. Dan dalam 4 jam itu, tagihan gue naik dari $0 ke $643.
Jantung gue… gue gak tau gimana deskripsiinnya. Kayak ada yang nimpuk bata ke dada gue. Tapi yang lebih bikin ngeri adalah cara mereka masuk: sebuah API key AWS yang gue commit ke public repo GitHub. Setahun sebelumnya. Gue lupa. Dan seseorang — atau lebih tepatnya bot otomatis — menemukannya.
Nah, keamanan API cloud. Ini topik yang gue anggep “ah gue ngerti lah” — sampe akhirnya kejadian sendiri. Dan setelah gue telusuri, baca-baca, dan ngobrol sama temen-temen yang kerja di cloud security, gue sadar: API key leakage itu masih jadi penyebab nomor satu insiden keamanan cloud. Bukan zero-day exploit. Bukan advanced persistent threat. Bukan serangan canggih ala nation-state. Tapi API key yang ketiduran di public GitHub repository.
Dan ini gak cuma kejadian sama gue. Tahun 2024 kemarin aja, GitHub ngedeteksi 12.8 JUTA secrets yang ke-commit ke public repository. Itu data dari GitHub sendiri. Dua belas juta lebih. Dari access token, private key, API key, sampai database credentials — semuanya numpuk di repository publik, tinggal nunggu bot scanning ketemu. Bot nya udah canggih sekarang. Mereka scanning real-time, pake pattern matching yang sophisticated, multi-stage verification. Begitu ketemu AWS key yang valid? Langsung deploy resource. Langsung mine crypto. Langsung abuse. Semua otomatis.
Gimana Sih Kronologi Lengkapnya?
Oke gue cerita lebih detail. Mungkin lo bisa ngambil pelajaran dari kebodohan gue.
Jadi sekitar setahun sebelum insiden itu, gue lagi ngerjain side project — sebuah script otomasi kecil buat nge-backup database WordPress beberapa klien ke S3. Script simpel. Python, pake boto3 library. Gue develop di local, testing, jalan — semua oke. Karena lagi buru-buru dan “cuma proyek iseng” — gue commit semuanya ke public GitHub repo. Termasuk file konfigurasi yang isinya:
AWS_ACCESS_KEY_ID=AKIAXXXXXX
AWS_SECRET_ACCESS_KEY=xxxxx
Gue pikir: “Ah, ini repo gak ada yang liat, paling cuma gue doang.” Pikiran bodoh tingkat dewa. Seriously.
Fast forward setahun kemudian. Suatu pagi, jam 7:30-an WIB, gue dapet alert billing AWS. Gue kira spam. Atau error. Tapi gue login ke AWS Console — dan beneran. Di billing dashboard, grafiknya naik curam kayak harga Bitcoin pas 2021. $0 → $643 dalam 4 jam. Gue langsung cek EC2 instances.
Ada 47 instance EC2 jalan. EMPAT PULUH TUJUH. Di 8 region berbeda. Semuanya instance type c5.xlarge atau yang sejenis — instance komputasi berat yang emang optimal buat mining. Gue cek satu-satu — semuanya jalanin script mining. Monero, mostly. Karena Monero bisa di-mine pake CPU biasa, gak perlu GPU mahal.
Mereka gak nyolong data. Gak bikin deface. Gak ada ransomware. Mereka cuma butuh compute power lo. CPU lo. Buat mining. Tagihan lo yang bayar. Simple. Brutal. Efektif.
Langkah pertama gue: revoke semua key yang compromised. Langsung dari IAM console. Tanpa pikir panjang. RIBUT - langsung matiin semua instance yang gak gue kenal. Push delete, terminate, semuanya. Baru setelah api key ganti dan instance mati — gue investigasi. Tracing. Darimana mereka masuk? Kenapa baru sekarang? Padahal key itu udah setahun lebih di public repo.
Jawabannya: bot mereka scanning terus-menerus. Tapi key AWS biasanya di-scan dengan sistem trial-and-error. Bot nemu pattern yang keliatannya kayak AWS key → coba validasi → kalo valid, langsung masuk antrian eksploitasi. Sistemnya sophisticated. Mungkin key gue udah ketemu dari 6 bulan yang lalu, tapi baru dipake sekarang karena mereka punya “jadwal” atau queue.
Kenapa API Key Di Code Repository Masih Jadi Masalah Nomor Satu?
Lo mungkin mikir: “Ah, itu kan dulu. Sekarang udah ada GitHub secret scanning, udah ada pre-commit hooks, udah ada segalanya.” Dan bener. Tapi solusi itu gak kepake kalo developernya — ya gue — males atau gak tau.
Masalahnya structural:
Deadline Dan Buru-Buru Adalah Musuh Keamanan
Gue gak tau berapa kali gue commit buru-buru karena deadline mepet. Klien nunggu. Bos nanyain progress. Client call bentar lagi. Dalam tekanan kayak gitu, lo gak mikir “apa iya file .env gue ke-filter .gitignore?” — lo mikir “COMMIT. PUSH. SELESAI.” Dan itu fatal.
Banyak banget developer yang ngerasain pressure yang sama. Startup yang ngejar MVP. Freelancer yang diburu klien. Tim kecil yang gak punya dedicated security person. Semua ini bikin API key slipping through the cracks.
Educated Developer vs Security-Aware Developer
Gue ngerti Python. Gue ngerti AWS. Gue bisa setup EC2, S3, Lambda. Tapi soal keamanan — gue gak pernah dikasih training formal. Semuanya dari pengalaman. Dari kejadian kayak gini. Dari blog post. Dari conference YouTube yang gue tonton sambil makan.
Dan realitanya: kebanyakan developer juga kayak gitu. Mereka jago ngoding — tapi gak jago securing. Itu bukan salah mereka sepenuhnya — kadang perusahaan juga gak nyediain training. Tapi dampaknya nyata. Satu API key aja bisa bikin kebocoran data atau tagihan meledak.
Tooling Itu Gak Otomatis Nyala
GitHub punya secret scanning. GitGuardian ada free tier. git-secrets dan truffleHog bisa dipasang sebagai pre-commit hook. Tapi semuanya butuh conscious effort buat di-enable. Gak ada yang otomatis kecuali lo setting sendiri. Dan kenyataannya — banyak developer yang bahkan gak tau tools ini exist.
Gue sendiri baru tau soal truffleHog SETELAH insiden itu. Pas gue desperate Googling “how to find leaked aws keys in git history” — nemu tools itu. Dan gue mikir: kenapa gue gak tau ini dari dulu?
Cara Mencegah: Yang Gue Pake Sekarang
Setelah insiden itu, gue overhaul total workflow gue. Beberapa langkah yang gue terapin:
.gitignore — Pastiin Udah Bener Sebelum Commit Pertama
Ini basic. Tapi banyak yang salah. Jangan cuma tambahin .env — tambahin juga pattern cadangan, backup, dan segala jenis file yang mungkin nyimpen credentials. Ini yang gue pake:
.env
.env.*
*.pem
*.key
credentials.json
service-account.json
*.tfstate
*.tfstate.*
secrets.yml
config/secrets.yml
Dan yang penting: SETUP .GITIGNORE SEBELUM LO NGELAKUIN COMMIT PERTAMA. Kalo lo udah pernah commit file yang berisi key, nambahin .gitignore setelahnya GAK AKAN ngehapus file itu dari git history. Tetep ada di history. Tetep bisa ditemuin. Lo harus rewrite history dengan BFG Repo-Cleaner atau git filter-branch buat beneran bersihin.
Environment Variables — Bukan Cuma Best Practice, Tapi Survival
Simpel: semua credentials harus via environment variable, bukan hardcoded. Di local development, pake file .env yang udah di-gitignore. Di production, pake environment variable dari platform (Vercel env, Heroku config vars, Docker secrets, Kubernetes secrets). Di CI/CD, pake secrets management dari platform CI/CD (GitHub Actions secrets, GitLab CI variables).
Jangan pernah — SERIUS, jangan pernah — taro key di dalam source code. Kelihatannya obvious. Tapi gue udah ngeliat kode production dengan AWS key hardcoded. Lebih sering dari yang lo kira.
Secrets Manager — Pake Layanan Khusus, Bukan File Config
AWS punya Secrets Manager. GCP punya Secret Manager. Azure punya Key Vault. HashiCorp Vault buat yang self-hosted. Gunakan. Jangan simpan API key di file config yang bisa ke-commit. Di kode lo, panggil secrets via SDK:
import boto3
from botocore.exceptions import ClientError
def get_secret():
client = boto3.client('secretsmanager')
response = client.get_secret_value(SecretId='my-api-key')
return response['SecretString']
Dengan gini, kode lo gak pernah nyimpen key. Key-nya di Secrets Manager. Kode lo cuma minta akses. Malah di AWS, kalo lo pake EC2 atau Lambda, lo bahkan gak perlu access key sama sekali — pake IAM Role. Nanti gue jelasin.
IAM Role Instead Of IAM User Access Key
Ini yang banyak gak tau. Kalo resource AWS lo jalan di dalam AWS (EC2 instance, Lambda function, ECS task) — lo GAK PERLU bikin access key. Pake IAM Role.
Caranya: attach IAM Role ke resource lo. Role itu ngasih permission yang dibutuhin — baca S3, tulis ke DynamoDB, apa aja. AWS SDK otomatis detect role dari environment dan pake temporary credentials. Gak ada static key yang bisa bocor. Key-nya rotated otomatis oleh AWS setiap beberapa jam.
Sejak gue pindah ke IAM Role, gue GAK PUNYA access key satupun di laptop gue. Semua pake temporary credentials dari IAM Role atau AWS SSO. Beautiful. Damai. Gak ada yang bisa ke-commit.
Pre-Commit Scanning — Jaring Pengaman Sebelum Push
Install git-secrets atau truffleHog sebagai pre-commit hook:
# git-secrets
git secrets --install
git secrets --register-aws
# Atau truffleHog
trufflehog git file://. --since-commit HEAD --only-verified
Pre-commit hook ini ngecek setiap commit lo sebelum jadi. Kalo ada pattern yang mirip API key, commit lo di-reject. Force? Tetep bisa sih — tapi setidaknya lo dikasih warning dulu. Dan biasanya lo akan pause dan mikir: “Oh iya, ada credentials nih.”
Gue wajibin pre-commit hook ini di semua project sekarang. Termasuk project pribadi. Karena sepele banget install-nya. Dua baris command. Tapi bisa nyelametin lo dari tagihan belasan juta.
Rotate Keys Secara Berkala
Ini kebiasaan yang gue akuisisi setelah insiden. Setiap 90 hari, rotate semua API key. AWS ada fitur built-in buat ini. Di IAM, lo bisa enforce password policy — tapi buat access key, lo harus manual atau bikin script sendiri.
Logikanya: semakin sering rotate, semakin pendek window of opportunity kalo key bocor. Kalo key lo bocor dan baru ketemu 6 bulan kemudian — itu 6 bulan exposure. Kalo lo rotate tiap 90 hari — key yang bocor udah invalid sebelum sempet di-exploitasi.
Gue pake script Lambda sederhana yang ngecek umur access key setiap user. Kalo udah di atas 90 hari, otomatis kirim email ke user itu. Gak sampe auto-revoke sih — gue gak setega itu — tapi setidaknya mereka diingetin.
Apa Yang Lo Lakukan Kalo Key Lo Bocor
Pertama, jangan panik. Panik = langkah lo kacau. Gue ngomong gini padahal gue sendiri panik waktu kejadian. Tapi dari pengalaman, ini urutan yang harus lo lakuin:
-
Revoke dulu. Langsung. Jangan mikir. Revoke access key yang bocor. Di AWS: IAM → Users → Security Credentials → Deactivate key. Ini nge-stop bleeding.
-
Terminate resource mencurigakan. Cek semua region. Cek semua service yang resource-nya bisa jalanin komputasi — EC2, ECS, Lambda, SageMaker, bahkan CodeBuild. Matiin yang gak lo kenal.
-
Cek billing. Di billing dashboard, breakdown per service per region. Ini ngasih lo gambaran apa aja yang di-deploy. Gue nemuin mereka deploy di region yang gak lazim — Middle East, South America — mungkin karena region itu jarang dimonitor.
-
Cek CloudTrail. Ini log semua API calls di akun AWS lo. Filter by access key yang bocor. Lo bakal liat history lengkap: jam berapa mulai, dari IP mana, resource apa yang dibuat. Ini penting buat investigasi dan report ke AWS (mereka kadang bisa waive tagihan kalo lo bisa buktiin ini fraud).
-
Hubungi AWS Support. Jelasin situasi. Lampirin bukti dari CloudTrail. Dalam banyak kasus, AWS baik hati dan ngewave tagihan — gak selalu, tapi lo harus coba. Tagihan mining yang gede gitu seringkali di-waive kalo lo bisa buktiin.
-
Rotate semua key lain. Karena satu key bocor bisa jadi tanda bahwa workflow lo flawed. Mungkin ada key lain yang juga vulnerable. Rotate semuanya.
-
Scan repo lo. Pake truffleHog atau GitGuardian buat scan seluruh commit history di semua repo. Gak cuma repo yang lo tau key-nya bocor — tapi SEMUA repo. Termasuk yang private. Karena kadang key bocor di private repo, terus ada yang fork atau clone.
-
Kasih tau tim. Kalo ini akun perusahaan, transparan ke tim. Jangan ditutup-tutupi. Bikin post-mortem. Identifikasi root cause-nya — bukan buat nyari siapa yang salah, tapi buat bikin sistem yang gak akan gagal lagi dengan cara yang sama.
Gue ngelakuin semuanya. AWS untungnya ngewave tagihan gue — sekitar 90% dari total. Tetep bayar $60-an tapi itu jauh lebih baik dari $643. Dan sejak itu, gue gak pernah lagi nyimpen API key di source code. Gak ada. Zero tolerance.
Pelajaran Mahal Yang Gak Perlu Lo Ulangi
Gue gak nulis ini supaya lo kagum sama cerita gue. Gue nulis ini supaya lo GAK USAH ngalamin sendiri. Karena percaya deh — sakitnya kebangetan. Bukan cuma soal duit (yang untungnya kebanyakan bisa di-waive). Tapi soal rasa bego, rasa bersalah, rasa “kenapa gue gak lebih hati-hati.”
Kalo lo developer, cloud engineer, DevOps, atau siapapun yang megang akses ke cloud — cek repo lo. Sekarang. Cek git history lo. Scan pake truffleHog. Pastiin gak ada satu pun API key atau secret yang ke-commit.
Dan yang paling penting: setup pre-commit hook. 5 menit. Gak lebih. Lo bisa nyelametin diri lo dari stres luar biasa dan potensi tagihan puluhan juta.
Keamanan API cloud bukan tentang tools mahal atau sertifikasi. Ini tentang kebiasaan. Kebiasaan yang mesti dipaksa sampe jadi muscle memory. Karena manusia — termasuk gue — itu pelupa. Buru-buru. Ceroboh. Dan cloud provider gak peduli. Mereka jalan terus. Tagihan tetep jalan. Bot scanner tetep nyari. Tinggal lo — mau belajar dari pengalaman orang atau nunggu giliran sendiri.
