HashiCorp Vault Secret Management ฉบับสมบูรณ์ 2026

HashiCorp Vault Secret Management 2026

ปัญหาที่ใหญ่ที่สุดในวงการ DevOps คือการจัดการ secrets ไม่ว่าจะเป็น database password, API keys, TLS certificates หรือ cloud credentials ทุกองค์กรมี secrets จำนวนมากที่ต้องจัดเก็บอย่างปลอดภัย แจกจ่ายให้ application ที่ถูกต้อง rotate สม่ำเสมอ และ revoke ทันทีเมื่อเกิด breach ครับ

HashiCorp Vault คือ solution ที่ออกแบบมาเพื่อแก้ปัญหานี้โดยเฉพาะ เป็นมากกว่า secrets manager ธรรมดา Vault ให้ dynamic secrets ที่สร้างใหม่ทุกครั้ง encryption as a service และ PKI certificate authority สำหรับออก TLS certificate อัตโนมัติ บทความนี้จะพาคุณติดตั้งและใช้งาน Vault ตั้งแต่เริ่มต้นจนถึง production ครับ

สารบัญ 1. ทำไมต้อง Vault 2. ติดตั้ง Vault บน Ubuntu 3. Initialize และ Unseal 4. KV Secrets Engine 5. Dynamic Secrets 6. Authentication Methods 7. Policies และ ACL 8. Encryption as a Service 9. High Availability 10. Audit Logging 11. Troubleshooting 12. FAQ 13. สรุป

1. ทำไมต้อง Vault

ลองตรวจสอบ codebase ของคุณวันนี้ มี API key hardcode ใน config file กี่ตัว มี database password อยู่ใน environment variable ที่ทุกคนเห็นกี่ตัว มี AWS access key อยู่ใน CI/CD pipeline กี่ตัว ถ้าคำตอบมากกว่าศูนย์ คุณต้องการ Vault ครับ

ปัญหาของการจัดการ secrets แบบเดิมคือ secrets กระจายอยู่ทุกที่ ใน .env files, Kubernetes secrets, CI/CD variables ไม่มี central audit log ว่าใครเข้าถึง secret อะไรเมื่อไหร่ ไม่มี automatic rotation และเมื่อเกิด breach ไม่สามารถ revoke secrets ทั้งหมดได้ทันที Vault แก้ปัญหาเหล่านี้ด้วย centralized secret management ที่มี encryption at rest, audit logging และ dynamic secrets ที่หมดอายุอัตโนมัติ เมื่อเทียบกับ AWS Secrets Manager ที่ใช้ได้เฉพาะ AWS หรือ Azure Key Vault ที่ใช้ได้เฉพาะ Azure แล้ว Vault เป็น multi-cloud solution ที่ทำงานได้ทุกที่ ไม่ว่าจะเป็น cloud หรือ on-premise ครับ

2. ติดตั้ง Vault บน Ubuntu

# เพิ่ม HashiCorp repository
wget -O- 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

sudo apt update && sudo apt install -y vault

# ตรวจสอบ version
vault version
# Vault v1.18.x
# /etc/vault.d/vault.hcl - Production config
ui = true

storage "raft" {
  path    = "/opt/vault/data"
  node_id = "vault-node-01"
}

listener "tcp" {
  address     = "0.0.0.0:8200"
  tls_disable = false
  tls_cert_file = "/opt/vault/tls/vault.crt"
  tls_key_file  = "/opt/vault/tls/vault.key"
}

api_addr     = "https://vault.example.com:8200"
cluster_addr = "https://vault.example.com:8201"

telemetry {
  prometheus_retention_time = "30s"
  disable_hostname = true
}
# สร้างโฟลเดอร์และเปิด service
sudo mkdir -p /opt/vault/data /opt/vault/tls
sudo chown -R vault:vault /opt/vault
sudo systemctl enable vault
sudo systemctl start vault

export VAULT_ADDR='https://127.0.0.1:8200'
echo 'export VAULT_ADDR="https://127.0.0.1:8200"' >> ~/.bashrc

3. Initialize และ Unseal

