리눅스

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

변군이글루 2024. 7. 25. 20:13
반응형

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

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

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
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를 사용합니다.
  • node111
cat <<EOF | sudo tee /etc/vault.d/vault.hcl
ui = true

storage "raft" {
  path    = "/opt/vault/data"
  node_id = "node1"  # 이 값을 각 서버에 맞게 조정
  retry_join {
    leader_api_addr = "http://192.168.10.111:8200"
  }
  retry_join {
    leader_api_addr = "http://192.168.10.112:8200"
  }
  retry_join {
    leader_api_addr = "http://192.168.10.113:8200"
  }
}

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

api_addr     = "http://192.168.10.111:8200"
cluster_addr = "http://192.168.10.111:8201"
EOF
  • node112
cat <<EOF | sudo tee /etc/vault.d/vault.hcl
ui = true

storage "raft" {
  path    = "/opt/vault/data"
  node_id = "node2"  # 이 값을 각 서버에 맞게 조정
  retry_join {
    leader_api_addr = "http://192.168.10.111:8200"
  }
  retry_join {
    leader_api_addr = "http://192.168.10.112:8200"
  }
  retry_join {
    leader_api_addr = "http://192.168.10.113:8200"
  }
}

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

api_addr     = "http://192.168.10.112:8200"
cluster_addr = "http://192.168.10.112:8201"
EOF
  • node113
cat <<EOF | sudo tee /etc/vault.d/vault.hcl
ui = true

storage "raft" {
  path    = "/opt/vault/data"
  node_id = "node3"  # 이 값을 각 서버에 맞게 조정
  retry_join {
    leader_api_addr = "http://192.168.10.111:8200"
  }
  retry_join {
    leader_api_addr = "http://192.168.10.112:8200"
  }
  retry_join {
    leader_api_addr = "http://192.168.10.113:8200"
  }
}

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

api_addr     = "http://192.168.10.113:8200"
cluster_addr = "http://192.168.10.113: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 750 /opt/vault/data

Vault 서비스 시작 및 활성화

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

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: 80wL+4DQOUkJwGol7+TrHpfNsTxvEeZqFBB8LZGvQj4+
Unseal Key 2: +ypwBhLV9ytwGtjjqzWXbcgRrwDLVC/9n7LzZ9rKRfnm
Unseal Key 3: 4mX1QLsDnfaaMp8GIXniWYhUJrh5thGg7XxkzzXRPby5
Unseal Key 4: axrdezlFJl/nG7DxLNGGAo7wRtuYU5Eh/7/AC4n9fl3E
Unseal Key 5: jocaggckP5pZkiyHGdrhj0bOXscwLr/K8voIS/5kOBdE

Initial Root Token: hvs.TpDlVyyfv7LPBad2NzYL3cmM

Vault initialized with 5 key shares and a key threshold of 3. Please securely
distribute the key shares printed above. When the Vault is re-sealed,
restarted, or stopped, you must supply at least 3 of these keys to unseal it
before it can start servicing requests.

Vault does not store the generated root key. Without at least 3 keys to
reconstruct the root key, Vault will remain permanently sealed!

It is possible to generate new unseal keys, provided you have a quorum of
existing unseal keys shares. See "vault operator rekey" for more information.

언실(Sealing) 해제

  • 초기화된 Vault를 언실하기 위해 언실 키를 사용합니다.
vault operator unseal 80wL+4DQOUkJwGol7+TrHpfNsTxvEeZqFBB8LZGvQj4+
vault operator unseal +ypwBhLV9ytwGtjjqzWXbcgRrwDLVC/9n7LzZ9rKRfnm
vault operator unseal 4mX1QLsDnfaaMp8GIXniWYhUJrh5thGg7XxkzzXRPby5
vault operator unseal axrdezlFJl/nG7DxLNGGAo7wRtuYU5Eh/7/AC4n9fl3E
vault operator unseal jocaggckP5pZkiyHGdrhj0bOXscwLr/K8voIS/5kOBdE

로그인

vault login <root_token>
vault login hvs.TpDlVyyfv7LPBad2NzYL3cmM

서버 상태 확인

vault status

정책 확인

vault token lookup
경고! VAULT_TOKEN 환경 변수가 설정되었습니다!
"unset VAULT_TOKEN" 후 다시 등록합니다.

 

클러스터의 멤버 목록 확인

  • Vault 클러스터의 각 노드가 어떤 상태인지 리더 노드와 팔로워 노드의 정보를 포함하여 클러스터의 전반적인 상태를 확인합니다.
vault operator members
vault operator raft list-peers

클러스터에 노드 추가

  • 환경 변수 설정
export VAULT_ADDR='http://127.0.0.1:8200'

나머지 서버에서 첫 번째 서버에 연결하여 클러스터에 참여시킵니다.

vault operator raft join http://<첫_번째_서버_IP>:8200
vault operator raft join http://192.168.10.111:8200
$ vault operator raft join http://192.168.10.111:8200
Key       Value
---       -----
Joined    true

각 노드 언실(Sealing) 해제

  • 클러스터에 참여한 각 노드를 언실합니다.
vault operator unseal 80wL+4DQOUkJwGol7+TrHpfNsTxvEeZqFBB8LZGvQj4+
vault operator unseal +ypwBhLV9ytwGtjjqzWXbcgRrwDLVC/9n7LzZ9rKRfnm
vault operator unseal 4mX1QLsDnfaaMp8GIXniWYhUJrh5thGg7XxkzzXRPby5
vault operator unseal axrdezlFJl/nG7DxLNGGAo7wRtuYU5Eh/7/AC4n9fl3E
vault operator unseal jocaggckP5pZkiyHGdrhj0bOXscwLr/K8voIS/5kOBdE

또는

vault operator unseal
$ vault operator unseal
Unseal Key (will be hidden): [Unseal Key 입력]
Key                Value
---                -----
Seal Type          shamir
Initialized        true
Sealed             true
Total Shares       5
Threshold          3
Unseal Progress    2/3
Unseal Nonce       6f895337-de93-6825-40bb-8a39a15e709c
Version            1.17.2
Build Date         2024-07-05T15:19:12Z
Storage Type       raft
HA Enabled         true

VAULT_TOKEN 환경 변수를 해제

unset VAULT_TOKEN
vault login hvs.TpDlVyyfv7LPBad2NzYL3cmM

클러스터 상태 확인

  • 모든 서버에서 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-836e0fce
Cluster ID              6f506663-ecee-7a52-3f72-144d1b6e3ed2
HA Enabled              true
HA Cluster              https://192.168.10.111:8201
HA Mode                 standby
Active Node Address     http://192.168.10.111:8200
Raft Committed Index    71
Raft Applied Index      71

 

vault operator members
vault operator raft list-peers

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

 

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

 

728x90
반응형