ข้ามไปยังเนื้อหา
KoishiAI
EN
← กลับไปหน้าสารบัญ
บทที่ 11 / 12 · 5 กันยายน 2569

สิทธิ์ แซนด์บ็อกซ์ และความปลอดภัย

โหมดสิทธิ์ทั้งหกและอันไหนเป็นค่าตั้งต้นของคุณจริง ๆ ไวยากรณ์กฎที่พลาดแล้วเปิดช่องกว้างเกิน แซนด์บ็อกซ์ Bash ที่ระบบปฏิบัติการบังคับให้ และสิ่งที่ไม่มีโหมดไหนอนุมัติให้เลย

คู่มือชุดนี้ลิขสิทธิ์ All Rights Reserved — อ่านได้ฟรี แต่คัดลอก/เผยแพร่ซ้ำต้องขออนุญาต

บทที่ 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 โหมดสิทธิ์ทั้งหก

ค่าในไฟล์ตั้งค่าชื่อที่เห็นบนจอรันได้โดยไม่ถามเหมาะกับ
defaultManualอ่านอย่างเดียวงานอ่อนไหว โค้ดที่ไม่คุ้น
acceptEditsEdit automaticallyอ่าน แก้ไฟล์ และคำสั่งจัดไฟล์ทั่วไป (mkdir touch mv cp)วนแก้โค้ดที่คุณกำลังดูอยู่
planPlanอ่าน บวกคำสั่งที่ classifier อนุมัติ (เมื่อมี auto mode)สำรวจโค้ดเบสก่อนแก้
autoAutoทุกอย่าง โดยมีการตรวจความปลอดภัยเบื้องหลังงานยาว ลดความล้าจากการกดอนุมัติ
dontAskDon’t askเฉพาะเครื่องมือที่อนุมัติไว้ล่วงหน้าCI และสคริปต์ที่ล็อกแน่น
bypassPermissionsBypass permissionsทุกอย่างคอนเทนเนอร์และ VM ที่แยกออกมาแล้วเท่านั้น

จุดที่สับสนกันมากที่สุด โหมดที่ให้คุณตรวจทุกอย่างชื่อว่า Manual บนจอ แต่ค่าในไฟล์คือ default ตัว CLI รับ manual เป็นชื่อพ้องได้ (ต้องเวอร์ชัน 2.1.200 ขึ้นไป)

session ของคุณเริ่มที่โหมดไหน

นี่คือส่วนที่คู่มือฉบับก่อนของเราไม่ถูกต้องแล้ว บนแพ็กเกจ Pro, Max และ Team โหมดตั้งต้นที่ติดมาในตัวคือ auto mode ไม่ใช่ Manual

ลำดับการเลือกคือ

  1. ธง --permission-mode หรือ --dangerously-skip-permissions
  2. permissions.defaultMode ในไฟล์ตั้งค่า
  3. ค่าตั้งต้นที่ติดมาในตัว

และค่าตั้งต้นที่ติดมาในตัวขึ้นกับว่าคุณรันอย่างไร แถวแรกที่ตรงคือแถวที่ใช้

กรณีโหมดเริ่มต้น
มีไฟล์ตั้งค่าไหนตั้ง disableAutoMode เป็น "disable"default
การดึง feature flag ถูกปิดdefault
session แรกหลังติดตั้งหรืออัปเกรดdefault
claude -p หรือ Agent SDKdefault
Amazon Bedrock, Google Cloud’s Agent Platform, Microsoft Foundry, Claude Platform on AWSdefault
แพ็กเกจ Pro, Max หรือ Team ใน terminal หรือส่วนขยาย VS Codeauto
แพ็กเกจ Enterprise หรือ API key ของ Claude Consoledefault

มีกับดักซ่อนอยู่หนึ่งข้อ ถ้าคุณตั้ง "auto" หรือ "bypassPermissions" ใน .claude/settings.json หรือ .claude/settings.local.json ค่านั้นจะไม่มีผล กรณี bypassPermissions session จะเริ่มที่ Manual แทน ค่าอื่นใช้ได้จากไฟล์ตั้งค่าไหนก็ได้

สลับโหมดระหว่างทาง

ใน CLI กด Shift+Tab เพื่อวนโหมด จาก auto การกดครั้งแรกจะไป default แล้ววนเป็น defaultacceptEditsplan → กลับ 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
WindowsC:\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ไม่ต้อง
ลดการถามโดยไม่ใช้ classifierManual + แซนด์บ็อกซ์โหมด 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ไฟล์นโยบายที่องค์กรวางไว้ ทับค่าทุกระดับ