หัดเล่น Vault แบบขี้เกียจ ใช้ Docker ละกัน

Vault เป็นผลิตภัณฑ์ของ HashiCorp ที่ทำหน้าที่ บริหารจัดการความลับ (Manage Secrets) และ ปกป้องข้อมูลที่อ่อนไหว

author image
drs

Technology evangelistic advocacy

Posted on 2023-01-10 08:14:30 +0700

เดี๋ยว ๆ Vault คืออะไร เอาไปทำอะไร

Vault เป็นผลิตภัณฑ์ของ HashiCorp ที่ทำหน้าที่ บริหารจัดการความลับ (Manage Secrets) และ ปกป้องข้อมูลที่อ่อนไหว (Protect Sensitive Data)

  • จัดการความลับ ความลับในที่นี้ขอตีกรอบให้แคบนิดหนึ่งนะครับ เป็นความลับที่เรากำลังจะพูดถึง เป็นความลับในเชิง IT แปลว่า จะมีบางอย่างที่มายุ่งกับความลับพวกนี้ อาจจะเป็นคน อาจจะเป็นโปรแกรม อาจจะเป็น planform ต่าง ๆ ที่ต้องการจัดการ อ่าน เขียน ใช้งาน ความลับพวกนี้ ตัวอย่างของความลับที่หยิบยกให้เป็นภาพ ก็น่าจะเป็นพวก password, API Key หรือ Secret Key ประมาณนี่้ อะไรก็ตามที่ ไม่ได้อยากให้คนทั่วไปเห็น เห็นแล้วอาจเกิดผลกระทบอะไรบางอย่างกับระบบของเรา โดยที่เราไม่อยากให้เกิดขึ้น Vault จะมาช่วยเป็นศูนย์กลางในการจัดเก็บ จัดการการเข้าถึงความลับ รวมถึงวิธีการที่จะให้ application เข้าถึงความลับ เพื่อนำไปใช้งาน
  • ให้บริการเข้าและถอดรหัสลับ ถ้าเรามีข้อมูลที่อยากรักษาให้เป็นความลับ แต่ว่ามีความจำเป็นต้องส่งไปยังปลายที่ต้องกำหนดไว้ แต่ว่าเราไม่มั่นใจเลยว่า ไม่ระหว่างการส่งจากต้นทางไปยังปลายทาง อาจจมีความเสี่ยงที่ทำให้ข้อมูลเราถูกดักอ่าน หรือถูกดักเก็บ ระหว่างทางได้ … ดังนั้นเราอาจจะแก้ไขปัญหาโดยการตกลงกับปลายทางว่าเราจะเข้ารหัสลับข้อมูลที่จะส่งออกไป แล้วให้ปลายทางถอดรหัสลับเพื่อไปใช้งาน หรือว่า จะให้จัดเก็บข้อมูลทั้ง ๆ ที่ยังถูกเข้ารหัสลับอยู่อย่างนั้น เมื่อถึงเวลาไปใช้งานค่อนนำไปถอดรหัสลับ ทำอย่างไรดี ถ้าจะคิดเร็ว ๆ software ที่ฝั่งต้นทางต้องพัฒนา function ที่ทำหน้าที่เข้ารหัสลับ ส่วนฝั่งปลายทาง ก็ต้องพัฒนา function ในการถอดรหัสลับ … ฟังดูก็ไม่น่าจะยุ่งยากอะไร แต่ถ้าลงไปดูในรายละเอียดลึก ๆ ใช้ algorithm ไหนดี จัดการ key ในการเข้ารหัสลับอย่างไรดี การส่งผ่าน key จากต้นทางไปยังปลายทาง เลือกใช้วิธีไหนดี ยังอีกอีกทางเลือกหนึ่ง Vault สามารถทำหน้าที่เป็น Encryption as a Service ให้ หากต้องการเข้าหรือถอดรหัสลับ ก็เพียงส่งข้อมูลไปยัง Vault และ Vault ก็จะทำหน้าที่นั้น ๆ ให้ได้ตามที่ต้องการ
  • บริการจัดการ Key หัวใจหลักของการจัดการเรื่องเข้ารหัสลับ คือเรื่องของ Key ซึ่งต้องเก็บรักษาไว้เป็นความลับ ต้องมีิวิธีการบริหารจัดการทั้งวงจรชีวิตของ Key อย่างที่เรียกกันว่า Key Management Lifecycle สำหรับ Vault เอง ส่วนเข้ามาเติมเต็มในส่วนของ Backup, Deployment และ Roation ได้

