Rotasi Kredensial Otomatis: Strategi yang Tahan Audit

Foto oleh ccPixs.com on flickr
Secret statis dibuat sekali lalu dipakai berulang kali sampai ada yang mengubahnya secara manual, sehingga secara default tetap valid tanpa batas waktu. Secret dinamis dibuat sesuai permintaan oleh secrets engine, membawa lease dan time-to-live, dan kedaluwarsa secara otomatis. Secret dinamis memperkecil jendela waktu yang bisa dimanfaatkan penyerang dari hitungan bulan menjadi hitungan menit.
Kalau kredensial lama dicabut tepat saat kredensial baru dibuat, konsumen mana pun yang belum sempat memakai nilai baru, misalnya deployment yang berlangsung bertahap, koneksi yang tersimpan di cache, atau permintaan yang sedang berjalan, akan tiba-tiba gagal melakukan autentikasi. Pola dua-secret menghindari ini dengan menjaga kedua kredensial tetap valid bersamaan selama jendela masa tenggang, sehingga setiap konsumen bisa berpindah sebelum kredensial lama dicabut.
Polanya mengikuti empat fase: buat kredensial baru berdampingan dengan yang lama, terapkan ke sistem tujuan, uji apakah kredensial itu berhasil melakukan autentikasi, dan baru setelah itu selesaikan dengan menaikkan statusnya menjadi aktif serta mencabut kredensial lama setelah masa tenggang. AWS Secrets Manager meresmikan fase-fase ini dengan label staging, menandai kredensial aktif sebagai current dan yang baru sebagai pending sampai cutover selesai.
Dalam kebanyakan kasus bisa, untuk apa pun yang didukung oleh secrets engine seperti database secrets engine milik Vault, karena kredensial kedaluwarsa dengan sendirinya dan tidak pernah butuh langkah rotasi manual. Beberapa integrasi, seperti kunci API pihak ketiga berumur panjang tanpa API penerbitan dinamis, tetap memerlukan rotasi terskrip memakai pola dua-secret, bukan kredensial berumur pendek murni.
Deteksi seharusnya terjadi dalam hitungan menit, bukan menunggu jadwal rotasi berikutnya, dengan memakai pemindai secret di continuous integration dan push protection di level platform sehingga kredensial jarang sampai masuk ke repositori remote sejak awal. Setelah terdeteksi, langkah pencabutan-dan-rotasi sebaiknya terskrip dan terhubung ke kanal insiden sehingga manusia tidak menjadi titik penghambat antara deteksi dan tindakan.

