본문 바로가기

리눅스

[draft] 우분투에 HashiCorp Vault를 설치하고 클러스터를 구성하는 방법

728x90

우분투에 HashiCorp Vault를 설치하고 클러스터를 구성하는 방법

HashiCorp Vault는 비밀 관리와 데이터 보호를 위한 강력한 도구로 클러스터링을 통해 고가용성과 확장성을 제공합니다.

 

역할 호스트 이름 아이피 주소 비고
Vault 서버 node211 192.168.0.211  
Vault 서버 node212 192.168.0.212  
Vault 서버 node213 192.168.0.213  
클라이언트 node214 192.168.0.214  

1. Vault 설치

GPG 키 및 저장소 설정

  • HashiCorp의 공식 GPG 키를 가져오고 Vault 저장소를 추가합니다.
sudo rm -f /usr/share/keyrings/hashicorp-archive-keyring.gpg
curl -fsSL 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

Vault 설치

  • 저장소를 업데이트한 후 Vault를 설치합니다.
sudo apt-get update
sudo apt-get install -y vault

2. Vault 설정

각 서버에서 Vault 서버를 초기화하고 구성합니다.(Raft 스토리지 사용)

클러스터 모드에서는 서버 간의 통신을 위해 Consul, Raft, etcd와 같은 분산 키-값 저장소를 사용할 수 있습니다.

 

Vault 설정 파일 작성

  • /etc/vault.d/vault.hcl 파일을 작성합니다.
더보기

---

cat /etc/vault.d/vault.hcl
# Copyright (c) HashiCorp, Inc.
# SPDX-License-Identifier: BUSL-1.1

# Full configuration options can be found at https://developer.hashicorp.com/vault/docs/configuration

ui = true

#mlock = true
#disable_mlock = true

storage "file" {
  path = "/opt/vault/data"
}

#storage "consul" {
#  address = "127.0.0.1:8500"
#  path    = "vault"
#}

# HTTP listener
#listener "tcp" {
#  address = "127.0.0.1:8200"
#  tls_disable = 1
#}

# HTTPS listener
listener "tcp" {
  address       = "0.0.0.0:8200"
  tls_cert_file = "/opt/vault/tls/tls.crt"
  tls_key_file  = "/opt/vault/tls/tls.key"
}

# Enterprise license_path
# This will be required for enterprise as of v1.8
#license_path = "/etc/vault.d/vault.hclic"

# Example AWS KMS auto unseal
#seal "awskms" {
#  region = "us-east-1"
#  kms_key_id = "REPLACE-ME"
#}

# Example HSM auto unseal
#seal "pkcs11" {
#  lib            = "/usr/vault/lib/libCryptoki2_64.so"
#  slot           = "0"
#  pin            = "AAAA-BBBB-CCCC-DDDD"
#  key_label      = "vault-hsm-key"
#  hmac_key_label = "vault-hsm-hmac-key"
#}

---

vim /etc/vault.d/vault.hcl
ui = true

storage "raft" {
  path    = "/opt/vault/data"
  node_id = "node1" # 이 값을 각 서버에 맞게 조정
  retry_join {
    leader_api_addr = "http://<서버1_IP>:8200"
  }
  retry_join {
    leader_api_addr = "http://<서버2_IP>:8200"
  }
  retry_join {
    leader_api_addr = "http://<서버3_IP>:8200"
  }
}

listener "tcp" {
  address = "0.0.0.0:8200"
  tls_disable = 1
}

api_addr = "http://<서버_IP>:8200"
cluster_addr = "http://<서버_IP>:8201"
  • node_id는 각 서버에서 고유해야 합니다.
  • api_addr와 cluster_addr는 해당 서버의 IP를 사용합니다.
  • node211(192.168.0.211)
cat <<EOF | sudo tee /etc/vault.d/vault.hcl
ui = true

storage "raft" {
  path    = "/opt/vault/data"
  node_id = "node211"
  
  retry_join {
    leader_api_addr = "http://192.168.0.211:8200"
  }
  retry_join {
    leader_api_addr = "http://192.168.0.212:8200"
  }
  retry_join {
    leader_api_addr = "http://192.168.0.213:8200"
  }
}

listener "tcp" {
  address     = "0.0.0.0:8200"
  tls_disable = 1
}

api_addr     = "http://192.168.0.211:8200"
cluster_addr = "http://192.168.0.211:8201"
EOF
  • node212(192.168.0.212)
cat <<EOF | sudo tee /etc/vault.d/vault.hcl
ui = true

storage "raft" {
  path    = "/opt/vault/data"
  node_id = "node212"
  
  retry_join {
    leader_api_addr = "http://192.168.0.211:8200"
  }
  retry_join {
    leader_api_addr = "http://192.168.0.212:8200"
  }
  retry_join {
    leader_api_addr = "http://192.168.0.213:8200"
  }
}

