ติดตั้ง HashiCorp Vault จัดการ Secrets บน VPS

ติดตั้ง HashiCorp Vault จัดการ Secrets บน VPS

มิถุนายน 2026 · อ่าน 8 นาที

HashiCorp Vault เป็นเครื่องมือระดับ enterprise สำหรับจัดการ secrets โดยสามารถเก็บ API keys, passwords, certificates, และข้อมูลลับอื่น ๆ อย่างปลอดภัย บทความนี้จะแนะนำวิธีติดตั้ง Vault บน VPS ตั้ง policies access control และสร้าง dynamic secrets สำหรับ Docker และ applications ต่าง ๆ

ความเข้าใจพื้นฐานเกี่ยวกับ Vault

HashiCorp Vault เป็นระบบจัดการเข็บความลับแบบ centralized ที่ใช้ encryption ในการปกป้องข้อมูล คุณลักษณะหลักของ Vault ได้แก่:

Vault ใช้ model ที่เรียกว่า "Unsealing" เมื่อเริ่มต้นเซิร์ฟเวอร์ต้องอนุมัติการเข้าถึง root key โดยใช้ Shamir's Secret Sharing algorithm เพื่อป้องกัน single point of failure

ความต้องการของระบบและการเตรียมการ

ก่อนเริ่มติดตั้ง Vault ให้ตรวจสอบความต้องการต่อไปนี้:

ตรวจสอบเวอร์ชัน kernel และ permissions:

uname -a
sudo -l
whoami

ดาวน์โหลดและติดตั้ง HashiCorp Vault

ขั้นแรกให้ติดตั้ง Vault บน VPS โดยทำตามขั้นตอนต่อไปนี้:

cd /tmp
wget https://releases.hashicorp.com/vault/1.15.0/vault_1.15.0_linux_amd64.zip
unzip vault_1.15.0_linux_amd64.zip
sudo mv vault /usr/local/bin/
rm vault_1.15.0_linux_amd64.zip

ตรวจสอบการติดตั้ง:

vault version

ผลลัพธ์ที่คาดหวัง:

Vault v1.15.0 (7cd4637e5f7e4d1d6f7e8c9b0a1b2c3d)

สร้าง user สำหรับ Vault:

sudo useradd --system --home /var/lib/vault --shell /bin/false vault
sudo mkdir -p /var/lib/vault /etc/vault
sudo chown vault:vault /var/lib/vault /etc/vault
sudo chmod 700 /var/lib/vault /etc/vault

ตั้งค่า Vault Configuration

สร้างไฟล์ configuration สำหรับ Vault:

sudo nano /etc/vault/vault.hcl

เพิ่มเนื้อหาต่อไปนี้:

ui = true

storage "file" {
  path = "/var/lib/vault/data"
}

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

api_addr      = "https://127.0.0.1:8200"
cluster_addr  = "https://127.0.0.1:8201"
ui            = true

หมายเหตุ: สำหรับการพัฒนาเบื้องต้น คุณสามารถตั้ง tls_disable = 1 เพื่อปิด TLS ชั่วคราว แต่อย่าใช้ในสภาพแวดล้อม production

สร้าง TLS Certificates และเริ่มต้น Vault

สร้าง TLS certificates สำหรับ Vault:

sudo mkdir -p /etc/vault/tls
cd /etc/vault/tls

# สร้าง private key
sudo openssl genrsa -out tls.key 2048

# สร้าง self-signed certificate
sudo openssl req -new -x509 -key tls.key -out tls.crt -days 365 \
  -subj "/CN=127.0.0.1/O=Vault/C=TH"

sudo chown vault:vault tls.key tls.crt
sudo chmod 600 tls.key tls.crt

สร้าง systemd service file:

sudo nano /etc/systemd/system/vault.service

เพิ่มเนื้อหาต่อไปนี้:

[Unit]
Description=HashiCorp Vault
Documentation=https://www.vaultproject.io/docs/
Requires=network-online.target
After=network-online.target
ConditionFileNotEmpty=/etc/vault/vault.hcl

[Service]
Type=notify
ProtectSystem=full
ProtectHome=yes
NoNewPrivileges=yes
PrivateTmp=yes
PrivateDevices=yes
SecureBits=keep-caps
AmbientCapabilities=CAP_IPC_LOCK
CapabilityBoundingSet=CAP_SYSLOG CAP_IPC_LOCK
LimitNOFILE=65536
LimitNPROC=512
KillMode=process
Restart=on-failure
RestartSec=5
TimeoutStopSec=30
LimitMEMLOCK=infinity
ExecStart=/usr/local/bin/vault server -config=/etc/vault/vault.hcl
ExecReload=/bin/kill -HUP $MAINPID
StandardOutput=journal
StandardError=journal
SyslogIdentifier=vault
User=vault
Group=vault

