Vault Plugin Part 2 - Create Plugin

มาเขียน Vault Plugin กันเถอะ : ตอนที่ 2 สร้าง Plugin

ในตอนที่แล้วเราสามารถ Start Vault server ขึ้นมาใช้งานได้แล้ว ตอนนี้เรามาลองสร้าง Vault plugin ขึ้นมาใช้งาน ซึ่งจริงๆมันมีตัวอย่างที่ Web ของ Vault อยู่แล้วตาม Link นี้ ซึ่งก็บอกละเอียดดีแต่มันขาดส่วนที่เกี่ยวกับการอธิบาย Code แล้วจริงๆมันสร้างสั่งผ่าน Rest api ได้ด้วย ซึ่งน่าใช้กว่า cmd เพราะสามารถจัดข้อมูลก่อนส่งได้ ถ้าเป็น cmd ต้องเป็นบรรทัดเดียว (จริงๆทำหลายบรรทัดก็ได้นะ แต่ไม่ค่อยชอบ)

Compile plugin กันก่อน

ขั้นตอนแรกไป Clone ตัว Plugin มาก่อนโดยใช้คำสั่ง

1
2
3
4
5
git clone https://github.com/hashicorp/vault-guides.git
cd vault-guides

# Source code มันมีการ Update หลังจากผมเขียน Blog เลยต้องย้ายมา commit
git checkout e0eb4285d8066770bc1f50056c27e2c6e4a989e1

จากนั้นย้ายเข้าไปใน Directory ของ plugin ตัวอย่าง

1
cd vault-guides/secrets/mock

ตรงจุดนี้คือการเอา Docker ของ go มา compile code ให้

1
2
3
4
5
6
7
8
9
10
11
# ทำการสร้าง docker ขึ้นมา โดยสั่งคำสั่งนี้แล้วมันเข้าไปอยู่ในเครื่อง docker ที่เราสร้างสำหรับทำการ compile
docker run -ti --rm -v "$PWD:/go/src/plugin" golang:1.14-buster bash

# ย้ายไป Directory ที่ Source เราอยู่
cd /go/src/plugin

# ทำการสั่ง Build ตัว Plugin
CGO_ENABLED=0 GOOS=linux go build -a -installsuffix cgo -o vault/plugins/mock cmd/mock/main.go

# ทำการออกจาก Docker
exit

จากนั้นตรวจสอบ directory ของเราจะได้ดังด้านล่าง

1
2
3
4
5
6
7
8
9
10
11
12
.
├── backend.go
├── cmd
│   └── mock
│   └── main.go
├── go.mod
├── go.sum
├── Makefile
├── README.md
└── vault
└── plugins
└── mock

โดยผลลัพธ์จากการ compile จะอยู่ใน ./vault/plugins/mock ให้ copy ไฟล์นี้ไว้นะครับ

Register Plugin เข้าไปใน Vault server

ในการ Register plugin ของ vault นั้นเราจะต้องเอาไฟล์ Plugin ไปวางไว้ใน Directory plugin บน Vault server ซึ่งจากขั้นตอนที่แล้วที่ให้ copy ไฟล์ ./vault/plugins/mock แล้วไปวางไว้ที่ Directory ของ Vault server ในตอนที่แล้ว ซึ่ง path ที่จะให้ไปวางก็คือ plugin/mock

1
2
3
4
.
├── data
├── plugin
│   └── mock

แต่การวางไฟล์ไว้บนเครื่องยังไม่น่าเชื่อถือว่าคุณคือคนทำ plugin นั้นจริงๆ แล้ว plugin นั้นใช่ตัวเดียวกับวางบน server รึเปล่า ดังนั้นเขาเลยใช้ hash เช็คไฟล์ด้วยซะเลย ดังนั้นในการเราต้องค่า hash ของ plugin นั้นด้วย โดยใช้คำสั่ง

1
2
3
4
5
openssl dgst -sha256 mock

# ผลลัพธ์จะได้แบบนี้ แต่ของคุณอาจจะไม่เหมือนของผม เพราะการ compile อาจจะได้ค่าไม่เท่ากันก็ได้
# SHA256(mock)= c0798363e1dd0ec1c1a8cfe0865654cd7d6b6e0f83401d672e43b4dab1202eb8
# ให้ copy c0798363e1dd0ec1c1a8cfe0865654cd7d6b6e0f83401d672e43b4dab1202eb8 เก็บไว้

จากนั้นเราจะทำการ Register Plugin โดยใช้ Rest api ที่ Vault มีให้ โดยรายละเอียด Api สามารถดูได้ที่ Link นี้ โดยผมจะใช้ Postman ในการยิง Http Request ( ท่านสามารถ Download Collection และ Environment ของ Postman ได้ที่นี่)

ยิง Register Plugin

ตัว Body ที่ยิง

1
2
3
4
{
"sha256": "c0798363e1dd0ec1c1a8cfe0865654cd7d6b6e0f83401d672e43b4dab1202eb8",
"command": "mock"
}

ตรวจสอบว่า Register สำเร็จไหม

โดยถ้าสำเร็จจะต้องมี plugin ชื่อ mock โผล่ในส่วนของ Secret engine ครับ

นำ Plugin มาใช้งาน

ในขั้นตอนเราแค่ทำการ Register plugin เข้าไปในระบบ ให้ระบบทราบว่ามี Plugin นี้อยู่ในระบบนะ แต่เรายังไม่ได้เอา plugin มาใช้งาน โดยถ้าจะเอา plugin ไปใช้เราจะต้องเอามันไป Mount ที่ path โดย 1 plugin สามารถ mount ได้หลาย path โดยจะถือว่าเป็นคนละตัวกันเลย โดยรายละเอียดเกี่ยวกับ api ที่ใช้ Mount plugin ไปที่ path สามารถอ่านได้ที่ Link

Mount plugin to path

ทำการ Enable plugin โดยทำตามภาพ

โดยหา Register สำเร็จเมื่อเข้ามาดูหน้า Web จะเห็นว่ามี Path mock/ โผล่มาที่หน้าจอแล้วดังภาพ

ทดสอบ Mock plugin

Mock plugin ที่เราสร้างขึ้นมานั้นมีหน้าที่เก็บค่าที่ส่งเข้าแล้วเก็บไว้ที่ Path ที่ต้องการ โดยตัวอย่างเราจะเก็บข้อมูลที่ path : test โดยเก็บข้อมูล

1
2
3
{
"message" : "Secret value : qtaaNdjaddzhdrjit"
}

จากนั้นลอง Get ข้อมูลก็จะได้ข้อมูล

1
2
3
4
5
6
7
8
9
10
11
12
{
"request_id": "28e109fc-6657-647b-97e8-bf542232bd72",
"lease_id": "",
"renewable": false,
"lease_duration": 0,
"data": {
"message": "Secret value : qtaaNdjaddzhdrjit"
},
"wrap_info": null,
"warnings": null,
"auth": null
}

จบก่อนเขียนมาเยอะละ

สำหรับตอนนี้เราได้เรียนรู้วิธีการสร้าง Plugin (จริงๆเอา plugin ตัวอย่างมาใช้) แล้วก็วิธี Register plugin เข้าไปในระบบ แล้วก็เอา Plugin มา Mount ที่ Path เพื่อใช้งาน ในส่วนของตอนถัดไปเรามาดูเรื่อง Code ของ Plugin ตัวอย่างว่ามันทำงานยังไง แล้วลองเปลี่ยน Plugin เล่นกันดู

เพลงประกอบการเขียน Blog