listener "tcp" {
  address     = "0.0.0.0:8200"
  tls_disable = 1
}

api_addr     = "http://192.168.0.212:8200"
cluster_addr = "http://192.168.0.212:8201"
EOF
  • node213(192.168.0.213)
cat <<EOF | sudo tee /etc/vault.d/vault.hcl
ui = true

storage "raft" {
  path    = "/opt/vault/data"
  node_id = "node213"
  
  retry_join {
    leader_api_addr = "http://192.168.0.211:8200"
  }
  retry_join {
    leader_api_addr = "http://192.168.0.212:8200"
  }
  retry_join {
    leader_api_addr = "http://192.168.0.213:8200"
  }
}

listener "tcp" {
  address     = "0.0.0.0:8200"
  tls_disable = 1
}

api_addr     = "http://192.168.0.213:8200"
cluster_addr = "http://192.168.0.213:8201"
EOF
더보기

---

Vault 서비스 파일 작성

  • Vault를 systemd 서비스로 실행하기 위해 /usr/lib/systemd/system/vault.service 파일을 작성합니다.
cat <<EOF | sudo tee /usr/lib/systemd/system/vault.service
[Unit]
Description="HashiCorp Vault - A tool for managing secrets"
Documentation=https://developer.hashicorp.com/vault/docs
Requires=network-online.target
After=network-online.target
ConditionFileNotEmpty=/etc/vault.d/vault.hcl
StartLimitIntervalSec=60
StartLimitBurst=3

[Service]
Type=notify
EnvironmentFile=/etc/vault.d/vault.env
User=vault
Group=vault
ProtectSystem=full
ProtectHome=read-only
PrivateTmp=yes
PrivateDevices=yes
SecureBits=keep-caps
AmbientCapabilities=CAP_IPC_LOCK
CapabilityBoundingSet=CAP_SYSLOG CAP_IPC_LOCK
NoNewPrivileges=yes
ExecStart=/usr/bin/vault server -config=/etc/vault.d/vault.hcl
ExecReload=/bin/kill --signal HUP $MAINPID
KillMode=process
KillSignal=SIGINT
Restart=on-failure
RestartSec=5
TimeoutStopSec=30
LimitNOFILE=65536
LimitMEMLOCK=infinity
LimitCORE=0

[Install]
WantedBy=multi-user.target
EOF

Vault 사용자 및 디렉토리 설정

  • Vault 사용자와 데이터 디렉토리를 설정합니다.
sudo useradd --system --home /home/vault --shell /bin/false vault
sudo mkdir -p /opt/vault/data
sudo chown -R vault:vault /opt/vault
sudo chmod 700 /opt/vault

---

데이터 디렉토리 생성 및 권한 설정

  • Vault가 실행되는 사용자가 디렉토리에 쓰기 권한을 가지고 있어야 합니다.
sudo mkdir -p /opt/vault/data
sudo chown -R vault:vault /opt/vault/data
sudo chmod -R 750 /opt/vault/data

환경 파일 생성

echo "VAULT_ADDR='http://127.0.0.1:8200'" | sudo tee /etc/vault.d/vault.env

Vault 서비스 시작 및 활성화

  • Vault 서비스를 시작하고 부팅 시 자동으로 시작되도록 설정합니다.
sudo systemctl daemon-reload
sudo systemctl --now enable vault
sudo systemctl restart vault
sudo systemctl status vault --no-pager

3. Vault 초기화 및 클러스터 구성

환경 변수 설정

export VAULT_ADDR='http://127.0.0.1:8200'

Vault 초기화

  • 클러스터의 첫 번째 서버에서 Vault를 초기화합니다.
vault operator init | tee ~/vault_info.txt
  • 여러 개의 키와 초기 루트 토큰을 생성합니다. 이 정보를 안전하게 보관해야 합니다.
$ vault operator init | tee ~/vault_info.txt
Unseal Key 1: UK3ZpxgIyoEFoEszDi88YEdLZgS64Q7Xrp76ATE+ERir
Unseal Key 2: s0iv+/PWOB5IVApw/GP5RU5117sz/QQrl8El+VR9cShT
Unseal Key 3: 1DInNOZsx1pTLntzs5ZVtJv5Y2uFqPhR6nJdGL4v7Rpu
Unseal Key 4: /xXG642bQkxRQdlIjEvvBfG7UXtxjOiNienWfV/V4Qd7
Unseal Key 5: CGxMnVCyqkOQbOnUVNISzQcA+nenvvZfUq2r++rktdfw

Initial Root Token: hvs.tpD0q9s6BPtqOIfTN5ngSFWi

언실(Sealing) 해제

  • 초기화된 Vault를 언실하기 위해 언실 키를 사용합니다.
