본문 바로가기

리눅스

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

반응형

우분투에 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
반응형