การใช้งาน AI Coding Agent อย่าง OpenCode ช่วยเพิ่มความเร็วในการพัฒนาซอฟต์แวร์ได้อย่างมหาศาล แต่การปล่อยให้ AI ทำงานโดยไม่มีการกำหนดขอบเขตสิทธิ์ที่รัดกุม อาจนำไปสู่ความเสี่ยง เช่น การอ่านไฟล์ความลับ หรือการแก้ไขซอร์สโค้ดโดยไม่ได้อนุญาต บทความนี้สรุปแนวทางการจัดการ Permissions ใน OpenCode แบบถูกต้องตาม Schema และเอกสารทางการล่าสุดครับ
1. โครงสร้างและการตั้งค่า Permissions ใน opencode.json
การจำกัดสิทธิ์ใน OpenCode ทำได้โดยการกำหนดค่าใน opencode.json (ตัวอย่าง) ซึ่งรองรับทั้งการตั้งค่าแบบครอบคลุมและการกำหนดสิทธิ์แบบเจาะจง (Granular Rules):
{
"$schema": "https://opencode.ai/config.json",
"permission": {
"bash": {
"*rm*": "ask",
"*Remove-Item*": "ask",
"*node -e*": "deny",
"*node --eval*": "deny",
"*python -c*": "deny",
"*python3 -c*": "deny",
"*python *.py*": "ask",
"*node *.js*": "ask",
"*.env*": "deny",
"*.env.example*": "allow"
},
"read": {
"**/.env*": "deny",
"**/.env.example": "allow"
},
"grep": {
"**/.env*": "deny",
"**/.env.example": "allow"
},
"glob": {
"*": "allow"
},
"external_directory": {
"*": "deny",
"~/projects/personal/**": "allow"
}
},
"share": "manual"
}
- ผลลัพธ์ของสิทธิ์ (Actions): มี 3 ค่าหลัก คือ
"allow"(อนุญาตทันที),"ask"(ต้องถามยืนยัน), และ"deny"(ปฏิเสธเด็ดขาด) - การใช้ Wildcard Matching: รองรับ
*(ตรงกับตัวอักษรใดๆ ในชั้นเดียว),**(Recursive สแกนทะลุทุก Subdirectory) และ?(ตรงกับ 1 ตัวอักษร) - หลักการอ่านกฎ (Last-Match-Wins): ระบบจะอ่านกฎจากบนลงล่าง กฎข้อสุดท้ายที่ตรงเงื่อนไขจะเป็นกฎที่มีผลจริงเสมอ เช่น การสั่ง
"**/.env*": "deny"ไว้ก่อนเพื่อบล็อกไฟล์.envทุกรูปแบบแล้วจึงวาง"**/.env.example": "allow"ไว้ด้านล่างสุด เพื่อปลดล็อกให้ใช้เฉพาะไฟล์ตัวอย่างได้
Auto Mode (--auto): หากรัน OpenCode ด้วยคำสั่ง
opencode --autoระบบจะอนุมัติสิทธิ์ที่เป็น"ask"ให้อัตโนมัติ แต่กฎที่เป็น"deny"จะยังคงถูกบล็อกเพื่อความปลอดภัยเสมอ
2. การควบคุมขอบเขตสิทธิ์และการป้องกัน Bypass
การจำกัดสิทธิ์การเข้าถึงไฟล์ความลับ เช่น .env จำเป็นต้องครอบคลุมทั้ง Built-in Tools และ Shell Terminal เพื่อป้องกันการ Bypass (Defense-in-Depth):
- การคุม Built-in Tools (read, grep & glob):
read: ควบคุมการอ่านเนื้อหาภายในไฟล์โดยตรง (ใช้**/.env*เพื่อครอบคลุมทั้ง.env.local,.env.productionในทุกระดับโฟลเดอร์)grep: ควบคุมการค้นหาคีย์เวิร์ด/ข้อความภายในเนื้อหาไฟล์ (กำหนดกฎเหมือนกับread)glob: ควบคุมการสแกนค้นหารายชื่อไฟล์และเส้นทาง Directory (ไม่ได้อ่านเนื้อหาไฟล์ จึงสามารถเปิด"glob": { "*": "allow" }เพื่อให้ AI เข้าใจโครงสร้างโปรเจกต์ได้)
- การป้องกัน Bypass ผ่าน Terminal (bash): หาก AI พยายามเลี่ยง Built-in Tools ไปรันคำสั่ง CLI บน Terminal เช่น
Get-Content **/.env*,gc **/.env*,type **/.env*,cat **/.env*,grep **/.env*หรือSelect-String **/.env*การตั้งค่าบล็อกรูปแบบคำสั่งเหล่านี้ในส่วนbashจะช่วยปิดช่องโหว่ได้อย่างรัดกุม - ข้อจำกัด Glob Pattern vs Regex ใน bash block:
การระบุกฎใน OpenCode ใช้ Glob Pattern Engine ในการจับคู่ข้อความ ไม่ได้ใช้ Regular Expression (Regex) ทำให้ไม่รองรับการยุบรวมคำสั่งด้วยการจัดกลุ่มแบบ
(cat|grep)หรือ[cat|grep]เพราะเครื่องหมาย|หรือ(...)จะถูกมองเป็นตัวอักษรตรงๆ การตั้งค่าในbashจึงจำเป็นต้องแยกเขียนระบุทีละคำสั่งอย่างชัดเจนเท่านั้น - external_directory (Deny-by-Default): ตั้งค่าเริ่มต้นให้ปฏิเสธการเข้าถึง Directory นอก Workspace ทั้งหมดโดยการใส่
"*": "deny"ไว้เป็นบรรทัดแรก แล้วค่อยเปิดข้อยกเว้นเฉพาะโฟลเดอร์ที่จำเป็น เช่น"~/projects/personal/**": "allow"ไว้บรรทัดถัดมา
ข้อควรจำ: ไฟล์คอนฟิกจะถูกอ่านเฉพาะตอนเริ่มระบบ (Startup) เท่านั้น หากมีการแก้ไข
opencode.jsonต้อง Restart OpenCode ใหม่เสมอ
3. การควบคุมการแชร์ Session (share) และป้องกัน Data Leakage
การตั้งค่าแชร์บทสนทนาส่งผลโดยตรงต่อความปลอดภัยของ Source Code และ Logs ในระบบ:
{
"share": "manual"
}
หากตั้งค่าเป็น "share": "auto" ระบบจะอัปโหลด Session Logs ขึ้น Web Server เป็น Public Read-Only Link ให้อัตโนมัติ
ความเสี่ยงด้าน Security: แม้ผู้ที่ได้รับลิงก์จะไม่สามารถ Remote กลับมาควบคุมเครื่องได้ ทำได้เพียงอ่านเท่านั้น แต่มีความเสี่ยงสูงเรื่อง Data Leakage หากมี API Keys, Passwords หรือ Internal URLs หลุดไปใน Logs แนะนำให้ตั้งเป็น
"manual"หรือ"disabled"เสมอ
4. รายการ Permissions ที่รองรับทั้งหมด
สามารถดูรายละเอียดรายการสิทธิ์ (Permission Types) ทั้งหมดที่ OpenCode รองรับ ขอบเขตการทำงาน และค่า Default ล่าสุดได้จากเอกสารทางการที่ https://opencode.ai/docs/permissions/#สิทธิ์ที่มีอยู่
5. การตั้งค่าสิทธิ์ระดับ Agent (Agent Precedence)
คุณสามารถตั้งค่าสิทธิ์เฉพาะของแต่ละ Agent เพื่อ Override ค่า Global Config ได้ เช่น การจำกัดไม่ให้ Agent สาย Review ทำการแก้ไขไฟล์ หรือรันคำสั่ง Shell:
---
description: Code review agent without edit permissions
mode: subagent
permission:
edit: deny
bash: ask
webfetch: deny
---
Only analyze code and suggest changes.
ลำดับความสำคัญของสิทธิ์ (Precedence) จะประมวลผลตามลำดับ: Agent Config (.opencode/agents/*.md) > Project Config (opencode.json) > Global Config (~/.config/opencode/opencode.json)
สรุป
การจัด Permissions ใน OpenCode ที่ถูกต้อง คือการตั้งค่า
permissionครอบคลุมทั้ง Built-in Tools (read,grep) และ Shell (bash) โดยใช้**/.env*เพื่อสแกนครอบคลุมทุก Subdirectory และทุกไฟล์ตระกูล.envพร้อมยกเว้น.env.exampleด้วยหลักการ Last-Match-Wins กำหนดให้external_directoryเป็น Deny-by-Default ร่วมกับการเลือกการแชร์แบบ"manual"เพื่อความปลอดภัยสูงสุดครับ
No comments:
Post a Comment