ทำความรู้จักที่เก็บ ความลับให้ดีก่อนเอาไปเก็บ
ส่วนประกอบใน HashiCorp Vault ที่ทำหน้าที่จัดเก็บความลับ จะเรียกว่า Secret Engine … ว่ากันไปแล้ว Secret Engine ทำหน้าที่หลากหลาย ทั้งจัดเก็บ (store) , สร้าง (generate) และ เข้ารหัสลับ (encrypt data) ขึ้นอยู่กับ Secret Engine ที่เราเลือกใช้ … ใช่ครับ ! Secret Engine มีหลายตัวให้เลือกใช้ แต่ละตัวมีความสามารถ และหน้าที่ต่างกัน เช่น KV Secrets Engine ตัวนี้ น่าจะเป็นตัวที่ถูกใช้งานอยู่บ่อย เนื่องจากทำหน้าที่จัดเก็บความลับให้ และจัดเก็บในส่วนของที่เก็บข้อมูลของ Vault เองไม่ต้องเชื่อมต่อกับระบบอื่น ๆ, AWS Secrets Engine ตัวนี้ใช้ในการสร้าง AWS access credentials และ ลบให้เมื่อหมดเวลาที่กำหนดไว้ ช่วยให้เราบริหารจัดการการเข้าถึง AWS ของเราได้สะดวกขึ้น ตัวสุดท้ายที่เอ่ยถึงในบทความนี้ Transit Secrets Engine ตัวนี้ทำหน้าที่ encryption as a service ทำหน้า เข้า/ถอดรหัสลับให้, sign/verify ข้อมูล, สร้าง Hash และ สร้างสุ่มสร้างข้อมูลให้ได้ (a source of random bytes)
ในหัวข้อนี้ เราจะเริ่มต้นด้วยการจัดเก็บความลับด้วย KV Secrets Engine
#0 สมมุติฐานในเบื้องต้น
สมมุติฐานก่อนที่จะไปเรียนรู้วิธีการจัดเก็บความลับ ต้องติดตั้ง HashiCorp Vault, Unseal เรียบร้อยแล้ว และมี Root Token อยู่แล้ว ถ้ายังไม่คุ้นเคย ลองดูเรื่องนี้กันก่อนนะครับ
หัดเล่น Vault แบบขี้เกียจ ใช้ Docker ละกัน
#1 บอก Vault ว่าเราจะเก็บความลับ ไว้ที่ path myproject/
เริ่มต้นอย่างแรก เราต้องบอก Vault ก่อนว่าเราจะเก็บความลับไว้ที่ path ไหน ด้วย Secrets Engine อะไร ในกรณีนี้ เราจะเก็บความลับด้วย KV Secrets Engine version 2 ไว้ที่ path myproject/
เราข้ามเรื่องการบริหารจัดการ user กับ authorization ไปก่อนนะครับ ดังนั้นในช่วงแรก ๆ ผมจะใช้ Root token ในการทดสอบในช่วงแรก
#- login ด้วย root token
d8k-a2m2 myvault > vault login hvs.sORJ5Tcmt3GGGmesCSU9le5l
Success! You are now authenticated. The token information displayed below
is already stored in the token helper. You do NOT need to run "vault login"
again. Future Vault requests will automatically use this token.
Key Value
--- -----
token hvs.sORJ5Tcmt3GGGmesCSU9le5l
token_accessor Rd7vdiu1mqEMt7Q4m9xmlXPm
token_duration ∞
token_renewable false
token_policies ["root"]
identity_policies []
policies ["root"]
d8k-a2m2 myvault > vault secrets enable -path=myproject kv-v2
Success! Enabled the kv-v2 secrets engine at: myproject/
d8k-a2m2 myvault > vault secrets list
Path Type Accessor Description
---- ---- -------- -----------
cubbyhole/ cubbyhole cubbyhole_4f93f7c6 per-token private secret storage
identity/ identity identity_999a1a4c identity store
myproject/ kv kv_65716abe n/a
sys/ system system_eadfdcc9 system endpoints used for control, policy and debugging
#2 เก็บความลับไว้ใน path ที่ต้องการ
คำสั่ง vault kv put
เป็นคำสั่งที่ใช้ในการเก็บความลับไว้ที่ path ที่กำหนด โดยรูปแบบของการจัดการความลับใน KV Secrets Engine จะอยู่ในรูปแบบ key=vaule ตัวอย่างนี้เราจะเก็บข้อมูล access_id และ access_key ไว้ที่ myproject/project1
d8k-a2m2 myvault > vault kv put myproject/project1 access_id=user1 access_key=Diels9#IEcieIsidk
===== Secret Path =====
myproject/data/project1
======= Metadata =======
Key Value
--- -----
created_time 2023-01-17T11:40:41.992185755Z
custom_metadata <nil>
deletion_time n/a
destroyed false
version 1
#3 เรียกความลับที่เก็บไว้มาใช้งานด้วยคำสั่ง vault
command line เป็นหนึ่งในวิธีการที่จะเรียกความลับที่เก็บไว้มาใช้งาน คำสั่ง vault kv get
เป็นคำสั่งที่เรียกความลับที่เก็บไว้ที่ path ที่กำหนดมาใช้งาน
d8k-a2m2 myvault > vault kv get myproject/project1
===== Secret Path =====
myproject/data/project1
======= Metadata =======
Key Value
--- -----
created_time 2023-01-17T11:40:41.992185755Z
custom_metadata <nil>
deletion_time n/a
destroyed false
version 1
======= Data =======
Key Value
--- -----
access_id user1
access_key Diels9#IEcieIsidk
#4 เรียกความลับที่เก็บไว้มาใช้งาน
อึกวิธีที่สามารถเรียกใช้งานความลับที่เก็บไว้ก็คือเรียกใช้งานจากโปรแกรมที่เราพัฒนาตรง ๆ เลย โดยที่ HashiCorp ได้พัฒนา Client Libraries บางภาษาไว้ให้เรียกใช้งาน เช่น Go, Ruby และ มี Community พัฒนาอีกหลากหลายภาษา
d8k-a2m2 docker > go run getsecret.go
Secret access_id at myproject/project1 is user1
Secret access_key at myproject/project1 is Diels9#IEcieIsidk
ตัวอย่าง code ภาษา Go