Cloud Native Solution/[Hashicorp] Vault

[Hashicorp][HA] Vault Raft 클러스터 구성

Cloud Engineer 2022. 8. 27. 14:44

0. 개요

단순히 Vault를 학습할 때는 standalone VM 노드에서 Vault를 구축하여 테스트해볼 수 있겠지만, 기업에서 PoC 및 프로덕션 환경에서는 클러스터링을 통해 Vault 무중단 시스템을 구축해야됩니다. Hashicorp에서는 Vault가 Community와 Enterprise인지에 따라 차별화된 클러스터링 기능을 제공하는데요. 본 포스팅에서는 Community를 기준으로 Vault Raft Cluster를 구성하는 내용을 다뤄보겠습니다. Raft Cluster는 Raft 합의 알고리즘을 따르기 때문에 3개 VM 노드를 생성하여 클러스터를 구성하겠습니다.

1. 시스템 구성도

  • OS : CentOS 7.x
  • Vault : Community Version
  • HA Type : Raft Cluster (= Integrated Storage)
  • 특이사항
    • 인터넷 가능 (폐쇄망 X)
    • SElinux Disbale

Vault version 별 HA 클러스터 구성도

2. 실습

본 실습에서는 Yum Repository 구성부터 Vault 설치 및 Configuration 구성을 완료하고 결과값을 확인해보겠습니다.

2-1. Yum Repository 및 Vault 설치

먼저 Hashicorp에서 공식적으로 제공하는 Package Repository를 추가한 뒤, Vault를 설치해줍니다.

# 1. Yum Repository 구성에 필요한 패키지 설치
$ sudo yum install -y yum-utils

# 2. Hashicorp에서 제공하는 Repository 추가
$ sudo yum-config-manager --add-repo https://rpm.releases.hashicorp.com/RHEL/hashicorp.repo

# 3. Vault 설치
$ sudo yum -y install vault

2-2. Vault Configuration 구성

Vault 및 Raft 클러스터 구성 정보를 입력해줍니다. 만약 해당 경로에 파일이 없다면 생성해줍니다.

  • 8200 포트 : Client로부터 받은 요청을 Redirect할 때 Advertise할 IP 주소를 지정
  • 8201 포트 : 노드 간 Raft 클러스터 운영에 필요한 정보를 공유

Vault 구성과 관련된 레퍼런스를 확인하고 싶으신 분은 링크를, Raft는 링크를 클릭하여 확인하시면 됩니다.

2-2-1. Active Node

$ sudo vi /etc/vault.d/vault.hcl

cluster_addr    = "http://1.1.1.1:8201"
api_addr                        = "http://1.1.1.1:8200"
disable_mlock = true //raft 기반 구성 시, out of memory 방지하기 위해 설정
ui            = true

// Listner 설정 (외부 포트 Open)
listener "tcp" {
        address = "0.0.0.0:8200"
        cluster_address = "0.0.0.0:8201"
        tls_disable = true	// 실습이므로, TLS Disable. Production에서는 False로 변경
}

// Raft Storage 설정 (Integrated Storage)
storage "raft" {
        path = "/opt/vault/data"
	    node_id = "{{ Active Node 고유 이름 }}"

// Node 개수만큼 retry_join 절 작성
        retry_join {
                leader_api_addr   = "http://1.1.1.1:8200"
        }
        retry_join {
                leader_api_addr   = "http://1.1.1.2:8200"
        }
        retry_join {
                leader_api_addr   = "http://1.1.1.3:8200"
        }
}

2-2-2. Standby Node

cluster_addr    = "http://{{ 본인 Node IP 주소 }}:8201"
api_addr                        = "http://{{ 본인 Node IP 주소 }}:8200"
disable_mlock = true //raft 기반 구성 시, out of memory 방지하기 위해 설정
ui            = true

// Listner 설정
listener "tcp" {
        address = "0.0.0.0:8200"
        cluster_address = "0.0.0.0:8201"
        tls_disable = true			// 실습이므로, TLS Disable. Production에서는 False로 변경
}

// Raft Storage 설정
storage "raft" {
	path = "/opt/vault/data"
	node_id = "{{ Stnadby 노드 고유 이름 }}"

// Node 개수만큼 retry_join 절 작성
        retry_join {
                leader_api_addr   = "http://1.1.1.1:8200"
        }
        retry_join {
                leader_api_addr   = "http://1.1.1.2:8200"
        }
        retry_join {
                leader_api_addr   = "http://1.1.1.3:8200"
        }
}

2-3. Service 등록 및 시작

Vault를 Systemd로 등록하여 재부팅 시 자동으로 구동되도록 설정한 뒤 데몬을 시작해줍니다.

$ sudo systemctl enable vault.service
$ sudo systemctl start vault.service
$ sudo systemctl status vault.service

2-3. Vault 주소 환경변수 등록

Vault CLI를 활용하기 위해 Vault IP 주소를 환경 변수로 등록한 뒤, Vault 상태를 확인합니다.

$ export VAULT_ADDR="http://{{각 Node IP 주소}}:8200"

# vault 상태 확인
$ vault status

2-4. Vault 초기화 및 Unseal

Vault가 Seal 상태로 존재한다면 Barrier로 인해 외부 접근이 불가합니다. Vault 노드를 Unseal 상태로 구성하여 외부에서 접근할 수 있도록 해줍니다.

2-4-1. Active Node

Vault 클러스터 Initialize 및 Seal 상태를 Unseal로 변경해줍니다.

$ vault operator init -key-shares=1 -key-threshold=1

# 생성된 Unseal Key 입력
$ vault operator unseal

2-4-2. Standby Node 

Standby 노드에서 아직 Active Node 및 Cluster에 대한 정보를 모르고 있기 때문에 해당 클러스터에 Join해준 뒤, Unseal로 구성해줍니다. 

$ vault operator raft join "http://{{ Active Node IP 주소}}:8200"

# Active Node에서 생성한 Unseal Key 입력
$ vault operator unseal

2-5. Vault Login 및 Raft Join 확인

Active Node에서 Vault Root 계정으로 로그인하여 Vault 및 Raft Cluster 정보를 확인합니다.

# Active Node를 초기화할 때 확인한 Root Token Value 입력
$ vault login token={{ token value }}

# Raft 구성 확인
$ vault operator raft list-peers

3. 마무리

Vault Raft Cluster 구성 방법에 대해 알아봤습니다. 만약 회사에서 SDDC를 구성한다면 Vault Raft Cluster를 DR로 구성하여 클러스터를 HA 구성하는 방식이 존재합니다. 향후에는 클러스터 HA 구성 방식에 대해 다뤄보겠습니다.