دليل الأمان
نظرة سريعة
ما: ضوابط الأمان للثقة، التوقيعات، الإفصاح، والوصول لماذا: منع التلاعب بالأدلة وتقليل تعرض البيانات من: مهندسو الأمان، فرق الامتثال، مشغلو الإنتاج المتطلبات السابقة: evidence_flow_and_execution_model.md
وضعيات مسبقة
تقوم Decision Gate بشحن أربعة إعدادات مسبقة (انظر preset_configs.md):
- Quickstart-Dev: مصادقة محلية فقط، تجاوز السجل محلي فقط، تم تفعيل الإذن المطور.
- موصى به افتراضي: مصادقة محلية فقط مع خرائط رئيسية صريحة؛ تجاوز السجل غير مفعل.
- مُعزَّز: مصادقة الحامل، تعطيل مساحة الأسماء الافتراضية، يتطلب توقيع المخطط.
- Container-Prod: مصادقة حامل، إنهاء TLS في الاتجاه العلوي، إعدادات افتراضية بدون حالة.
هذه الإعدادات مسبقة الصنع واضحة عن عمد. إذا قمت بتغيير الوضعية (وضع المصادقة، الافتراضات الخاصة بالنطاق، ACL السجل، مسارات الثقة)، قم بتحديث الإعدادات المسبقة وأعد تشغيل اختبارات النظام.
فشل-مغلق العمارة
قرار بوابة يفشل مغلقة: الأدلة المفقودة أو غير الصالحة تنتج unknown، مما يحتجز البوابات.
تم تطبيق ضوابط الأمان (بالترتيب):
- حد أدنى لثقة المسار (
min_lane) - التحقق من الرابط (إذا تم تكوينه)
- التحقق من التوقيع (إذا لزم الأمر)
- تقييم المقارن (ثلاثي الحالة)
تحكم الوصول
الوصول إلى الأداة (API MCP)
يتم التحكم في الوصول إلى الأداة بواسطة [server.auth].
[server.auth]
mode = "bearer_token"
bearer_tokens = ["token-1", "token-2"]
allowed_tools = ["scenario_define", "scenario_start", "scenario_next"]
أنماط:
local_only(افتراضي): حلقة العودة + stdio فقطbearer_token: HTTPAuthorization: Bearer <token>مطلوبmtls: يستخدم رأسx-decision-gate-client-subjectمن وكيل موثوق ينهي TLS
ملاحظة السجل:
schema_registry.acl.allow_local_only = trueيتجاوز تعيين المبدأ للمتصلين المحليين فقط. استخدمه فقط لتوجيه المطورين/المستخدمين المحليين.
ربط غير دائري
ربط HTTP/SSE مع غير حلقة التكرار يتطلب جميع ما يلي:
--allow-non-loopbackأوDECISION_GATE_ALLOW_NON_LOOPBACK=1[server.tls]تم تكوينه أوserver.tls_termination = "upstream"- المصادقة غير المحلية (
bearer_tokenأوmtls)
لـ mtls داخل الحاوية، يجب تعيين server.tls.client_ca_path و require_client_cert = true. بالنسبة لإنهاء TLS في الاتجاه العلوي، فرض mTLS عند الوكيل وتمرير x-decision-gate-client-subject.
مسارات الثقة
يتم تصنيف الأدلة إلى مسارات:
- تم التحقق منه: دليل تم جلبه من المزود
- تم التأكيد: فحص مسبق للأحمال
يتم تطبيق الحد الأدنى للمسار بواسطة:
[trust]
min_lane = "verified" # or "asserted"
إذا كانت حارة الأدلة أقل من الحد الأدنى، تصبح الحالة غير معروفة ويتم تسجيل خطأ trust_lane في حزمة التشغيل.
وضع المطور المرن
[dev]
permissive = true
التأثيرات:
- يصبح
min_laneالفعالassertedلمعظم المزودين. - تبقى مقدمو الخدمة المدرجون في
dev.permissive_exempt_providersصارمين (افتراضي:assetcore,assetcore_read). - غير مسموح به عندما
namespace.authority.mode = "assetcore_http".
التحقق من التوقيع
تم تكوينه باستخدام trust.default_policy:
[trust]
# Require Ed25519 signatures from these public key files.
default_policy = { require_signature = { keys = ["/etc/decision-gate/keys/provider.pub"] } }
ملاحظات:
- كل إدخال في
keysهو مسار ملف. قد يحتوي ملف المفتاح على بايتات مفتاح عمومي خام بحجم 32 بايت أو نص بتنسيق base64. EvidenceResult.signature.key_idيجب أن يتطابق مع سلسلة مسار المفتاح المكونة.- يتم التحقق من التوقيع على JSON القياسي لـ HashDigest.
- إذا كان
evidence_hashموجودًا، يجب أن يتطابق مع الهاش القياسي لقيمة الدليل.
إذا فشل التحقق من التوقيع، فإن استدعاء المزود يفشل وتصبح الحالة unknown مع تسجيل provider_error.
تحقق من الرابط
يتم تكوين المراسي عبر تكوين الخادم، وليس السيناريو:
[anchors]
[[anchors.providers]]
provider_id = "assetcore_read"
anchor_type = "assetcore.anchor_set"
required_fields = ["assetcore.namespace_id", "assetcore.commit_id", "assetcore.world_seq"]
قواعد الربط (بالضبط):
EvidenceResult.evidence_anchor.anchor_typeيجب أن يتطابق.anchor_valueيجب أن يكون سلسلة تحتوي على JSON قياسي.- يجب أن يتم تحليل JSON إلى كائن.
- يجب أن توجد الحقول المطلوبة وأن تكون من نوع سلسلة نصية أو رقم (لا توجد قيم منطقية، مصفوفات، كائنات، أو قيم فارغة).
تنتج الانتهاكات anchor_invalid وتصبح الحالة unknown.
إفصاح الأدلة
evidence_query يمكن أن يعيد القيم الخام، لكن الكشف يخضع لسياسة التحكم:
[evidence]
allow_raw_values = false
require_provider_opt_in = true
[[providers]]
name = "json"
type = "builtin"
config = { root = "/var/lib/decision-gate/evidence", root_id = "evidence-root", max_bytes = 1048576, allow_yaml = false }
allow_raw = true
السلوك:
- إذا تم حظر الكشف الخام، يقوم Decision Gate بتحرير
valueوcontent_typeولكنه لا يزال يعيد الهاشات والمرتكزات. - هذا ليس خطأ JSON-RPC.
- أسماء المزودين فريدة؛ المعرفات المدمجة (
time,env,json,http) محجوزة.
معالجة الحمولة الخاصة بالتقديم/التفعيل
scenario_submit.payload و scenario_trigger.payload هما قنوات سجل التدقيق. يقوم Decision Gate بالاحتفاظ بهذه الحمولة في حالة التشغيل وقطع التشغيل حسب التصميم. يجب على التكاملات تجنب إرسال الأسرار الخام من خلال هذه الحقول.
النمط الموصى به:
- إرسال مراجع/مقابض غير شفافة في الحمولة.
- حل الأسرار من مدير أسرار مخصص خارج DG.
إعدادات الإنتاج الآمنة
[server]
transport = "http"
bind = "0.0.0.0:4000"
mode = "strict"
[server.auth]
mode = "bearer_token"
bearer_tokens = ["token-1"]
[server.tls]
cert_path = "/etc/decision-gate/tls/cert.pem"
key_path = "/etc/decision-gate/tls/key.pem"
[trust]
min_lane = "verified"
default_policy = { require_signature = { keys = ["/etc/decision-gate/keys/provider.pub"] } }
[evidence]
allow_raw_values = false
require_provider_opt_in = true
[anchors]
[[anchors.providers]]
provider_id = "json"
anchor_type = "file_path_rooted"
required_fields = ["root_id", "path"]
[namespace]
allow_default = false
[policy]
engine = "static"
[policy.static]
default = "deny"
[run_state_store]
type = "sqlite"
path = "/var/lib/decision-gate/decision-gate.db"
journal_mode = "wal"
sync_mode = "full"
مهم: بالنسبة للربط غير الدائري، أضف --allow-non-loopback أو قم بتعيين DECISION_GATE_ALLOW_NON_LOOPBACK=1.
سلامة SQLite
يخزن متجر حالة تشغيل SQLite لقطات JSON القياسية ويتحقق من التجزئات عند التحميل. الفساد أو عدم تطابق التجزئات يؤديان إلى الفشل المغلق.
أفضل الممارسات:
- استخدم حجمًا متينًا (تجنب
/tmp). - قم بعمل نسخة احتياطية من ملفات
.dbو-walو-shmمعًا.
الأخطاء الشائعة (تم تصحيحها)
- “أخطاء التوقيع تعيد signature_invalid.” -> لا. تظهر حالات فشل التوقيع كـ
provider_errorأثناء استدعاءات الموفر. - “سياسة الربط موجودة في السيناريو.” -> لا. تم تكوينها تحت
[anchors]. - “أداة التحكم في سياسة الوصول.” -> لا.
[policy]تتحكم في إرسال الحزم فقط. الوصول إلى الأداة هو[server.auth]. - “evidence_query returns an error when raw values are blocked.” -> لا. القيم محجوبة، وليست مرفوضة.