ทำไมต้องใช้ HashiCorp Vault ที่ทำงานบน Docker

จริง ๆ แล้วผมเรียนรู้จากการหัดติดตั้ง Vault ใน Ubuntu หัด Unseal ในหลากหลายรูปแบบ ถ้าอยู่ที่บ้าน ก็จะ provision VM ใน lab ที่บ้าน บางทีอยู่นอกบ้านก็จะไป provision บน Public Cloud พอจะกลับบ้าน ก็สั่งลบ … เอ๊ะ แล้วทำไมไม่สร้าง VM บน laptop ล่ะ … แหะ ๆ สารภาพว่า ช่วยนั้นเครื่องที่ใช้อยู่มันเก่ามาก เรี่ยวแรง CPU ที่มีอยู่มันอืดอัด ช้า ไม่ทันใจ พอทำแบบที่เล่าให้ฟังบ่อย ๆ ก็รู้สึกว่าเสียเวลา งั้นจะเขียน Ansible Playbook ดีไหม … ไม่เอาดีกว่า ขี้เกียจ มันต้องมีทางอื่นสิ … ลองไปดู Docker ดีไหม น่าจะมี สุดท้ายก็ไปเจอว่า ใช้ container technology นี่แหละ สะดวก เร็ว พกติดตัวไปใน laptop นั่งเรียนรู้ที่ไหนก็ได้

#0 เริ่มจากต้องมี Container Technology ในเครื่องก่อน

ก่อนที่จะไปในลำดับถัดไป จะต้องมี Containter Technology อยู่ที่เครื่องที่เราจะทดสอบกันก่อนนะครับ จะเป็น Docker, Podman หรือจะไป cri-o หรือ อื่น ๆ ก็ได้นะครับ แล้วแต่ถนัดเลย ผมเลือก Docker … ด้วยเหตุผลที่ว่า เวลาที่จะมาแบ่งปันให้กับคนที่กำลังอ่านอยู่ รอบรับทุก platform ทั้งใน Linux มี Docker Desktop สำหรับ macOS และ Microsoft Windows (แต่ต้องระวังเรื่องข้อจำกัดในการใช้งานในรูปแบบองค์กรด้วยนะครับ)ผมว่ามันเป็นตัวที่ทุกคนน่าจะมีติดเครื่องอยู่ตอนนี้

#1 สร้าง directory ที่จำเป็นสำหรับเก็บข้อมูลที่ไม่อยากให้หาย ตอนลบ container

directory ที่เราจะสร้างเอาไว้ข้อมูลในเบื้องต้นดังนี้

  • config สำหรับเก็บ configuration ของ Vault Server เวลาที่เราอยากปรับเปลี่ยนพฤติกรรมการทำงานของ Vault Server ก็จะปรับเปลี่ยนไฟล์ configuration ใน directory นี้
  • data สำหรับเก็บข้อมูลความลับ ที่เราต้องการเก็บไว้ใน Vault … จริง ๆ แล้ว Vault มีความสามาถในการจัดเก็บข้อมูลความลับไว้ได้หลายรูปแบบ ในเบื้องต้น เอาแบบยังไม่มี software ตัวอื่น ๆ มาเกี่ยวข้องเราจะเก็บข้อมูลความลับในรูปแบบของไฟล์ไว้ใน directory นี้
  • logs สำหรับจัดเก็บ logs ที่ Vault ได้ทำงาน หรือให้บริการไป เพื่อไว้ใช้วิเคราะห์ปัญหา ตรวจสอบการทำงาน ตรวจสอบการร้องขอข้อมูลได้
  • tls สำหรับเก็บ key pair ของ Vault Server