Vault ใช้ Shamir's Secret Sharing algorithm แบ่ง master key ออกเป็น shares ต้องใช้ shares ตามจำนวน threshold จึงจะ unseal ได้ ป้องกันไม่ให้คนเดียวเข้าถึง secrets ทั้งหมด

# Initialize - แบ่ง 5 shares, threshold 3
vault operator init -key-shares=5 -key-threshold=3
# Output: Unseal Key 1-5 + Initial Root Token
# !!! เก็บให้ปลอดภัย แจกคนละ 1 key !!!

# Unseal - ต้องใส่ 3 จาก 5 keys
vault operator unseal   # key 1
vault operator unseal   # key 2
vault operator unseal   # key 3

vault status
# Sealed: false

vault login hvs.xxxxxxxxxxxxx

สำหรับ production ไม่ควรใช้ manual unseal เพราะทุกครั้งที่ Vault restart ต้องหาคนมาใส่ key แนะนำใช้ auto-unseal กับ cloud KMS เช่น AWS KMS, Azure Key Vault หรือ GCP KMS ที่ unseal อัตโนมัติโดยไม่ต้อง human intervention ครับ

# Auto-unseal config ใน vault.hcl
seal "awskms" {
  region     = "ap-southeast-1"
  kms_key_id = "alias/vault-unseal"
}

4. KV Secrets Engine

KV (Key-Value) เป็น secrets engine พื้นฐานสำหรับเก็บ static secrets เช่น API keys, passwords มี v2 ที่มี versioning เก็บ history ทุกการเปลี่ยนแปลง

# เปิด KV v2
vault secrets enable -path=secret kv-v2

# เขียน secret
vault kv put secret/database/production \
  username="dbadmin" \
  password="Pr0dP@ss2026!" \
  host="db.internal.example.com" \
  port="5432"

# อ่าน secret
vault kv get secret/database/production
vault kv get -field=password secret/database/production

# ดู version history
vault kv metadata get secret/database/production

# Rollback
vault kv rollback -version=1 secret/database/production

5. Dynamic Secrets

Dynamic secrets คือ killer feature ของ Vault แทนที่จะเก็บ static password Vault สร้าง credentials ใหม่ทุกครั้งที่ร้องขอ มี TTL หมดอายุอัตโนมัติ revoke ได้ทันที ทุก application instance ได้ credentials เฉพาะตัว ถ้าเกิด breach revoke ได้โดยไม่กระทบ instance อื่น

# เปิด Database secrets engine
vault secrets enable database

# ตั้งค่า PostgreSQL connection
vault write database/config/production \
  plugin_name=postgresql-database-plugin \
  connection_url="postgresql://{{username}}:{{password}}@db:5432/prod?sslmode=require" \
  allowed_roles="readonly","readwrite" \
  username="vault_admin" \
  password="VaultAdminP@ss!"

# สร้าง role
vault write database/roles/readonly \
  db_name=production \
  creation_statements="CREATE ROLE \"{{name}}\" WITH LOGIN PASSWORD '{{password}}' \
    VALID UNTIL '{{expiration}}'; \
    GRANT SELECT ON ALL TABLES IN SCHEMA public TO \"{{name}}\";" \
  revocation_statements="DROP ROLE IF EXISTS \"{{name}}\";" \
  default_ttl="1h" \
  max_ttl="24h"

# ขอ dynamic credentials
vault read database/creds/readonly
# username: v-token-readonly-abc123
# password: A1b2C3d4E5f6
# lease_duration: 1h

# Revoke ทันที
vault lease revoke database/creds/readonly/abc123

ด้วย dynamic secrets ไม่มี long-lived password ที่รั่วไหลแล้วใช้ได้ตลอดกาล credentials หมดอายุอัตโนมัติตาม TTL นี่คือ zero-trust security ที่แท้จริง สำหรับ AWS ก็ใช้ dynamic secrets ได้เช่นกัน Vault สร้าง IAM credentials ชั่วคราวที่มี policy ตามที่กำหนดและหมดอายุอัตโนมัติครับ

# AWS Dynamic Secrets
vault secrets enable aws
vault write aws/config/root \
  access_key=AKIA... \
  secret_key=... \
  region=ap-southeast-1

