반응형
우분투에 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
반응형
'리눅스' 카테고리의 다른 글
Vault를 사용하여 SSH CA 키를 관리하는 방법 (0) | 2024.07.25 |
---|---|
Vault 클러스터를 Consul을 백엔드 스토리지로 사용하여 구성하는 방법 (0) | 2024.07.25 |
etcd 클러스터를 구성하는 방법 (0) | 2024.07.23 |
우분투에 etcd를 설치하는 방법 (0) | 2024.07.22 |
쿠버네티스 클러스터를 멀티 마스터 환경에서 고가용성을 구현하는 방법 (0) | 2024.07.22 |