สิทธิ์ แซนด์บ็อกซ์ และความปลอดภัย
โหมดสิทธิ์ทั้งหกและอันไหนเป็นค่าตั้งต้นของคุณจริง ๆ ไวยากรณ์กฎที่พลาดแล้วเปิดช่องกว้างเกิน แซนด์บ็อกซ์ Bash ที่ระบบปฏิบัติการบังคับให้ และสิ่งที่ไม่มีโหมดไหนอนุมัติให้เลย
บทที่ 11 | สิทธิ์ แซนด์บ็อกซ์ และความปลอดภัย กลุ่มเป้าหมาย: ทุกคนที่ปล่อยให้ Claude Code รันคำสั่งบนเครื่องตัวเอง
มีสามชั้นที่คนมักปนกัน ต้องแยกให้ออกก่อน
| ชั้น | ตอบคำถามว่า |
|---|---|
| โหมดสิทธิ์ | Claude ต้องถามคุณก่อนลงมือไหม |
กฎสิทธิ์ (allow / ask / deny) | เครื่องมือหรือคำสั่งนี้ผ่านหรือไม่ผ่าน |
| แซนด์บ็อกซ์ | เมื่อคำสั่งได้รันแล้ว มันแตะอะไรได้บ้าง |
เอกสารทางการสรุปความสัมพันธ์ไว้ว่า “Permission modes decide whether Claude asks before an action, and the Bash sandbox and outer isolation boundaries decide what an action can reach once it runs”
11.1 โหมดสิทธิ์ทั้งหก
| ค่าในไฟล์ตั้งค่า | ชื่อที่เห็นบนจอ | รันได้โดยไม่ถาม | เหมาะกับ |
|---|---|---|---|
default | Manual | อ่านอย่างเดียว | งานอ่อนไหว โค้ดที่ไม่คุ้น |
acceptEdits | Edit automatically | อ่าน แก้ไฟล์ และคำสั่งจัดไฟล์ทั่วไป (mkdir touch mv cp) | วนแก้โค้ดที่คุณกำลังดูอยู่ |
plan | Plan | อ่าน บวกคำสั่งที่ classifier อนุมัติ (เมื่อมี auto mode) | สำรวจโค้ดเบสก่อนแก้ |
auto | Auto | ทุกอย่าง โดยมีการตรวจความปลอดภัยเบื้องหลัง | งานยาว ลดความล้าจากการกดอนุมัติ |
dontAsk | Don’t ask | เฉพาะเครื่องมือที่อนุมัติไว้ล่วงหน้า | CI และสคริปต์ที่ล็อกแน่น |
bypassPermissions | Bypass permissions | ทุกอย่าง | คอนเทนเนอร์และ VM ที่แยกออกมาแล้วเท่านั้น |
จุดที่สับสนกันมากที่สุด โหมดที่ให้คุณตรวจทุกอย่างชื่อว่า Manual บนจอ แต่ค่าในไฟล์คือ
defaultตัว CLI รับmanualเป็นชื่อพ้องได้ (ต้องเวอร์ชัน 2.1.200 ขึ้นไป)
session ของคุณเริ่มที่โหมดไหน
นี่คือส่วนที่คู่มือฉบับก่อนของเราไม่ถูกต้องแล้ว บนแพ็กเกจ Pro, Max และ Team โหมดตั้งต้นที่ติดมาในตัวคือ auto mode ไม่ใช่ Manual
ลำดับการเลือกคือ
- ธง
--permission-modeหรือ--dangerously-skip-permissions permissions.defaultModeในไฟล์ตั้งค่า- ค่าตั้งต้นที่ติดมาในตัว
และค่าตั้งต้นที่ติดมาในตัวขึ้นกับว่าคุณรันอย่างไร แถวแรกที่ตรงคือแถวที่ใช้
| กรณี | โหมดเริ่มต้น |
|---|---|
มีไฟล์ตั้งค่าไหนตั้ง disableAutoMode เป็น "disable" | default |
| การดึง feature flag ถูกปิด | default |
| session แรกหลังติดตั้งหรืออัปเกรด | default |
claude -p หรือ Agent SDK | default |
| Amazon Bedrock, Google Cloud’s Agent Platform, Microsoft Foundry, Claude Platform on AWS | default |
| แพ็กเกจ Pro, Max หรือ Team ใน terminal หรือส่วนขยาย VS Code | auto |
| แพ็กเกจ Enterprise หรือ API key ของ Claude Console | default |
มีกับดักซ่อนอยู่หนึ่งข้อ ถ้าคุณตั้ง "auto" หรือ "bypassPermissions" ใน .claude/settings.json หรือ .claude/settings.local.json ค่านั้นจะไม่มีผล กรณี bypassPermissions session จะเริ่มที่ Manual แทน ค่าอื่นใช้ได้จากไฟล์ตั้งค่าไหนก็ได้
สลับโหมดระหว่างทาง
ใน CLI กด Shift+Tab เพื่อวนโหมด จาก auto การกดครั้งแรกจะไป default แล้ววนเป็น default → acceptEdits → plan → กลับ default แถบสถานะจะบอกโหมดที่ใช้อยู่ เช่น ⏸ manual mode on หรือ ⏵⏵ auto mode on
ใน VS Code คลิกที่ตัวบอกโหมดใต้ช่องพรอมต์ ในแอปเดสก์ท็อปใช้ตัวเลือกข้างปุ่มส่ง ส่วนปลั๊กอิน JetBrains รัน CLI ใน terminal ของ IDE จึงใช้ Shift+Tab เหมือนกัน
สิ่งที่ไม่มีโหมดไหนอนุมัติให้เลย
รวมถึง bypassPermissions ด้วย นี่คือรายการที่ควรจำ
- เครื่องมือที่ตรงกับกฎ
askที่คุณเขียนไว้เอง - เครื่องมือของ connector ที่องค์กรตั้งเป็น
ask - เครื่องมือที่ต้องให้คนตอบ เช่น
AskUserQuestionและเครื่องมือ MCP ที่ทำเครื่องหมายrequiresUserInteraction rmและrmdirที่เล็งไปยังพาธวิกฤต ซึ่งไม่มีกฎ allow หรือ hook"allow"ตัวไหนอนุมัติได้- มาตรการป้องกันของการส่งข้อความข้าม session
และ กฎ deny บล็อกได้ในทุกโหมด รวมถึง bypassPermissions ส่วนกฎ allow ไม่มีผลใน bypassPermissions
--dangerously-skip-permissions ใช้เมื่อไร
คำตอบสั้น ๆ คือ ใช้เมื่ออยู่ในคอนเทนเนอร์หรือ VM ที่แยกออกมาแล้วเท่านั้น และบน Linux กับ macOS ให้รันในฐานะผู้ใช้ที่ไม่ใช่ root
claude -p "<พรอมต์>" --dangerously-skip-permissions
ในการรัน -p แบบนี้ คำสั่งไม่กี่ตัวที่ยังจะถามอยู่ จะถูกปฏิเสธแทน ไม่ใช่ผ่านไป
11.2 กฎสิทธิ์ — ไวยากรณ์ที่พลาดแล้วเจ็บ
{
"permissions": {
"defaultMode": "default",
"allow": ["Bash(npm run *)", "Read(src/**)", "WebFetch(domain:github.com)"],
"ask": ["Bash(git push *)"],
"deny": ["Read(./.env)"],
"additionalDirectories": ["/tmp/work"]
}
}
ลำดับการตัดสินคือ deny ก่อน แล้ว ask แล้ว allow ตัวแรกที่ตรงเป็นผู้ชนะ ความเจาะจงของกฎไม่มีผลต่อลำดับ ดังนั้นกฎ deny กว้าง ๆ อย่าง Bash(aws *) บล็อกทุกอย่างที่ตรง รวมถึงคำสั่งที่ตรงกับกฎ allow แคบ ๆ อย่าง Bash(aws s3 ls) ด้วย
ช่องว่างหน้าดอกจัน
ข้อผิดพลาดที่พบบ่อยที่สุด
| เขียนแบบนี้ | ได้อะไร |
|---|---|
Bash(git diff *) | คำสั่งที่ขึ้นต้นด้วย git diff |
Bash(git diff*) | ครอบ git diff-index ไปด้วยโดยไม่ตั้งใจ |
Bash(git *) | คำสั่ง git ทุกตัว ซึ่งอาจกว้างเกินที่ตั้งใจ |
และดอกจันที่อยู่ ก่อน ชื่อคำสั่งย่อยอย่าง Bash(git * main) เป็นรูปแบบเสี่ยง เพราะครอบคำสั่งอย่าง git -c core.fsmonitor=<สคริปต์> diff main เข้าไปด้วย Claude Code เตือนตอนเริ่มต้นเมื่อเจอกฎ allow แบบนี้
ความลึกของพาธต่างกันระหว่าง allow กับ deny
| เขียน | ในกฎ deny | ในกฎ allow |
|---|---|---|
Edit(src/**) | บล็อกทั้ง src/ และ vendor/pkg/src/ | อนุญาตแค่ src/ ใต้ working directory |
Edit(**/src/**) | — | อนุญาตทุก src/ ทุกความลึก |
พูดง่าย ๆ คือ กฎห้ามครอบกว้างไว้ก่อน กฎอนุญาตครอบแคบไว้ก่อน ซึ่งเป็นค่าตั้งต้นที่ปลอดภัย แต่ทำให้คนแปลกใจเวลากฎ allow ไม่ทำงานอย่างที่คิด
รูปแบบอื่นที่ใช้บ่อย
"WebFetch(domain:example.com)"
"WebFetch(domain:*.example.com)"
"mcp__puppeteer"
"mcp__puppeteer__puppeteer_navigate"
"Agent(Explore)"
11.3 แซนด์บ็อกซ์ Bash
นี่คือของที่คู่มือฉบับก่อนของเราไม่มีเลย และเป็นชั้นที่ต่างจากกฎสิทธิ์โดยสิ้นเชิง เพราะ ระบบปฏิบัติการเป็นคนบังคับ ไม่ใช่ Claude Code
รองรับ macOS, Linux และ WSL2 ส่วน Windows แบบเนทีฟไม่รองรับ ถ้าใช้ Windows ให้รัน Claude Code ใน WSL2 บน macOS ไม่ต้องติดตั้งอะไร ใช้ Seatbelt ที่มีมาในตัว บน Linux และ WSL2 ต้องมีแพ็กเกจเพิ่ม
เปิดด้วยการพิมพ์ /sandbox ในเซสชัน แผงจะบอกด้วยว่าขาดอะไรอยู่ หรือตั้ง sandbox.enabled เป็น true ในไฟล์ตั้งค่า
สองโหมด
Auto-allow คำสั่งที่แซนด์บ็อกซ์ได้จะรันและอนุมัติเอง คำสั่งที่แซนด์บ็อกซ์ไม่ได้ เช่นที่ต้องต่อโฮสต์นอกรายการอนุญาต จะตกกลับไปเข้าเส้นทางขออนุญาตปกติ
Regular permissions ทุกคำสั่งเข้าเส้นทางขออนุญาตปกติ ต่อให้แซนด์บ็อกซ์แล้วก็ตาม
จุดที่สำคัญและคนไม่ค่อยรู้ auto-allow ทำงานเป็นอิสระจากโหมดสิทธิ์ แปลว่าคำสั่ง Bash ที่แก้ไฟล์ภายในขอบเขตแซนด์บ็อกซ์จะรันโดยไม่ถาม แม้คุณอยู่ในโหมด Manual ทั้งที่เครื่องมือแก้ไฟล์โดยตรงจะถาม ข้อยกเว้นคือโหมด plan ซึ่ง auto-allow ไม่ขยายการอนุมัติให้
ถึงอยู่ใน auto-allow กฎ deny ยังศักดิ์สิทธิ์ กฎ ask ที่ระบุคำสั่งอย่าง Bash(git push *) ยังบังคับให้ถาม และ rm/rmdir ที่เล็งพาธวิกฤตยังเข้าเส้นทางปกติ
ไฟล์ — เขียนได้ที่ไหน
| ขอบเขต | |
|---|---|
| เขียนได้ | working directory และไดเรกทอรีย่อย, ที่เพิ่มด้วย --add-dir หรือ permissions.additionalDirectories, และ temp directory ของ session ที่ $TMPDIR ชี้ไป |
| อ่านได้ | ทั้งเครื่อง ยกเว้นไดเรกทอรีที่ถูกห้ามไว้ |
| เขียนไม่ได้ | ทุกอย่างนอกนั้น รวมถึง ~/.bashrc และไบนารีระบบใน /bin/ |
จุดที่ต้องอ่านสองรอบ ค่าตั้งต้นของแซนด์บ็อกซ์ ยังอ่านไฟล์ credential อย่าง
~/.aws/credentialsและ~/.ssh/ได้ ถ้าต้องการปิด ต้องตั้งsandbox.credentialsหรือใส่พาธเหล่านั้นในdenyReadเอง แซนด์บ็อกซ์กันการ เขียน เป็นหลัก ไม่ได้กันการอ่านให้อัตโนมัติ
พาธที่ถูกป้องกันแม้อยู่ในโซนที่เขียนได้
เหตุผลตรงไปตรงมา คือคำสั่งที่แก้ไฟล์เหล่านี้ได้ จะให้สิทธิ์ตัวเองเพิ่ม หรือใส่ hook กับ MCP server ที่ Claude Code รันนอกแซนด์บ็อกซ์ได้
กลุ่มที่ถูกป้องกันคือ ไฟล์ตั้งค่า .claude และโฟลเดอร์ skills agents commands hooks ใต้มัน, .mcp.json, ไฟล์ที่ Claude Code รันเอง, ไฟล์เริ่มต้นเชลล์อย่าง .bashrc .zshrc, .gitconfig, โฟลเดอร์ .vscode และ .idea, hooks กับ config ใน .git และเนื้อหาส่วนใหญ่ใน ~/.claude
ไม่มีทางยกเว้นพาธเหล่านี้ทีละตัว กฎ allowWrite หรือกฎ allow ของ Edit ไม่ปลดล็อกให้ วิธีเดียวที่ปิดได้คือปิดการแยกไฟล์ทั้งระบบด้วย filesystem.disabled ซึ่งปิดทุกพาธพร้อมกัน
เครือข่าย
ค่าตั้งต้นคือไม่อนุญาตโดเมนใดเลย ครั้งแรกที่คำสั่งต้องการโดเมนใหม่ Claude Code จะถาม (หรือส่งให้ classifier ตรวจในโหมด auto) ถ้าตอบ Yes จะอนุญาตตลอด session นี้ ถ้าตอบ “Yes, and don’t ask again” จะบันทึกกฎ WebFetch(domain:...) ลงไฟล์ตั้งค่าเฉพาะเครื่อง
ตั้งล่วงหน้าได้เพื่อไม่ต้องถาม
{
"sandbox": {
"enabled": true,
"network": {
"allowedDomains": ["github.com", "*.npmjs.org"],
"deniedDomains": ["evil.example.com"],
"strictAllowlist": true
}
}
}
strictAllowlist ทำให้ปฏิเสธเลยแทนที่จะถาม แต่ตั้งใน .claude/settings.json หรือ .claude/settings.local.json ของ repo ไม่มีผล ต้องตั้งที่ระดับผู้ใช้ managed หรือผ่าน --settings
ไวลด์การ์ดในกฎโดเมนรองรับสองรูปแบบคือ *. นำหน้า กับ * เดี่ยว ไวลด์การ์ดตำแหน่งอื่นอย่าง domain:example.* ยังตรงกับ WebFetch แต่ไม่มีผลกับคำสั่งในแซนด์บ็อกซ์
ถ้าองค์กรใช้พร็อกซี ให้ตั้ง HTTPS_PROXY HTTP_PROXY และ NO_PROXY ใน บล็อก env ของไฟล์ตั้งค่า ไม่ใช่แค่ในเชลล์ เพื่อให้ agent ที่รันเบื้องหลังได้รับด้วย
ทางออกฉุกเฉินเมื่อคำสั่งรันในแซนด์บ็อกซ์ไม่ได้
Claude Code จะรายงานว่าแซนด์บ็อกซ์บล็อกพาธหรือโฮสต์ไหน แล้ว Claude อาจลองใหม่ด้วยพารามิเตอร์ dangerouslyDisableSandbox ซึ่งรันนอกแซนด์บ็อกซ์และเข้าเส้นทางขออนุญาตปกติ
ถ้าอยากให้ถามทุกครั้งแม้ในโหมด auto ให้เพิ่มกฎ ask
"ask": ["Bash(dangerouslyDisableSandbox:true)"]
ถ้าอยากปิดทางออกนี้ทั้งหมด ตั้ง "allowUnsandboxedCommands": false ในแผง /sandbox เรียกว่า Strict sandbox mode
11.4 การบังคับใช้ระดับองค์กร
ไฟล์ managed settings อยู่ที่
| ระบบปฏิบัติการ | พาธ |
|---|---|
| macOS | /Library/Application Support/ClaudeCode/managed-settings.json |
| Linux และ WSL | /etc/claude-code/managed-settings.json |
| Windows | C:\Program Files\ClaudeCode\managed-settings.json |
Claude Code ไม่อ่าน พาธเก่าของ Windows คือ
C:\ProgramData\ClaudeCode\managed-settings.jsonแล้ว
ถ้าหลายทีมดูแลนโยบายคนละส่วน ให้แยกเป็นไฟล์ใน managed-settings.d/ ข้าง ๆ managed-settings.json ในไดเรกทอรีระบบเดียวกัน แทนการแก้ไฟล์เดียวร่วมกัน
ค่าที่ผู้ดูแลบังคับได้และมีผลจริง เช่น permissions.defaultMode, permissions.disableAutoMode เป็น "disable" เพื่อถอด auto mode ออกจากวงจรไม่ให้ใครเลือกได้, กฎ deny และ sandbox.network.allowManagedDomainsOnly ซึ่งทำให้โดเมนที่ไม่อยู่ในรายการถูกบล็อกทันทีโดยไม่ถาม และนับเฉพาะรายการจาก managed settings เท่านั้น
11.5 ชุดตั้งค่าที่แนะนำตามสถานการณ์
| อยากได้ | เริ่มจาก | ต้องมีการแยกระดับไหน |
|---|---|---|
| ตรวจทุกอย่างเอง | claude --permission-mode default | ไม่ต้อง |
| ลดการถามโดยไม่ใช้ classifier | Manual + แซนด์บ็อกซ์โหมด auto-allow | แซนด์บ็อกซ์ในตัว (macOS/Linux/WSL2) |
| สำรวจก่อนแก้ | claude --permission-mode plan | ไม่ต้อง |
| ทำงานยาวแบบไม่ต้องกด | claude --permission-mode auto | ไม่ต้อง แต่แซนด์บ็อกซ์ช่วยเพิ่มชั้นป้องกัน |
| CI ที่มี allowlist เป๊ะ | claude -p "..." --permission-mode dontAsk --allowedTools "Bash(npm test)" "Read" | เท่าที่ runner มี |
| ปล่อยรันเองเต็มที่ | claude -p "..." --dangerously-skip-permissions | บังคับ ต้องมีคอนเทนเนอร์หรือ VM |
สรุปบทนี้
โหมดสิทธิ์ตอบว่าจะถามไหม กฎตอบว่าผ่านหรือไม่ผ่าน แซนด์บ็อกซ์ตอบว่าแตะอะไรได้ สามชั้นนี้ทำงานแยกกัน และการเปิดชั้นหนึ่งไม่ได้ปิดอีกชั้น สองสิ่งที่ควรจำที่สุดคือ กฎ deny บล็อกได้ทุกโหมดแม้แต่ bypass และแซนด์บ็อกซ์ป้องกันการเขียนเป็นหลัก ไม่ได้ปิดการอ่านไฟล์ credential ให้โดยอัตโนมัติ
คำศัพท์ประจำบท
| คำ | ความหมาย |
|---|---|
| Manual mode | โหมดที่ถามก่อนเกือบทุกอย่าง ค่าในไฟล์คือ default |
| Classifier | โมเดลตัวที่สองที่ตรวจการกระทำแทนคุณในโหมด auto |
| Protected paths | พาธที่แซนด์บ็อกซ์ห้ามเขียน แม้อยู่ในโซนที่เขียนได้ |
| Auto-allow | โหมดแซนด์บ็อกซ์ที่อนุมัติคำสั่งที่แซนด์บ็อกซ์ได้เอง |
| Strict sandbox mode | การปิดทางออก dangerouslyDisableSandbox |
| Managed settings | ไฟล์นโยบายที่องค์กรวางไว้ ทับค่าทุกระดับ |