Hướng dẫn cài đặt và cấu hình HashiCorp Vault

HashiCorp Vault là một công cụ quản lý secret, cho phép bạn lưu trữ và kiểm soát truy cập đến API keys, password hay certificate. Bài viết dưới đây sẽ hướng dẫn bạn cài đặt và cấu hình Vault chi tiết từng bước.

1. Chuẩn bị

Cập nhật hệ thống và cài đặt GPG:

Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
// Lệnh này cập nhật danh sách gói và cài đặt GPG, giúp hệ thống kiểm tra tính hợp lệ của các key ký số.
sudo apt update && sudo apt install gpg
// Tải Về Key Ký Số Của HashiCorp
wget -O- https://apt.releases.hashicorp.com/gpg | sudo gpg --dearmor -o /usr/share/keyrings/hashicorp-archive-keyring.gpg
// xác nhận rằng key chính xác và không bị giả mạo
gpg --no-default-keyring --keyring /usr/share/keyrings/hashicorp-archive-keyring.gpg --fingerprint
// Lệnh này cập nhật danh sách gói và cài đặt GPG, giúp hệ thống kiểm tra tính hợp lệ của các key ký số. sudo apt update && sudo apt install gpg // Tải Về Key Ký Số Của HashiCorp wget -O- https://apt.releases.hashicorp.com/gpg | sudo gpg --dearmor -o /usr/share/keyrings/hashicorp-archive-keyring.gpg // xác nhận rằng key chính xác và không bị giả mạo gpg --no-default-keyring --keyring /usr/share/keyrings/hashicorp-archive-keyring.gpg --fingerprint
// Lệnh này cập nhật danh sách gói và cài đặt GPG, giúp hệ thống kiểm tra tính hợp lệ của các key ký số.
sudo apt update && sudo apt install gpg

// Tải Về Key Ký Số Của HashiCorp
wget -O- https://apt.releases.hashicorp.com/gpg | sudo gpg --dearmor -o /usr/share/keyrings/hashicorp-archive-keyring.gpg

// xác nhận rằng key chính xác và không bị giả mạo
gpg --no-default-keyring --keyring /usr/share/keyrings/hashicorp-archive-keyring.gpg --fingerprint

2. Cài Đặt Vault

Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
// Để hệ thống có thể tải gói Vault từ kho lưu trữ chính thức, bạn cần thêm repository của HashiCorp:
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
//Cập Nhật Và Cài Đặt Vault
sudo apt update && sudo apt install vault
// Kiểm tra phiên bản Vault đã cài đặt:
vault -v
// Để hệ thống có thể tải gói Vault từ kho lưu trữ chính thức, bạn cần thêm repository của HashiCorp: 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 //Cập Nhật Và Cài Đặt Vault sudo apt update && sudo apt install vault // Kiểm tra phiên bản Vault đã cài đặt: vault -v
// Để hệ thống có thể tải gói Vault từ kho lưu trữ chính thức, bạn cần thêm repository của HashiCorp: 
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

//Cập Nhật Và Cài Đặt Vault
sudo apt update && sudo apt install vault

// Kiểm tra phiên bản Vault đã cài đặt:
vault -v

3. Cấu Hình Vault

Thiết lập biến môi trường

Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
//Việc này giúp đảm bảo rằng bạn không sử dụng token mặc định, tránh sai sót khi khởi tạo Vault.
unset VAULT_TOKEN
//Việc này giúp đảm bảo rằng bạn không sử dụng token mặc định, tránh sai sót khi khởi tạo Vault. unset VAULT_TOKEN
//Việc này giúp đảm bảo rằng bạn không sử dụng token mặc định, tránh sai sót khi khởi tạo Vault.
unset VAULT_TOKEN

Tạo file cấu hình cho Vault

Tạo một file cấu hình config.hcl với nội dung như sau:

Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
storage "raft" {
path = "./vault/data"
node_id = "node1"
}
listener "tcp" {
address = "0.0.0.0:8200"
tls_disable = "true"
}
api_addr = "http://127.0.0.1:8200"
cluster_addr = "https://127.0.0.1:8201"
ui = true
storage "raft" { path = "./vault/data" node_id = "node1" } listener "tcp" { address = "0.0.0.0:8200" tls_disable = "true" } api_addr = "http://127.0.0.1:8200" cluster_addr = "https://127.0.0.1:8201" ui = true
storage "raft" {
  path    = "./vault/data"
  node_id = "node1"
}

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

