Tutorial HashiCorp Vault VPS: Automasi Dynamic Secrets PostgreSQL & Redis
Poin Kunci Artikel Ini:
- Bahaya Hardcoded Credentials & Siklus Hidup Rahasia StatisBayangkan server VPS production dibobol jam dua malam.
- Peretas tidak butuh eksploitasi rumit.
- Cukup baca file di direktori proyek atau repositori Git tersingkap.
Bahaya Hardcoded Credentials & Siklus Hidup Rahasia Statis
Bayangkan server VPS production dibobol jam dua malam. Peretas tidak butuh eksploitasi rumit. Cukup baca file .env di direktori proyek atau repositori Git tersingkap. Kredensial root PostgreSQL dan Redis tersimpan polos sejak dua tahun lalu. Sekali bocor, seluruh data hilang hitungan menit.
Kredensial statis penyebab utama insiden keamanan server. Buat user db_user dengan password permanen picu tiga masalah besar:
- Radius dampak luas: Kredensial sama dipakai banyak layanan. Satu aplikasi bocor, seluruh infrastruktur terancam.
- Rotasi manual sulit: Ubah password database production butuh koordinasi tim, ubah file konfigurasi, restart aplikasi berisiko downtime.
- Jejak audit kabur: Terjadi aktivitas mencurigakan, sulit identifikasi server atau proses penanggung jawab karena semua pakai user statis sama.
Arsitektur Zero Trust balik pendekatan ini. Jangan percaya koneksi atau simpan rahasia permanen. Pakai dynamic secrets, aplikasi tidak simpan password database. Setiap aplikasi butuh akses, HashiCorp Vault buat user temporer di PostgreSQL atau Redis otomatis. User punya masa berlaku (Time-To-Live / TTL), otomatis dihapus saat expired.
Setup HashiCorp Vault Server & Konfigurasi Database Secret Engine
Pasang HashiCorp Vault di VPS Linux (Ubuntu 22.04/24.04). Tambah repositori resmi HashiCorp, install biner Vault.
sudo apt-get update && sudo apt-get install -y gpg coreutils
wget -O- https://apt.releases.hashicorp.com/gpg | sudo gpg --dearmor -o /usr/share/keyrings/hashicorp-archive-keyring.gpg
echo "deb [signed-by=/usr/share/keyrings/hashicorp-archive-keyring.gpg] https://apt.releases.hashicorp.com $(lsb_release -cs) main" | sudo tee /etc/apt/sources.list.d/hashicorp.list
sudo apt-get update && sudo apt-get install vaultBuat file konfigurasi minimal di /etc/vault.d/vault.hcl. Untuk VPS produksi tunggal, pakai penyimpanan file lokal atau Raft storage dengan binding lokal.
storage "file" {
path = "/var/lib/vault/data"
}
listener "tcp" {
address = "127.0.0.1:8200"
tls_disable = 1
}
ui = true
disable_mlock = trueJalankan service Vault, lakukan inisialisasi awal:
sudo systemctl enable --now vault
export VAULT_ADDR='http://127.0.0.1:8200'
vault operator initSimpan Unseal Keys dan Initial Root Token aman. Unseal Vault pakai tiga key terbuat:
vault operator unseal <key_1>
vault operator unseal <key_2>
vault operator unseal <key_3>
vault login <root_token>Konfigurasi Engine Database PostgreSQL
Aktifkan Database Secret Engine di Vault untuk kelola koneksi PostgreSQL production.
vault secrets enable databaseSebelum hubungkan Vault ke PostgreSQL, buat user administrator khusus di PostgreSQL dengan wewenang buat user baru (CREATEROLE):
CREATE USER vault_admin WITH PASSWORD 'AdminVaultPassword123!' CREATEROLE SUPERUSER;Daftarkan koneksi PostgreSQL ke Vault:
vault write database/config/postgres-plugin \
plugin_name=postgresql-database-plugin \
allowed_roles="app-readonly", "app-readwrite" \
connection_url="postgresql://{{username}}:{{password}}@127.0.0.1:5432/production_db?sslmode=disable" \
username="vault_admin" \
password="AdminVaultPassword123!"Buat Vault Role yang definisikan pembuatan user dinamis PostgreSQL serta query pembuatan dan penghapusannya:
vault write database/roles/app-readwrite \
db_name=postgres-plugin \
creation_statements="CREATE ROLE \"{{name}}\" WITH LOGIN PASSWORD '{{password}}' VALID UNTIL '{{expiration}}'; GRANT SELECT, INSERT, UPDATE, DELETE ON ALL TABLES IN SCHEMA public TO \"{{name}}\";" \
revocation_statements="REVOKE ALL PRIVILEGES ON ALL TABLES IN SCHEMA public FROM \"{{name}}\"; DROP ROLE IF EXISTS \"{{name}}\";" \
default_ttl="1h" \
max_ttl="24h"Setiap role app-readwrite dipanggil, Vault eksekusi SQL buat user acak (contoh: v-approle-app-read-a8f9z1...) yang otomatis kedaluwarsa sesuai TTL.
Integrasi AppRole & Automasi Rotasi Kredensial PostgreSQL/Redis
Aplikasi production dilarang pakai root token Vault. Gunakan autentikasi AppRole untuk autentikasi server-to-server.
vault auth enable approleBuat ACL Policy berikan izin akses baca kredensial database saja. Buat file /etc/vault/app-policy.hcl:
path "database/creds/app-readwrite" {
capabilities = ["read"]
}
path "sys/leases/renew" {
capabilities = ["update"]
}Terapkan policy ke Vault, hubungkan dengan AppRole:
vault policy write backend-policy /etc/vault/app-policy.hcl
vault write auth/approle/role/backend-service \
secret_id_ttl=0 \
token_num_uses=0 \
token_ttl=1h \
token_max_ttl=4h \
policies="backend-policy"Ambil role_id dan buat secret_id untuk diberikan ke server aplikasi:
vault read auth/approle/role/backend-service/role-id -format=json
vault write -f auth/approle/role/backend-service/secret-id -format=jsonAutomasi Dynamic Secrets Redis
Redis 6.0+ dukung Access Control List (ACL). Vault bisa buat user dinamis Redis dengan izin terbatas otomatis.
Daftarkan koneksi Redis ke Vault Database Engine:
vault write database/config/redis-plugin \
plugin_name=redis-database-plugin \
allowed_roles="redis-app-role" \
host="127.0.0.1" \
port=6379 \
username="default" \
password="RedisMasterPassword123!"Buat Vault Role Redis dengan perintah ACL dinamis:
vault write database/roles/redis-app-role \
db_name=redis-plugin \
creation_statements="ACL SETUSER {{username}} on >{{password}} ~cache:* +@read +@write +get +set" \
revocation_statements="ACL DELUSER {{username}}" \
default_ttl="2h" \
max_ttl="12h"Aplikasi minta rahasia ke path database/creds/redis-app-role, Vault langsung eksekusi ACL SETUSER di engine Redis dan berikan password acak ke aplikasi.
Handling Lease TTL, Revocation, & Troubleshooting Koneksi Terputus
Penggunaan kredensial dinamis wajibkan penanganan lease benar di tingkat aplikasi atau infrastruktur.
Manajemen Lease dan Perpanjangan (Renewal)
Setiap response kredensial Vault menyertakan lease_id. Contoh response:
{
"lease_id": "database/creds/app-readwrite/h38291a8-....",
"lease_duration": 3600,
"lease_renewable": true,
"data": {
"password": "A1-x9_k2p1z8",
"username": "v-approle-app-read-a8f9z1"
}
}Sebelum 3600 detik berakhir, aplikasi harus perpanjang lease atau minta kredensial baru lewat CLI/API Vault:
vault lease renew database/creds/app-readwrite/h38291a8-.... 1hTerjadi indikasi kebocoran sistem, cabut seluruh kredensial aktif instan dengan pencabutan paksa:
vault lease revoke -prefix database/creds/app-readwriteTroubleshooting: Solusi Connection Pool Terputus
Masalah paling sering di produksi: Vault hapus user (DROP ROLE) saat TTL habis, aplikasi masih simpan koneksi database lama di connection pool (HikariCP, pgBouncer, sql.DB Golang). Aplikasi error FATAL: role "v-..." does not exist.
Terapkan tiga solusi cegah aplikasi crash:
- Atur Max Lifetime Connection Pool: Set durasi maksimum koneksi aplikasi (misal
maxLifetime = 45 menit) LEBIH PENDEK dari TTL Vault (1 jam). Connection pool tutup koneksi alami sebelum Vault hapus user PostgreSQL. - Gunakan Vault Agent Sidecar: Pasang Vault Agent di VPS. Vault Agent urus autentikasi AppRole, rotasi token, ambil kredensial database baru, tulis ke file lokal otomatis tanpa ubah banyak kode aplikasi.
- Penanganan Script Revocation Graceful: Ubah
revocation_statementsdi PostgreSQL agar putus koneksi aktif sebelum hapus role:
vault write database/roles/app-readwrite \
db_name=postgres-plugin \
creation_statements="CREATE ROLE \"{{name}}\" WITH LOGIN PASSWORD '{{password}}' VALID UNTIL '{{expiration}}'; GRANT SELECT, INSERT, UPDATE, DELETE ON ALL TABLES IN SCHEMA public TO \"{{name}}\";" \
revocation_statements="SELECT pg_terminate_backend(pid) FROM pg_stat_activity WHERE usename = '{{name}}'; REVOKE ALL PRIVILEGES ON ALL TABLES IN SCHEMA public FROM \"{{name}}\"; DROP ROLE IF EXISTS \"{{name}}\";" \
default_ttl="1h" \
max_ttl="24h"Kesimpulan
Hapus hardcoded credentials, beralih ke dynamic secrets: langkah wajib amankan VPS Linux production. Kombinasi HashiCorp Vault, PostgreSQL Secret Engine, dan Redis ACL buat rahasia akses database bocor tidak berguna bagi peretas karena otomatis kedaluwarsa.
Aksi Praktis: Isolasi satu service non-kritis di VPS. Pasang Vault Agent, aktifkan AppRole, turunkan TTL kredensial PostgreSQL ke 1 jam. Amati aplikasi sesuaikan rotasi rahasia tanpa restart.




๐ฌ Komentar (0)
Tulis Komentar