บทที่ 34

บทที่ 34 — Managed build และนโยบายองค์กร

thClaws บางชุดถูกตั้งค่าโดยองค์กร ไม่ใช่โดยคนที่ใช้งานมัน บทนี้เขียนให้คนที่ อยู่ปลายทางของการตั้งค่านั้น ว่าสำเนาที่ถูกจัดการต่างจากปกติอย่างไร จะรู้ได้ อย่างไรว่าของคุณเป็นแบบนั้นหรือเปล่า และควรทำอะไรเมื่อบางอย่างถูกปฏิเสธ

ถ้าคุณติดตั้ง thClaws เองและไม่มีใครยื่น policy.json ให้ บทนี้ไม่เกี่ยวกับ คุณเลย สำเนาของคุณทำงานตามที่คู่มือทั้ง 33 บทที่ผ่านมาอธิบายไว้ทุกประการ

แนวคิดเดียวที่ต้องเข้าใจ

ไฟล์นโยบายเป็นประตู ไม่ใช่ฟีเจอร์

ถ้าไม่มีไฟล์นโยบาย thClaws ก็คือผลิตภัณฑ์ที่คุณอ่านมาตลอด 33 บท ไม่มีการ บังคับอะไร ทุกการตั้งค่าเป็นของคุณ แต่ถ้ามีไฟล์นโยบายที่ ลงลายเซ็นแล้ว การควบคุมบางอย่างจะถูกเปิดขึ้นมา และถ้ามีไฟล์นโยบายที่ตรวจสอบไม่ผ่าน ตัว binary จะ ปฏิเสธที่จะเริ่มทำงาน เพราะการถอยกลับไปใช้พฤติกรรมเปิดแบบเงียบ ๆ จะทำลายเหตุผลทั้งหมดของการมีนโยบาย

การปฏิเสธนั้นคือดีไซน์ สำเนาที่ถูกจัดการซึ่งเงียบ ๆ เมินนโยบายที่พังอยู่ แย่กว่าสำเนาที่เปิดไม่ขึ้น

สำเนาของฉันถูกจัดการอยู่หรือเปล่า

❯ /policy status

สำเนาที่ไม่ได้ถูกจัดการจะบอกตรง ๆ

no org policy active (open-core defaults)

ส่วนสำเนาที่ถูกจัดการจะบอกชื่อไฟล์ ผู้ออกนโยบาย กุญแจที่ใช้ตรวจสอบ วันหมดอายุ และบล็อกไหนถูกเปิดอยู่บ้าง

policy: /etc/thclaws/policy.json (issuer acme-corp, key embedded)
expires: 2027-01-31T00:00:00Z
branding=on plugins=on gateway=on sso=off

ไฟล์อยู่ที่ไหน

thClaws หาจากสามที่ ตามลำดับนี้

  1. THCLAWS_POLICY_FILE — ระบุ path ตรง ๆ ผ่าน environment
  2. /etc/thclaws/policy.json — ใช้กับทุก user บนเครื่อง
  3. ~/.config/thclaws/policy.json — เฉพาะคุณ

เจอที่ไหนก่อนใช้ที่นั่น สำหรับเครื่องทำงานที่ถูกจัดการ /etc/ เป็นที่ที่ใช้ กันตามปกติ เพราะต้องมีสิทธิ์ admin ถึงจะเขียนได้ user จึงสลับไฟล์เองเงียบ ๆ ไม่ได้

“thClaws refused to start”

ข้อความที่คุณมีโอกาสเจอมากที่สุด

thClaws refused to start: this copy is configured for your organization
and its policy file is missing.

Ask whoever provided thClaws for your organization's policy.json, then
save it as one of:
  /etc/thclaws/policy.json          (all users on this machine)
  ~/.config/thclaws/policy.json     (just you)

Nothing else needs installing — the file alone is enough.

เกือบทุกครั้งนี่คือไฟล์ที่ถูกลบหรือไม่เคยถูกก๊อปมา ไม่ใช่การติดตั้งที่พัง ไฟล์อย่างเดียวก็พอ ไม่มี agent, service หรือ licence server แยกให้ต้องตั้ง

