จัดเก็บความลับ ในกล่องแห่งความลับ (HashiCorp Vault)

ว่ากันไปแล้ว Secret Engine ทำหน้าที่หลากหลาย ทั้งจัดเก็บ (store) , สร้าง  (generate) และ เข้ารหัสลับ (encrypt data) ขึ้นอยู่กับ Secret Engine ที่เราเลือกใช้

author image
drs

Technology evangelistic advocacy

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

ทำความรู้จักที่เก็บ ความลับให้ดีก่อนเอาไปเก็บ

ส่วนประกอบใน 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 พัฒนาอีกหลากหลายภาษา

More Client Libraries Info

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

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

Share on

Tags

Human knowledge belongs to the world

a line from the movie "Antitrust"