vault write aws/roles/s3-reader \
  credential_type=iam_user \
  policy_document=-<<EOF
{"Version":"2012-10-17","Statement":[
  {"Effect":"Allow","Action":"s3:GetObject","Resource":"arn:aws:s3:::mybucket/*"}
]}
EOF

vault read aws/creds/s3-reader
# access_key, secret_key, lease_duration

6. Authentication Methods

# AppRole - สำหรับ application/automation
vault auth enable approle
vault write auth/approle/role/web-app \
  token_ttl=1h token_max_ttl=4h \
  token_policies="web-app-policy" \
  secret_id_ttl=24h

vault read auth/approle/role/web-app/role-id
vault write -f auth/approle/role/web-app/secret-id

vault write auth/approle/login role_id="xxx" secret_id="yyy"
# Kubernetes auth - สำหรับ pods
vault auth enable kubernetes
vault write auth/kubernetes/config \
  kubernetes_host="https://kubernetes.default.svc"

vault write auth/kubernetes/role/web-app \
  bound_service_account_names=web-app \
  bound_service_account_namespaces=production \
  policies=web-app-policy ttl=1h
# LDAP - สำหรับ human users
vault auth enable ldap
vault write auth/ldap/config \
  url="ldaps://ldap.example.com:636" \
  userattr="sAMAccountName" \
  userdn="OU=Users,DC=example,DC=com" \
  groupdn="OU=Groups,DC=example,DC=com"

vault write auth/ldap/groups/devops policies=devops-policy

ใช้ AppRole สำหรับ application, Kubernetes auth สำหรับ pods, LDAP/OIDC สำหรับ human users อย่าใช้ root token ในชีวิตประจำวัน สร้าง admin policy แยก ส่วน root token ให้เก็บไว้กรณีฉุกเฉินเท่านั้นครับ

7. Policies และ ACL

# web-app-policy.hcl
path "secret/data/web-app/*" {
  capabilities = ["read", "list"]
}
path "database/creds/readonly" {
  capabilities = ["read"]
}
path "auth/token/renew-self" {
  capabilities = ["update"]
}

# devops-policy.hcl
path "secret/*" {
  capabilities = ["create","read","update","delete","list"]
}
path "database/*" {
  capabilities = ["create","read","update","delete","list"]
}
path "sys/audit" {
  capabilities = ["read", "list"]
}
vault policy write web-app-policy web-app-policy.hcl
vault policy write devops-policy devops-policy.hcl
vault policy list

Policy ของ Vault ใช้หลัก deny-by-default ทุก path ที่ไม่ได้ระบุใน policy จะถูก deny อัตโนมัติ ให้สิทธิ์เท่าที่จำเป็น web app อ่านได้เฉพาะ secrets ของตัวเอง devops จัดการได้ทั้งหมดแต่ดู audit log ได้อย่างเดียว เป็น principle of least privilege ที่ enforce ได้จริงครับ

8. Encryption as a Service (Transit Engine)

Transit engine ให้ application encrypt/decrypt data โดยไม่ต้องจัดการ encryption key เอง ส่ง plaintext มา Vault encrypt ให้แล้วส่ง ciphertext กลับ key ไม่เคยออกจาก Vault เลย ปลอดภัยกว่าการเก็บ encryption key ไว้ใน application code มากครับ

# เปิด Transit engine
vault secrets enable transit

# สร้าง encryption key
vault write -f transit/keys/payment-data
vault write -f transit/keys/user-pii

# Encrypt data
vault write transit/encrypt/payment-data \
  plaintext=$(echo -n "4111111111111111" | base64)
# ciphertext: vault:v1:abc123encrypted...

# Decrypt data
vault write transit/decrypt/payment-data \
  ciphertext="vault:v1:abc123encrypted..."
# plaintext: (base64 encoded)

# Rotate encryption key
vault write -f transit/keys/payment-data/rotate

# Re-encrypt data ด้วย key ใหม่
vault write transit/rewrap/payment-data \
  ciphertext="vault:v1:abc123encrypted..."
# ciphertext: vault:v2:def456newencrypted...

