ai

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

วิดีโอประกอบการเรียนรู้ | YouTube @icafefx

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

1. ทำไมต้อง Vault

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

ลองตรวจสอบ 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

เนื้อหาเกี่ยวข้อง — ทำความเข้าใจ ClickHouse Analytics Micro-segmentation


# 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 ตามที่กำหนดและหมดอายุอัตโนมัติครับ

แนะนำเพิ่มเติม — ดูสัญญาณเทรดที่ XM Signal


# 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 มากครับ

เนื้อหาเกี่ยวข้อง — อ่านต่อ: Narrow AI คืออะไร — วิธีตั้งค่าและใช้งานจริงพร้อมตัวอย่าง


# เปิด 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

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

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

แนะนำเพิ่มเติม — SiamCafeBook

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

เนื้อหาเกี่ยวข้อง — บทความที่เกี่ยวข้อง: VXLAN Overlay Domain Driven Design DDD — คู่มือฉบับสมบูรณ์ 2026

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

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 อัตโนมัติครับ

เนื้อหาเกี่ยวข้อง — ตราสารหนี้คืออะไร — ข้อมูลครบถ้วน 2026

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

XM Legend · เทรดเดอร์ & ผู้สอน Forex 13 ปี

ผู้ก่อตั้ง SiamCafe ตั้งแต่ปี 1997 · เทรดเดอร์สาย Forex มากกว่า 13 ปี ได้รับการยกย่องเป็น XM Legend · แบ่งปันความรู้ Forex, ไอที, AI และการเทรด จากประสบการณ์จริงในตลาดจริง