จะสร้างผู้ใช้สิทธิ์ admin ก็ต้องรู้จัก Policy
Policy เป็นส่วนหนึ่งของ HashiCorp Vault ที่ใช้กำหนดสิทธิ์ของผู้ที่เชื่อมต่่อมายัง HashiCorp Vault ว่าสามารถเข้าถึง และทำงานได้ตามที่ร้องขอได้หรือไม่ เช่น สามารถกำหนดให้การร้องขอเพื่อจัดเก็บ, แก้ไข และเรียกดูความลับได้ หรือในบางกรณีเราอาจจะกำหนดให้การร้องขอเพื่อเรียกดูความลับได้อย่างเดียวไม่สามารถสร้างและแก้ไขข้อมูลความลับใด ๆ ได้
เนื่องจากทุกอย่างใน Vault ถูกมองโครงสร้างทุกอย่างเป็น Path การจัดการความลับก็จัดอยู่ในโครงสร้างที่เป็น Path ดังนั้นข้อกำหนดในอยู่ใน Policy ก็จะเป็นโครงสร้างว่า
path "auth/*"
{
capabilities = ["create", "read", "update", "delete", "list", "sudo"]
}
โดยปกติ ถ้าไม่มีการกำหนด policy ใด ๆ สิทธิ์ที่มีจะเป็นการ ไม่อนุญาตใน path ที่ไม่ถูกระบุใน Policy ที่ผู้ใช้ได้รับ (deny by default)
Build-in Policies ที่มีตั้งแต่ติดตั้ง HashiCorp Vault
HashiCorp Vault มี 2 policies ที่ถูกมีตั้งแต่ติดตั้ง HashiCorp Vault และไม่สามารถลบ policies ทั้ง 2 ตัวนี้ได้
- Default Policy โดยปกติ default policy เป็น policy ที่จะให้กับทุก token ทุก token ที่สร้าง แต่ก็สามารถกำหนดให้ได้ในบาง Authentication Method ว่าไม่ต้องแนบ Default Policy ไปให้ได้ โดยที่ default policy ก็จะมีสิทธิ์พื้นฐาน สามารถดูรายละเอียดของ Default Policy ด้วยคำสั่ง
vault read sys/policy/default
- Root Policy เป็น policy ที่มีสิทธิ์สูงสุดใน HashiCorp Vault ซึ่งในเบื้องต้นหลังจากที่ติดตั้ง HashiCorp Vault เสร็จ จะมี Root Token ที่ได้รับ Root Policy ถูกสร้างขึ้นมา เพื่อให้ใช้จัดบริหารจัดการกำหนดค่าต่าง ๆ ให้เรียบร้อย เพื่อให้พร้อมใช้งาน แต่ HashiCorp เองก็แนะนำให้ลบ Root Token หลังจากที่จัดการกำหนดค่าต่าง ๆ เรียบร้อย พร้อมใช้งาน
สร้าง Policy ที่มีสิทธิ์เทียบเท่า Root Policy แล้วลบ Root Token
Root Token ที่ถูกสร้างขึ้นในขึ้นตอนการติดตั้ง HashiCorp Vault มีสิทธิ์สูงสุดในระบบและ มีความเสี่ยงที่จะรั่วไหลได้ง่ายมาก ดังนั้นคำแนะนำในเบื้องต้นคือควรลบ Root Token ทิ้ง … แต่ถ้าไม่มี Root Token ก็จะไม่มีอะไรที่มี privilege สูงเพื่อบริหารจัดการระบบ และ อีกอย่างหนึ่งที่เป็นประเด็นก็คือ Auth Methods ที่ผมใช้ทดสอบคือ userpass ไม่รองรับการกำหนด Root Policy ให้กับผู้ใช้ที่ใช้ userpass Auth Method ได้
d8k-a2m2 myvault > vault write auth/userpass/users/admin password=administrator policies=root
Success! Data written to: auth/userpass/users/admin
d8k-a2m2 myvault > vault login -method=userpass username=admin password=administrator
Error authenticating: Error making API request.
URL: PUT https://127.0.0.1:8200/v1/auth/userpass/login/admin
Code: 400. Errors:
* auth methods cannot create root tokens
ทางเลือกที่ผมเลือกแก้ปัญหานี้ในขั้นตอนการทดสอบ คือผมเลือกสร้าง Policy ที่มีสิทธิ์เทียบเท่า Root Policy แล้วกำหนดให้กับผู้ใช้ ในตัวอย่างก็จะเป็นผู้ใช้ drs
… แต่ผมก็ยังค้างคาอยู่ในใจว่า มีวิธีการอื่นที่ดีกว่านี้ไหม ใครมีิวิธีการดี ๆ แนะนำได้นะครับ
เริ่มจาก login ด้วย Root Token, สร้าง myroot-policy ที่มีสิทธิ์เทียบเท่ากับ Root Policy และทดสอบ login ด้วยผู้ใช้ drs
d8k-a2m2 myvault > vault login ${TOKEN}
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.cPiG74XQgih7cKeA3QdxJVnF
token_accessor zBzOB3bbjA9elq8frVSVlvDP
token_duration ∞
token_renewable false
token_policies ["root"]
identity_policies []
policies ["root"]
d8k-a2m2 myvault >
vault policy write myroot-policy - <<EOF
path "*" {
capabilities = ["create", "read", "update", "delete", "list", "sudo"]
}
EOF
Success! Uploaded policy: myroot-policy
d8k-a2m2 myvault > vault auth enable userpass
Success! Enabled userpass auth method at: userpass/
d8k-a2m2 myvault > vault write auth/userpass/users/drs password=myroot policies=myroot-policy
Success! Data written to: auth/userpass/users/drs
d8k-a2m2 myvault > vault login -method=userpass username=drs password=myroot
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.CAESIGrDjE7iwc3BBWGG1tg-vNjp-jQwusjbChsrBIyTRTXEGh4KHGh2cy5Nd2dnTUwwU3h2WHFBalNlSUI2c253TnA
token_accessor symIQpuOwHhu1clxRtSIi5qb
token_duration 768h
token_renewable true
token_policies ["default" "myroot-policy"]
identity_policies []
policies ["default" "myroot-policy"]
ลบ Root Token
d8k-a2m2 myvault > vault token revoke $TOKEN
Success! Revoked token (if it existed)
คำถามหนึ่งที่ยังค้างคาในใจคือ มี Auth Methods ตัวไหนไหมที่สามารถกำหนด Root Policy ให้กับผู้ใช้ได้
Made by มูลค่าความสุข
Reference:
- https://developer.hashicorp.com/vault/docs/concepts/policies
- https://developer.hashicorp.com/vault/tutorials/policies/policies