Key rotation เป็นเรื่องสำคัญที่หลายองค์กรละเลย Transit engine ทำให้ rotate key ง่ายมาก แค่สั่ง rotate แล้ว rewrap ciphertext เก่า Application ไม่ต้องเปลี่ยน code เลย Vault จะ decrypt ด้วย key version ที่ถูกต้องอัตโนมัติ ผ่าน compliance audit ง่ายเพราะมี key version tracking ครบถ้วนครับ

9. High Availability

Vault production ต้องมี HA เพื่อป้องกัน downtime Raft integrated storage รองรับ HA ในตัว ไม่ต้องติดตั้ง Consul เพิ่ม ขั้นต่ำ 3 node สำหรับ quorum

# Node 2 - /etc/vault.d/vault.hcl
storage "raft" {
  path    = "/opt/vault/data"
  node_id = "vault-node-02"
  retry_join {
    leader_api_addr = "https://vault-01.example.com:8200"
  }
}
listener "tcp" {
  address     = "0.0.0.0:8200"
  tls_cert_file = "/opt/vault/tls/vault.crt"
  tls_key_file  = "/opt/vault/tls/vault.key"
}
api_addr     = "https://vault-02.example.com:8200"
cluster_addr = "https://vault-02.example.com:8201"

# Node 3 - เหมือนกัน เปลี่ยน node_id และ api_addr
# ตรวจสอบ Raft cluster
vault operator raft list-peers
# Node          Address                  State     Voter
# vault-node-01 vault-01:8201            leader    true
# vault-node-02 vault-02:8201            follower  true
# vault-node-03 vault-03:8201            follower  true

# Snapshot สำหรับ backup
vault operator raft snapshot save backup.snap
vault operator raft snapshot restore backup.snap

Raft consensus ต้องมี majority ของ node ทำงาน ถ้ามี 3 node ล่มได้ 1 ถ้ามี 5 node ล่มได้ 2 ใส่ load balancer หน้า Vault cluster route traffic ไป active node อัตโนมัติ standby node จะ forward request ไป active node ให้ครับ ทำ snapshot backup ทุกวันเพื่อ disaster recovery

10. Audit Logging

Audit log เป็น feature ที่สำคัญมากสำหรับ compliance ทุก request ที่เข้า Vault จะถูก log ทั้ง request และ response รวมถึง authentication method, policy ที่ใช้ และ path ที่เข้าถึง

# เปิด audit device
vault audit enable file file_path=/var/log/vault/audit.log

# เปิด syslog audit
vault audit enable syslog tag="vault" facility="AUTH"

# ดู audit devices ที่เปิดอยู่
vault audit list

# ตัวอย่าง audit log entry
# {
#   "type": "request"
#   "auth": {"token": "hmac-sha256:...", "policies": ["web-app-policy"]}
#   "request": {
#     "path": "secret/data/web-app/config"
#     "operation": "read"
#     "remote_address": "10.0.1.50"
#   }
# }

Vault hash sensitive data ใน audit log ด้วย HMAC-SHA256 โดย default ทำให้ audit log ไม่มี plaintext secrets แต่ยัง correlate ได้ว่า request ไหนเข้าถึง secret เดียวกัน ส่ง audit log ไป SIEM เช่น Elasticsearch, Splunk หรือ Datadog เพื่อ alert เมื่อเกิด suspicious access pattern ครับ

11. Troubleshooting

Vault sealed หลัง restart

นี่คือ behavior ปกติ Vault seal ตัวเองเมื่อ restart เพื่อความปลอดภัย ต้อง unseal ใหม่ทุกครั้ง ถ้าไม่ต้องการ manual unseal ให้ใช้ auto-unseal กับ cloud KMS ซึ่งจะ unseal อัตโนมัติเมื่อ service start ครับ

Permission denied error

ตรวจสอบ policy ของ token ที่ใช้ด้วย vault token lookup ดูว่ามี policy ที่ให้สิทธิ์เข้าถึง path ที่ต้องการหรือไม่ Vault ใช้ deny-by-default ทุก path ที่ไม่ได้ระบุจะถูก deny Policy ต้อง match ทั้ง path และ capabilities ครับ