api_addr = "http://127.0.0.1:8200"
cluster_addr = "https://127.0.0.1:8201"
ui = true
  • storage “raft”: Sử dụng backend lưu trữ RAFT, dữ liệu sẽ được lưu trong thư mục ./vault/data và định danh node là node1.
  • listener “tcp”: Vault sẽ lắng nghe kết nối trên địa chỉ 0.0.0.0:8200 với TLS bị vô hiệu hóa (phù hợp cho môi trường thử nghiệm).
  • api_addr & cluster_addr: Xác định địa chỉ API và địa chỉ cho cụm (cluster) của Vault.
  • ui: Bật giao diện web để quản trị.

Tạo thư mục lưu trữ Backend RAFT

Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
//Lệnh này đảm bảo rằng Vault có nơi để lưu trữ thông tin theo cấu hình backend RAFT.
mkdir -p ./vault/data
//Lệnh này đảm bảo rằng Vault có nơi để lưu trữ thông tin theo cấu hình backend RAFT. mkdir -p ./vault/data
//Lệnh này đảm bảo rằng Vault có nơi để lưu trữ thông tin theo cấu hình backend RAFT.
mkdir -p ./vault/data

Khởi chạy Vault Server

Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
vault server -config=config.hcl
vault server -config=config.hcl
vault server -config=config.hcl

Thiết lập địa chỉ API và Token

Ở một terminal khác, thiết lập biến môi trường cho địa chỉ API của Vault:

Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
export VAULT_ADDR='http://20.191.142.182:8200'
export VAULT_TOKEN="hvs.cF0tdh2dgR1CTpTK3vMfOVjN"
export VAULT_ADDR='http://20.191.142.182:8200' export VAULT_TOKEN="hvs.cF0tdh2dgR1CTpTK3vMfOVjN"
export VAULT_ADDR='http://20.191.142.182:8200'
export VAULT_TOKEN="hvs.cF0tdh2dgR1CTpTK3vMfOVjN"

Khởi tạo (Initialize) Vault

Quá trình khởi tạo sẽ tạo ra các unseal keys và root token. Hãy ghi lại những thông tin này vì nó sử dụng cho mở khóa và quản trị Vault.

Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
vault operator init
vault operator init
vault operator init

4. Cấu hình và quản lý quyền truy cập

Vault hỗ trợ nhiều phương thức xác thực (authentication) và quản lý quyền truy cập (policy). Dưới đây là một số ví dụ cơ bản:

4.1. Cấu hình AppRole

AppRole là phương thức xác thực cho phép máy chủ hoặc ứng dụng đăng nhập vào Vault thông qua role và secret ID.

Tạo role với các tùy chọn:

Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
vault write auth/approle/role/my-role \
token_type=batch \
secret_id_ttl=10m \
token_ttl=20m \
token_max_ttl=30m \
secret_id_num_uses=40
vault write auth/approle/role/my-role \ token_type=batch \ secret_id_ttl=10m \ token_ttl=20m \ token_max_ttl=30m \ secret_id_num_uses=40
vault write auth/approle/role/my-role \
    token_type=batch \
    secret_id_ttl=10m \
    token_ttl=20m \
    token_max_ttl=30m \
    secret_id_num_uses=40
  • token_type=batch: Chỉ định loại token sẽ được tạo ra khi đăng nhập bằng AppRole. Token loại batch thường có thời gian sống cố định và không thể gia hạn, phù hợp cho các tác vụ tự động (batch jobs) hoặc các ứng dụng cần token ngắn hạn.
  • secret_id_ttl=10m: Thời gian sống (Time To Live – TTL) của Secret ID được cấp cho AppRole. Sau 10 phút, Secret ID sẽ hết hạn và không thể sử dụng để đăng nhập nữa.
  • token_ttl=20m: Thời gian sống ban đầu của token được cấp sau khi đăng nhập thành công bằng AppRole. Token này sẽ có hiệu lực trong 20 phút kể từ thời điểm cấp.
  • token_max_ttl=30m: Thời gian sống tối đa của token, tức là dù token có thể được gia hạn hay kéo dài thêm, thời gian sống của nó sẽ không vượt quá 30 phút.
  • secret_id_num_uses=40: Xác định số lần tối đa mà một Secret ID có thể được sử dụng để đăng nhập.

Đăng nhập bằng AppRole:

Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
vault read auth/approle/login role_id="f3142fd8-63c6-4a4e-9408-3bd27fe395d6" secret_id="abc39e14-8b83-75fd-0bf0-34dc581ebf26"
vault read auth/approle/login role_id="f3142fd8-63c6-4a4e-9408-3bd27fe395d6" secret_id="abc39e14-8b83-75fd-0bf0-34dc581ebf26"
vault read auth/approle/login role_id="f3142fd8-63c6-4a4e-9408-3bd27fe395d6" secret_id="abc39e14-8b83-75fd-0bf0-34dc581ebf26"

