productize.life
TH EN
Claude Code · Production Guardrails

allowedTools ให้สิทธิ์แล้ว
ทำไม agent ยัง permission denied

ตั้ง Read ไว้ใน allowedTools เรียบร้อย แต่ agent อ่านไฟล์นอก working directory ไม่ได้ ที่หลอกกว่านั้นคือ Glob หาไฟล์เจอ แต่ Read กลับถูกปฏิเสธ นี่คือบทเรียนจากการ debug จริง ว่าทำไม permission กับสิทธิ์อ่านโฟลเดอร์เป็นคนละเรื่องกัน

Yim· เขียนด้วยกันกับ Dobby (AI Oracle)/8 ก.ค. 2026

เราตั้งค่าให้ AI agent ตัวหนึ่งอ่านโฟลเดอร์ความรู้ส่วนกลางได้ ใส่ Read(<ทาง>/**) ไว้ใน allowedTools เรียบร้อย พอรันจริง agent กลับตอบว่าอ่านไฟล์ไม่ได้ ขึ้น permission denied ทั้งที่อยู่ในโหมดที่ไม่ถามยืนยัน จุดที่งงคือ Glob บนทางเดียวกันหาไฟล์เจอ คืนชื่อไฟล์กลับมาตรง ๆ แต่พอ Read หรือ Grep ทางเดิม กลับถูกปฏิเสธทั้งคู่ allow ก็ allow แล้ว ไฟล์ก็มีอยู่จริง แล้วทำไมยังอ่านไม่ได้

ช่วงที่ 1allowedTools กับ --add-dir คือคนละชั้น

กับดักอยู่ที่การเข้าใจว่า allowedTools เท่ากับสิทธิ์เข้าถึงไฟล์ จริง ๆ แล้ว อนุญาต ไม่เท่ากับ เข้าถึง มันเป็นสองเรื่องแยกกันที่ต้องผ่านทั้งคู่

Claude Code ตั้งต้นให้เครื่องมืออ่านไฟล์อยู่ในขอบเขต cwd เป็นหลัก ไฟล์ที่อยู่นอก cwd ต่อให้ allowedTools อนุญาต pattern ไว้แล้ว ก็ยังต้อง เพิ่มโฟลเดอร์นั้นเข้ามาด้วย --add-dir ก่อน Read ถึงจะผ่าน ขาดอย่างใดอย่างหนึ่งก็อ่านไม่ได้ ด้านหนึ่ง permission ปลดล็อกว่า "เรียกเครื่องมือได้" อีกด้าน --add-dir ปลดล็อกว่า "แตะไฟล์ตรงนั้นได้" คนละคำถามกัน

ช่วงที่ 2อาการหลอก: Glob เจอ แต่ Read ปฏิเสธ

สิ่งที่กินเวลา debug ที่สุดคือ Glob กับ Read ไม่ได้ถูกคุมด้วยกฎเดียวกัน Glob แค่ไล่ดูรายชื่อไฟล์ เลยคืน path กลับมาได้ตามปกติ แต่การเปิดอ่านเนื้อไฟล์ที่อยู่นอกขอบเขต filesystem กลับถูกปฏิเสธ พอเห็น Glob คืน path มาให้ ก็เผลอสรุปว่า เข้าถึงได้แล้ว ทั้งที่ยังอ่านเนื้อในไม่ได้เลยสักไฟล์

อาการนี้ชวนให้ไปโทษผิดจุด เดี๋ยวก็ว่า path พิมพ์ผิด เดี๋ยวก็ว่า allowedTools ตั้งผิดรูปแบบ วนแก้อยู่สองอย่างนั้นเพราะมันคือที่ที่เรามองหาโดยสัญชาตญาณ ทั้งที่ต้นเหตุจริงอยู่อีกด้านหนึ่ง คือ โฟลเดอร์นั้นยังไม่ได้อยู่ใน sandbox จำอาการคู่นี้ไว้เป็นสัญญาณเฉพาะของบั๊กนี้ ถ้า Glob เจอไฟล์ แต่ Read กับ Grep บนทางเดียวกัน denied ในโหมด dontAsk ให้สงสัยเรื่อง --add-dir ก่อนเป็นอันดับแรก อย่าเพิ่งไปไล่ปรับ pattern

ช่วงที่ 3วิธีที่ถูก: allow คู่กับ add-dir แล้วเปิดให้แคบ

ทางแก้คือแก้สองจุดให้ตรงกัน ใส่ทั้ง Read(<dir>/**) ใน allowedTools และ --add-dir <dir> พอทั้งสองตรงกันแล้ว Read ถึงผ่าน ถ้าอยากให้ค่านี้ติดข้ามรอบการใช้งาน เอกสารแนะนำให้ตั้ง permissions.additionalDirectories ไว้ในไฟล์ settings แทนการพิมพ์ flag ทุกครั้ง

แต่สิ่งที่ทำให้มันเป็น guardrail ที่ดี ไม่ใช่แค่ workaround คือ การเปิดให้แคบ เปิด --add-dir เฉพาะโฟลเดอร์ที่ agent ควรเห็นจริง ๆ เช่นความรู้ส่วนที่แชร์ได้ ส่วนข้อมูลส่วนตัวหรือ secret ไม่ต้องเพิ่มเข้า sandbox มันจะอ่านไม่ได้เองโดยปริยาย เท่ากับได้ least-privilege (เปิดสิทธิ์น้อยที่สุดเท่าที่จำเป็น) มาฟรีจากการที่ทั้งคู่ต้องตรงกันอยู่แล้ว โฟลเดอร์ที่ไม่ได้ add เข้ามา คือโฟลเดอร์ที่ agent แตะไม่ถึง ไม่ต้องไปตั้ง deny rule เพิ่มให้ยุ่ง

ช่วงที่ 4บทเรียน: อนุญาตแล้ว ไม่เท่ากับเข้าถึงได้จริง

บทเรียนที่ใช้ซ้ำได้กว้างกว่าเรื่อง flag คือ อย่าเชื่อว่า config ที่เขียนไว้เท่ากับพฤติกรรมจริง คำว่า allow ในไฟล์ตั้งค่าเป็นแค่ครึ่งเดียวของสมการ อีกครึ่งคือขอบเขตไฟล์ที่ agent มองเห็นจริง สองอย่างนี้ตั้งแยกกัน และพังเงียบ ๆ ได้เมื่อมันไม่ตรงกัน

ทางที่เชื่อได้คือยืนยันที่ runtime ไม่ใช่บนกระดาษ ให้ agent ลอง Read ไฟล์จริงหนึ่งอันที่ควรอ่านได้ แล้วดูว่าอ่านผ่านจริง จากนั้นลอง Read ไฟล์ในโฟลเดอร์ส่วนตัวที่ควรอ่านไม่ได้ แล้วดูว่ามันถูกปฏิเสธจริง นี่คือ positive กับ negative control คู่กัน ตั้งค่าถูกบนกระดาษกับ agent เข้าถึงได้จริงเป็นคนละเรื่อง จนกว่าจะเห็นผลรันจริงทั้งสองทาง

สรุปให้จำสามบรรทัด

  1. allowedTools = เรียกเครื่องมือไหนได้โดยไม่ต้องถามยืนยัน · --add-dir = เห็นโฟลเดอร์ไหนได้ ต้องมีทั้งคู่ Read ถึงผ่าน
  2. อาการที่บอกว่าใช่เคสนี้คือ Glob เจอไฟล์ แต่ Read กับ Grep denied ในโหมด dontAsk ให้สงสัย --add-dir ก่อน
  3. เวลาให้ agent อ่านนอก cwd ใส่ --add-dir คู่กับ allowedTools เสมอ เปิดแคบเฉพาะที่ต้อง แล้ว probe จริงทั้งฝั่งอ่านได้และอ่านไม่ได้
ที่มาและอ้างอิง
ติดตาม

รับบทความใหม่และของฟรีก่อนใคร

ทิ้งอีเมลไว้ บทความใหม่และของฟรีเป็นครั้งคราวจะส่งไปให้ ไม่สแปม

ใช้อีเมลเพื่อส่งอัปเดตเท่านั้น

ความคิดเห็น

ร่วมพูดคุย

แบ่งปันความคิดเห็นได้เลย

ชื่อจะแสดงต่อสาธารณะ อีเมลเก็บเป็นความลับ ไม่แสดงที่ไหน

กำลังโหลดความคิดเห็น…