d8k-a2m2 myvault  > mkdir config data logs tls
d8k-a2m2 myvault  > ls
config data   logs   tls

#2 สร้าง Key Pair สำหรับ Vault

ในตัวอย่างนี้ เราจะให้รูปแบบการเข้าถึง Vault ต้องเชื่อมต่อด้วย Secure Connection ถ้าเป็น API ก็จะผ่านทาง HTTPS ดังนั้นจึงต้องการ Key Pair สำหรับ TLS - Transport Layer Security

d8k-a2m2 myvault  > cd tls

#- สร้าง Certificate Authority
d8k-a2m2 tls  > openssl genrsa -out ca.key 2048
Generating RSA private key, 2048 bit long modulus
......................................................+++++
....................................................................................................+++++
e is 65537 (0x10001)
d8k-a2m2 tls  > openssl req -new -key ca.key -subj "/CN=My CA" -out ca.csr
d8k-a2m2 tls  > openssl x509 -req -in ca.csr -signkey ca.key -out ca.crt
Signature ok
subject=/CN=My CA
Getting Private key

#- สร้าง Key Pair
d8k-a2m2 tls  > openssl genrsa -out tls.key 2048
Generating RSA private key, 2048 bit long modulus
.....................................+++++
.....................................+++++
e is 65537 (0x10001)
d8k-a2m2 tls  > openssl req -new -key tls.key -subj "/CN=myvault" -out tls.csr
d8k-a2m2 tls  > echo subjectAltName = DNS:myvault,IP:127.0.0.1 >> server1.cnf;
d8k-a2m2 tls  > echo extendedKeyUsage = serverAuth >> server1.cnf
d8k-a2m2 tls  > openssl x509 -req -in tls.csr -CAkey ca.key -CA ca.crt -out tls.crt -CAcreateserial -extfile server1.cnf
Signature ok
subject=/CN=myvault
Getting CA Private Key

#3 สร้างตัวอย่างไฟล์ Vault Configuration

ตัวอย่างไฟล์ Vault Configuration นี้ เป็นจะกำหนดให้ Vault เก็บข้อมูลไว้ที่ /vault/data, รอเปิดรับการร้องขอที่ TCP/8200 รองรับด้วย TLS กำหนด Key Pair ไว้ที่ /vault/tls และเปิดใช้งานผ่าน GUI ได้ รวมถึงขั้นตอนในการ Unseal ก็จะใช้วิธีการเป็ํนที่ค่าปกติ โดยใช้ Shamir’s Secret Sharing

d8k-a2m2 tls  > cd ..

d8k-a2m2 myvault  > cat <<EOF | tee config/vautl.hcl
storage "raft" {
  path    = "/vault/data"
  node_id = "node1"
}
listener "tcp" {
  address       = "0.0.0.0:8200"
  tls_cert_file = "/vault/tls/tls.crt"
  tls_key_file  = "/vault/tls/tls.key"
}

disable_mlock = true

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

[... truncated output ...]

#4 สร้าง container ชื่อว่า myvault จาก image vault

HashiCorp เองได้เตรียม Container Image ไว้ให้เรียบร้อยแล้วที่ Docker Hub

d8k-a2m2 myvault  > docker container run --cap-add=IPC_LOCK -d -p 127.0.0.1:8200:8200 -v $(pwd)/config:/vault/config -v $(pwd)/data:/vault/data -v $(pwd)/logs:/vault/logs  -v $(pwd)/tls:/vault/tls --rm --name  myvault vault server
9f0fd4839c1071debaf4c1e79fdc57dacb6ccad1d50ddf39d1824d04aaf87df4

d8k-a2m2 myvault  > docker container ls -l
CONTAINER ID   IMAGE     COMMAND                  CREATED          STATUS          PORTS                      NAMES
9f0fd4839c10   vault     "docker-entrypoint.s…"   53 seconds ago   Up 52 seconds   127.0.0.1:8200->8200/tcp   myvault

started vault

