변군이글루 블로그(Development)
[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
'리눅스' 카테고리의 다른 글
[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 |