[Install]
WantedBy=multi-user.target

เรียกใช้ Vault:

sudo systemctl daemon-reload
sudo systemctl enable vault
sudo systemctl start vault
sudo systemctl status vault

Initialize และ Unseal Vault

เมื่อ Vault เริ่มต้นจะอยู่ในสถานะ sealed ต้อง initialize โดยสร้าง root token และ unseal keys:

export VAULT_ADDR='https://127.0.0.1:8200'
export VAULT_SKIP_VERIFY=true
vault operator init -key-shares=5 -key-threshold=3

ผลลัพธ์จะแสดง unseal keys และ root token ตัวอย่าง:

Unseal Key 1: 7ZzX9K2mQ4R5T8vU1W2X3Y4Z5A6B7C8D
Unseal Key 2: 9E0F1G2H3I4J5K6L7M8N9O0P1Q2R3S4T
Unseal Key 3: 5U6V7W8X9Y0Z1A2B3C4D5E6F7G8H9I0J
Unseal Key 4: 1K2L3M4N5O6P7Q8R9S0T1U2V3W4X5Y6Z
Unseal Key 5: 7A8B9C0D1E2F3G4H5I6J7K8L9M0N1O2P

Initial Root Token: s.7Q8R9S0T1U2V3W4X5Y6Z7A8B9C0D1E2F

สำคัญ: บันทึก unseal keys และ root token ในที่ปลอดภัย ไม่ควรบันทึกไว้ในเซิร์ฟเวอร์ หลังจาก initialize ต้องสร้าง policy แล้วปิดการใช้ root token

ปลด seal โดยใช้ unseal keys (ต้องใช้ 3 keys ในตัวอย่างนี้):

vault operator unseal 7ZzX9K2mQ4R5T8vU1W2X3Y4Z5A6B7C8D
vault operator unseal 9E0F1G2H3I4J5K6L7M8N9O0P1Q2R3S4T
vault operator unseal 5U6V7W8X9Y0Z1A2B3C4D5E6F7G8H9I0J

ตรวจสอบสถานะ Vault:

vault status

ผลลัพธ์ที่คาดหวัง:

Key                Value
---                -----
Seal Type          shamir
Initialized        true
Sealed             false
Total Shares       5
Threshold          3
Version            1.15.0
Storage Type       file
Cluster Name       vault-cluster-1
Cluster ID         8f4c5d3e-2b1a-4c3d-9e0f-1a2b3c4d5e6f

ตั้งค่า Policies และ Access Control

Vault ใช้ policies ในการควบคุมสิทธิ์การเข้าถึง สร้าง policy สำหรับ app user:

vault login s.7Q8R9S0T1U2V3W4X5Y6Z7A8B9C0D1E2F

สร้างไฟล์ policy:

cat > /tmp/app-policy.hcl << 'EOF'
# ให้สิทธิ์อ่าน secrets ที่ path secret/data/app/*
path "secret/data/app/*" {
  capabilities = ["read", "list"]
}

# ให้สิทธิ์อ่าน secret metadata
path "secret/metadata/app/*" {
  capabilities = ["read", "list"]
}

# ห้ามลบ secret
path "secret/*" {
  capabilities = ["deny"]
}

# อ่านข้อมูล auth method
path "auth/token/lookup-self" {
  capabilities = ["read"]
}

# Renew token
path "auth/token/renew-self" {
  capabilities = ["update"]
}
EOF

เพิ่ม policy ใน Vault:

vault policy write app-policy /tmp/app-policy.hcl

สร้าง AppRole auth method สำหรับ applications:

vault auth enable approle

vault write auth/approle/role/app-role \
  token_ttl=1h \
  token_max_ttl=4h \
  policies="app-policy"

vault read auth/approle/role/app-role/role-id

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

สร้าง Secrets และ Dynamic Secrets

สร้าง static secrets สำหรับ application:

vault kv put secret/app/database \
  username="dbuser" \
  password="SecurePassword123!" \
  host="db.example.com"

vault kv put secret/app/stripe \
  api_key="sk_live_4eC39HqLyjWDarhtT1ZdV7hG"

vault kv put secret/app/jwt \
  secret="your-jwt-secret-key-here"

อ่าน secrets:

vault kv get secret/app/database
vault kv get -field=password secret/app/database

สำหรับ dynamic secrets ต้องเชื่อมต่อกับ database backend:

vault auth list
vault secrets list

ตรวจสอบว่า Vault ทำงานถูกต้อง