#5 ติดตั้ง vault เพื่อทำหน้าที่เป็น Vault Client สำหรับการทดสอบ

เครื่องที่ใช้ในการทดสอบจะเป็น macOS และติดตั้ง vaul โดยใช้ brew

d8k-a2m2 myvault  > brew tap hashicorp/tap
[... truncated output ...]
==> Tapping hashicorp/tap
Cloning into '/opt/homebrew/Library/Taps/hashicorp/homebrew-tap'...
remote: Enumerating objects: 2694, done.
[... truncated output ...]
Resolving deltas: 100% (1650/1650), done.
Tapped 2 casks and 22 formulae (57 files, 687.6KB).

d8k-a2m2 myvault  > brew install hashicorp/tap/vault
==> Fetching hashicorp/tap/vault
==> Downloading https://releases.hashicorp.com/vault/1.12.2/vault_1.12.2_darwin_arm64.zip
[... truncated output ...]
==> Summary
🍺  /opt/homebrew/Cellar/vault/1.12.2: 4 files, 201.6MB, built in 2 seconds
==> Running `brew cleanup vault`...
Disable this behaviour by setting HOMEBREW_NO_INSTALL_CLEANUP.
Hide these hints with HOMEBREW_NO_ENV_HINTS (see `man brew`).

#6 Unseal เพื่อให้ Vault พร้อมใช้งาน

d8k-a2m2 myvault  > export VAULT_ADDR=https://127.0.0.1:8200
d8k-a2m2 myvault  > export VAULT_CACERT=./tls/ca.crt

d8k-a2m2 myvault  > vault status
Key                Value
---                -----
Seal Type          shamir
Initialized        false
Sealed             true
Total Shares       0
Threshold          0
Unseal Progress    0/0
Unseal Nonce       n/a
Version            1.12.2
Build Date         2022-11-23T12:53:46Z
Storage Type       raft
HA Enabled         true

d8k-a2m2 myvault  > vault operator init
Unseal Key 1: 2Ua7jQliWdrxtY1DU985Tq+hvgjHp9IsmI4oRSTmsXNN
Unseal Key 2: praZfGw0KK2hn3C1nrw9OU4WznPFWPEwYzYHn0hwBcnV
Unseal Key 3: 4A407DadGa7zPModmmksSOnyWIiMPryhKDgn8Mr78YU1
Unseal Key 4: RUq1cRkEM9r4UbLCv7q+429emfJtCJK4Cseot+gPb+li
Unseal Key 5: HuIVmH7mXfqloIjroOFfBgIHCdAELGpzRZklbcbp+Pw/

Initial Root Token: hvs.Kawu8jKumnuIeWYBaufAmrRM

[... truncated output ...]

d8k-a2m2 myvault  > vault operator unseal 2Ua7jQliWdrxtY1DU985Tq+hvgjHp9IsmI4oRSTmsXNN
d8k-a2m2 myvault  > vault operator unseal praZfGw0KK2hn3C1nrw9OU4WznPFWPEwYzYHn0hwBcnV
d8k-a2m2 myvault  > vault operator unseal RUq1cRkEM9r4UbLCv7q+429emfJtCJK4Cseot+gPb+li

d8k-a2m2 myvault  > vault status
Key                     Value
---                     -----
Seal Type               shamir
Initialized             true
Sealed                  false
Total Shares            5
Threshold               3
Version                 1.12.2
Build Date              2022-11-23T12:53:46Z
Storage Type            raft
Cluster Name            vault-cluster-5ac2dbec
Cluster ID              d446915b-20d7-5714-44e5-20749de71217
HA Enabled              true
HA Cluster              https://127.0.0.1:8201
HA Mode                 active
Active Since            2023-01-11T04:15:07.530688928Z
Raft Committed Index    36
Raft Applied Index      36

ถึงขึ้นตอนนี้ Vault Server ก็พร้อมที่จะทดสอบความสามารถต่าง ๆ ได้

Referrence: https://www.vaultproject.io/

Made by มูลค่าความสุข

Share on

Tags

Human knowledge belongs to the world

a line from the movie "Antitrust"