การปฏิเสธแบบอื่น — ลายเซ็นไม่ถูก นโยบายหมดอายุ นโยบายผูกกับองค์กรอื่น — จะ พิมพ์ว่าอะไรล้มเหลวและชี้ให้ end user ไปหาผู้ดูแลระบบ ถ้าคุณกำลังทดสอบไม่ใช่ ใช้งานจริง การลบไฟล์นโยบายออกจะทำให้ binary กลับไปเป็นพฤติกรรมเปิดตามเดิม

นโยบายเปิดอะไรได้บ้าง

มีหกบล็อก แต่ละบล็อกเป็นอิสระจากกัน และปิดอยู่ทั้งหมดจนกว่านโยบายจะระบุ

runtime — บล็อกที่พูดว่าไม่

บล็อกอื่นตั้งค่าว่า thClaws ชี้ไปที่ไหน ส่วนบล็อกนี้จำกัดว่ามัน ทำอะไรได้ ซึ่งมักเป็นคำถามแรกที่ผู้ดูแลระบบถาม

การตั้งค่า ผล
permission_mode บังคับเป็น ask, auto หรือ plan ถูกใช้ หลัง settings และหลัง CLI flag — --permission-mode auto จึงปีนข้ามไม่ได้
deny_tools tool ที่ระบุจะถูกถอดออกจากทุก registry โมเดลจึงไม่เห็นมันเลย และถูกปฏิเสธซ้ำอีกครั้งตอน dispatch เผื่อมี registry ที่การถอดออกไปไม่ถึง
allow_remote false จะหยุด thClaws Remote ทั้งการ pair การ reconnect และ autoconnect ตอน boot
allow_serve false แล้ว binary จะปฏิเสธที่จะ bind --serve

การป้องกันสองชั้นของ deny_tools เป็นความตั้งใจ เพราะ “โมเดลเรียกมันไม่ได้” เป็นคำกล่าวอ้างที่อ่อนกว่า “การเรียกนั้นไม่ทำงาน”

ทั้ง allow_remote และ allow_serve มีค่าเริ่มต้นเป็น true นโยบายจะปิด มันได้ก็ต่อเมื่อระบุไว้ ไม่ใช่ด้วยการละฟิลด์ไว้ นโยบายที่เขียนไม่ครบจึงล็อก เครื่องโดยไม่ตั้งใจไม่ได้

branding

แทนที่ชื่อผลิตภัณฑ์ โลโก้ อีเมลฝ่ายสนับสนุน และข้อความ About ด้วยของ องค์กรเอง เป็นเรื่องรูปลักษณ์ แต่ก็เป็นสิ่งที่ทำให้การ rollout ภายในรู้สึก เหมือนเครื่องมือขององค์กรจริง ๆ

plugins

จำกัดว่าส่วนขยายมาจากไหนได้บ้าง

  • allowed_hosts — pattern ของ host แบบมี wildcard สำหรับ skill, plugin และ MCP server ถ้าเป็น list ว่างพร้อมเปิดบล็อกไว้ จะหมายถึงห้ามแหล่งภายนอก ทั้งหมด ซึ่งเป็นค่าสำหรับสภาพแวดล้อมแบบ air-gapped
  • allow_external_scripts — ค่า false (ค่าเริ่มต้น) จะปฏิเสธ skill ที่มี ไดเรกทอรี scripts/ ที่รันได้ เหลือแต่ skill แบบ declarative

gateway

route ทุกการเรียก HTTP ไปหา provider ผ่าน endpoint ขององค์กรเอง ตั้งเป็น บังคับ ก็ได้ — อะไรที่ไม่ตรง host ของ gateway จะถูกบล็อก — หรือเป็นแค่ ตัวเลือกที่แนะนำ ซึ่งยังเข้าถึง provider ตรง ๆ ได้

นี่คือวิธีที่องค์กรรัน thClaws กับ deployment โมเดลของตัวเองโดยที่ user ทุกคนไม่ต้องมาตั้ง key เอง

sso

ล็อกอินแบบ OIDC เพื่อให้คนที่ใช้ thClaws เป็นคนเดียวกับที่ identity provider ของคุณบอก ใช้ /sso status, /sso login, /sso logout

audit

บันทึกการเรียก tool ฝั่ง client แล้วส่งออกไปยัง sink ที่ตั้งไว้ นี่คือบล็อกที่ ทำให้ deployment ตรวจสอบย้อนหลังได้

ตัวซองของไฟล์

