AizuDemy

Tutorial HashiCorp Vault VPS: Automasi Dynamic Secrets PostgreSQL & Redis

Tutorial HashiCorp Vault VPS: Automasi Dynamic Secrets PostgreSQL & Redis
IKLAN
IDCloudHost
๐ŸŽง
Dengarkan Artikel Ini
Suara AI Otomatis โ€ข 6 mnt baca baca
โšก TL;DR

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.
๐Ÿ“‹ Daftar Isi Materi Tutup โ–ด

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 vault

Buat 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 = true

Jalankan service Vault, lakukan inisialisasi awal:

sudo systemctl enable --now vault
export VAULT_ADDR='http://127.0.0.1:8200'
vault operator init

Simpan 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 database

Sebelum 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 approle

Buat 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=json

Automasi 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-.... 1h

Terjadi indikasi kebocoran sistem, cabut seluruh kredensial aktif instan dengan pencabutan paksa:

vault lease revoke -prefix database/creds/app-readwrite

Troubleshooting: 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:

  1. 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.
  2. 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.
  3. Penanganan Script Revocation Graceful: Ubah revocation_statements di 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.

A
Aizu Dev

Tim penulis AizuDemy yang menyajikan tutorial teknologi, cloud, dan pengembangan perangkat lunak dalam Bahasa Indonesia.

๐Ÿ’ฌ Komentar (0)

Tulis Komentar

๐Ÿ“– Artikel Terkait