Sử dụng CURL cho AppRole:

Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
curl --request POST \
--header "Content-Type: application/json" \
--data '{"role_id": "6b4870aa-a130-ceaf-6aee-2edc14b3820a", "secret_id": "75533fb1-fa2d-f1d1-938a-fd8cff1a1c0f"}' \
http://10.14.171.25:8200/v1/auth/approle/login
curl --request POST \ --header "Content-Type: application/json" \ --data '{"role_id": "6b4870aa-a130-ceaf-6aee-2edc14b3820a", "secret_id": "75533fb1-fa2d-f1d1-938a-fd8cff1a1c0f"}' \ http://10.14.171.25:8200/v1/auth/approle/login
curl --request POST \
--header "Content-Type: application/json" \
--data '{"role_id": "6b4870aa-a130-ceaf-6aee-2edc14b3820a", "secret_id": "75533fb1-fa2d-f1d1-938a-fd8cff1a1c0f"}' \
http://10.14.171.25:8200/v1/auth/approle/login

Đọc dữ liệu secret:

Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
curl --header "X-Vault-Token: hvs.CAESIImc3lTH-Fbih7KQP27CSJmScBsYJxID9wJNJ95Oh2OcGh4KHGh2cy5KOHhSeUdLWEJRaHZPZXRUZFpUV3JWOXk" \
--header "X-Vault-Namespace: admin" \
http://10.14.171.25:8200/v1/secret/data/myapp | jq -r ".data"
curl --header "X-Vault-Token: hvs.CAESIImc3lTH-Fbih7KQP27CSJmScBsYJxID9wJNJ95Oh2OcGh4KHGh2cy5KOHhSeUdLWEJRaHZPZXRUZFpUV3JWOXk" \ --header "X-Vault-Namespace: admin" \ http://10.14.171.25:8200/v1/secret/data/myapp | jq -r ".data"
curl --header "X-Vault-Token: hvs.CAESIImc3lTH-Fbih7KQP27CSJmScBsYJxID9wJNJ95Oh2OcGh4KHGh2cy5KOHhSeUdLWEJRaHZPZXRUZFpUV3JWOXk" \
--header "X-Vault-Namespace: admin" \
http://10.14.171.25:8200/v1/secret/data/myapp | jq -r ".data"

Kiểm tra đăng nhập AppRole với token mới:

Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
vault write auth/approle/login role_id="f3142fd8-63c6-4a4e-9408-3bd27fe395d6" secret_id="385ffc99-aeff-4c53-cf6a-4cc6d8d9b188"
vault write auth/approle/login role_id="f3142fd8-63c6-4a4e-9408-3bd27fe395d6" secret_id="385ffc99-aeff-4c53-cf6a-4cc6d8d9b188"
vault write auth/approle/login role_id="f3142fd8-63c6-4a4e-9408-3bd27fe395d6" secret_id="385ffc99-aeff-4c53-cf6a-4cc6d8d9b188"

4.2. Quản lý chính sách

Chính sách (policy) giúp bạn kiểm soát các quyền truy cập đến các đường dẫn (path) trong Vault.

Ví dụ, tạo file policy (enable_secrets.hcl) với nội dung:

Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
path "sys/mounts/*" {
capabilities = ["create", "update", "delete", "read"]
}
path "sys/mounts/*" { capabilities = ["create", "update", "delete", "read"] }
path "sys/mounts/*" {
capabilities = ["create", "update", "delete", "read"]
}

Tải policy vào Vault:

Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
vault policy write enable_secrets enable_secrets.hcl
vault policy write enable_secrets enable_secrets.hcl
vault policy write enable_secrets enable_secrets.hcl

Gán policy cho người dùng qua phương thức userpass:

Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
vault write auth/userpass/users/admin \
password="<password>" \
policies="enable_secrets"
vault write auth/userpass/users/admin \ password="<password>" \ policies="enable_secrets"
vault write auth/userpass/users/admin \
password="<password>" \
policies="enable_secrets"

Gán policy cho AppRole:

Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
vault write auth/approle/role/my-role policies="enable_secrets"
vault write auth/approle/role/my-role policies="enable_secrets"
vault write auth/approle/role/my-role policies="enable_secrets"

Nguyễn Tiến Trường

Mình viết về những điều nhỏ nhặt trong cuộc sống, Viết về câu chuyện những ngày không có em