HashiCorp Vault
Pendahuluan
Vault adalah tool open-source yang dikembangkan oleh HashiCorp untuk mengelola secrets dan melindungi data sensitif. Dalam lingkungan production, Vault menyediakan solusi yang aman untuk menyimpan, mengontrol akses, dan mengelola berbagai jenis secrets seperti API keys, password, certificates, dan data sensitif lainnya. Keamanan data pribadi yang disimpan dalam aplikasi menjadi semakin penting seiring dengan meningkatnya ancaman siber dan kebutuhan kepatuhan terhadap regulasi keamanan data. Dengan menggunakan Vault, organisasi dapat memastikan bahwa data sensitif mereka dienkripsi dengan kuat dan hanya dapat diakses oleh entitas yang berwenang, sehingga mengurangi risiko kebocoran data dan penyalahgunaan informasi.
Tutorial sebelumnya telah membahas cara mengamankan aplikasi dengan Vault, namun fokus pada instalasi manual di server. Kali ini, kita akan membahas instalasi dan konfigurasi Vault menggunakan Docker dan Docker Compose, yang dirancang untuk deployment di production server. Pendekatan ini menawarkan beberapa keunggulan signifikan dibandingkan instalasi manual. Docker memungkinkan aplikasi untuk dikemas bersama dengan semua dependensinya dalam sebuah container, yang memastikan konsistensi lingkungan dari development hingga production. Docker Compose, di sisi lain, menyederhanakan manajemen aplikasi multi-container dengan mendefinisikan layanan, jaringan, dan volume dalam satu file YAML. Ini tidak hanya mempercepat proses setup tetapi juga memudahkan skalabilitas, pemeliharaan, dan portabilitas deployment. Dengan menggunakan Docker Compose, kita dapat dengan mudah mengelola konfigurasi Vault, volume persisten untuk data, dan pengaturan jaringan dengan cara yang lebih terstruktur dan dapat direproduksi.
Tutorial ini akan membahas setup minimalis dengan satu node saja. Meskipun setup ini ideal untuk aplikasi sederhana atau lingkungan development, penting untuk dicatat bahwa dalam skala production yang besar, disarankan untuk menjalankan Vault dengan konfigurasi High Availability (HA) untuk menghindari downtime dan kehilangan data. Dalam setup satu node, jika terjadi error pada node tersebut, akan ada downtime sementara sambil menyiapkan node pengganti dan melakukan restorasi data. Namun, untuk keperluan proof-of-concept atau aplikasi dengan beban kerja yang tidak terlalu kritis, setup satu node ini sudah memadai dan memberikan dasar yang kuat untuk memahami cara kerja Vault dalam lingkungan containerized.
Prasyarat
Sebelum memulai proses instalasi dan konfigurasi Vault menggunakan Docker Compose, ada beberapa prasyarat yang harus dipenuhi untuk memastikan lingkungan siap dan proses berjalan lancar. Prasyarat ini mencakup perangkat lunak yang perlu diinstal serta pengetahuan dasar yang diperlukan.
Docker dan Docker Compose terinstal:
Docker adalah platform yang digunakan untuk mengemas aplikasi dan dependensinya ke dalam container. Docker Compose adalah alat untuk mendefinisikan dan menjalankan aplikasi Docker multi-container. Pastikan Docker dan Docker Compose sudah terinstal di sistem Anda. Untuk memeriksa apakah Docker sudah terinstal, jalankan perintah
docker --version
di terminal. Untuk Docker Compose, gunakan perintahdocker-compose --version
ataudocker compose version
(untuk Docker Compose V2). Jika belum terinstal, ikuti panduan instalasi resmi dari situs web Docker sesuai dengan sistem operasi yang Anda gunakan (misalnya, Ubuntu, CentOS, Windows, atau macOS). Instalasi Docker biasanya melibatkan penambahan repository resmi Docker, instalasi paket Docker Engine, dan konfigurasi agar Docker berjalan sebagai non-root user atau dengansudo
.
Pengetahuan dasar Docker dan Docker Compose:
Memahami konsep dasar Docker seperti images, containers, volumes, dan networks akan sangat membantu. Demikian juga, familiaritas dengan sintaks
docker-compose.yml
untuk mendefinisikan layanan (services), port mapping, volume mounting, dan variabel lingkungan (environment variables) adalah kunci untuk mengikuti tutorial ini dengan mudah. Anda harus tahu bagaimana cara menjalankan (docker-compose up -d
), menghentikan (docker-compose down
), dan melihat log (docker-compose logs
) dari layanan yang didefinisikan di Docker Compose.
Nama domain dan A record:
Untuk akses HTTPS yang aman, Anda memerlukan nama domain (misalnya,
vault.example.com
) yang sudah dikonfigurasi dengan A record yang menunjuk ke alamat IP publik server VPS Anda. Jika Anda hanya melakukan setup untuk tujuan development atau pengujian di lingkungan lokal, Anda dapat menggunakanlocalhost
atau membuat entri di file/etc/hosts
(di Linux/macOS) untuk memetakan nama domain lokal ke IP loopback127.0.0.1
. Namun, untuk production, nama domain yang valid dan sertifikat SSL yang sesuai sangatlah penting. Proses verifikasi untuk sertifikat SSL (seperti Let's Encrypt) seringkali memerlukan bahwa nama domain sudah dapat diakses publik dan resolve ke IP server yang benar.
Dengan memastikan semua prasyarat di atas terpenuhi, Anda akan siap untuk melanjutkan ke langkah-langkah instalasi dan konfigurasi Vault dengan Docker Compose.
Struktur Direktori dan File Konfigurasi
Organisasi file dan direktori yang baik sangat penting untuk memudahkan manajemen, pemeliharaan, dan skalabilitas deployment Vault. Struktur yang jelas akan membantu Anda atau anggota tim lainnya dengan cepat memahami lokasi konfigurasi, sertifikat SSL, data Vault, dan skrip pendukung lainnya. Berikut adalah struktur direktori yang direkomendasikan untuk setup Vault dengan Docker Compose:
vault-docker/
├── docker-compose.yml
├── config/
│ └── vault.hcl
├── certs/
│ ├── server.crt
│ └── server.key
├── data/
├── logs/
├── policies/
│ └── admin-policy.hcl
│ └── dev-policy.hcl
└── scripts/
└── init-vault.sh
Penjelasan untuk setiap direktori dan file:
vault-docker/
: Direktori utama proyek. Anda dapat memberi nama sesuai keinginan, misalnyavault-production
ataumy-vault-setup
.docker-compose.yml
: File konfigurasi utama Docker Compose. File ini mendefinisikan layananvault
, image yang akan digunakan, port mapping, volume mounting, environment variables, dan pengaturan lainnya yang diperlukan untuk menjalankan container Vault.config/
: Direktori ini berisi file konfigurasi Vault.vault.hcl
: File konfigurasi utama Vault dalam format HCL (HashiCorp Configuration Language). File ini berisi pengaturan seperti listener (alamat dan port, TLS), storage backend (tempat data Vault disimpan), API address, cluster address, dan pengaturan UI.
certs/
: Direktori untuk menyimpan sertifikat SSL/TLS.server.crt
: File sertifikat SSL publik.server.key
: File kunci privat SSL. Untuk production, sebaiknya gunakan sertifikat dari Certificate Authority (CA) tepercaya seperti Let's Encrypt. Untuk development, Anda dapat membuat sertifikat self-signed.
data/
: Direktori ini akan dipasang (mount) sebagai volume ke dalam container Vault dan digunakan oleh Vault untuk menyimpan data secara persisten. Sangat penting untuk memastikan direktori ini memiliki izin yang tepat agar proses di dalam container dapat menulis ke sana. Docker Compose akan membuat direktori ini jika belum ada, atau Anda dapat membuatnya secara manual.logs/
: Direktori untuk menyimpan log yang dihasilkan oleh Vault. Memisahkan log dari container memudahkan analisis dan rotasi log.policies/
: Direktori untuk menyimpan file definisi ACL (Access Control List) policy Vault.admin-policy.hcl
: Contoh file policy untuk administrator.dev-policy.hcl
: Contoh file policy untuk tim development. Anda dapat membuat beberapa file policy sesuai kebutuhan akses di lingkungan Anda.
scripts/
(Opsional): Direktori untuk menyimpan skrip-skrip pembantu, misalnya skrip untuk inisialisasi Vault, unseal, atau setup awal.init-vault.sh
(Contoh): Skrip yang mungkin berisi serangkaian perintah Vault CLI untuk mengotomatiskan beberapa langkah setup setelah container pertama kali berjalan.
Untuk membuat struktur direktori ini, Anda dapat menggunakan perintah berikut di terminal Anda:
mkdir -p vault-docker/{config,certs,data,logs,policies,scripts}
Setelah struktur direktori siap, kita dapat melanjutkan dengan membuat file-file konfigurasi yang diperlukan, dimulai dari docker-compose.yml
.
Docker Compose Setup
File docker-compose.yml
adalah inti dari setup Vault kita menggunakan Docker. File ini akan mendefinisikan bagaimana container Vault harus dijalankan, termasuk image yang digunakan, volume untuk penyimpanan data persisten, port yang diekspos, variabel lingkungan yang diperlukan, dan kapabilitas tambahan yang diperlukan oleh Vault. Berikut adalah contoh file docker-compose.yml
yang disesuaikan untuk setup Vault production minimalis dengan satu node.
Buat file docker-compose.yml
di dalam direktori utama proyek Anda (misalnya, vault-docker/
) dan tambahkan konten berikut:
version: '3.8'
services:
vault:
image: hashicorp/vault:latest # Gunakan versi spesifik untuk production, misal 1.16.X
container_name: vault-server
restart: unless-stopped
ports:
- "8200:8200" # Port untuk API dan UI
- "8201:8201" # Port untuk cluster communication (meskipun single node, baik untuk disediakan)
volumes:
- ./data:/vault/data # Volume untuk data Vault
- ./logs:/vault/logs # Volume untuk logs
- ./config:/vault/config # Volume untuk file konfigurasi vault.hcl
- ./certs:/vault/certs # Volume untuk sertifikat SSL
cap_add:
- IPC_LOCK # Kapabilitas untuk mencegah memori Vault di-swap ke disk
environment:
- VAULT_ADDR=https://0.0.0.0:8200
- VAULT_API_ADDR=https://vault.example.com:8200 # Ganti dengan domain Anda
- VAULT_CLUSTER_ADDR=https://vault.example.com:8201 # Ganti dengan domain Anda
# VAULT_LOCAL_CONFIG dapat digunakan sebagai alternatif file vault.hcl,
# tetapi file vault.hcl lebih disukai untuk konfigurasi yang kompleks.
command: vault server -config=/vault/config/vault.hcl
networks:
- vault-network
networks:
vault-network:
driver: bridge
Penjelasan detail untuk setiap bagian dari file docker-compose.yml
:
version: '3.8'
: Menentukan versi file format Docker Compose yang digunakan. Versi 3.8 mendukung fitur-fitur yang umum digunakan.services:
: Bagian utama yang mendefinisikan layanan-layanan yang akan dijalankan. Dalam kasus ini, kita hanya memiliki satu layanan bernamavault
.image: hashicorp/vault:latest
: Menentukan Docker image yang akan digunakan untuk container Vault.hashicorp/vault
adalah image resmi dari HashiCorp. Untuk lingkungan production, sangat disarankan untuk menggunakan tag versi spesifik (misalnya,hashicorp/vault:1.16.1
) daripadalatest
untuk menghindari perubahan yang tidak terduga.container_name: vault-server
: Memberikan nama tetap untuk container, yang memudahkan dalam merujuk ke container (misalnya, saat melihat log atau mengeksekusi perintah di dalam container).restart: unless-stopped
: Menentukan kebijakan restart untuk container. Container akan selalu di-restart kecuali jika dihentikan secara manual. Ini membantu memastikan Vault berjalan terus-menerus, bahkan setelah server reboot.ports:
: Memetakan port dari host ke port di dalam container."8200:8200"
: Memetakan port 8200 di host ke port 8200 di container. Port 8200 digunakan untuk Vault API dan Web UI."8201:8201"
: Memetakan port 8201 di host ke port 8201 di container. Port 8201 digunakan untuk komunikasi internal cluster Vault. Meskipun kita setup single node, menyediakan port ini adalah praktik yang baik jika di kemudian hari ingin mengupgrade ke cluster.
volumes:
: Memasang direktori atau file dari host ke dalam container. Ini penting untuk persistensi data dan konfigurasi../data:/vault/data
: Memasang direktoridata
di host ke/vault/data
di dalam container. Direktori ini akan digunakan oleh storage backend Vault (misalnya,file
atauraft
) untuk menyimpan data secara persisten../logs:/vault/logs
: Memasang direktorilogs
di host ke/vault/logs
di container untuk menyimpan log Vault../config:/vault/config
: Memasang direktoriconfig
di host ke/vault/config
di container. Di sini kita akan menempatkan filevault.hcl
../certs:/vault/certs
: Memasang direktoricerts
di host ke/vault/certs
di container untuk menyimpan file sertifikat SSL (server.crt
danserver.key
).
cap_add:
: Menambahkan kapabilitas Linux ke container.- IPC_LOCK
: Kapabilitas ini sangat penting untuk keamanan Vault. Ini memungkinkan Vault untuk mengunci memorinya di RAM dan mencegah sistem operasi menukar (swap) data sensitif ke disk, yang dapat menjadi celah keamanan.
environment:
: Menyetel variabel lingkungan di dalam container.VAULT_ADDR
: Alamat yang digunakan oleh klien (termasuk Vault CLI di dalam container) untuk berkomunikasi dengan server Vault.VAULT_API_ADDR
: Alamat yang diiklankan oleh server Vault untuk klien eksternal. Penting untuk menggantivault.example.com
dengan nama domain aktual Anda yang menunjuk ke IP server Vault.VAULT_CLUSTER_ADDR
: Alamat yang digunakan untuk komunikasi antar node dalam cluster Vault. Penting untuk menggantivault.example.com
dengan nama domain aktual Anda.
command: vault server -config=/vault/config/vault.hcl
: Perintah yang akan dijalankan saat container dimulai. Perintah ini memulai server Vault dan memberi tahu lokasi file konfigurasinya.networks:
: Menyambungkan layanan ke jaringan yang ditentukan.- vault-network
: Menyambungkan containervault
ke jaringanvault-network
.
networks:
: Mendefinisikan jaringan kustom.vault-network:
: Nama jaringan.driver: bridge
: Menggunakan driver bridge, yang merupakan jaringan virtual privat untuk container-container di host yang sama.
Pastikan Anda telah mengganti vault.example.com
pada VAULT_API_ADDR
dan VAULT_CLUSTER_ADDR
dengan nama domain yang valid dan dapat diakses. File docker-compose.yml
ini merupakan fondasi untuk menjalankan instance Vault kita. Langkah selanjutnya adalah membuat file konfigurasi Vault itu sendiri, vault.hcl
.
File Konfigurasi Vault (vault.hcl)
File vault.hcl
adalah file konfigurasi utama untuk server Vault. File ini menggunakan HCL (HashiCorp Configuration Language) untuk mendefinisikan berbagai aspek perilaku Vault, termasuk bagaimana Vault menyimpan datanya, bagaimana ia menerima koneksi, dan pengaturan keamanan seperti TLS. Buat file vault.hcl
di dalam direktori config/
yang telah Anda siapkan sebelumnya.
# vault.hcl
# Aktifkan UI Web Vault
ui = true
# Nonaktifkan mlock jika Anda mengalami masalah atau tidak memilikinya.
# Untuk production, disarankan untuk mengaktifkannya jika memungkinkan.
# Di Docker Compose, kita sudah menambahkan cap_add IPC_LOCK.
# Jika Anda mendapatkan error terkait mlock, Anda mungkin perlu menyetel ini ke "true"
# atau memastikan container memiliki izin yang cukup.
# disable_mlock = true
# Konfigurasi Storage Backend
# Untuk setup minimalis satu node, kita bisa menggunakan 'file' atau 'raft'.
# 'raft' lebih disukai karena mendukung HA di masa depan dan memiliki beberapa keunggulan.
storage "raft" {
path = "/vault/data"
node_id = "vault-node-1"
}
# Konfigurasi Listener
# Listener mendefinisikan bagaimana Vault menerima koneksi.
listener "tcp" {
address = "[::]:8200" # Mendengarkan pada semua interface IPv4 dan IPv6 di port 8200
tls_disable = "false" # Wajib diaktifkan untuk production
tls_cert_file = "/vault/certs/server.crt"
tls_key_file = "/vault/certs/server.key"
# Untuk production, pertimbangkan untuk menambahkan:
# tls_require_and_verify_client_cert = "true" # Jika menggunakan mTLS
}
# Alamat API yang diiklankan
api_addr = "https://vault.example.com:8200" # Ganti dengan domain Anda
# Alamat Cluster yang diiklankan (penting untuk HA atau Raft storage)
cluster_addr = "https://vault.example.com:8201" # Ganti dengan domain Anda
# Tingkat log (opsional)
log_level = "info"
# Format log (opsional)
log_format = "json"
# Path untuk file log (opsional, jika ingin menulis log ke file)
# log_file = "/vault/logs/vault.log"
Penjelasan detail untuk setiap bagian dari file vault.hcl
:
ui = true
: Mengaktifkan Web UI bawaan Vault. Anda dapat mengakses UI ini melalui browser dihttps://<domain-vault-anda>:8200
.disable_mlock = true
: Opsi ini mengontrol apakah Vault akan mencoba untuk mengunci memorinya (mlock(2)
). Di Docker, kita telah menambahkan kapabilitasIPC_LOCK
didocker-compose.yml
, yang merupakan cara yang lebih disukai untuk memberikan izin ini. Jika Anda mengalami error terkaitmlock
meskipunIPC_LOCK
sudah ditambahkan, menyeteldisable_mlock
ketrue
bisa menjadi solusi, tetapi ini berarti memori Vault berpotensi bisa di-swap ke disk, yang tidak ideal untuk keamanan maksimal. Untuk production, usahakan agarmlock
aktif.storage "raft" { ... }
: Bagian ini mengonfigurasi storage backend. Vault mendukung berbagai backend sepertifile
,consul
,dynamodb
, danraft
.path = "/vault/data"
: Menentukan direktori di dalam container tempat data Raft akan disimpan. Path ini sesuai dengan volume./data:/vault/data
yang kita definisikan didocker-compose.yml
.node_id = "vault-node-1"
: Memberikan ID unik untuk node Vault ini dalam konteks cluster Raft. Meskipun kita hanya memiliki satu node, ID ini tetap diperlukan. Alternatif untukraft
adalahfile
storage backend:
storage "file" { path = "/vault/data" }
file
backend lebih sederhana untuk setup satu node, tetapiraft
lebih direkomendasikan bahkan untuk satu node karena mempersiapkan untuk kemungkinan upgrade ke multi-node High Availability (HA) di masa depan dan menawarkan fitur-fitur seperti auto-unseal (dengan konfigurasi tambahan) yang lebih baik.listener "tcp" { ... }
: Mengonfigurasi listener TCP, yang menangani koneksi masuk ke Vault.address = "[::]:8200"
: Menyebabkan Vault mendengarkan pada port 8200 untuk semua alamat IP (IPv4 dan IPv6) yang tersedia di dalam container.tls_disable = "false"
: Sangat penting untuk production. Ini memastikan bahwa semua komunikasi dengan Vault dienkripsi menggunakan TLS/SSL. Jangan pernah menonaktifkan TLS di production.tls_cert_file = "/vault/certs/server.crt"
: Path ke file sertifikat SSL publik di dalam container.tls_key_file = "/vault/certs/server.key"
: Path ke file kunci privat SSL di dalam container.tls_require_and_verify_client_cert = "true"
: Jika Anda mengimplementasikan mutual TLS (mTLS) di mana klien juga harus menyajikan sertifikat yang valid, Anda dapat mengaktifkan opsi ini. Ini menambah lapisan keamanan tambahan.
api_addr = "https://vault.example.com:8200"
: Alamat publik yang akan digunakan oleh klien untuk berkomunikasi dengan Vault API. Anda harus menggantivault.example.com
dengan nama domain aktual Anda. Nilai ini harus cocok dengan yang ada didocker-compose.yml
.cluster_addr = "https://vault.example.com:8201"
: Alamat yang digunakan untuk komunikasi antar-node Vault jika Anda mengatur cluster. Anda harus menggantivault.example.com
dengan nama domain aktual Anda. Nilai ini harus cocok dengan yang ada didocker-compose.yml
.log_level = "info"
: Menentukan tingkat verbositas log. Nilai yang umum adalahtrace
,debug
,info
,warn
, danerror
.info
adalah pilihan yang baik untuk production.log_format = "json"
: Menentukan format log.json
membuat log lebih terstruktur dan mudah diurai oleh alat log management.log_file = "/vault/logs/vault.log"
: Jika Anda ingin Vault menulis lognya ke file selain stdout/stderr (yang akan ditangkap oleh Docker), Anda dapat menentukan path di sini. Pastikan volume untuk log sudah di-mount dengan benar.
Dengan file docker-compose.yml
dan vault.hcl
yang sudah dikonfigurasi, langkah selanjutnya adalah mempersiapkan sertifikat SSL.
Generate Sertifikat SSL
Komunikasi yang aman antara klien dan server Vault sangat krusial, terutama di lingkungan production. SSL/TLS (sering disingkat SSL) menyediakan enkripsi untuk data yang dikirimkan melalui jaringan, mencegah penyadapan dan memastikan integritas data. Untuk setup production, Anda harus menggunakan sertifikat SSL yang diterbitkan oleh Certificate Authority (CA) tepercaya. Let's Encrypt adalah CA populer yang menyediakan sertifikat gratis dan otomatis. Namun, untuk tujuan pengembangan atau pengujian internal, Anda dapat membuat sertifikat self-signed.
Opsi 1: Sertifikat dari Let's Encrypt (Disarankan untuk Production)
Let's Encrypt menyediakan sertifikat SSL gratis yang valid dan diterima oleh semua browser modern. Untuk mendapatkan sertifikat dari Let's Encrypt, Anda biasanya menggunakan tool seperti Certbot.
Prasyarat:
Nama domain (misalnya,
vault.example.com
) sudah dikonfigurasi dengan A record yang menunjuk ke alamat IP publik server Anda.Server dapat diakses melalui port 80 (HTTP) dan/atau 443 (HTTPS) dari internet, karena Certbot akan menggunakan port ini untuk verifikasi kepemilikan domain.
Langkah-langkah:
Instal Certbot: Certbot dapat diinstal dengan berbagai cara, salah satunya menggunakan
snap
(disarankan oleh dokumentasi Certbot).sudo snap install core; sudo snap refresh core sudo snap install --classic certbot
Pastikan
certbot
command dapat diakses:sudo ln -s /snap/bin/certbot /usr/bin/certbot
Generate Sertifikat: Certbot dapat menghasilkan sertifikat dengan beberapa metode. Metode
standalone
memungkinkan Certbot untuk menjalankan server web sementara sendiri di port 80 untuk verifikasi. Pastikan tidak ada web server lain (seperti Apache atau Nginx) yang berjalan dan menggunakan port 80 saat Anda menjalankan perintah ini. Gantivault.example.com
dengan nama domain Anda.sudo certbot certonly --standalone -d vault.example.com
certonly
: Memberitahu Certbot untuk hanya menghasilkan sertifikat, tidak menginstalnya secara otomatis ke web server.--standalone
: Menggunakan plugin standalone untuk verifikasi.-d vault.example.com
: Menentukan domain untuk sertifikat.
Jika proses berhasil, Certbot akan menyimpan sertifikat di
/etc/letsencrypt/live/vault.example.com/
. Anda akan melihat output yang memberi tahu lokasi file penting:fullchain.pem
: Sertifikat lengkap untuk domain Anda, termasuk rantai CA.privkey.pem
: Kunci privat untuk sertifikat Anda.
Salin Sertifikat ke Direktori Proyek Vault: Salin file
fullchain.pem
danprivkey.pem
ke direktoricerts/
dalam proyek Docker Compose Vault Anda. Gantivault.example.com
dengan domain Anda.sudo cp /etc/letsencrypt/live/vault.example.com/fullchain.pem ./vault-docker/certs/server.crt sudo cp /etc/letsencrypt/live/vault.example.com/privkey.pem ./vault-docker/certs/server.key
Atur Izin Akses: Pastikan file sertifikat dan kunci privat dapat dibaca oleh container Docker. Anda mungkin perlu mengubah kepemilikan file jika Certbot membuatnya dengan izin terbatas.
# Contoh: Ubah kepemilikan ke user yang menjalankan Docker, atau sesuaikan izinnya # sudo chown $USER:$USER ./vault-docker/certs/server.crt # sudo chown $USER:$USER ./vault-docker/certs/server.key # Atur izin agar hanya pemilik yang bisa membaca (terutama untuk privkey.pem) chmod 644 ./vault-docker/certs/server.crt chmod 600 ./vault-docker/certs/server.key
Penting untuk memastikan bahwa user di dalam container Vault (biasanya
vault
user) memiliki izin untuk membaca file-file ini. Docker Compose biasanya menangani pemetaan user dengan baik, tetapi jika ada masalah terkait izin, Anda mungkin perlu memeriksa user ID di dalam imagehashicorp/vault
dan menyesuaikan izin file di host, atau menggunakan direktifuser
didocker-compose.yml
.
Opsi 2: Sertifikat Self-Signed (Untuk Development/Pengujian)
Jika Anda tidak memiliki domain publik atau hanya ingin melakukan pengujian di lingkungan lokal, Anda dapat membuat sertifikat self-signed. Browser akan menampilkan peringatan keamanan saat mengakses Vault dengan sertifikat self-signed, tetapi ini dapat diabaikan untuk tujuan development.
Generate Private Key:
openssl genrsa -out ./vault-docker/certs/server.key 2048
Generate Certificate Signing Request (CSR): Anda akan diminta untuk memasukkan beberapa informasi seperti Country, State, Organization, dan Common Name (CN). Untuk CN, masukkan nama domain yang Anda gunakan untuk Vault (misalnya,
vault.example.com
ataulocalhost
jika hanya untuk akses lokal).openssl req -new -key ./vault-docker/certs/server.key -out ./vault-docker/certs/server.csr
Generate Self-Signed Certificate: Perintah ini akan membuat sertifikat yang ditandatangani dengan kunci privat itu sendiri. Opsi
-days 365
menetapkan masa berlaku sertifikat 365 hari.openssl x509 -req -in ./vault-docker/certs/server.csr -signkey ./vault-docker/certs/server.key -out ./vault-docker/certs/server.crt -days 365
Setelah ini, Anda akan memiliki
server.crt
danserver.key
di direktoricerts/
. Fileserver.csr
dapat dihapus.
Dengan sertifikat SSL siap di direktori certs/
, kita sekarang dapat melanjutkan untuk menjalankan container Vault.
Menjalankan dan Menginisialisasi Vault
Setelah semua file konfigurasi (docker-compose.yml
, vault.hcl
) dan sertifikat SSL siap, kita dapat menjalankan container Vault dan kemudian menginisialisasinya. Inisialisasi adalah proses satu kali yang menghasilkan kunci unseal dan root token yang sangat penting untuk operasional Vault.
1. Menjalankan Container Vault
Navigasikan ke direktori proyek Anda (tempat docker-compose.yml
berada) di terminal dan jalankan perintah berikut:
docker-compose up -d
up
: Membangun (jika perlu), (re)creates, starts, dan attaches ke containers untuk layanan.-d
: Menjalankan container di mode detached (background).
Anda dapat memeriksa status container:
docker-compose ps
Outputnya harus menunjukkan bahwa container vault-server
sedang berjalan (Up
). Anda juga dapat melihat log Vault untuk memastikan tidak ada error saat startup:
docker-compose logs -f vault-server
Pada awalnya, Vault akan dalam status "sealed" dan "initialized": false
. Ini adalah perilaku default yang aman. Setelah beberapa saat, Anda akan melihat log yang menunjukkan Vault server telah dimulai, tetapi masih menunggu inisialisasi.
2. Mengecek Status Vault
Anda dapat mengecek status server Vault dari dalam container atau dari host jika Anda telah menginstal Vault CLI.
Dari host (jika Vault CLI terinstal): Pastikan Anda telah mengekspor VAULT_ADDR
dan VAULT_CACERT
jika menggunakan sertifikat self-signed atau CA kustom.
export VAULT_ADDR='https://vault.example.com:8200' # Ganti dengan domain/IP Anda
# Jika menggunakan sertifikat self-signed atau CA yang tidak dikenal host:
# export VAULT_CACERT='./vault-docker/certs/server.crt'
vault status
Dari dalam container Vault:
docker exec -it vault-server sh
# Di dalam container
vault status
exit
Perintah vault status
akan menampilkan informasi tentang status Vault. Pada tahap ini, Anda seharusnya melihat:
Key Value
--- -----
Seal Type shamir
Initialized false
Sealed true
Total Shares 0
Threshold 0
...
Initialized: false
menunjukkan bahwa Vault belum diinisialisasi.
3. Inisialisasi Vault
Inisialisasi Vault adalah proses kritis yang menghasilkan master key (yang kemudian dipecah menjadi unseal keys) dan root token. Unseal keys dan root token ini SANGAT PENTING dan harus disimpan dengan aman. Jika hilang, data Vault yang terenkripsi tidak dapat dipulihkan.
Anda dapat melakukan inisialisasi melalui Web UI atau CLI.
Menggunakan CLI (lebih disukai untuk scripting dan kontrol):
Eksekusi ke dalam container Vault:
docker exec -it vault-server sh
Di dalam container, jalankan perintah inisialisasi:
vault operator init
Secara default, perintah ini akan menghasilkan 5 unseal keys dengan threshold 3 (artinya diperlukan minimal 3 dari 5 kunci untuk melakukan unseal).
Contoh Output vault operator init
:
Unseal Key 1: jaCYkRmQCl+uoKh+cgCSlEIQF8F41VSImSkyqDrY4Ka2
Unseal Key 2: Tg0OzoLjeBVYCa6xsP83+6aCrAlHXI7cZx5pkE8q2ntL
Unseal Key 3: xX7yX6uMfdZ8kRsbNeuH2NmdLWvCyzjsL6aleq7kKhAZ
Unseal Key 4: fFO1XgqumqfcAoi5WYxSYLnF4gTZuArlWLAxIkoG/Zer
Unseal Key 5: dE3W+GrgUub4i1UjsFwZQ4C75fqzACsD9bqDejdvlkK0
Initial Root Token: s.MwPEOWyYFM6XNT87WMMxTyPL
Success! Vault is initialized and sealed.
PENTING:
Simpan semua Unseal Keys (1-5) di tempat yang sangat aman. Ini adalah bagian dari master key.
Simpan Initial Root Token di tempat yang sangat aman. Token ini memiliki akses penuh (superuser) ke Vault.
Distribusikan Unseal Keys kepada beberapa orang tepercaya (sesuai dengan Key Management Ceremony yang disebutkan di PDF asli). Jangan biarkan satu orang memiliki semua kunci.
Metode Inisialisasi yang Lebih Aman dengan GPG (Opsional, sangat disarankan untuk production):
Untuk meningkatkan keamanan selama proses inisialisasi, Anda dapat mengenkripsi unseal keys menggunakan GPG public key dari pemegang kunci yang berwenang. Ini memastikan bahwa operator yang melakukan inisialisasi tidak dapat melihat unseal keys dalam bentuk plaintext.
Siapkan GPG Public Keys: Pastikan Anda memiliki GPG public key (misalnya,
endy.pub
,anggi.pub
,dadang.pub
,ivans.pub
,iqbal.pub
) untuk setiap pemegang unseal key. Salin file-file.pub
ini ke dalam container atau ke lokasi yang dapat diakses oleh Vault CLI saat menjalankan perintah.Jalankan Inisialisasi dengan GPG:
# Di dalam container vault-server # Asumsikan file .pub sudah ada di /tmp/keys atau path yang dapat diakses vault operator init -key-shares=5 -key-threshold=3 -pgp-keys="/tmp/keys/endy.pub,/tmp/keys/anggi.pub,/tmp/keys/dadang.pub,/tmp/keys/ivans.pub,/tmp/keys/iqbal.pub"
-key-shares=5
: Jumlah total unseal keys yang akan dibuat.-key-threshold=3
: Jumlah minimal unseal keys yang diperlukan untuk unseal.-pgp-keys="..."
: Daftar GPG public key yang dipisahkan koma, sesuai urutan, yang akan digunakan untuk mengenkripsi masing-masing unseal key.
Outputnya akan berupa unseal keys yang sudah terenkripsi dan root token (yang biasanya tidak terenkripsi oleh GPG dalam perintah standar ini, jadi hati-hati).
Key 1 (Base64-encoded GPG-encrypted): wcBMA37rwGt6FS1VAQgAk1q8XQh6yc... Key 2 (Base64-encoded GPG-encrypted): wcBMA0wwnMXgRzYYAQgAavqbTCxZGD... Key 3 (Base64-encoded GPG-encrypted): wcFMA2DjqDb4YhTAARAAeTFyYxPmUd... Key 4 (Base64-encoded GPG-encrypted): wcFMAw0SPiCRMPCuAcxybCRqhF35Hf... Key 5 (Base64-encoded GPG-encrypted): wcBMAUS8ElQh9BLgzuq0nq/+hBYszJ... Initial Root Token: s.anotherRootTokenString...
Setiap pemegang kunci harus mendekripsi key mereka menggunakan private key GPG masing-masing:
# Di komputer pemegang kunci yang memiliki private key GPG yang sesuai echo "wcBMA37..." | base64 --decode | gpg -dq
Setelah inisialisasi selesai, Vault akan dalam status "sealed". Langkah berikutnya adalah melakukan unseal.
4. Unseal Vault
Unseal adalah proses memberikan unseal keys kepada Vault untuk mendekripsi master key dan memungkinkan Vault untuk beroperasi. Anda perlu memberikan sebanyak threshold
unseal keys (dalam contoh kita, 3 kunci).
Menggunakan CLI:
Masih di dalam container Vault (atau dari host jika Vault CLI terkonfigurasi dan VAULT_ADDR
serta VAULT_TOKEN
untuk root token sudah disetel dengan benar untuk perintah operator
), jalankan perintah vault operator unseal
dan masukkan unseal keys satu per satu.
# Di dalam container vault-server
vault operator unseal
Unseal Key (will be hidden): # Masukkan Unseal Key 1
Key Value
--- -----
Seal Type shamir
Initialized true
Sealed true
Total Shares 5
Threshold 3
Unseal Progress 1/3
...
vault operator unseal
Unseal Key (will be hidden): # Masukkan Unseal Key 2
Key Value
--- -----
Seal Type shamir
Initialized true
Sealed true
Total Shares 5
Threshold 3
Unseal Progress 2/3
...
vault operator unseal
Unseal Key (will be hidden): # Masukkan Unseal Key 3
Key Value
--- -----
Seal Type shamir
Initialized true
Sealed false # <-- Sekarang statusnya Unsealed!
Total Shares 5
Threshold 3
Version 1.16.x
...
Setelah Anda memasukkan jumlah unseal keys yang mencukupi threshold, status Sealed
akan berubah menjadi false
. Vault sekarang sudah "unsealed" dan siap digunakan.
Menggunakan Web UI:
Buka
https://vault.example.com:8200
di browser Anda.Anda akan melihat halaman "Seal Vault".
Masukkan unseal keys satu per satu ke dalam kotak input dan klik "Unseal". Ulangi hingga Vault ter-unseal.
Setelah ter-unseal, Anda akan diarahkan ke halaman login.
5. Login ke Vault
Setelah Vault ter-unseal, Anda dapat login menggunakan Initial Root Token yang Anda simpan selama proses inisialisasi.
Menggunakan CLI:
# Di dalam container atau dari host yang sudah terinstal Vault CLI
# Pastikan VAULT_ADDR sudah di-set
export VAULT_ADDR='https://vault.example.com:8200'
vault login
Token (will be hidden): # Masukkan Initial Root Token Anda
Jika berhasil, Anda akan mendapatkan pesan "Success! You are now authenticated."
Menggunakan Web UI:
Setelah Vault ter-unseal, halaman login akan muncul.
Pilih "Token" sebagai metode login.
Masukkan Initial Root Token Anda ke dalam kotak "Token".
Klik "Sign In".
Setelah login berhasil, Anda akan memiliki akses penuh ke Vault melalui UI atau CLI. Dari sini, Anda dapat mulai mengonfigurasi auth methods, secrets engines, policies, dan tokens.
PENTING: Root Token seharusnya hanya digunakan untuk setup awal dan tugas-tugas administratif tingkat tinggi. Untuk operasional sehari-hari, buatlah token dengan izin yang lebih terbatas sesuai prinsip least privilege.
Mengelola Policies
Policies di Vault adalah aturan akses yang mendefinisikan apa yang dapat dan tidak dapat dilakukan oleh sebuah token atau entitas yang terautentikasi. Policies ditulis dalam HCL (HashiCorp Configuration Language) dan menggunakan sistem pencocokan awalan path untuk memberikan atau menolak akses ke operasi tertentu pada path tertentu di Vault. Semuanya di Vault bersifat berbasis path, sehingga policies memberikan kontrol granular atas berbagai aspek Vault, seperti mengakses secrets engine, mengelola auth methods, atau mengonfigurasi sistem.
Konsep Dasar Policies
Path-Based: Setiap aturan policy dikaitkan dengan sebuah path. Path ini sesuai dengan API path di Vault.
Capabilities: Untuk setiap path, Anda mendefinisikan satu atau lebih capabilities (kemampuan) yang diizinkan atau dilarang. Capabilities meliputi:
create
: Membuat data baru di path tersebut (misalnya,POST
atauPUT
untuk data baru).read
: Membaca data dari path tersebut (misalnya,GET
).update
: Memperbarui data yang sudah ada di path tersebut (misalnya,POST
atauPUT
untuk data yang ada).delete
: Menghapus data dari path tersebut (misalnya,DELETE
).list
: Mendaftar item di path tersebut (misalnya,LIST
). Tidak semua secrets engine mendukunglist
.patch
: Memperbarui bagian tertentu dari data yang ada di path (misalnya,PATCH
).sudo
: Memungkinkan akses ke path yang dilindungi root, biasanya digunakan bersama capabilities lain untuk operasi administratif.deny
: Secara eksplisit menolak akses ke path.deny
memiliki prioritas tertinggi.
Default Deny: Jika tidak ada policy yang secara eksplisit mengizinkan akses ke suatu path dan operasi, akses tersebut akan ditolak.
Prioritas Spesifisitas: Jika beberapa policies berlaku untuk sebuah path, policy yang paling spesifik (path terpanjang yang cocok) akan memiliki prioritas.
Membuat File Policy
Mari kita buat beberapa contoh file policy. Buat direktori policies/
di dalam direktori proyek Anda jika belum ada.
1. Policy untuk Tim Development (dev-policy.hcl
) Asumsikan kita akan mengaktifkan KV v2 secrets engine di path kv-dev/
. Tim development perlu akses penuh (create, read, update, delete, list) ke secret di bawah path ini.
Buat file policies/dev-policy.hcl
:
# Policy untuk tim development
# Mengizinkan akses penuh ke KV v2 secrets engine di path 'kv-dev'
path "kv-dev/data/*" {
capabilities = ["create", "read", "update", "delete", "list", "patch"]
}
# Untuk KV v2, akses ke metadata juga seringkali diperlukan
path "kv-dev/metadata/*" {
capabilities = ["read", "list", "delete"]
}
Penjelasan:
kv-dev/data/*
: Path ini mengacu pada data di KV v2 secrets engine yang di-mount dikv-dev
.*
adalah wildcard yang cocok dengan apa pun di bawah path tersebut.kv-dev/metadata/*
: Path ini mengacu pada metadata di KV v2 secrets engine.
2. Policy untuk Aplikasi Spesifik (app-webapp-policy.hcl
) Asumsikan sebuah aplikasi web hanya perlu membaca secret tertentu di path kv-dev/data/webapp/config
.
Buat file policies/app-webapp-policy.hcl
:
# Policy untuk aplikasi webapp
# Hanya mengizinkan membaca secret di path spesifik
path "kv-dev/data/webapp/config" {
capabilities = ["read"]
}
3. Policy Administrator Terbatas (admin-limited-policy.hcl
) Sebuah policy yang memungkinkan pengguna untuk mengelola auth methods dan secrets engine, tetapi tidak memiliki akses root penuh.
# Policy administrator terbatas
# Mengizinkan manajemen auth methods
path "auth/*" {
capabilities = ["create", "read", "update", "delete", "list", "sudo"]
}
# Mengizinkan manajemen secrets engines
path "sys/mounts/*" {
capabilities = ["create", "read", "update", "delete", "list", "sudo"]
}
# Mengizinkan manajemen policies (kecuali root policy)
path "sys/policies/acl/*" {
capabilities = ["create", "read", "update", "delete", "list"]
denied_parameters = {"name" = ["root", "default"]} # Mencegah modifikasi policy root/default
}
# Mengizinkan melihat status kesehatan sistem
path "sys/health" {
capabilities = ["read", "sudo"]
}
path "sys/seal-status" {
capabilities = ["read", "sudo"]
}
Policy ini masih cukup luas dan harus diberikan dengan hati-hati. Menolak modifikasi policy root
dan default
adalah praktik yang baik.
Menulis (Mendaftarkan) Policy ke Vault
Setelah file policy dibuat, Anda perlu "menulis" atau mendaftarkannya ke Vault menggunakan Vault CLI.
Menggunakan CLI:
Pastikan Anda sudah login ke Vault dengan token yang memiliki izin untuk membuat policies (biasanya root token atau token dengan policy
sudo
pada pathsys/policies
).Gunakan perintah
vault policy write
.Contoh untuk mendaftarkan
dev-policy.hcl
:# Asumsikan Anda di host dengan Vault CLI terinstal dan VAULT_ADDR & VAULT_TOKEN sudah di-set # Atau jalankan dari dalam container vault-server vault policy write dev-policy ./policies/dev-policy.hcl
Outputnya seharusnya
Success! Uploaded policy: dev-policy
Contoh untuk mendaftarkan
app-webapp-policy.hcl
:vault policy write app-webapp-policy ./policies/app-webapp-policy.hcl
Contoh untuk mendaftarkan
admin-limited-policy.hcl
:vault policy write admin-limited-policy ./policies/admin-limited-policy.hcl
Menggunakan Web UI:
Login ke Vault Web UI.
Pilih tab "Policies".
Klik "Create ACL policy".
Masukkan nama policy (misalnya,
dev-policy
).Paste isi file
dev-policy.hcl
ke dalam editor teks.Klik "Create Policy".
Melihat Policy yang Sudah Didaftarkan
Untuk melihat daftar policies yang ada di Vault:
vault policy list
Untuk melihat detail dari sebuah policy:
vault policy read dev-policy
Dengan memahami dan mengimplementasikan policies dengan baik, Anda dapat memastikan bahwa akses ke secrets dan konfigurasi di Vault terkontrol dengan aman sesuai prinsip least privilege. Setelah policies siap, langkah selanjutnya adalah membuat token dan mengaitkannya dengan policies ini.
Mengelola Token
Token di Vault adalah metode utama untuk autentikasi dan otorisasi. Setiap kali klien (baik itu user, aplikasi, atau service) berhasil mengautentikasi ke Vault (melalui auth method apa pun), Vault akan mengeluarkan sebuah token. Token ini kemudian disertakan dalam setiap permintaan berikutnya ke Vault. Vault menggunakan token untuk mengidentifikasi klien, menentukan policies yang terkait, dan memutuskan apakah permintaan tersebut diizinkan atau ditolak berdasarkan capabilities yang didefinisikan dalam policies tersebut.
Token itu sendiri dapat memiliki berbagai properti, seperti waktu hidup (TTL - Time To Live), apakah dapat diperbarui, policies yang terkait, metadata, dan batas penggunaan.
Membuat Token
Anda dapat membuat token baru menggunakan perintah vault token create
. Token yang dibuat akan menjadi "child" dari token yang digunakan untuk membuatnya (kecuali jika dibuat sebagai "orphan"). Token baru akan mewarisi semua policies dari token pembuat kecuali jika secara eksplisit ditentukan subset policy tertentu.
Sintaks Dasar:
vault token create [options]
Contoh: Membuat Token dengan Policy Spesifik
Misalkan kita ingin membuat token untuk tim development yang memiliki policy dev-policy
.
vault token create -policy=dev-policy -ttl="24h"
-policy=dev-policy
: Mengaitkan policydev-policy
ke token baru. Anda dapat menentukan beberapa policies dengan menggunakan flag-policy
beberapa kali (misalnya,-policy=dev-policy -policy=other-policy
).-ttl="24h"
: Menetapkan Time To Live awal token menjadi 24 jam. Token ini akan kedaluwarsa setelah 24 jam kecuali diperbarui.
Contoh Output:
Key Value
--- -----
token s.3oK...
token_accessor abcdef...
token_duration 24h
token_renewable true
token_policies ["dev-policy" "default"] # "default" policy biasanya otomatis ditambahkan
identity_policies []
policies ["dev-policy" "default"]
Simpan token
dan token_accessor
dengan aman. token_accessor
dapat digunakan untuk operasi seperti lookup atau renew tanpa mengekspos token itu sendiri.
Opsi-opsi Penting vault token create
:
-display-name="Token for Dev Team"
: Memberikan nama deskriptif untuk token. Nama ini akan muncul di audit log.-ttl="<duration>"
: Mengatur TTL awal token (misalnya,30m
,1h
,24h
). Jika tidak diatur, token mungkin tidak dapat diperbarui.-explicit-max-ttl="<duration>"
: Mengatur batas maksimum hidup token. Ini adalah batas keras yang tidak dapat dilampaui, bahkan dengan perpanjangan.-period="<duration>"
: Membuat token periodik. Token periodik dapat diperbarui selama actively digunakan, dan setiap perpanjangan akan mengatur TTL kembali ke nilaiperiod
. Ini berguna untuk token jangka panjang yang perlu diperbarui secara berkala.-renewable=true/false
: Menentukan apakah token dapat diperbarui setelah TTL-nya habis. Defaultnya adalahtrue
.-orphan=true
: Membuat token tanpa induk (orphan). Token ini tidak akan dicabut secara otomatis jika token pembuatnya dicabut atau kedaluwarsa. Membutuhkan izinsudo
.-no-default-policy=true
: Mencegah policydefault
otomatis ditambahkan ke token.-metadata key=value
: Menambahkan metadata kustom ke token. Metadata ini akan muncul di audit log saat token digunakan. Dapat ditentukan beberapa kali.-use-limit=N
: Membatasi berapa kali token dapat digunakan. Setelah digunakan N kali, token akan otomatis dicabut.-type="service"|"batch"
:service
(default): Token yang dapat digunakan berulang kali hingga TTL-nya habis atau dicabut. Cocok untuk service atau aplikasi.batch
: Token yang dapat digunakan berulang kali tetapi tidak dapat diperbarui. Cocok untuk tugas-tugas batch atau jangka pendek.
-wrap-ttl="<duration>"
: Membungkus respons (token yang baru dibuat) dalam "cubbyhole" token dengan TTL tertentu. Ini meningkatkan keamanan dengan memastikan hanya pemegang cubbyhole token yang dapat membuka dan melihat token aslinya.
Contoh: Membuat Token untuk Aplikasi dengan TTL Pendek dan Tanpa Renewal
vault token create -policy=app-webapp-policy -ttl="1h" -renewable=false -display-name="WebApp Token"
Contoh: Membuat Token Orphan untuk Administrasi
vault token create -policy=admin-limited-policy -ttl="8h" -orphan -display-name="Limited Admin Token"
Melihat Informasi Token
Anda dapat melihat detail token jika Anda memiliki accessor-nya atau token itu sendiri.
Menggunakan Token Accessor:
vault token lookup <accessor>
Atau jika Anda adalah pemegang token (token sudah diset di VAULT_TOKEN
atau Anda login):
vault token lookup
Menggunakan Token Itu Sendiri (jika Anda memilikinya):
vault token lookup <token_value>
Memperbarui Token
Jika token dapat diperbarui (renewable: true
), Anda dapat memperpanjang TTL-nya.
vault token renew <token_value_or_accessor>
Atau untuk token yang sedang aktif digunakan oleh CLI:
vault token renew self
Perpanjangan token tidak selalu menjamin TTL akan diperpanjang hingga nilai maksimalnya; hal ini tergantung pada konfigurasi sistem.
Mencabut Token
Anda dapat mencabut token untuk segera membatalkan aksesnya.
vault token revoke <token_value_or_accessor>
Mencabut sebuah token juga akan secara otomatis mencabut semua token anaknya (kecuali jika token tersebut adalah orphan).
Praktik Terbaik Manajemen Token
Prinsip Least Privilege: Selalu buat token dengan izin minimal yang diperlukan untuk tugasnya. Hindari menggunakan root token untuk operasional sehari-hari.
TTL yang Wajar: Tetapkan TTL yang sesuai dengan kebutuhan token. Untuk interaksi user manual, TTL beberapa jam mungkin cukup. Untuk service/aplikasi, TTL yang lebih lama atau token periodik mungkin lebih sesuai.
Gunakan Display Name: Berikan nama yang jelas dan deskriptif untuk memudahkan identifikasi token di audit log.
Jangan Hardcode Token di Aplikasi: Hindari menyimpan token secara langsung di kode sumber atau file konfigurasi yang tidak aman. Gunakan mekanisme yang lebih aman seperti environment variables yang disuntikkan dengan aman, Vault Agent, atau integrasi dengan platform cloud (misalnya, IAM roles untuk AWS/Azure/GCP).
Rotasi Token Secara Teratur: Terapkan kebijakan rotasi token secara berkala untuk meminimalkan risiko dari token yang mungkin telah ter泄露.
Monitor Penggunaan Token: Gunakan audit device Vault untuk memantau penggunaan token dan mendeteksi aktivitas yang mencurigakan.
Dengan memahami cara membuat dan mengelola token secara efektif, Anda dapat mengontrol akses ke Vault dengan aman dan efisien. Langkah selanjutnya adalah mengaktifkan dan mengonfigurasi secrets engine untuk mulai menyimpan data sensitif.
Mengaktifkan dan Menggunakan Secrets Engine
Secrets engine adalah komponen di Vault yang bertanggung jawab untuk menyimpan, menghasilkan, atau mengenkripsi data. Vault mendukung berbagai jenis secrets engine, seperti Key/Value (untuk menyimpan secret statis), database (untuk menghasilkan credential database dinamis), PKI (untuk mengeluarkan sertifikat), Transit (untuk enkripsi sebagai layanan), dan banyak lagi. Setiap secrets engine diaktifkan pada path tertentu di Vault.
Mengaktifkan Secrets Engine
Anda dapat mengaktifkan secrets engine menggunakan CLI atau Web UI.
Menggunakan CLI:
Perintah umum untuk mengaktifkan secrets engine adalah vault secrets enable
.
Contoh: Mengaktifkan KV v2 Secrets Engine di Path kv-dev
KV (Key/Value) v2 adalah secrets engine yang paling umum digunakan untuk menyimpan secret statis seperti API keys, password, atau file konfigurasi.
vault secrets enable -path=kv-dev kv-v2
-path=kv-dev
: Menentukan path di mana secrets engine ini akan diaktifkan. Jika tidak ditentukan, path default akan sama dengan tipe secrets engine (misalnya,kv
).kv-v2
: Tipe secrets engine yang akan diaktifkan (Key/Value versi 2).
Outputnya akan menjadi Success! Enabled the kv-v2 secrets engine at: kv-dev/
Menggunakan Web UI:
Login ke Vault Web UI.
Pilih tab "Secrets engines".
Klik "Enable new engine".
Pilih "KV" dari daftar.
Klik "Next".
Di "Path", masukkan
kv-dev
.Pastikan "KV Version 2" terpilih.
Klik "Enable Engine".
Anda dapat mengaktifkan instance yang sama dari secrets engine beberapa kali di path yang berbeda. Setiap instance akan terisolasi.
Menggunakan KV v2 Secrets Engine
Setelah KV v2 diaktifkan, Anda dapat mulai menyimpan dan mengelola secret.
Membuat (Menulis) Secret:
Gunakan perintah vault kv put
.
vault kv put kv-dev/data/webapp/config username="webapp_user" password="s3cr3tP@ssw0rd" api_key="abc123xyz"
kv-dev
: Path di mana KV v2 engine diaktifkan.data/webapp/config
: Path untuk secret tersebut. Untuk KV v2, path data selalu diawali dengandata/
.key="value"
: Pasangan key-value yang akan disimpan.
Membaca Secret:
Gunakan perintah vault kv get
.
vault kv get kv-dev/data/webapp/config
Outputnya akan menampilkan metadata dan data secret:
====== Metadata ======
Key Value
--- -----
created_time 2024-05-23T10:30:00.123456789Z
custom_metadata <nil>
deletion_time n/a
destroyed false
version 1
====== Data ======
Key Value
--- -----
api_key abc123xyz
password s3cr3tP@ssw0rd
username webapp_user
Untuk mendapatkan hanya nilai tertentu (berguna untuk scripting):
vault kv get -field=password kv-dev/data/webapp/config
# Output: s3cr3tP@ssw0rd
Memperbarui Secret:
Gunakan vault kv put
lagi di path yang sama. Vault akan membuat versi baru dari secret tersebut.
vault kv put kv-dev/data/webapp/config username="webapp_user" password="n3wP@ssw0rd" api_key="def456uvw"
Jika Anda membaca secret lagi, version
akan menjadi 2
.
Menghapus Secret (Soft Delete):
KV v2 melakukan soft delete secara default. Secret tidak langsung dihapus permanen.
vault kv delete kv-dev/data/webapp/config
Secret akan ditandai sebagai dihapus. Anda masih dapat melihat metadata versi yang dihapus atau memulihkannya.
Melihat/Mengelola Versi Secret:
# Melihat metadata semua versi (termasuk yang dihapus)
vault kv metadata get kv-dev/data/webapp/config
# Memulihkan versi tertentu
vault kv undelete -versions=1 kv-dev/data/webapp/config
# Menghapus permanen versi tertentu
vault kv destroy -versions=1 kv-dev/data/webapp/config
Mengaktifkan Secrets Engine Lain (Contoh: Database)
Secrets engine database dapat menghasilkan credential database dinamis dengan lifetime terbatas. Ini jauh lebih aman daripada menggunakan credential statis.
1. Mengaktifkan Database Secrets Engine:
vault secrets enable database
2. Mengonfigurasi Koneksi ke Database: Anda perlu memberikan Vault informasi koneksi ke database server Anda (misalnya, PostgreSQL, MySQL). Contoh untuk PostgreSQL:
vault write database/config/my-postgres-db \
plugin_name=postgresql-database-plugin \
allowed_roles="my-role" \
connection_url="postgresql://username:password@host:port/dbname" \
# Atau gunakan Vault dynamic credentials untuk username/password
# username="vault_user" password="vault_password"
Ganti placeholder dengan detail koneksi database Anda yang sebenarnya. Penting untuk memastikan koneksi ini aman dan user yang digunakan oleh Vault memiliki izin yang cukup untuk membuat user di database target.
3. Membuat Role: Role mendefinisikan jenis credential yang akan dibuat oleh Vault.
vault write database/roles/my-role \
db_name=my-postgres-db \
creation_statements="CREATE ROLE \"{{name}}\" WITH LOGIN PASSWORD '{{password}}' VALID UNTIL '{{expiration}}'; GRANT SELECT ON ALL TABLES IN SCHEMA public TO \"{{name}}\";" \
default_ttl="1h" \
max_ttl="24h"
db_name
: Nama koneksi database yang dikonfigurasi di langkah 2.creation_statements
: SQL statement yang akan dieksekusi untuk membuat user.{{name}}
,{{password}}
, dan{{expiration}}
adalah template yang akan diisi oleh Vault.default_ttl
danmax_ttl
: TTL default dan maksimum untuk credential yang dihasilkan.
4. Menghasilkan Credential: Sekarang, aplikasi atau service dapat meminta credential dari role ini.
vault read database/creds/my-role
Outputnya akan berisi username
dan password
yang baru dibuat, beserta lease_id
dan lease_duration
.
Key Value
--- -----
lease_id database/creds/my-role/xyz...
lease_duration 1h
lease_renewable true
password A1b2C3d4E5f6G7h8
username v-token-my-role-abc...
Aplikasi dapat menggunakan username
dan password
ini untuk terhubung ke database. Credential akan otomatis dicabut oleh Vault setelah lease_duration
berakhir (kecuali diperbarui).
Mengaktifkan dan menggunakan berbagai secrets engine sesuai kebutuhan adalah inti dari manajemen secrets dengan Vault. Ini memungkinkan pendekatan yang aman, dinamis, dan terpusat untuk semua data sensitif Anda.
Mengelola Auth Methods
Auth methods di Vault adalah komponen yang bertanggung jawab untuk mengautentikasi pengguna atau mesin. Setelah autentikasi berhasil, Vault mengeluarkan token yang terkait dengan policies tertentu, yang menentukan apa yang dapat dilakukan oleh pengguna atau mesin tersebut. Vault mendukung berbagai auth methods, mulai dari yang sederhana seperti userpass
(username/password) hingga yang lebih canggih seperti kubernetes
(untuk workload di Kubernetes), jwt
(untuk OIDC), ldap
, dan approle
(untuk mesin/aplikasi).
Mengaktifkan Auth Method
Anda dapat melihat auth methods yang sudah diaktifkan dengan vault auth list
. Untuk mengaktifkan auth method baru, gunakan vault auth enable
.
Contoh: Mengaktifkan Userpass Auth Method
userpass
adalah auth method sederhana yang memungkinkan autentikasi dengan username dan password. Cocok untuk skenario kecil atau sebagai backup.
vault auth enable userpass
Output: Success! Enabled userpass auth method at: userpass/
Secara default, auth methods diaktifkan di path yang sesuai dengan namanya (misalnya, userpass/
). Anda dapat menentukan path kustom dengan flag -path
.
Menggunakan Web UI:
Login ke Vault.
Pilih tab "Access".
Pilih "Auth Methods".
Klik "Enable new method".
Pilih "Username & Password".
Klik "Next".
Anda dapat mengubah path jika diperlukan.
Klik "Enable Method".
Membuat User dan Mengaitkan Policy (Userpass)
Setelah userpass
diaktifkan, Anda dapat membuat user dan mengaitkan policies kepadanya.
Membuat User:
vault write auth/userpass/users/developer \
password="devP@ssw0rd!" \
policies="dev-policy,default"
auth/userpass/users/developer
: Path untuk membuat userdeveloper
.password="..."
: Password untuk user tersebut.policies="..."
: Daftar policies yang akan dikaitkan dengan token yang dikeluarkan untuk user ini, dipisahkan koma.
Login dengan Userpass:
vault login -method=userpass username=developer
# Akan diminta memasukkan password
Contoh Auth Method Lain: AppRole
AppRole
adalah auth method yang direkomendasikan untuk mesin atau aplikasi. Ini menggunakan dua konsep: Role ID (yang dapat dianggap mirip username) dan Secret ID (mirip password, tetapi dapat dibatasi penggunaannya dan TTL-nya).
1. Mengaktifkan AppRole Auth Method:
vault auth enable approle
2. Membuat Role:
vault write auth/approle/roles/my-app-role \
token_policies="app-webapp-policy" \
token_ttl="1h" \
token_max_ttl="4h"
auth/approle/roles/my-app-role
: Path untuk membuat rolemy-app-role
.token_policies
: Policies yang akan dikaitkan dengan token yang dikeluarkan untuk role ini.token_ttl
dantoken_max_ttl
: Pengaturan TTL untuk token.
3. Mendapatkan Role ID dan Secret ID: Aplikasi memerlukan Role ID dan Secret ID untuk melakukan autentikasi.
# Mendapatkan Role ID (ini statis dan dapat disebarkan ke aplikasi)
vault read auth/approle/role/my-app-role/role-id
# Membuat Secret ID baru (ini harus disimpan dengan aman oleh aplikasi)
vault write -f auth/approle/role/my-app-role/secret-id
Simpan role_id
dan secret_id
dengan aman. Secret ID biasanya memiliki TTL dan mungkin memiliki batas penggunaan.
4. Login dengan AppRole: Aplikasi akan menggunakan Role ID dan Secret ID untuk login.
vault write auth/approle/login role_id=<your_role_id> secret_id=<your_secret_id>
Jika berhasil, Vault akan mengeluarkan token dengan policies yang telah dikonfigurasi untuk role tersebut.
Memilih dan mengonfigurasi auth method yang tepat sangat penting untuk keamanan dan keterpaduan Vault dalam infrastruktur Anda. AppRole
seringkali menjadi pilihan utama untuk integrasi aplikasi, sementara userpass
atau ldap
/oidc
lebih cocok untuk autentikasi user manusia.
Backup dan Restore Data Vault
Melindungi data Vault dari kehilangan adalah hal yang sangat kritis. Karena Vault mengenkripsi data menggunakan master key yang dipecah menjadi unseal keys, proses backup dan restore memerlukan perhatian khusus. Anda tidak hanya perlu mencadangkan file data Vault, tetapi juga memastikan Anda memiliki cara untuk meng-unseal Vault setelah restore.
Strategi Backup
1. Backup Filesystem Data: Ini adalah metode paling umum jika Anda menggunakan file
atau raft
storage backend. Anda hanya perlu mencadangkan direktori data yang di-mount ke container.
Lokasi Data: Di setup Docker Compose kita, data Vault disimpan di direktori
./data
di host, yang di-mount ke/vault/data
di dalam container.Prosedur Backup:
Matikan container Vault untuk memastikan tidak ada perubahan data selama proses backup.
docker-compose stop vault-server
Buat arsip (zip/tar) dari direktori data.
# Navigasikan ke direktori proyek vault-docker tar -czf vault-data-backup-$(date +%Y%m%d-%H%M%S).tar.gz data/
Simpan arsip ini di lokasi yang aman dan terpisah dari server Vault. Idealnya, gunakan layanan backup cloud atau penyimpanan offsite yang aman.
Nyalakan kembali container Vault.
docker-compose up -d vault-server
Setelah dinyalakan kembali, Vault akan dalam status "sealed" dan perlu di-unseal menggunakan unseal keys yang ada.
2. Menggunakan vault operator raft snapshot
(Jika Menggunakan Raft Backend): Jika Anda menggunakan raft
storage backend (seperti dalam contoh vault.hcl
), Vault menyediakan perintah khusus untuk membuat snapshot yang konsisten dari data Raft.
Keuntungan: Dapat dilakukan saat Vault berjalan (online backup).
Prosedur Backup:
Pastikan Vault sudah ter-unseal dan berjalan.
Jalankan perintah snapshot:
# Dari host dengan VAULT_ADDR dan VAULT_TOKEN (root token atau token dengan izin) terkonfigurasi # Atau dari dalam container vault-server vault operator raft snapshot save vault-raft-snapshot-$(date +%Y%m%d-%H%M%S).snap
Simpan file
.snap
ini di lokasi yang aman dan terpisah.
Strategi Restore
1. Restore dari Filesystem Backup:
Matikan container Vault:
docker-compose stop vault-server
Hapus atau pindahkan direktori data yang ada (opsional, untuk keamanan):
# mv data data-old-$(date +%Y%m%d-%H%M%S)
Ekstrak arsip backup ke direktori data:
tar -xzf vault-data-backup-YYYYMMDD-HHMMSS.tar.gz
Nyalakan kembali container Vault:
docker-compose up -d vault-server
Unseal Vault: Setelah container berjalan, Vault akan dalam status "sealed" dan "initialized": true. Gunakan unseal keys yang Anda simpan selama inisialisasi awal (atau inisialisasi terakhir sebelum backup) untuk meng-unseal Vault.
2. Restore dari Raft Snapshot:
Matikan container Vault:
docker-compose stop vault-server
Hapus atau pindahkan direktori data yang ada (sangat disarankan saat restore snapshot):
# mv data data-old-$(date +%Y%m%d-%H%M%S)
Buat ulang direktori data kosong:
mkdir data
Restore snapshot:
# Dari host dengan VAULT_ADDR dan VAULT_TOKEN terkonfigurasi # Atau dari dalam container vault-server vault operator raft snapshot restore vault-raft-snapshot-YYYYMMDD-HHMMSS.snap
Nyalakan kembali container Vault:
docker-compose up -d vault-server
Unseal Vault: Vault akan memulai dengan data dari snapshot. Statusnya akan "sealed" dan "initialized": true. Gunakan unseal keys yang sesuai dengan data di snapshot untuk meng-unseal.
Pentingnya Unseal Keys dan Root Token
Unseal Keys: Diperlukan untuk meng-unseal Vault setelah setiap restart (jika tidak menggunakan auto-unseal) dan setelah proses restore. Tanpa unseal keys yang benar, data Vault yang terenkripsi tidak dapat diakses.
Root Token: Diperlukan untuk operasi administratif tingkat tinggi setelah restore, seperti mengubah konfigurasi inti, mengelola policies root, atau jika ada masalah dengan token lainnya.
Simpan dengan Aman: Unseal keys dan root token harus disimpan di lokasi yang sangat aman, seperti HSM (Hardware Security Module), manajer password yang sangat aman, atau dicetak dan disimpan di brankas fisik oleh beberapa orang tepercaya (sesuai Key Management Ceremony). Jangan simpan mereka bersamaan dengan backup data Vault yang tidak terenkripsi.
Dengan menjalankan prosedur backup dan restore secara teratur dan mengelola unseal keys serta root token dengan aman, Anda dapat memastikan bahwa data Vault Anda terlindungi dari kehilangan dan dapat dipulihkan saat dibutuhkan.
Kesimpulan dan Langkah Selanjutnya
Tutorial ini telah membahas cara men-setup HashiCorp Vault untuk lingkungan production minimalis menggunakan Docker dan Docker Compose. Kita telah melangkah dari persiapan awal, pembuatan file konfigurasi docker-compose.yml
dan vault.hcl
, penerapan SSL/TLS untuk komunikasi aman, hingga inisialisasi dan unseal Vault. Selanjutnya, kita menjelajahi konsep-konsep penting dalam pengelolaan Vault seperti pembuatan dan penerapan ACL policies untuk kontrol akses granular, pembuatan dan pengelolaan token untuk autentikasi, pengaktifan dan penggunaan secrets engine (seperti KV v2 dan database) untuk menyimpan dan mengelola data sensitif, serta konfigurasi auth methods (seperti userpass
dan approle
) untuk mengautentikasi pengguna dan aplikasi. Terakhir, kita membahas strategi krusial untuk backup dan restore data Vault untuk memastikan ketahanan dan pemulihan bencana.
Dengan setup ini, Anda memiliki fondasi yang kuat untuk mengelola secrets dan data sensitif aplikasi Anda dengan cara yang lebih aman dan terpusat. Namun, perjalanan menuju keamanan data yang optimal tidak berhenti di sini. Ada beberapa area penting yang perlu dipertimbangkan untuk pengembangan lebih lanjut, terutama jika Anda berencana untuk menggunakan Vault dalam skala production yang lebih besar dan kritis.
Area untuk Pengembangan Lebih Lanjut
High Availability (HA) dan Clustering:
Setup yang dijelaskan dalam tutorial ini adalah single-node. Jika node tersebut gagal, Vault akan tidak tersedia hingga node pengganti disiapkan dan data dipulihkan, yang menyebabkan downtime.
Untuk lingkungan production yang menuntut ketersediaan tinggi, Anda harus mengonfigurasi Vault cluster dengan beberapa node. HashiCorp Vault mendukung clustering dengan storage backend seperti Raft (yang sudah kita gunakan di contoh, meskipun hanya satu node), Consul, atau penyedia cloud terintegrasi.
Dalam setup HA, jika satu node gagal, node lain dapat mengambil alih, meminimalkan downtime. Anda juga dapat mengimplementasikan auto-unseal untuk mengotomatiskan proses unseal pada node-node dalam cluster, yang sangat penting untuk ketersediaan.
Auto-Unseal:
Proses unseal manual, meskipun aman, dapat menjadi beban operasional, terutama setelah restart atau dalam skenario HA. Auto-unseal memungkinkan Vault untuk secara otomatis meng-unseal dirinya sendiri tanpa intervensi manual.
Auto-unseal dapat dikonfigurasi menggunakan solusi cloud (AWS KMS, Google Cloud KMS, Azure Key Vault) atau HSM (Hardware Security Module) on-premise. Ini sangat direkomendasikan untuk lingkungan production untuk memastikan ketersediaan berkelanjutan.
Monitoring dan Alerting:
Untuk memastikan Vault beroperasi dengan baik dan mendeteksi masalah sejak dini, Anda perlu mengimplementasikan monitoring yang komprehensif.
Vault mengekspor metrik dalam format Prometheus (via
/v1/sys/metrics
). Anda dapat menggunakan Prometheus untuk mengumpulkan metrik ini dan Grafana untuk memvisualisasikannya.Pantau metrik kunci seperti status seal, performa, penggunaan token, dan error rate.
Siapkan alerting untuk notifikasi segera jika Vault menjadi sealed, tidak tersedia, atau mengalami error kritis.
Audit Logging:
Audit logging sangat penting untuk kepatuhan dan forensik keamanan. Vault dapat mengirim log audit ke berbagai target, seperti file, syslog, atau socket.
Aktifkan audit logging untuk mencatat semua permintaan dan respons yang masuk ke Vault, termasuk siapa yang mengakses secret apa, kapan, dan dari mana.
Pastikan log audit disimpan dengan aman dan dilindungi dari modifikasi.
Integrasi dengan CI/CD dan Platform Cloud:
Integrasi Vault dengan pipeline CI/CD (seperti GitLab CI, Jenkins) memungkinkan Anda untuk menyediakan secret ke aplikasi dengan aman selama proses build dan deployment.
Gunakan auth methods seperti
kubernetes
untuk workload di Kubernetes,jwt
/oidc
untuk autentikasi dengan penyedia identitas cloud, atauapprole
untuk aplikasi generik.Vault Agents dapat digunakan untuk menyederhanakan integrasi ini dengan menyediakan cache, templating, dan auto-auth untuk aplikasi Anda.
Manajemen Secret Dinamis:
Tutorial ini memberikan contoh singkat tentang database secrets engine. Manfaatkan sepenuhnya kemampuan Vault untuk menghasilkan secret dinamis (database credentials, sertifikat PKI, token cloud, dll.) dengan lifetime terbatas.
Ini secara signifikan meningkatkan keamanan dengan mengurangi kebutuhan akan credential statis yang berumur panjang.
Keamanan Jaringan:
Pastikan instance Vault Anda dilindungi oleh firewall dan hanya dapat diakses dari jaringan yang diizinkan.
Pertimbangkan untuk menggunakan PrivateLink (AWS), Private Service Connect (GCP), atau layanan serupa untuk akses privat ke Vault jika dihosting di cloud.
Gunakan Web Application Firewall (WAF) di depan Vault jika diekspos ke internet.
Dengan mempertimbangkan dan mengimplementasikan area-area pengembangan ini, Anda dapat membangun infrastruktur manajemen secrets yang tidak hanya aman dan andal tetapi juga skalabel dan mudah dioperasikan, sesuai dengan kebutuhan production yang sebenarnya. Vault adalah alat yang sangat kuat, dan eksplorasi fitur-fiturnya yang lebih lanjut akan sangat bermanfaat untuk meningkatkan postur keamanan keseluruhan organisasi Anda.
Referensi
Last updated