Tóm tắt: Bật secrets engine KV v2 (vault secrets enable -path=secret kv-v2), ghi/đọc bằng vault kv put/get -mount=secret. Viết policy HCL cấp quyền theo path (với KV v2 path API có data/ và metadata/). Automation đăng nhập bằng AppRole (role_id + secret_id) để nhận token ngắn hạn gắn policy. So sánh Vault với SOPS/ansible-vault xem Quản lý secret. Lệnh dưới cũng chạy với OpenBao (thay vault bằng bao).
Luồng hoạt động
flowchart LR A["Ansible / CI"] -->|"role_id + secret_id"| B["auth/approle/login"] B -->|"token (TTL 1h, policy netops-ro)"| A A -->|"GET secret/data/netops/router"| C["KV v2"] C --> D{"Policy cho phép?"} D -->|có| E["Trả secret"] D -->|không| F["403 permission denied"]
Lệnh
Kết nối
export VAULT_ADDR=https://vault.example.com:8200
export VAULT_CACERT=/etc/ssl/certs/internal-ca.pem # CA nội bộ ký cert của Vault
vault status # Sealed: false là OK
vault login -method=oidc # hoặc -method=userpass username=alice
vault token lookup # policy, TTL của token hiện tạiLab nhanh: vault server -dev (in-memory, tự unseal, root token in ra màn hình). Chỉ dùng để thử lệnh, không lưu dữ liệu thật.
KV v2
vault secrets enable -path=secret kv-v2
vault secrets list -detailed # cột Options có version:2
# Ghi: "-" đọc giá trị từ stdin, tránh lộ trong history/ps
printf '%s' "$ROUTER_PASS" | vault kv put -mount=secret netops/router username=automation password=-
vault kv get -mount=secret netops/router
vault kv get -mount=secret -field=password netops/router
vault kv get -mount=secret -format=json netops/router | jq .data.data
vault kv patch -mount=secret netops/router enable_secret=- # sửa 1 key, giữ key khác
vault kv list -mount=secret netops| Mục đích | Lệnh |
|---|---|
| Xem lịch sử version | vault kv metadata get -mount=secret netops/router |
| Đọc version cũ | vault kv get -mount=secret -version=2 netops/router |
| Quay về version cũ (tạo version mới) | vault kv rollback -mount=secret -version=2 netops/router |
| Xoá mềm version mới nhất / khôi phục | vault kv delete ... / vault kv undelete -versions=3 ... |
| Xoá vĩnh viễn một version | vault kv destroy -mount=secret -versions=3 netops/router |
| Xoá toàn bộ secret và lịch sử | vault kv metadata delete -mount=secret netops/router |
| Giới hạn số version giữ lại | vault kv metadata put -mount=secret -max-versions=10 netops/router |
Policy
KV v2 dùng path API secret/data/... (đọc/ghi) và secret/metadata/... (list, lịch sử). CLI vault kv tự thêm data/, policy thì phải viết rõ.
path "secret/data/netops/*" {
capabilities = ["read"]
}
path "secret/metadata/netops/*" {
capabilities = ["list"]
}vault policy write netops-ro netops-ro.hcl
vault policy read netops-ro
vault token capabilities secret/data/netops/router # kiểm tra token hiện tại có quyền gìAppRole cho automation
vault auth enable approle
vault write auth/approle/role/ansible \
token_policies=netops-ro token_ttl=1h token_max_ttl=4h \
secret_id_ttl=24h secret_id_num_uses=0 token_bound_cidrs=198.51.100.0/24
vault read -field=role_id auth/approle/role/ansible/role-id # ít nhạy cảm, có thể để trong config
vault write -f -field=secret_id auth/approle/role/ansible/secret-id # nhạy cảm, giao qua CI secret
# Phía automation
export VAULT_TOKEN=$(vault write -field=token auth/approle/login \
role_id="$VAULT_ROLE_ID" secret_id="$VAULT_SECRET_ID")
vault kv get -mount=secret -field=password netops/routerTrong Ansible, collection community.hashi_vault đọc trực tiếp (lookup community.hashi_vault.vault_kv2_get, auth approle hoặc token), không cần ghi secret ra file.
Lỗi thường gặp
| Triệu chứng | Nguyên nhân | Cách xử lý |
|---|---|---|
403 permission denied dù policy có secret/netops/* |
KV v2 cần secret/data/netops/* |
Sửa path trong policy; thử vault token capabilities <path> |
vault kv list bị từ chối nhưng get được |
Thiếu list trên secret/metadata/... |
Thêm block metadata |
Vault is sealed (503) |
Vault restart, chưa unseal | vault operator unseal (đủ số key share) hoặc cấu hình auto-unseal |
x509: certificate signed by unknown authority |
Client không tin CA của Vault | Đặt VAULT_CACERT; không dùng VAULT_SKIP_VERIFY ngoài lab |
no handler for route "secret/..." |
Mount chưa bật hoặc sai tên mount | vault secrets list |
| Token automation hết hạn giữa chừng | token_ttl ngắn hơn thời gian job |
Tăng token_ttl/token_max_ttl vừa đủ, hoặc renew |
invalid secret id |
secret_id hết hạn/hết lượt dùng |
Cấp secret_id mới; xem secret_id_ttl, secret_id_num_uses |