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
'리눅스' 카테고리의 다른 글
[draft] 우분투에서 사용자별 용량 제한을 설정하고 사용하는 방법 (0) | 2024.07.28 |
---|---|
[draft] Vault 클러스터를 Consul을 백엔드 스토리지로 사용하여 구성하는 방법 (1) | 2024.07.25 |
[draft] 쿠버네티스 클러스터를 고가용성으로 구성하는 방법 (0) | 2024.07.23 |
[draft] etcd 클러스터를 구성하는 방법 (0) | 2024.07.23 |
[draft] 우분투에 etcd를 설치하는 방법 (0) | 2024.07.22 |