หนึ่งในหลักการของคนทำงานสาย Cybersecurity ที่รู้จักกันดี ก็คือ Principle of least privilege ว่ากันคร่าว ๆ ก็คือ การกำหนดสิทธ์ในการทำงาน ในการเข้าถึงข้อมูล เท่าที่จำเป็นต้องใช้งาน เฉพาะที่ต้องใช้งานเท่านั้น … หลักการนี้คงรวมถึงการนำมาเป็นแนวคิดในการสร้างผู้ใช้ที่จะทำหน้าที่บริหารจัดการ HashiCorp Vault ด้วยเช่นกัน แต่ว่าในตอน สร้างผู้ใช้สิทธิ์ admin ใน HashiCorp Vault กล่าวถึงแค่แนวคิดในการสร้างผู้ใช้ที่จะทำหน้าที่นี้ ให้สิทธิ์กว้าง ๆ ที่ครอบคลุมสิทธิ์ทุกอย่างในการบริหารจัดการ ในตอนนี้ เราจะยกตัวอย่างถึงการกำหนดสิทธิ์เฉพาะงาน เฉพาะบางส่วน ในการทำหน้าที่เป็น HashiCrop Vault Administrator รวมถึงรายละเอียดของสิทธิ์ที่จะกำหนดได้
กำหนดสิทธิ์อะไรไดบ้าง
การกำหนดสิทธิ์ จะถูกกำหนดใน Policy ในส่วนของ capabilities ซึ่งสามารถกำหนดสิทธิ์ต่าง ๆ ที่ต้องการอนุญาตหรือไม่อนุญาต ตัวอย่างรูปแบบดังนี้ capabilities = ["create", "update", "patch", "read", "delete"]
สิทธิ์ที่สามารถกำหนดให้ได้มีดังนี้
- create (POST/PUT) อนุญาตให้สร้างข้อมูลใน path ที่กำหนดได้
- update (POST/PUT) อนุญาตให้เปลี่ยนแปลงข้อมูลใน path ที่กำหนดได้
- patch (PATCH) อนุญาตให้แก้ไขข้อมูลบางส่วนใน path ที่กำหนดได้
- read (GET) อนุญาตให้อ่านข้อมูลใน path ที่กำหนดได้
- delete (DELETE) อนุญาตให้ลบข้อมูลใน path ที่กำหนดได้
- list (LIST) อนุญาตให้เรียกดูรายการข้อมูลใน path ที่กำหนดได้ และระบบอนุญาตให้เรียกดู นั่นหมายความว่า ในบาง path ถึงจะอนุญาตก็ไม่สามารถเรียกดูรายการของข้อมูลได้
จากรายการสิทธิ์ด้านบนมีการวงเล็บ HTTP Method ไว้ให้ด้วย เพื่อใช้ในการอ้างอิงเวลาที่เรียกใช้งาน HashCorp Vault ผ่าน API ยังมีอีก 2 สิทธิ์ที่สามารถกำหนดให้กับ capabilities ได้ แต่ไม่มี HTTP Method ดังนี้
- sudo อนุญาตให้เข้าถึงที่ path แบบพิเศษที่ถูกกำหนดให้เป็น Root Protected ซึ่งต้องใช้ Root Token ในการเข้าถึง หรือ ถ้าผู้ที่เข้าถึงไม่เป็น Root Token ก็ต้องมีสิทธิ์ sudo
- deny กำหนดให้ไม่อนุญาตให้เข้าถึง path ที่กำหนด
note: create และ update ในบาง path การสั่งให้ create และ update มองว่าเป็นการทำงานที่ต่างกัน แต่ก็มีในบาง path มองว่า create และ update เป็นการทำงานในรูปแบบเดียวกัน ซึ่งรายละเอียดการทำงานสามารถหาเพิ่มเติมได้ในเอกสารที่เกี่ยวข้องกับ path นั้น ๆ
admin ที่มีบทบาทบริหารจัดการ Policy
path ในการจัดการ Policy จะอยู่ที่ sys/policies ตัวอย่างของ policy รูปแบบต่าง ๆ ที่เกี่ยวข้อง
```
# เรียกดูรายการ policy ในระบบได้เท่านั้น
path "sys/policies/acl"
{
capabilities = ["list"]
}
# สร้างและแก้ไข policy
path "sys/policies/acl/*"
{
capabilities = ["create", "read", "update", "delete", "list", "sudo"]
}
```
ทดสอบสร้าง admin ที่มีบทบาทเป็น auditor จะทำหน้าที่เพียงเฉพาะ เรียกดูรายการ policy และดูรายละเอียดของ policyได้เท่านั้น ข้อมูลเบื้องต้นของระบบที่ใช้ทดสอบ
- HashiCorp Vault v1.13.0
- ใช้ Root Token สร้าง policy ไว้จำนวน 4 รายการดังนี้ policy1, policy2, policy3 และ policy4
- สร้างผู้ใช้งาน drs ด้วย Auth Method แบบ userpass และแนว policy เพียง Default Policy
d8k-a2m2 myvault > vault login -method=userpass username=drs password=mypassword
[... truncated output ...]
policies ["default"]
token_meta_username drs
d8k-a2m2 myvault > vault policy list
Error listing policies: Error making API request.
URL: GET https://127.0.0.1:8200/v1/sys/policies/acl?list=true
Code: 403. Errors:
* 1 error occurred:
* permission denied
จะเป็นว่าผู้ใช้ drs ที่มี Default Policy ไม่สามารถเรียกดูรายการของ policy ได้ เนื่องจากโดยปกติถ้าไม่มีอนุญาตที่ path ที่กำหนดจะเป็นการ Deny by Default
ใช้ Root Token ในการสร้าง policy ชื่อว่า listpolcy ที่กำหนดสิทธิ์ให้เรียกดูรายการ และอ่าน policy ได้ และเพิ่ม listpolcy ให้กับผู้ใช้ drs
d8k-a2m2 myvault > vault login ${TOKEN}
[... truncated output ...]
token_policies ["root"]
identity_policies []
policies ["root"]
d8k-a2m2 myvault > vault policy write listpolicy - <<EOF
path "/sys/policies/acl/*" {
capabilities = ["read", "list"]
}
EOF
Success! Uploaded policy: listpolicy
d8k-a2m2 myvault > vault write auth/userpass/users/drs/policies policies="listpolicy"
Success! Data written to: auth/userpass/users/drs/policies
เข้าใช้งานผู้ใช้ drs, ทดสอบเรียกดูรายการ polcy และ เรียกดูรายละเอียดของ policy1
d8k-a2m2 myvault > vault login -method=userpass username=drs password=mypassword
[... truncated output ...]
policies ["default" "listpolicy"]
token_meta_username drs
d8k-a2m2 myvault > vault policy list
default
listpolicy
policy1
policy2
policy3
policy4
root
d8k-a2m2 myvault > vault policy read policy1
path "*" {
capabilities = ["create", "read", "update", "delete", "list", "sudo"]
}
เข้าใช้งานผู้ใช้ drs, ทดสอบสร้าง policy5
d8k-a2m2 myvault > vault policy write policy5 - <<EOF
path "*" {
capabilities = ["create", "read", "update", "delete", "list", "sudo"]
}
EOF
Error uploading policy: Error making API request.
URL: PUT https://127.0.0.1:8200/v1/sys/policies/acl/policy5
Code: 403. Errors:
* 1 error occurred:
* permission
จะพบว่าผู้ใช้ drs ที่ได้รับ policy แค่ Default Policy และ listpolicy ไม่สามารถสร้าง policy5 ได้
admin ที่มีบทบาทบริหารจัดการ Auth Method
ใน HashiCorp Vault รองรับวิธีการในการพิสูจน์ตัวตนให้หลากหลายวิธี ที่เรียกว่า Auth Method ซึ่งรองรับได้หลากหลายวิธีเช่น Kuberos, LDAP, Username & Password, TLS Certificates ถ้าต้องการกำหนดสิทธิ์ administrator ให้บริหารจัดการ Auth Mothod จะกำหนดสิทธิ์ต่าง ๆ ที่ path auth/ แต่ถ้าต้องการกำหนดให้ละเอียดก็ต้องระบุ path ในขั้นตอนการ enable เช่นถ้าระบุ path เป็น -path=project1
ก็กำหนดให้ administrator สามารถจัดการได้ที่ auth/project1
# ตัวอย่างกำหนดสิทธ์ให้สามารถจัดการ Auth Method ได้โดยภาพรวมทั้งหมด
path "auth/*"
{
capabilities = ["create", "read", "update", "delete", "list"]
}
ทดสอบสร้าง admin ที่มีบทบาทเป็น project manager ของโครงการที่ชื่อว่า project1 จะทำหน้าที่เพียงสร้างผู้ใช้สำหรับโครงการ project1 เท่านั้น ข้อมูลเบื้องต้นของระบบที่ใช้ทดสอบ
- HashiCorp Vault v1.13.0
- ใช้ Root Token สร้าง Userpass Auth Method ไว้ 2 path คือ auth/project1 สำหรับโครงการ project1 และ auth/project2 สำหรับโครงการ project2
- สร้างผู้ใช้งาน drs ด้วย Auth Method แบบ userpass ใน path auth/project1
ทดสอบสร้าง policy ชื่อว่า project1-auth ที่สร้าง,ปรับปรุง และลบข้อมูลได้เฉพาะ Auth Method ที่ระบุ path ไว้ที่ project1 เท่านั้น (vault auth enable -path=project1 userpass
) และ สร้างผู้ใช้งาน drs ที่ได้รับ project1-auth policy
d8k-a2m2 myvault > vault policy write project1-auth - <<EOF
path "auth/project1/*" {
capabilities = ["create", "update", "delete"]
}
EOF
Success! Uploaded policy: project1-
d8k-a2m2 myvault > vault write auth/project1/users/drs password=mypassword policies="project1-auth"
Success! Data written to: auth/project1/users/drs
ทดสอบ login ด้วยผู้ใช้ drs แล้วสร้างผู้ใช้งานใน project1 และ project2
d8k-a2m2 myvault > vault login -method=userpass -path=project1 username=drs password=mypassword
[... truncated output ...]
policies ["default" "project1-auth"]
token_meta_username drs
d8k-a2m2 myvault > vault write auth/project1/users/dev1 password=mypassword
Success! Data written to: auth/project1/users/dev1
d8k-a2m2 myvault > vault write auth/project2/users/dev1 password=mypassword
Error writing data to auth/project2/users/dev1: Error making API request.
URL: PUT https://127.0.0.1:8200/v1/auth/project2/users/dev1
Code: 403. Errors:
* 1 error occurred:
* permission denied
จะพบว่าผู้ใช้ drs สร้างผู้ใช้ได้เฉพาะใน project1 แต่ไม่สามารถสร้างผู้ใช้ใน project2 ได้
Reference:
- https://developer.hashicorp.com/vault/docs/concepts/policies#capabilities
- https://en.wikipedia.org/wiki/Principle_of_least_privilege
- https://developer.hashicorp.com/vault/tutorials/policies/policies
- https://developer.hashicorp.com/vault/api-docs/system/policies
- https://developer.hashicorp.com/vault/docs/auth