เดี๋ยว ๆ 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
#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/