vault operator unseal UK3ZpxgIyoEFoEszDi88YEdLZgS64Q7Xrp76ATE+ERir
vault operator unseal s0iv+/PWOB5IVApw/GP5RU5117sz/QQrl8El+VR9cShT
vault operator unseal 1DInNOZsx1pTLntzs5ZVtJv5Y2uFqPhR6nJdGL4v7Rpu
vault operator unseal /xXG642bQkxRQdlIjEvvBfG7UXtxjOiNienWfV/V4Qd7
vault operator unseal CGxMnVCyqkOQbOnUVNISzQcA+nenvvZfUq2r++rktdfw

클러스터 상태 확인

vault status

Vault 로그인

vault login hvs.tpD0q9s6BPtqOIfTN5ngSFWi
vault operator members
$ vault operator members
Host Name    API Address                  Cluster Address               Active Node    Version    Upgrade Version    Redundancy Zone    Last Echo
---------    -----------                  ---------------               -----------    -------    ---------------    ---------------    ---------
node211      http://192.168.0.211:8200    https://192.168.0.211:8201    true           1.17.2     1.17.2             n/a                n/a
node212      http://192.168.0.212:8200    https://192.168.0.212:8201    false          1.17.2     1.17.2             n/a                2024-07-29T13:28:09+09:00
node213      http://192.168.0.213:8200    https://192.168.0.213:8201    false          1.17.2     1.17.2             n/a                2024-07-29T13:28:10+09:00

클러스터 피어 상태 확인

vault operator raft list-peers
$ vault operator raft list-peers
Node       Address               State       Voter
----       -------               -----       -----
node211    127.0.0.1:8201        leader      true
node212    192.168.0.212:8201    follower    true
node213    192.168.0.213:8201    follower    true

클러스터에 노드 추가

  • 환경 변수 설정
export VAULT_ADDR="http://192.168.0.211:8200"
  • 언실(Sealing) 해제
vault operator unseal UK3ZpxgIyoEFoEszDi88YEdLZgS64Q7Xrp76ATE+ERir
vault operator unseal s0iv+/PWOB5IVApw/GP5RU5117sz/QQrl8El+VR9cShT
vault operator unseal 1DInNOZsx1pTLntzs5ZVtJv5Y2uFqPhR6nJdGL4v7Rpu
vault operator unseal /xXG642bQkxRQdlIjEvvBfG7UXtxjOiNienWfV/V4Qd7
vault operator unseal CGxMnVCyqkOQbOnUVNISzQcA+nenvvZfUq2r++rktdfw

Vault 로그인

vault login hvs.nk0ahRr5GNcoxRCcClUtrJE7
  • 나머지 서버에서 첫 번째 서버에 연결하여 클러스터에 참여시킵니다.
vault operator raft join http://<첫_번째_서버_IP>:8200
vault operator raft join http://192.168.0.211:8200
$ vault operator raft join http://192.168.0.211:8200
Key       Value
---       -----
Joined    true

각 노드 언실(Sealing) 해제

  • 클러스터에 참여한 각 노드를 언실합니다.
vault operator unseal UK3ZpxgIyoEFoEszDi88YEdLZgS64Q7Xrp76ATE+ERir
vault operator unseal s0iv+/PWOB5IVApw/GP5RU5117sz/QQrl8El+VR9cShT
vault operator unseal 1DInNOZsx1pTLntzs5ZVtJv5Y2uFqPhR6nJdGL4v7Rpu
vault operator unseal /xXG642bQkxRQdlIjEvvBfG7UXtxjOiNienWfV/V4Qd7
vault operator unseal CGxMnVCyqkOQbOnUVNISzQcA+nenvvZfUq2r++rktdfw
vault login hvs.tpD0q9s6BPtqOIfTN5ngSFWi
vault operator members
vault operator raft list-peers

클러스터 상태 확인

  • 모든 서버에서 vault status 명령어를 사용하여 클러스터 상태를 확인합니다.
vault status
$ vault status
Key                     Value
---                     -----
Seal Type               shamir
Initialized             true
Sealed                  false
Total Shares            5
Threshold               3
Version                 1.17.2
Build Date              2024-07-05T15:19:12Z
Storage Type            raft
Cluster Name            vault-cluster-05867962
Cluster ID              ce5827de-3f8e-e2a0-7976-6af159569618
HA Enabled              true
HA Cluster              https://192.168.0.211:8201
HA Mode                 standby
Active Node Address     http://192.168.0.211:8200
Raft Committed Index    379
Raft Applied Index      379

정상적으로 클러스터가 구성되었다면 각 서버에서 Vault의 상태 정보를 확인할 수 있습니다.

 

우분투에 최신 버전의 HashiCorp Vault를 설치하고 클러스터를 구성할 수 있습니다. 추가적인 설정이나 보안 조치가 필요할 수 있으므로 공식 문서와 관련 자료를 참고하여 설정을 세부적으로 조정하는 것이 좋습니다.

 

728x90