ตอนที่เขียนเรื่อง สร้างผู้ใช้สิทธิ์ admin ใน HashiCorp Vault หนึ่งในประเด็นที่ยังค้างคาในสมองก็คือ เรื่องของ Root Token
Root Token คืออะไรกันแน่
Root Token คือ token ที่ถูกสร้างขึ้นมาแล้วได้รับ Root Policy มาด้วย … ความพิเศษของ Root Token คือทำอะไรได้ทุกอย่าง และไม่มีวันหมดอายุ (แต่ก็กำหนดให้อายุได้ตอนสร้าง root token อีกตัว) ไม่จำเป็นต้อง renew
สร้าง Root Token
Root Token ทำอะไรได้ทุกอย่างในระบบ การสร้าง Root Token จึงมีเงื่อนไขที่ค่อนข้างจำกัดที่จะสร้าง Root Token ได้ การสร้าง Root Token จึงมีข้อจำกัดและเงื่อนไข การสร้าง Root Token มีเพียง 3 วิธีเท่านั้นที่จะสร้างได้ดังนี้
-
ถูกสร้างขึ้นหลังจากติดตั้ง HashiCorp Vault เสร็จเรียบร้อย และเรียกคำสั่ง
vault operator init
d8k-a2m2 myvault > vault operator init | grep "Initial Root Token" Initial Root Token: hvs.XCuoj4wu0syhudLnF8kZzoq2
-
ถูกสร้างจากผู้ใช้ที่ login ด้วย Root Token เรียกใช้คำสั่งสร้าง token เพื่อใช้งาน
vault token create
ก็จะได้ Root Token ที่ไม่มีวันหมดอายุด้วย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.1Mosjq60x8FQ4RmyClrmmDpD token_accessor PvjSP0pdQcoLfGJRDwzyO0XJ token_duration ∞ token_renewable false token_policies ["root"] identity_policies [] policies ["root"] d8k-a2m2 myvault > vault token create Key Value --- ----- token hvs.8v4rICnIB8lfeeqaHmrj0xQA token_accessor JgmpKCr2cik1vVIrvylTjlDo token_duration ∞ token_renewable false token_policies ["root"] identity_policies [] policies ["root"]
-
ถูกสร้างจากคำสั่ง
vault operator generate-root
และ unseal key ในการสร้าง## ข้อมูลเบื้องต้น 1. ตรวจสอบ token ปัจจบัน พบว่า ยังไม่มีการ login d8k-a2m2 myvault > vault token lookup Error looking up token: Error making API request. URL: GET https://127.0.0.1:8200/v1/auth/token/lookup-self Code: 403. Errors: * permission denied 2. เตรียม unseal key Unseal Key 1: gVZfWqzSe4fq4XMJdhdLmVTCWcNIV8fxTqZakOBDZsnh Unseal Key 2: QGy6JxeSBkU36w7Ad9ciIGsh1MGQ3IrmcucqYGOk1iSt Unseal Key 3: iagcGhHLM7UGC7LGTGI3+mfToX9eTajhd7JtpuJfZM7y Unseal Key 4: 1jXBq2uygyhZ+fv2c6REIJTTShjHbVKlQFy3qxjacE95 Unseal Key 5: Y1rLZE+aI3EnbD00rN/CnoBa6S3/no85wZYu5ZZDx2bJ d8k-a2m2 myvault > vault operator generate-root -init A One-Time-Password has been generated for you and is shown in the OTP field. You will need this value to decode the resulting root token, so keep it safe. Nonce 0d0fb084-6997-af44-b06d-24007b87e302 Started true Progress 0/3 Complete false OTP NOkrsCRgWbqbRFSZ6Whf31Y4dIN1 OTP Length 28 ## จากผลของการเรียกใช้งานคำสั่ง vault operator generate-root -init จะมีข้อมูลสำคัญที่จะใช้ในขั้นตอนสุดท้ายคืือ OTP ซึี่งในกรณีนี้มีค่าเป็น NOkrsCRgWbqbRFSZ6Whf31Y4dIN1 ## หลัง initialize เรียบร้อย ให้เรียกใช้คำสั่ง vault operator generate-root และจะมี prompt เพื่อ unseal key ซึ่งเราอาจจะเรียกคำสั่งนี้หลายครั้ง แต่เงื่อนไขของการ unseal ที่กำหนดไว้แต่แรก d8k-a2m2 myvault > vault operator generate-root Operation nonce: 0d0fb084-6997-af44-b06d-24007b87e302 Unseal Key (will be hidden): Nonce 0d0fb084-6997-af44-b06d-24007b87e302 Started true Progress 1/3 Complete false d8k-a2m2 myvault > vault operator generate-root Operation nonce: 0d0fb084-6997-af44-b06d-24007b87e302 Unseal Key (will be hidden): Nonce 0d0fb084-6997-af44-b06d-24007b87e302 Started true Progress 2/3 Complete false d8k-a2m2 myvault > vault operator generate-root Operation nonce: 0d0fb084-6997-af44-b06d-24007b87e302 Unseal Key (will be hidden): Nonce 0d0fb084-6997-af44-b06d-24007b87e302 Started true Progress 3/3 Complete true Encoded Token JjkYXBENCitkKyEROCwCY3c1PzViQDBeIhF8Ag ## ในขั้นตอนนี้ หลังจากที่เรียกใช้คำสั่ง vault operator generate-root จบครบตามเงื่อนไขของ unseal ก็จะได้ข้อมูล Encoded Token เพิ่มในกรณีตัวอย่างนี้ ค่า Encoded Token จะมีค่าเป็น JjkYXBENCitkKyEROCwCY3c1PzViQDBeIhF8Ag ## เรียกคำสั่ง เพื่อถอดรหัส (decode) เพื่อให้ได้ Root Tokey ตัวใหม่ด้วยคำสั่ง vault operator generate-root -decode=<Encoded Token> -otp=<OTP> d8k-a2m2 myvault > vault operator generate-root -decode=JjkYXBENCitkKyEROCwCY3c1PzViQDBeIhF8Ag -otp=NOkrsCRgWbqbRFSZ6Whf31Y4dIN1 hvs.bNXL3IPsjjQ9AbWSQqijFX23 d8k-a2m2 myvault > vault login hvs.bNXL3IPsjjQ9AbWSQqijFX23 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.bNXL3IPsjjQ9AbWSQqijFX23 token_accessor 50j8f1dXpIimTNm6v2OxnfvF token_duration ∞ token_renewable false token_policies ["root"] identity_policies [] policies ["root"]
จากปัญหาที่คาใจในตอน สร้างผู้ใช้สิทธิ์ admin ใน HashiCorp Vault ก็ได้คำตำตอบแล้วว่าไม่มี Auth Methods ใด ๆ ที่สามารถแนบ Root Policy ให้กับผู้ใช้ที่ login ได้แน่ ๆ
Reference:
- https://developer.hashicorp.com/vault/docs/concepts/tokens#root-tokens