นอกจากหกบล็อกแล้ว ตัวไฟล์เองยังพก

  • ลายเซ็น แบบ Ed25519 ครอบทั้งเอกสาร ไม่มีลายเซ็นหรือลายเซ็นผิดคือการ ปฏิเสธ ไม่ใช่คำเตือน
  • วันหมดอายุ (ไม่บังคับ) เลยวันนั้นไปนโยบายจะเลิกมีผล และเนื่องจาก managed build ต้องมีนโยบาย นั่นแปลว่าสำเนานั้นจะใช้งานไม่ได้ ผู้ดูแลระบบ ควรต่ออายุก่อนถึงวัน ไม่ใช่หลัง
  • การผูก (ไม่บังคับ) มี org_id ซึ่งถูก log ตอนเริ่มทำงาน การ deploy ผิด ที่จึงเห็นได้ในข้อมูล support และมี fingerprint ของ binary เป็นตัวเลือกด้วย ตัว fingerprint กันไม่ให้ยกนโยบายจาก build หนึ่งไปวางบนอีก build

ในทางปฏิบัติ สิ่งนี้หมายถึงอะไรกับคุณ

  • การตั้งค่าที่คุณเปลี่ยนอาจไม่มีผล ถ้า runtime.permission_mode ถูกตั้งไว้ ตัวเลือกของคุณจะถูก override ทีหลัง รวมถึง flag บนบรรทัดคำสั่งด้วย ใช้ /permissions ดูว่าจริง ๆ แล้วคุณอยู่โหมดไหน
  • tool บางตัวอาจหายไป tool ที่ถูก deny จะไม่อยู่ใน registry โมเดลจึงไม่ เสนอให้และไม่พูดถึงมัน
  • บางฟีเจอร์จะปฏิเสธตรง ๆ พร้อมระบุชื่อนโยบายที่หยุดมันไว้ นี่เป็นความ ตั้งใจ เพราะการถูกบอกว่า policies.runtime.allow_remote = false มีประโยชน์ กว่า error ทั่ว ๆ ไป
  • คุณ override อะไรจากเครื่องตัวเองไม่ได้เลย การแก้ settings.json ของคุณ ไม่ช่วย เพราะนโยบายถูกใช้เป็นลำดับสุดท้ายและมันลงลายเซ็นไว้

ถ้านโยบายบล็อกสิ่งที่คุณจำเป็นต้องใช้ในงาน นั่นเป็นเรื่องที่ต้องคุยกับคนที่ ออกนโยบาย ไม่ใช่ปัญหาการตั้งค่าที่คุณต้องแก้เอง

การแก้ปัญหา

อาการ สาเหตุ วิธีแก้
ขึ้น “policy file is missing” ตอนเปิด ไฟล์ถูกลบหรือไม่เคยถูกก๊อปมา ขอ policy.json จากผู้ดูแลระบบ แล้ววางที่หนึ่งในสอง path
“refused to start” พร้อม error เรื่องลายเซ็น ไฟล์ไม่ตรงกับกุญแจที่ build นี้พกมา ยืนยันว่าคุณได้ไฟล์ของ build ตัวนี้ จริง
เมื่อวานใช้ได้ วันนี้ปฏิเสธ นโยบายหมดอายุ ผู้ดูแลระบบต้องออกฉบับต่ออายุ
การตั้งค่าเด้งกลับตลอด runtime บังคับไว้ /policy status จะบอกว่าอะไรถูกบังคับอยู่
tool ที่คู่มือเขียนไว้ไม่มีอยู่จริง deny_tools เหมือนข้างบน
/policy status บอกว่า open-core แต่ IT บอกว่าถูกจัดการ ไฟล์ไม่ได้อยู่ใน path ที่ thClaws หา ตรวจสามที่ตามลำดับข้างบน

ดูเพิ่มเติม

  • บทที่ 5 — permission mode ซึ่ง runtime.permission_mode override ทับ
  • บทที่ 33 — Remote ซึ่ง runtime.allow_remote ปิดได้
  • บทที่ 3 — --serve ซึ่ง runtime.allow_serve ปิดได้
  • ENTERPRISE.md ในชุดแจกจ่าย thClaws — เอกสารอ้างอิงสำหรับผู้ดูแลระบบ ทั้ง รูปแบบไฟล์เต็ม วิธีลงลายเซ็นและออกนโยบาย และวิธี build สำเนาแบบ managed