Install Hashicorp Vault HA Cluster

Hashicorp Vault

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:

SizeCPUMemoryDisk CapacityDisk IODisk Throughput
Small2-4 core8-16 GB RAM100+ GB3000+ IOPS75+ MB/s
Large4-8 core32-64 GB RAM200+ GB10000+ IOPS250+ MB/s
Table: Hashicorp Vault VM Prerequisites

Berikut juga list port yang harus di open:

SourceDestinationportprotocolDirectionPurpose
Client machinesLoad balancer443tcpincomingRequest distribution
Load balancerVault servers8200tcpincomingVault API
Vault serversVault servers8200tcpbidirectionalCluster bootstrapping
Vault serversVault servers8201tcpbidirectionalRaft, replication, request forwarding
Vault serversExternal systemsvariousvariousvariousExternal APIs
Table: Hashicorp Vault Port Prerequisites

Arsitektur Gambaran:

Pict: Architecture For Hashicorp Vault Install HA Cluster Replication

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.

Leave a Reply