API key, password database, token webhook, dan private key sering diperlakukan seperti detail konfigurasi biasa. Padahal, siapa pun yang memilikinya mungkin dapat mengirim email atas nama aplikasi, membaca data pelanggan, mengakses server, atau mematikan layanan tertentu.
Masalahnya, kebocoran tidak selalu terjadi karena serangan canggih. Sering kali sumbernya lebih sederhana: kredensial tertulis di file PHP, ikut masuk ke Git, tercetak di log, terkirim lewat screenshot, atau tersimpan di backup yang tidak pernah diperiksa. Karena itu, keamanan rahasia aplikasi bukan hanya urusan developer. Pemilik website, admin server, dan tim operasional juga perlu punya kebiasaan yang benar.
Rahasia aplikasi bukan sekadar teks yang harus disembunyikan
Dalam konteks keamanan, rahasia adalah informasi yang dapat memberi hak akses. Contohnya adalah password database, token API, kredensial SMTP, kunci enkripsi, cookie sesi, dan kredensial deployment.
Kesalahan umum adalah menganggap sebuah token aman selama repository bersifat privat. Repository privat memang mengurangi risiko paparan publik, tetapi belum menghilangkan risiko. Akses developer, log CI/CD, fork internal, backup, dan laptop yang terinfeksi tetap dapat menjadi jalur kebocoran.
Prinsip sederhananya: rahasia harus hanya tersedia bagi proses dan orang yang benar-benar membutuhkannya, selama waktu yang diperlukan.
Jangan menaruh kredensial langsung di source code
Contoh yang sebaiknya dihindari:
$dbPassword = 'password-produksi-anda';
$apiKey = 'sk_live_xxxxxxxxx';Masalah kode seperti ini bukan hanya karena nilainya terlihat oleh orang yang membuka file. Nilai tersebut dapat ikut tersalin ke Git, masuk ke hasil build, muncul dalam error report, atau tertinggal di riwayat commit meskipun barisnya sudah dihapus.
Gunakan konfigurasi lingkungan atau secret manager sebagai gantinya. Untuk aplikasi PHP sederhana, pola berikut lebih baik:
$apiKey = getenv('PAYMENT_API_KEY');
$dbPassword = getenv('DB_PASSWORD');Namun, memindahkan nilai ke file .env bukan berarti masalah selesai. File tersebut tetap harus berada di luar document root jika memungkinkan, tidak boleh di-commit, dan harus memiliki izin baca yang terbatas. Pastikan server web juga tidak dapat menyajikannya sebagai file yang bisa diunduh.
WordPress: lindungi wp-config.php dan security keys
Pada instalasi WordPress, file wp-config.php berisi informasi sensitif seperti kredensial database dan security keys. Dokumentasi WordPress menyarankan agar file ini hanya dapat dibaca oleh pihak yang membutuhkan. Dalam konfigurasi tertentu, file tersebut juga dapat ditempatkan satu tingkat di atas direktori instalasi WordPress, selama konfigurasi server dilakukan dengan benar.
Security keys dan salts membantu WordPress membuat cookie serta nonce yang lebih sulit ditebak. Nilainya harus panjang, acak, dan unik untuk setiap situs. WordPress juga menjelaskan bahwa mengganti key dapat membatalkan cookie yang sedang aktif, sehingga pengguna harus login kembali.
Ini berguna ketika ada dugaan cookie autentikasi ikut bocor. Perlu diingat, mengganti key bukan pengganti investigasi. Jika sumber kebocoran belum ditemukan, token atau password lain yang terkait tetap mungkin disalahgunakan.
Nonce bukan pengganti otorisasi
Di plugin atau tema WordPress, nonce sering dipakai untuk memastikan sebuah request berasal dari alur yang diharapkan. Ini membantu melawan request palsu dari browser pengguna, tetapi nonce bukan password dan bukan mekanisme otorisasi.
Artinya, fungsi yang mengubah data tetap harus memeriksa kemampuan pengguna dengan current_user_can(). Jangan membuat endpoint admin hanya memeriksa nonce lalu menganggap siapa pun yang memiliki nonce otomatis boleh melakukan tindakan tersebut.
check_ajax_referer('hapus-komentar', 'nonce');
if ( ! current_user_can('moderate_comments') ) {
wp_die('Akses ditolak');
}Pola ini memisahkan dua pertanyaan penting: apakah request memiliki perlindungan terhadap pemalsuan, dan apakah pengguna memang berhak melakukan tindakan tersebut.
Kurangi dampak jika satu rahasia bocor
Rahasia yang aman bukan hanya rahasia yang sulit ditemukan. Ia juga harus memiliki cakupan akses yang terbatas dan dapat dicabut.
- Gunakan API key berbeda untuk development, staging, dan production.
- Batasi izin token hanya pada endpoint atau layanan yang diperlukan.
- Hindari satu password yang dipakai oleh banyak aplikasi.
- Atur masa berlaku token jika layanan mendukungnya.
- Catat siapa yang dapat melihat atau mengganti rahasia tersebut.
- Rotasi kredensial secara berkala dan setelah terjadi insiden.
OWASP menekankan pentingnya least privilege, rotasi, pencabutan, audit, serta larangan mencetak rahasia dalam log. Dalam praktiknya, token pembayaran seharusnya tidak memiliki izin mengubah konfigurasi server, dan kredensial backup seharusnya tidak dipakai sebagai password login harian.
Tambahkan pemeriksaan sebelum rahasia masuk ke repository
Jangan hanya mengandalkan ingatan developer. Tambahkan pemeriksaan otomatis pada alur kerja Git. Secret scanning dapat mencari pola token yang umum, sedangkan push protection dapat menghentikan commit tertentu sebelum masuk ke repository.
Alat seperti ini membantu, tetapi bukan jaminan lengkap. Pola internal, token buatan sendiri, atau rahasia yang tersamarkan masih dapat lolos. Karena itu, aturan dasar seperti larangan commit file .env, review perubahan konfigurasi, dan penggunaan template .env.example tetap diperlukan.
Contoh isi .gitignore:
.env
.env.*
!.env.example
*.pem
backup/
File .env.example boleh berisi nama variabel tanpa nilai rahasia:
DB_HOST=localhost
DB_NAME=nama_database
DB_USER=nama_pengguna
DB_PASSWORD=
PAYMENT_API_KEY=Jika rahasia sudah terlanjur bocor
Jangan berhenti pada menghapus baris kode atau membuat commit baru. Nilai lama mungkin masih ada di riwayat Git, cache CI/CD, backup, log, atau salinan lokal.
- Cabut atau nonaktifkan token yang bocor secepat mungkin.
- Buat kredensial pengganti dengan izin yang lebih terbatas.
- Periksa log penggunaan untuk mencari aktivitas yang tidak wajar.
- Identifikasi semua tempat nilai tersebut tersimpan atau pernah tersalin.
- Bersihkan repository dan artefak yang tidak diperlukan.
- Dokumentasikan penyebab serta perbaikan agar insiden tidak berulang.
Urutannya penting. Menghapus rahasia dari Git tanpa mencabut token tidak menghentikan penyalahgunaan. Sebaliknya, mengganti token tanpa mencari sumber kebocoran dapat membuat kredensial baru kembali tersebar.
Yang bisa dilakukan sekarang
- Cari kata seperti
password,api_key,secret, dantokendi source code serta file konfigurasi. - Pastikan
.env, backup database, dan private key tidak dapat diakses dari URL publik. - Periksa log aplikasi agar tidak mencetak header Authorization, cookie, atau query sensitif.
- Ganti kredensial yang pernah dibagikan melalui chat, email, atau screenshot.
- Aktifkan secret scanning atau pemeriksaan serupa di repository.
- Buat catatan sederhana: rahasia apa yang ada, digunakan oleh layanan mana, siapa pemiliknya, dan bagaimana cara merotasinya.
Keamanan rahasia tidak memerlukan sistem mahal untuk mulai diperbaiki. Yang paling penting adalah memperlakukan API key dan kredensial sebagai akses, bukan sebagai teks konfigurasi biasa. Begitu cara pandang ini berubah, keputusan teknis seperti pembatasan izin, rotasi, audit, dan respons insiden menjadi jauh lebih masuk akal.
Rujukan resmi: OWASP Secrets Management Cheat Sheet, WordPress Hardening, WordPress wp-config.php, dan GitHub Security Features.
Sumber & bacaan lebih lanjut
- OWASP Secrets Management Cheat Sheet
- WordPress Hardening
- WordPress wp-config.php
- WordPress Nonces
- GitHub Security Features
– Rio Yotto @rioyotto
