* feat(docs): mirror every docs/ page in all 65 locales Extends the documentation mirrors from the 22-page core set (#13940) to every Markdown page under docs/: 152 sources x 65 locales = 9,880 mirrors (6,208 new), language bars rewritten for the full locale list, state adopted so the blocking drift gate now covers all 152 pages. run-translation.mjs: an oversized block made only of table rows or list items (PROVIDER_REFERENCE.md 244-row table, FREE_TIERS.md 71-item list) is cut at item boundaries and rejoined without a blank line — the single 16-40 KB request outlived the backend socket for verbose scripts. 48 older mirrors whose tables had lost rows were retranslated with --force. * docs(i18n): refresh mirrors for the sources the base changed since the branch cut Section-level retranslation of the 29 docs (and README.md) whose source or mirrors moved on release/v3.8.51 during the run, then state adoption; the drift gate is green again on the merged tree.
24 KiB
Compliance & Audit (ไทย)
🌐 Languages: 🇺🇸 English · 🇪🇹 am · 🇸🇦 ar · 🇦🇿 az · 🇧🇬 bg · 🇧🇩 bn · 🇨🇿 cs · 🇩🇰 da · 🇩🇪 de · 🇬🇷 el · 🇪🇸 es · 🇪🇪 et · 🇮🇷 fa · 🇫🇮 fi · 🇫🇷 fr · 🇮🇪 ga · 🇮🇳 gu · 🇳🇬 ha · 🇮🇱 he · 🇮🇳 hi · 🇭🇷 hr · 🇭🇺 hu · 🇦🇲 hy · 🇮🇩 id · 🇳🇬 ig · 🇮🇹 it · 🇯🇵 ja · 🇬🇪 ka · 🇰🇭 km · 🇮🇳 kn · 🇰🇷 ko · 🇱🇹 lt · 🇱🇻 lv · 🇮🇳 ml · 🇮🇳 mr · 🇲🇾 ms · 🇲🇹 mt · 🇲🇲 my · 🇳🇵 ne · 🇳🇱 nl · 🇳🇴 no · 🇮🇳 or · 🇮🇳 pa · 🇵🇭 phi · 🇵🇱 pl · 🇵🇹 pt · 🇧🇷 pt-BR · 🇷🇴 ro · 🇷🇺 ru · 🇱🇰 si · 🇸🇰 sk · 🇸🇮 sl · 🇷🇸 sr · 🇸🇪 sv · 🇰🇪 sw · 🇮🇳 ta · 🇮🇳 te · 🇹🇷 tr · 🇺🇦 uk-UA · 🇵🇰 ur · 🇺🇿 uz · 🇻🇳 vi · 🇳🇬 yo · 🇨🇳 zh-CN · 🇹🇼 zh-TW
แหล่งข้อมูลอ้างอิงหลัก:
src/lib/compliance/,src/app/api/compliance/อัปเดตล่าสุด: 2026-06-28 — v3.8.40
OmniRoute บันทึกการดำเนินการของผู้ดูแลระบบ เหตุการณ์การยืนยันตัวตน การเปลี่ยนแปลงวงจรชีวิตของข้อมูลประจำตัวผู้ให้บริการ และการเรียกใช้เครื่องมือ MCP ลงในตารางตรวจสอบที่ใช้ SQLite เป็นฐาน หน้านี้อธิบายว่ามีการบันทึกข้อมูลใดบ้าง ข้อมูลถูกจัดเก็บไว้ที่ใด เก็บรักษาไว้นานเพียงใด คีย์ API สามารถเลือกไม่เข้าร่วมได้อย่างไร และวิธีสืบค้นข้อมูล
การใช้งานอยู่ใน src/lib/compliance/index.ts (T-43 — "การควบคุมการปฏิบัติตามข้อกำหนด") และ src/lib/compliance/providerAudit.ts การเขียนบันทึกการตรวจสอบจะไม่โยนข้อผิดพลาด โดยเมื่อเกิดความล้มเหลวใดๆ การเรียกจะถูกละเว้นโดยไม่มีการแจ้งเตือน เพื่อไม่ให้การบันทึกการตรวจสอบขัดขวางโฟลว์คำขอหลัก
ข้อมูลที่ถูกบันทึก
เหตุการณ์ตรวจสอบของผู้ดูแลระบบ (audit_log)
ทุกการเรียก logAuditEvent({ action, actor, target, details, ... }) จะสร้างข้อมูลหนึ่งแถว สตริงการดำเนินการใช้รูปแบบ domain.verb (หรือ domain.verb.outcome) ประเภทการดำเนินการที่ยืนยันว่ามีอยู่ในซอร์สโค้ด ได้แก่:
| การดำเนินการ | แหล่งที่มา |
|---|---|
auth.login.success |
src/app/api/auth/login/route.ts |
auth.login.failed |
src/app/api/auth/login/route.ts |
auth.login.locked |
src/app/api/auth/login/route.ts |
auth.login.error |
src/app/api/auth/login/route.ts |
auth.login.misconfigured |
src/app/api/auth/login/route.ts |
auth.login.setup_required |
src/app/api/auth/login/route.ts |
auth.logout.success |
src/app/api/auth/logout/route.ts |
provider.credentials.created |
src/app/api/providers/route.ts |
provider.credentials.updated |
src/app/api/providers/[id]/route.ts |
provider.credentials.revoked |
src/app/api/providers/[id]/route.ts |
provider.credentials.batch_revoked |
src/app/api/providers/route.ts |
sync.token.created |
src/app/api/sync/tokens/route.ts |
sync.token.revoked |
src/app/api/sync/tokens/[id]/route.ts |
compliance.cleanup |
src/lib/compliance/index.ts |
แต่ละรายการจะบันทึก action, actor (ค่าเริ่มต้นคือ "system"), target, details/metadata (JSON), ip_address, resource_type, status, request_id และ timestamp คีย์ที่มีข้อมูลละเอียดอ่อน (apiKey, accessToken, refreshToken, password, รายการใดๆ ที่ตรงกับ *token/*secret/*apikey เป็นต้น) จะถูกปกปิดแบบเรียกซ้ำเป็น "[redacted]" ก่อนเขียนข้อมูลลงในแถว
การเรียกใช้เครื่องมือ MCP (mcp_tool_audit)
ทุกการเรียกใช้เครื่องมือ MCP จะเขียนข้อมูลหนึ่งแถวผ่าน open-sse/mcp-server/audit.ts สคีมา (จาก src/lib/db/migrations/002_mcp_a2a_tables.sql):
| คอลัมน์ | หมายเหตุ |
|---|---|
id |
เพิ่มค่าโดยอัตโนมัติ |
tool_name |
ตัวระบุเครื่องมือ MCP |
input_hash |
sha256 ของอินพุต (ไม่มีการจัดเก็บเพย์โหลด) |
output_summary |
สรุปแบบย่อที่ถูกตัดให้สั้น |
duration_ms |
เวลาที่ผ่านไปจริง |
api_key_id |
ผู้เรียก (อนุญาตให้เป็นค่าว่าง) |
success |
1 / 0 |
error_code |
รหัสข้อผิดพลาดสุดท้ายเมื่อเกิดความล้มเหลว |
created_at |
การประทับเวลา ISO |
บันทึกคำขอ / การใช้งาน
ข้อมูลเหล่านี้เป็นเทเลเมทรีด้านการดำเนินงาน (ไม่ใช่การตรวจสอบของผู้ดูแลระบบโดยตรง) แต่ใช้กระบวนการเก็บรักษาข้อมูลเดียวกัน:
usage_history— สรุปการใช้งานต่อคำขอcall_logs— บันทึกแบบเต็มต่อคำขอ (อยู่ภายใต้ขีดจำกัดจำนวนแถว โปรดดูด้านล่าง)proxy_logs— บันทึกทราฟฟิกพร็อกซี (อยู่ภายใต้ขีดจำกัดจำนวนแถว)request_detail_logs— บันทึกรายละเอียดคำขอแบบเดิม (ยังคงถูกล้างข้อมูลหากมีอยู่)
สคีมาพื้นที่จัดเก็บข้อมูล
audit_log จะถูกสร้างแบบล่าช้าโดย ensureAuditLogSchema() เมื่อมีการใช้งานครั้งแรก:
CREATE TABLE IF NOT EXISTS audit_log (
id INTEGER PRIMARY KEY AUTOINCREMENT,
timestamp TEXT NOT NULL DEFAULT (datetime('now')),
action TEXT NOT NULL,
actor TEXT NOT NULL DEFAULT 'system',
target TEXT,
details TEXT,
ip_address TEXT,
resource_type TEXT,
status TEXT,
request_id TEXT,
metadata TEXT
);
ดัชนีจะถูกสร้างขึ้นบน timestamp, action, actor, resource_type,
status และ request_id คอลัมน์ที่ขาดหายไปในฐานข้อมูลรุ่นเก่าจะถูกเพิ่มผ่าน
ALTER TABLE ตามความจำเป็น
การเก็บรักษาและการล้างข้อมูล
ระบบรองรับระยะเวลาการเก็บรักษาแยกกันสองแบบ:
| ตัวแปรสภาพแวดล้อม | ค่าเริ่มต้น | ใช้กับ |
|---|---|---|
APP_LOG_RETENTION_DAYS |
7 |
audit_log, mcp_tool_audit |
CALL_LOG_RETENTION_DAYS |
7 |
usage_history, call_logs, proxy_logs, request_detail_logs |
CALL_LOGS_TABLE_MAX_ROWS |
100000 |
การตัดแต่งจำนวนแถวสูงสุดสำหรับ call_logs |
PROXY_LOGS_TABLE_MAX_ROWS |
100000 |
การตัดแต่งจำนวนแถวสูงสุดสำหรับ proxy_logs |
cleanupExpiredLogs() จะดำเนินการตามนโยบายการเก็บรักษา โดยจะถูกเรียกใช้เมื่อเซิร์ฟเวอร์เริ่มทำงาน
จาก src/instrumentation-node.ts การทำงานแต่ละครั้งจะบันทึกเหตุการณ์การตรวจสอบ
compliance.cleanup พร้อมจำนวนรายการที่ลบแยกตามตาราง การตัดแต่งบันทึกพร็อกซี/การเรียก
จะดำเนินการเป็นชุด (BATCH_SIZE = 5000) เพื่อหลีกเลี่ยงการล็อกการเขียนเป็นเวลานาน
การล้างประวัติคำขอด้วยตนเองจะแยกออกจากนโยบายการเก็บรักษา หน้า Request Logs
จะเรียก POST /api/settings/purge-request-history ซึ่งจะลบ call_logs,
request_detail_logs แบบเดิม และอาร์ติแฟกต์คำขอภายในเครื่องที่อยู่ภายใต้
${DATA_DIR}/call_logs/
ค่าเริ่มต้นกำหนดไว้ใน src/lib/logEnv.ts
(DEFAULT_APP_LOG_RETENTION_DAYS = 7, DEFAULT_CALL_LOG_RETENTION_DAYS = 7)
การเลือกไม่บันทึกด้วย noLog (ต่อคีย์ API)
คีย์ API สามารถถูกทำเครื่องหมายเพื่อไม่ให้บันทึกทราฟฟิกการเรียกปลายทางของคีย์นั้นได้
แฟล็กนี้อยู่ในตาราง api_keys (no_log INTEGER DEFAULT 0) และถูกทำสำเนา
ไปยังเซตในหน่วยความจำเพื่อใช้ค้นหาในเส้นทางที่ต้องการประสิทธิภาพสูง
# สร้างคีย์ที่ไม่บันทึกข้อมูล (ต้องมีสิทธิ์การจัดการ)
curl -X POST http://localhost:20128/api/keys \
-H "Cookie: auth_token=..." \
-H "Content-Type: application/json" \
-d '{"name": "Privacy key", "noLog": true}'
ฟังก์ชันช่วยเหลือ (src/lib/compliance/index.ts):
setNoLog(apiKeyId, true|false)— เปิดหรือปิดรายการในหน่วยความจำisNoLog(apiKeyId)— ตรวจสอบในเส้นทางคำขอ และหากไม่พบจะย้อนกลับไปอ่านจากapi_keys.no_logโดยแคชไว้เป็นเวลา 30 วินาทีNO_LOG_API_KEY_IDS(ตัวแปรสภาพแวดล้อม คั่นด้วยจุลภาค) — โหลดล่วงหน้าเข้าสู่เซตในหน่วยความจำ เมื่อเริ่มระบบ มีประโยชน์เมื่อคุณไม่สามารถสลับค่าคอลัมน์ได้โดยตรง
เหตุการณ์การตรวจสอบด้านการดูแลระบบ (การเข้าสู่ระบบ การเปลี่ยนแปลงผู้ให้บริการ การเรียกเครื่องมือ MCP ฯลฯ)
ไม่ได้ รับผลกระทบจาก noLog — มีเพียงการบันทึกทราฟฟิกต่อคำขอเท่านั้น
ที่ถูกเลือกไม่ให้บันทึก
REST API
| Endpoint | Method | Description | Auth |
|---|---|---|---|
/api/compliance/audit-log |
GET |
รายการบันทึกการตรวจสอบของผู้ดูแลระบบแบบแบ่งหน้าพร้อมตัวกรอง | การจัดการ |
/api/mcp/audit |
GET |
รายการบันทึกการตรวจสอบเครื่องมือ MCP แบบแบ่งหน้า | (open-sse) |
/api/mcp/audit/stats |
GET |
สถิติการตรวจสอบ MCP แบบรวม | (open-sse) |
ปัจจุบันยังไม่มี endpoint สำหรับส่งออก CSV — ให้ส่งออกจากแดชบอร์ดหรือสืบค้น ฐานข้อมูล SQLite โดยตรง
การสืบค้น /api/compliance/audit-log
พารามิเตอร์การสืบค้นที่รองรับ (ทั้งหมดเป็นทางเลือก และตัวกรองข้อความทั้งหมดใช้
การจับคู่แบบ LIKE %value%):
action,actor,target,resourceType(หรือresource_type),status,requestId(หรือrequest_id)from/since,to/until— การประทับเวลาแบบ ISOlimit(ค่าเริ่มต้น50, ต่ำสุด1, สูงสุด500)offset(ค่าเริ่มต้น0, สูงสุด10_000)
การตอบกลับเป็นอาร์เรย์ JSON โดยข้อมูลเมตาของการแบ่งหน้าจะถูกส่งกลับมาในส่วนหัว:
x-total-count, x-page-limit, x-page-offset
curl "http://localhost:20128/api/compliance/audit-log?action=provider.credentials&from=2026-05-01" \
-H "Cookie: auth_token=..."
แดชบอร์ด
แดชบอร์ดแสดงข้อมูลการตรวจสอบที่ /dashboard/audit
(src/app/(dashboard)/dashboard/audit/page.tsx) โดยหน้าดังกล่าวมีสองแท็บ:
- การปฏิบัติตามข้อกำหนด (
ComplianceTab.tsx) — เหตุการณ์การตรวจสอบของผู้ดูแลระบบจาก/api/compliance/audit-logกรองตามประเภทเหตุการณ์ ระดับความรุนแรง (ข้อมูล / คำเตือน / วิกฤต ซึ่งอนุมานจาก action + status) และช่วงวันที่ โดยระดับความรุนแรงจะ คำนวณฝั่งไคลเอนต์จากสตริง action/status - MCP (
McpAuditTab.tsx) — การตรวจสอบเครื่องมือ MCP จาก/api/mcp/auditพร้อม ตัวกรองตามชื่อเครื่องมือและสถานะสำเร็จ/ล้มเหลว
ทั้งสองแท็บแบ่งหน้าโดยใช้ขนาดหน้าที่ 50 (การปฏิบัติตามข้อกำหนด) และ 25 (MCP)
ตัวช่วยสำหรับข้อมูลรับรองของผู้ให้บริการ
src/lib/compliance/providerAudit.ts มีตัวช่วยในการจัดรูปแบบข้อมูลซึ่งใช้โดย
route สำหรับการจัดการผู้ให้บริการเมื่อมีการส่งเหตุการณ์เกี่ยวกับข้อมูลรับรอง:
summarizeProviderConnectionForAudit(connection)— ลบapiKey,accessToken,refreshToken,idTokenและproviderSpecificData.consoleApiKeyออกก่อนเขียนสแนปช็อตการเชื่อมต่อลงในdetailsgetProviderAuditTarget(connection)— ประกอบสตริง"<provider>:<name|id>"ที่คงที่สำหรับฟิลด์targetextractProviderWarnings(...payloads)— สแกนการตอบกลับของผู้ให้บริการเพื่อหา คำเตือนด้านนโยบาย/ความปลอดภัย ([sanitizer],prompt injection detected,content has been filtered,safety filter,policy violation) และ แสดงผลการตรวจพบสูงสุด 5 รายการ โดยแต่ละรายการจะถูกตัดให้เหลือ 400 อักขระ
แนวทางปฏิบัติที่ดีที่สุด
- ทำเครื่องหมาย API key ที่จัดการ PII (ข้อมูลทางกฎหมาย การแพทย์ ฯลฯ) ด้วย
noLog: true - ปรับแต่ง
APP_LOG_RETENTION_DAYS/CALL_LOG_RETENTION_DAYSให้ตรงกับ นโยบายการเก็บรักษาข้อมูลของคุณ โดยค่าเริ่มต้น 7 วันเป็นค่าที่รัดกุม - ส่งออกตารางการตรวจสอบไปไว้นอกแพลตฟอร์ม (
sqlite3 dump) ตามรอบเวลาใดก็ตาม ที่โปรแกรมการปฏิบัติตามข้อกำหนดของคุณกำหนด — ไม่มีระบบจัดเก็บถาวรในตัว - ติดตามจำนวน
auth.login.failedและauth.login.lockedเพื่อตรวจจับ การโจมตีแบบ brute-force - เมื่อเพิ่ม endpoint สำหรับผู้ดูแลระบบใหม่ ให้เรียก
logAuditEvent({ ... })ด้วยสตริง action แบบdomain.verb.outcomeที่คงที่ และส่งบริบทของคำขอผ่านgetAuditRequestContext(request)เพื่อให้บันทึก IP และrequestIdโดยอัตโนมัติ
ดูเพิ่มเติม
docs/security/GUARDRAILS.md— การปกปิด PII, การแทรกพรอมต์docs/frameworks/MCP-SERVER.md— แค็ตตาล็อกเครื่องมือและขอบเขตของ MCPdocs/reference/ENVIRONMENT.md— เอกสารอ้างอิงตัวแปรสภาพแวดล้อมฉบับเต็ม- ซอร์ส:
src/lib/compliance/,src/app/api/compliance/,src/app/api/mcp/audit/,src/lib/logEnv.ts