Dynamic credentials ไม่ถูกสร้าง

ตรวจสอบ connection ระหว่าง Vault กับ database ด้วย vault write database/config/production ดู error message ตรวจ firewall ว่าเปิด port database แล้ว ตรวจ username/password ของ vault_admin ว่ามีสิทธิ์ CREATE ROLE บน database ครับ

Raft cluster ไม่ converge

ตรวจสอบว่า node สื่อสารกันได้ผ่าน port 8201 (cluster port) ดู Raft peer list ด้วย vault operator raft list-peers ถ้า node หายไปให้ remove แล้ว re-join ใช้ vault operator raft remove-peer ตามด้วย retry_join ครับ

12. FAQ

Vault กับ AWS Secrets Manager ต่างกันอย่างไร?

AWS Secrets Manager ใช้ได้เฉพาะ AWS ecosystem เป็น managed service setup ง่าย ส่วน Vault เป็น multi-cloud รองรับ AWS, Azure, GCP, on-premise ทั้งหมด มี feature เพิ่มเช่น dynamic secrets, encryption as a service, PKI management ที่ Secrets Manager ไม่มี ถ้าใช้ AWS อย่างเดียว Secrets Manager อาจเพียงพอ แต่ถ้า multi-cloud หรือต้องการ feature ขั้นสูง Vault ดีกว่าครับ

Vault ฟรีหรือเปล่า?

Vault Community Edition เป็น open source ใช้ฟรีภายใต้ BSL license เหมาะสำหรับ self-hosted ส่วน HCP Vault เป็น managed service มี free tier สำหรับทดลอง Vault Enterprise มี license fee สำหรับ feature เช่น namespaces, replication, HSM support สำหรับทีมส่วนใหญ่ Community Edition เพียงพอครับ

Dynamic secrets คืออะไร?

Dynamic secrets คือ credentials ที่ Vault สร้างแบบ on-demand เมื่อ application ร้องขอ เช่น database username/password ที่สร้างใหม่ทุกครั้ง มี TTL หมดอายุอัตโนมัติ revoke ได้ทันที ปลอดภัยกว่า static credentials เพราะไม่มี long-lived password ที่รั่วไหลแล้วใช้ได้ตลอดกาลครับ

Vault unseal คืออะไร?

เมื่อ Vault เริ่มทำงาน data ถูก encrypt ทั้งหมด ต้อง unseal ด้วย master key shares ตาม Shamir Secret Sharing ต้องใช้ shares ตามจำนวน threshold เช่น 3 จาก 5 จึงจะ unseal ได้ สำหรับ production แนะนำ auto-unseal กับ cloud KMS เช่น AWS KMS ที่ unseal อัตโนมัติครับ

Vault เก็บ secrets ที่ไหน?

Vault รองรับหลาย storage backend เช่น Raft integrated storage ที่ setup ง่ายรองรับ HA ในตัว, Consul สำหรับ HA, S3 สำหรับ durability สูง สำหรับ production แนะนำ Raft เพราะไม่ต้องติดตั้ง dependency เพิ่มและรองรับ HA ด้วย 3-5 node ครับ

สรุป

HashiCorp Vault เปลี่ยนวิธีจัดการ secrets ขององค์กรอย่างสิ้นเชิง จากการ hardcode password ใน config file มาเป็น centralized secret management ที่มี encryption at rest, audit logging, dynamic secrets และ automatic rotation ด้วย KV engine สำหรับ static secrets, Database engine สำหรับ dynamic credentials, Transit engine สำหรับ encryption as a service และ Auth methods หลากหลาย Vault ครอบคลุมทุกความต้องการด้าน secret management ครับ

เริ่มจากติดตั้ง single node ใช้ KV engine เก็บ secrets ที่ hardcode อยู่ใน code จากนั้นค่อยเพิ่ม dynamic secrets, auth methods และ HA เมื่อทีมพร้อม ลงทุนเวลาเรียนรู้ Vault จะคืนทุนทันทีที่คุณไม่ต้อง rotate password ด้วยมืออีกต่อไป และมี audit trail ครบถ้วนสำหรับ compliance ครับ