Pada segment sebelumnya kita sudah membahas sedikit demi sedikit konseptual terkait secret management dan salah satu produknya yaitu Hashicorp Vault. Pada Bagian Kali ini kita akan memulai tutorial bagaimana menginstall atau mendeploy Hashicorp Vault High Availability sesuai real case. Tutorial kali ini akan menggunakan CentOS, atau bisa juga menggunakan AlmaLinux, ataupun Rocky Linux untuk alternatifnya. Untuk kasus studi ini, dikarenakan menggunakan arsitektur aslinya, maka dibutuhkan minimal 3 VM dengan spek seperti berikut:
Size | CPU | Memory | Disk Capacity | Disk IO | Disk Throughput |
Small | 2-4 core | 8-16 GB RAM | 100+ GB | 3000+ IOPS | 75+ MB/s |
Large | 4-8 core | 32-64 GB RAM | 200+ GB | 10000+ IOPS | 250+ MB/s |
Berikut juga list port yang harus di open:
Source | Destination | port | protocol | Direction | Purpose |
Client machines | Load balancer | 443 | tcp | incoming | Request distribution |
Load balancer | Vault servers | 8200 | tcp | incoming | Vault API |
Vault servers | Vault servers | 8200 | tcp | bidirectional | Cluster bootstrapping |
Vault servers | Vault servers | 8201 | tcp | bidirectional | Raft, replication, request forwarding |
Vault servers | External systems | various | various | various | External APIs |
Arsitektur Gambaran:
Baca Juga:
1. Bisakah Hashicorp Vault High Availability?
2. Hashicorp Vault, Apa itu? Secret Storage & Management
Langkah-Langkah Instalasi/Deployment:
1. Firewall & SELinux
Lakukan keseluruhan step ini di semua VM tanpa terkecuali
- systemctl enable –now firewalld
- firewall-cmd –add-port={443,8200,8201}/tcp –permanent
- firewall-cmd –reload
- yum install -y setools setroubleshoot-server selinux-policy-devel policycoreutils-python-utils rpm-build
- setenforce 0
- vi /etc/selinux/config
# This file controls the state of SELinux on the system.
# SELINUX= can take one of these three values:
# enforcing - SELinux security policy is enforced.
# permissive - SELinux prints warnings instead of enforcing.
# disabled - No SELinux policy is loaded.
SELINUX=permissive
# SELINUXTYPE= can take one of these three values:
# targeted - Targeted processes are protected,
# minimum - Modification of targeted policy. Only selected processes are protected.
# mls - Multi Level Security protection.
SELINUXTYPE=targeted
Note: Cukup ganti SELINUX=enforcing menjadi SELINUX=permissive , agar ketika restart nanti kondisi selinux tetap seperti itu dan tidak kembali ke kondisi awal.
2. Install Dependencies Yang Dibutuhkan
Lakukan step-step ini juga disetiap VM yang ada! Pastikan semua command di bawah ini sudah dilakukan pada setiap machine/VM yang nantinya akan dijadikan Hashicorp Vault HA Cluster.
- yum install -y bind-utils net-tools wget chrony telnet nmap
- systemctl enable –now chronyd
- timedatectl set-ntp true
- sudo yum install -y yum-utils
- sudo yum-config-manager –add-repo https://rpm.releases.hashicorp.com/RHEL/hashicorp.repo
- sudo yum -y install vault
3. Create RAFT Storage Directory
Lakukan pada setiap VM juga tanpa terkecuali, karena jika step ini terlewat dapat dipastikan cluster tidak dapat berjalan. Oleh sebab itu step pembuatan storage sangat diperlukan untuk penyimpanan Vault itu sendiri.
- sudo mkdir -p /opt/vault/data
- sudo chown -R vault:vault /opt/vault/data
4. Setup HCL Configuration
a. VM 1 (Nantinya akan menjadi Leader Node)
- cp /etc/vault.d/vault.hcl /etc/vault.d/vault.hcl.bak
Note: step ini perlu dilakukan untuk membackup default HCL config yang ada, jika nanti ada kesalahan config - vi /etc/vault.d/vault.hcl
storage "raft" {
path = "/opt/vault/data"
node_id = "vault1"
retry_join
{
leader_api_addr = "http://vault2.fqdn:8200"
}
retry_join
{
leader_api_addr = "http://vault3.fqdn:8200"
}
}
listener "tcp" {
address = "0.0.0.0:8200"
cluster_address = "0.0.0.0:8201"
tls_disable = true
scheme = "http"
}
api_addr = "http://vault1.fqdn:8200"
cluster_addr = "http://vault1.fqdn:8201"
disable_mlock = true
ui = true
log_level = "trace"
disable_cache = true
cluster_name = "fqdn"
# Enterprise license_path
# This will be required for enterprise as of v1.8
# license_path = "/etc/vault.d/vault.hclic"
Note: Ganti vault1.fqdn dengan domain VM 1, vault2.fqdn dengan domain VM 2, dan vault3.fqdn dengan domain VM 3
- systemctl enable –now vault
b. VM 2 (VM 2 Ini Yang Nantinya Akan Menjadi Follower Node)
- cp /etc/vault.d/vault.hcl /etc/vault.d/vault.hcl.bak
Note: step ini perlu dilakukan untuk membackup default HCL config yang ada, jika nanti ada kesalahan config - vi /etc/vault.d/vault.hcl
storage "raft" {
path = "/opt/vault/data"
node_id = "vault2"
retry_join
{
leader_api_addr = "http://vault1.fqdn:8200"
}
retry_join
{
leader_api_addr = "http://vault3.fqdn:8200"
}
}
listener "tcp" {
address = "0.0.0.0:8200"
cluster_address = "0.0.0.0:8201"
tls_disable = true
scheme = "http"
}
api_addr = "http://vault2.fqdn:8200"
cluster_addr = "http://vault2.fqdn:8201"
disable_mlock = true
ui = true
log_level = "trace"
disable_cache = true
cluster_name = "fqdn"
# Enterprise license_path
# This will be required for enterprise as of v1.8
# license_path = "/etc/vault.d/vault.hclic"
Note: Ganti vault1.fqdn dengan domain VM 1, vault2.fqdn dengan domain VM 2, dan vault3.fqdn dengan domain VM 3
- systemctl enable –now vault
c. VM 3 (VM 3 Juga Akan Menjadi Follower Node)
- cp /etc/vault.d/vault.hcl /etc/vault.d/vault.hcl.bak
Note: step ini perlu dilakukan untuk membackup default HCL config yang ada, jika nanti ada kesalahan config - vi /etc/vault.d/vault.hcl
storage "raft" {
path = "/opt/vault/data"
node_id = "vault3"
retry_join
{
leader_api_addr = "http://vault1.fqdn:8200"
}
retry_join
{
leader_api_addr = "http://vault2.fqdn:8200"
}
}
listener "tcp" {
address = "0.0.0.0:8200"
cluster_address = "0.0.0.0:8201"
tls_disable = true
scheme = "http"
}
api_addr = "http://vault3.fqdn:8200"
cluster_addr = "http://vault3.fqdn:8201"
disable_mlock = true
ui = true
log_level = "trace"
disable_cache = true
cluster_name = "fqdn"
# Enterprise license_path
# This will be required for enterprise as of v1.8
# license_path = "/etc/vault.d/vault.hclic"
Note: Ganti vault1.fqdn dengan domain VM 1, vault2.fqdn dengan domain VM 2, dan vault3.fqdn dengan domain VM 3
- systemctl enable –now vault
5. Memulai Inisialisasi Cluster (VM 1)
Inisialisasi cluster harus dimulai dari VM 1 sebagai master node nya. Lakukan dengan teliti!
- vi /etc/environment
VAULT_ADDR=http://ip_VM1:8200
- source /etc/environment
- vault operator init | tee root.token
Note: Mohon file root.token yang berisi root token dan unseal key disimpan+dijaga dengan baik. Karena jika hilang maka cluster akan kesulitan untuk kembali dan bisa saja cluster akan rusak nantinya - echo “export VAULT_TOKEN=root_token_yang_didapat_setelah_init” >> /etc/environment
- source /etc/environment
- vault operator unseal unseal_key_dari_init
Note: ketika melakukan “vault operator unseal” lakukan sebanyak 3 kali dengan 3 unseal key yang berbeda, agar dapat membuka statusnya menjadi unsealed (sealed=false) - vault status
Note: untuk mengecek status Vault server, jika keterangan “sealed=false” maka server Vault sudah jalan
Atau bagi teman-teman yang malas menggunakan pengetikan manual, penulis ada sedikit bash script untuk melakukan automation terhadap inisialisasi dan konfig yang ada pada VM 1. Lakukan penyesuaian script jika ada yang berbeda!
#!/bin/bash
cat <<EOF > /etc/environment
VAULT_ADDR=http://ip_VM1:8200
VAULT_TOKEN=root-token-init
EOF
awk 'NR>=1 && NR<=3 {print $4}' root.token | xargs -I {} -n1 vault operator unseal {} && sed -i "/VAULT_TOKEN/c\VAULT_TOKEN=$(awk '/Token/ {print $4}' root.token)" /etc/environment && sed -i "/VAULT_ADDR/c\VAULT_ADDR=http://$(hostname -f):8200" /etc/environment && source /etc/environment
6. Joining VM 2 dan VM 3 ke VM 1
Lakukan seluruh step ini pada VM 2 dan VM 3!
- vi /etc/environment
VAULT_ADDR=http://ip_VM2_atau_VM3:8200
Note: jika sedang melakukan setting pada VM 2 maka isikan variable VAULT_ADDR dengan http://ip_VM2 dengan port 8200. Namun jika sedang melakukan setting pada VM 3 maka isikan variable VAULT_ADDR dengan http://ip_VM3 dengan port 8200
- source /etc/environment
- copy isi root.token di VM 1 ke dalam root.token di VM 2 dan VM 3
- echo “export VAULT_TOKEN=root_token_yang_didapat_setelah_init” >> /etc/environment
- source /etc/environment
- vault operator raft join -address=http://ip_lVM1:8200
- vault operator unseal unseal_key_dari_init
Note: ketika melakukan “vault operator unseal” lakukan sebanyak 3 kali dengan 3 unseal key yang berbeda, agar dapat membuka statusnya menjadi unsealed (sealed=false) - vault status
Note: untuk mengecek status Vault server, jika keterangan “sealed=false” maka server Vault sudah jalan
Akhir kata, step-step di atas adalah salah satu tutorial untuk setup Hashicorp Vault HA (High Availability) Cluster With Integrated Raft Storage. Jika ada kendala atau bingung bisa mengunjungi dokumentasi resmi Vault. Jangan lupa mampir juga ke blog personal saya di cybertechnologyspace.blogspot.com atau www.cybertechnologyspace.my.id.