ข้ามไปยังเนื้อหา

การปกปิดข้อมูลลับ

ป้องกันไม่ให้ค่าที่ละเอียดอ่อน (API key, โทเค็น, รหัสผ่าน) ถูกส่งไปยังผู้ให้บริการ LLM เมื่อเปิดใช้งาน ข้อมูลลับจะถูกแทนที่ด้วยตัวแทนที่กำหนดค่าไว้ล่วงหน้าก่อนออกจากกระบวนการ และได้รับการกู้คืนในอาร์กิวเมนต์ของ tool call ที่โมเดลส่งกลับมา

เปิดใช้งานโดยค่าเริ่มต้น สลับการใช้งานผ่าน UI /settings หรือโดยตรงใน config.yml:

secrets:
enabled: false
  1. เมื่อเริ่มต้นเซสชัน ข้อมูลลับจะถูกรวบรวมจากสองแหล่ง:

    • ตัวแปรสภาพแวดล้อม ที่ตรงกับรูปแบบข้อมูลลับทั่วไป (*_KEY, *_SECRET, *_TOKEN, *_PASSWORD, ฯลฯ) โดยมีค่าที่มีความยาว >= 8 ตัวอักษร
    • ไฟล์ secrets.yml (ดูด้านล่าง)
  2. ข้อความขาออกไปยัง LLM จะมีค่าข้อมูลลับทั้งหมดถูกแทนที่ด้วยตัวแทน เช่น <<$env:S0>>, <<$env:S1>>, เป็นต้น

  3. อาร์กิวเมนต์ของ tool call ที่โมเดลส่งกลับมาจะถูกตรวจสอบแบบ deep-walk และตัวแทนจะได้รับการกู้คืนเป็นค่าเดิมก่อนการดำเนินการ

สองโหมดควบคุมสิ่งที่เกิดขึ้นกับข้อมูลลับแต่ละรายการ:

โหมดพฤติกรรมกู้คืนได้
obfuscate (ค่าเริ่มต้น)แทนที่ด้วยตัวแทนที่มีดัชนี <<$env:SN>>ใช่ (ถอดรหัสใน tool args)
replaceแทนที่ด้วยสตริงที่กำหนดค่าไว้ล่วงหน้าที่มีความยาวเท่ากันไม่ (ทางเดียว)

กำหนดรายการข้อมูลลับแบบกำหนดเองใน YAML โดยมีการตรวจสอบสองตำแหน่ง:

ระดับเส้นทางวัตถุประสงค์
ส่วนกลาง~/.xcsh/agent/secrets.ymlข้อมูลลับสำหรับทุกโปรเจกต์
โปรเจกต์<cwd>/.xcsh/secrets.ymlข้อมูลลับเฉพาะโปรเจกต์

รายการระดับโปรเจกต์จะแทนที่รายการส่วนกลางที่มี content ตรงกัน

แต่ละรายการในอาร์เรย์มีฟิลด์ดังนี้:

ฟิลด์ประเภทจำเป็นคำอธิบาย
type"plain" หรือ "regex"ใช่กลยุทธ์การจับคู่
contentstringใช่ค่าข้อมูลลับ (plain) หรือรูปแบบ regex (regex)
mode"obfuscate" หรือ "replace"ไม่ค่าเริ่มต้น: "obfuscate"
replacementstringไม่ข้อความแทนที่แบบกำหนดเอง (เฉพาะโหมด replace)
flagsstringไม่แฟล็ก regex (เฉพาะประเภท regex)
# ปกปิด API key เฉพาะ (โหมดเริ่มต้น)
- type: plain
content: sk-proj-abc123def456
# แทนที่รหัสผ่านฐานข้อมูลด้วยสตริงคงที่
- type: plain
content: hunter2
mode: replace
replacement: "********"
# ปกปิด key รูปแบบ AWS ใดก็ได้
- type: regex
content: "AKIA[0-9A-Z]{16}"
# จับคู่แบบไม่คำนึงถึงตัวพิมพ์เล็กใหญ่พร้อมแฟล็กที่ระบุอย่างชัดเจน
- type: regex
content: "api[_-]?key\\s*=\\s*\\w+"
flags: "i"
# ไวยากรณ์ regex literal (รูปแบบและแฟล็กในสตริงเดียว)
- type: regex
content: "/bearer\\s+[a-zA-Z0-9._~+\\/=-]+/i"

รายการ regex จะสแกนแบบ global เสมอ (แฟล็ก g ถูกบังคับใช้โดยอัตโนมัติ) ไวยากรณ์ regex literal /pattern/flags รองรับเป็นทางเลือกแทนฟิลด์ content + flags แยกกัน สแลชที่ใช้ escape ภายในรูปแบบ (\\/) ได้รับการจัดการอย่างถูกต้อง

# แทนที่ connection strings แบบทางเดียว (กู้คืนไม่ได้)
- type: regex
content: "postgres://[^\\s]+"
mode: replace
replacement: "postgres://***"

การทำงานร่วมกับการตรวจจับตัวแปรสภาพแวดล้อม

หัวข้อที่มีชื่อว่า “การทำงานร่วมกับการตรวจจับตัวแปรสภาพแวดล้อม”

ตัวแปรสภาพแวดล้อมจะถูกรวบรวมก่อนเสมอ รายการที่กำหนดในไฟล์จะถูกเพิ่มต่อท้าย ดังนั้นรายการในไฟล์จึงสามารถครอบคลุมข้อมูลลับที่ไม่ได้อยู่ในตัวแปรสภาพแวดล้อม (ไฟล์คอนฟิก, ค่าที่ฝังในโค้ด, ฯลฯ) หากค่าเดียวกันปรากฏในทั้งสองแหล่ง โหมดของรายการในไฟล์จะมีความสำคัญกว่า

  • src/secrets/index.ts — การโหลด, การรวม, การรวบรวมตัวแปรสภาพแวดล้อม
  • src/secrets/obfuscator.ts — คลาส SecretObfuscator, การสร้างตัวแทน, การปกปิดข้อความ
  • src/secrets/regex.ts — การวิเคราะห์และคอมไพล์ regex literal
  • src/config/settings-schema.ts — คำนิยามการตั้งค่า secrets.enabled