ตรวจสอบสถานะและการทำงานของ Vault:

# ตรวจสอบสถานะ Vault
vault status

# ตรวจสอบสถานะ service
sudo systemctl status vault

# ดูข้อมูลเชื่อมต่อ
curl -k https://127.0.0.1:8200/v1/sys/health

# ตรวจสอบ seal status
vault status | grep "Sealed"

# อ่าน secret ที่สร้าง
vault kv get secret/app/database

# ดูรายชื่อ secrets
vault kv list secret/app/

เคล็ดลับ: ใช้ VAULT_SKIP_VERIFY=true สำหรับ self-signed certificates ในสภาพแวดล้อมพัฒนา


แก้ปัญหาที่พบบ่อย

Error: "permission denied" เมื่อเริ่มต้น Vault

ปัญหานี้เกิดจากการตั้งค่า permissions ไม่ถูกต้องสำหรับ vault directory:

# แก้ไข
sudo chown -R vault:vault /var/lib/vault
sudo chown -R vault:vault /etc/vault
sudo chmod 700 /var/lib/vault
sudo chmod 700 /etc/vault

# ตรวจสอบ
ls -la /var/lib/vault
ls -la /etc/vault

# เริ่มต้น service ใหม่
sudo systemctl restart vault

Error: "failed to acquire lock" when starting Vault

เกิดจากมี Vault process อื่นทำงานอยู่หรือ lock file ติดอยู่:

# ตรวจสอบ process Vault ที่ทำงาน
ps aux | grep vault

# หากมี process เก่า ให้ kill มัน
sudo pkill -f 'vault server'

# ลบ lock file
sudo rm -f /var/lib/vault/data/.vault.lock

# เริ่มต้นใหม่
sudo systemctl start vault

Error: "x509: certificate signed by unknown authority"

เกิดจาก TLS certificate ไม่ถูกต้อง:

# ตั้ง skip verify ชั่วคราว
export VAULT_SKIP_VERIFY=true

# หรือสร้าง certificate ใหม่
cd /etc/vault/tls
sudo rm -f tls.key tls.crt
sudo openssl genrsa -out tls.key 2048
sudo openssl req -new -x509 -key tls.key -out tls.crt -days 365 \
  -subj "/CN=127.0.0.1/O=Vault/C=TH"

sudo chown vault:vault tls.key tls.crt
sudo chmod 600 tls.key tls.crt

sudo systemctl restart vault

Error: "unseal key invalid" หรือ "could not verify seal"

ปัญหาเกิดจากการใช้ unseal key ที่ผิดหรือ data storage เสียหาย:

# ตรวจสอบสถานะ storage
ls -la /var/lib/vault/data/

# ลองใช้ unseal key ที่ถูกต้องจากการ init
vault operator unseal [CORRECT_UNSEAL_KEY]

# ตรวจสอบว่า sealed หรือไม่
vault status

# หากยังคงมีปัญหา อาจต้อง migrate storage
vault operator migrate

คำถามที่พบบ่อย

ค่าใช้จ่ายของ HashiCorp Vault คือเท่าไร

HashiCorp Vault มี Community Edition ฟรี (open source) และ Enterprise Edition ซึ่งมีค่าใช้จ่าย Community Edition รองรับ features ทั้งหมดของ secrets management แต่ไม่มี enterprise support ฟีเจอร์เพิ่มเติมของ Enterprise Edition เช่น advanced audit logging, replication, dan performance tuning ห้องอพ 29VPS ทั่วไปสามารถใช้ Community Edition ได้

ปลด seal (Unseal) ต้องทำทุกครั้งหลังเซิร์ฟเวอร์รีบูต หรือ

ใช่ Vault ไม่เก็บ unseal key อยู่ในไฟล์ storage ดังนั้นเมื่อ service restart ต้องปลด seal ด้วยตนเอง สำหรับ production environment คุณสามารถใช้ "Auto-Unseal" feature ที่ใช้ key management service เช่น AWS KMS หรือ HSM (Hardware Security Module) เพื่ออนุมัติการปลด seal โดยอัตโนมัติ

วิธีรักษาความปลอดภัย unseal keys และ root token

Unseal keys และ root token เป็นข้อมูลที่สำคัญที่สุดของ Vault ควรเก็บไว้ในสถานที่ปลอดภัย เช่น offline storage encrypted USB drive vault management system หรือ password manager ไม่ควรเก็บไว้ในเซิร์ฟเวอร์ หรือไฟล์ข้อความ หลังจาก initialize ควรสร้าง policy ใหม่และใช้ application tokens แทน root token สำหรับการทำงานปกติ