Foto oleh ccPixs.com on flickr
Ringkasan Utama
Rotasi kredensial otomatis yang tahan audit mengandalkan tiga praktik: mengutamakan kredensial berumur pendek yang dibuat secara dinamis daripada yang statis, menerapkan pola dua-secret dengan label pending dan current untuk cutover tanpa downtime, serta mendeteksi kebocoran kredensial dalam hitungan menit lewat pemindaian secret berkelanjutan, bukan menunggu jadwal rotasi berikutnya.
Setiap musim audit, pertanyaan yang sama selalu muncul di daftar periksa: kapan terakhir kali kredensial ini dirotasi, dan siapa saja yang punya akses ke sana hari ini. Kalau jawaban jujurnya adalah angkat bahu dan spreadsheet yang tidak pernah dibuka sejak onboarding, kredensial itu sebenarnya tidak benar-benar terkendali. Ia hanya diam saja.
Tulisan ini menjabarkan strategi rotasi yang dibangun di atas tiga gagasan: utamakan kredensial yang kedaluwarsa dengan sendirinya, utamakan pembuatan kredensial sesuai permintaan daripada menyimpannya, dan jangan pernah membalik rotasi dalam satu langkah atomik yang berisiko menyebabkan gangguan layanan. Kalau tiga hal itu beres, audit menjadi formalitas, bukan pemadam kebakaran.
Secret statis adalah kredensial apa pun yang dibuat sekali lalu dipakai terus sampai ada yang ingat untuk menggantinya. Kata sandi database yang diketik ke file environment, kunci API yang ditempel ke pipeline deploy bertahun-tahun lalu, kunci akun layanan yang diunduh sekali lalu terlupakan. Semuanya gagal audit karena alasan yang sama dan bisa ditebak, dan kerangka kerja seperti SOC 2 serta PCI-DSS secara eksplisit meminta bukti kadensa rotasi kredensial, bukan sekadar pernyataan kebijakan di atas kertas.
Perlakukan umur maksimum setiap kredensial sebagai kontrol keamanan, bukan gangguan operasional. Kata sandi yang tidak bisa bertahan lebih lama dari kegunaannya adalah kata sandi yang tidak bisa dieksploitasi lama setelah ia dicuri.
Secret dinamis membalik modelnya. Alih-alih menyimpan satu kata sandi dan membagikannya ke semua konsumen, mesin secret seperti database secrets engine milik HashiCorp Vault membuat kredensial baru yang unik untuk setiap permintaan, lengkap dengan lease dan time-to-live yang sudah tertanam. Tidak ada yang perlu ingat untuk merotasinya, karena kredensial itu memang tidak dirancang untuk hidup lebih lama dari lease-nya.
# Enable the database secrets engine
vault secrets enable database
# Configure the connection with a rotating root credential
vault write database/config/orders-pg \
plugin_name="postgresql-database-plugin" \
connection_url="postgresql://{{username}}:{{password}}@pg-primary:5432/orders" \
allowed_roles="orders-readwrite" \
username="vault-admin" \
password="initial-bootstrap-password"
# Define a role with a short TTL
vault write database/roles/orders-readwrite \
db_name="orders-pg" \
creation_statements="CREATE ROLE \"{{name}}\" WITH LOGIN PASSWORD '{{password}}' \
VALID UNTIL '{{expiration}}'; GRANT SELECT, INSERT, UPDATE ON ALL TABLES \
IN SCHEMA public TO \"{{name}}\";" \
default_ttl="1h" \
max_ttl="4h"
# An app now requests a lease, not a password
vault read database/creds/orders-readwriteKredensial pada contoh di atas kedaluwarsa otomatis setelah satu jam, dan Vault langsung mencabutnya kalau lease tidak diperpanjang. Kalau bocor dari file log atau crash dump, umur kebocorannya terhitung menit, bukan bulan. Aplikasi meminta lease saat memulai satu unit kerja, bukan sekali saja saat boot, yang juga berarti kredensial yang bocor hanya memberi akses selama jendela waktu yang benar-benar dibutuhkan.
Bahkan di tempat secret dinamis tidak praktis diterapkan, misalnya akun layanan bersama yang dipakai puluhan worker berumur panjang, rotasi tetap bisa dilakukan dengan aman lewat pola dua-secret. AWS Secrets Manager meresmikan pola ini dengan label staging: kredensial aktif diberi label current, kredensial baru yang baru dibuat diberi label pending, dan keduanya tetap valid bersamaan selama jendela masa tenggang. Biaya menjaga dua akun tetap hidup sebentar jauh lebih murah dibanding biaya deployment yang gagal jam tiga pagi karena kata sandi dirotasi tepat saat layanan masih berjalan memakainya.
| Fase | Apa yang terjadi | Label staging |
|---|---|---|
| Create | Kredensial baru dibuat berdampingan dengan yang lama, bukan menggantikannya. | Pending |
| Set | Kredensial baru diterapkan ke sistem tujuan, misalnya pengguna database baru dengan hak akses yang sama. | Pending |
| Test | Otomasi memverifikasi kredensial baru benar-benar bisa melakukan autentikasi sebelum apa pun dialihkan. | Pending |
| Finish | Kredensial pending dinaikkan statusnya menjadi current, dan kredensial lama tetap dibiarkan hidup sebentar sebelum dicabut. | Current |
Jangan pernah mencabut kredensial lama pada langkah yang sama saat kredensial baru diaktifkan. Permintaan yang sedang berjalan, koneksi yang sudah tersimpan di cache, dan deployment yang berlangsung bertahap semuanya masih memegang nilai lama untuk beberapa waktu setelah peralihan, dan mematikannya seketika mengubah rotasi rutin menjadi gangguan layanan.
Mekanisme cutover yang aman sama saja baik saat merotasi kata sandi database maupun kunci API eksternal. Ikuti urutan ini setiap kali.
Aplikasi sebaiknya mengambil secret dari secrets manager atau vault client tepat saat dibutuhkan, atau lewat cache berumur pendek, bukan membacanya sekali saja saat proses dimulai. Kebiasaan sederhana ini yang membuat seluruh pola dua-secret benar-benar berfungsi dari ujung ke ujung.
Strategi rotasi hanya menutup separuh lingkaran. Separuh lainnya adalah menangkap kredensial yang bocor sebelum jadwal rotasi berikutnya sempat berjalan. Secret yang ter-commit ke repositori publik, ditempel ke tiket dukungan, atau tercatat dalam bentuk teks polos oleh handler yang salah konfigurasi, harus tertangkap dalam hitungan menit, bukan menunggu rotasi terjadwal berikutnya. Repositori publik khususnya terus-menerus dipindai oleh bot otomatis yang mencari kesalahan semacam ini, sehingga jendela waktu antara sebuah commit dan eksploitasi yang benar-benar berfungsi bisa lebih singkat daripada waktu yang dibutuhkan reviewer manusia untuk menyadari pull request itu.
Serangan yang paling sering berhasil bukanlah menebak kata sandi, melainkan memakai ulang kata sandi yang sudah bocor di tempat lain. Merotasi secret milik sendiri secara terjadwal tidak berarti apa-apa untuk menghentikan pola itu kalau kredensial yang bocor dibiarkan tidak dicabut selama berminggu-minggu sebelum ada yang menyadarinya sudah keluar dari sistem.
Ketika strategi rotasi dirancang dengan baik, percakapan audit menjadi singkat. Auditor tidak mencari kesempurnaan, mereka mencari bukti bahwa organisasi bisa menjawab pertanyaan dasar tentang kredensial apa pun kapan saja diminta.
Semua ini tidak memerlukan perkakas yang eksotis. Yang dibutuhkan hanyalah menjadikan kredensial berumur pendek sebagai default, memperlakukan rotasi sebagai cutover dua langkah yang terskrip alih-alih satu peralihan berisiko, dan menutup celah waktu antara terjadinya kebocoran dan saat seseorang benar-benar mencabutnya. Lakukan tiga hal itu secara konsisten, dan audit berikutnya menjadi laporan yang sudah kamu miliki, bukan proyek yang harus dimulai dari nol.