Gateway
إدارة الأسرار
يدعم OpenClaw مراجع SecretRefs الإضافية، بحيث لا يلزم تخزين بيانات الاعتماد المدعومة كنص صريح في الإعدادات.
نموذج وقت التشغيل
- تُحل الأسرار إلى لقطة وقت تشغيل داخل الذاكرة، بشكل استباقي أثناء التنشيط، وليس بشكل كسول في مسارات الطلبات.
- يفشل بدء التشغيل سريعًا عندما يتعذر حل SecretRef نشط فعليًا.
- إعادة التحميل تبديل ذري: إما نجاح كامل، وإما الاحتفاظ بآخر لقطة سليمة معروفة.
- تؤدي انتهاكات السياسة (مثل دمج ملف تعريف مصادقة يعمل بوضع OAuth مع إدخال SecretRef) إلى فشل التنشيط قبل تبديل لقطة وقت التشغيل.
- لا تقرأ طلبات وقت التشغيل إلا اللقطة النشطة داخل الذاكرة. تمر بيانات اعتماد SecretRef الخاصة بموفّر النموذج عبر تخزين المصادقة وخيارات البث في صورة علامات حارسة محلية للعملية حتى الخروج. كما تقرأ مسارات التسليم الصادر (تسليم الردود/سلاسل المحادثات في Discord وعمليات إرسال الإجراءات في Telegram) تلك اللقطة، ولا تعيد حل المراجع عند كل إرسال.
يُبقي هذا انقطاعات موفّري الأسرار خارج مسارات الطلبات الحساسة للأداء.
الحقن عند الخروج (العلامات الحارسة)
بالنسبة إلى بيانات اعتماد موفّري النماذج المدعومة بواسطة SecretRefs، ينشئ OpenClaw علامة حارسة مبهمة ومحلية للعملية أثناء حل مصادقة النموذج. لذلك ترى عمليات تخزين المصادقة وخيارات البث وإعدادات SDK والسجلات وكائنات الأخطاء ومعظم عمليات فحص وقت التشغيل قيمة مثل oc-sent-v1-...، لا بيانات اعتماد الموفّر. يستبدل جلب النموذج المحمي وفحوصات سلامة الموفّر المحلي المُدار العلامات الحارسة المعروفة في قيم عناوين URL والترويسات مباشرة قبل مغادرة كل طلب للعملية.
تُرفض القيم غير المعروفة التي تتخذ شكل علامة حارسة قبل حدوث أي نشاط شبكي. يرفض OpenClaw إرسال الطلب بدلًا من تمرير علامة حارسة غير محلولة إلى موفّر. كما تُسجَّل قيم الأسرار المحلولة لحجبها في السجلات عند التطابق التام، بوصف ذلك إجراءً دفاعيًا متعدد الطبقات.
تستخدم محوّلات الموفّرين أحدث نقطة حقن تدعمها حزمة SDK الخاصة بها:
- تتلقى حزم SDK التي توفر خيار جلب مخصص عملية الجلب المحمية من OpenClaw، ولذلك تحتفظ حزمة SDK بالعلامة الحارسة.
- تفك حزم SDK التي لا توفر خيار جلب مخصص العلامة الحارسة مباشرة قبل إنشاء العميل. وتفك تدفقات الموفّرين المملوكة لـ Plugin وأطر تشغيل الوكلاء العلامة عند نقطة التسليم النهائية المملوكة للنواة، لأن وسائل النقل هذه لا تشارك عملية الجلب المحمية الخاصة بـ OpenClaw.
تقلل العلامات الحارسة انكشاف النص الصريح عبر سلسلة استدعاء النموذج، لكنها لا توفر عزلًا للعملية. تظل القيمة الحقيقية موجودة في ذاكرة العملية نفسها، وتظهر عند حد المحوّل النهائي. وتظل بيانات اعتماد البيئة النصية الصريحة التي لم تُضبط عبر SecretRefs نصًا صريحًا وخارج هذه الآلية.
عيّن OPENCLAW_SECRET_SENTINELS=off (ويقبل أيضًا 0 أو false، دون حساسية لحالة الأحرف) لتعطيل إنشاء العلامات الحارسة أثناء الاستجابة للحوادث أو استكشاف مشكلات التوافق وإصلاحها. لا يعطّل مفتاح الإيقاف تسجيل الحجب عند التطابق التام للقيم.
حدود وصول الوكيل
تمنع SecretRefs حفظ بيانات الاعتماد بشكل دائم في الإعدادات وملفات النماذج المُنشأة، لكنها لا تمثل حدًا لعزل العملية. يظل بيان الاعتماد النصي الصريح المتروك على القرص ضمن مسار يستطيع الوكيل قراءته قابلًا للقراءة عبر أدوات الملفات أو الصدفة، متجاوزًا الحجب على مستوى API.
بالنسبة إلى عمليات النشر الإنتاجية التي تدخل فيها الملفات القابلة للوصول بواسطة الوكيل ضمن النطاق، لا يُعد الترحيل مكتملًا إلا عند تحقق كل ما يأتي:
- تستخدم بيانات الاعتماد المدعومة SecretRefs بدلًا من القيم النصية الصريحة.
- تُزال بقايا النص الصريح القديمة من
openclaw.jsonوauth-profiles.jsonو.envوملفاتmodels.jsonالمُنشأة. - يكون
openclaw secrets audit --checkخاليًا من المشكلات بعد الترحيل. - تُحمى أي بيانات اعتماد متبقية غير مدعومة أو دورية التغيير بواسطة عزل نظام التشغيل أو عزل الحاويات أو وكيل خارجي لبيانات الاعتماد.
لهذا السبب يُعد سير عمل التدقيق/الضبط/التطبيق بوابة ترحيل أمنية، وليس مجرد أداة مساعدة للراحة.
تصفية الأسطح النشطة
لا تُتحقق صلاحية SecretRefs إلا على الأسطح النشطة فعليًا:
- الأسطح المفعّلة: تمنع المراجع غير المحلولة بدء التشغيل/إعادة التحميل.
- الأسطح غير النشطة: لا تمنع المراجع غير المحلولة بدء التشغيل/إعادة التحميل؛ بل تصدر تشخيص
SECRETS_REF_IGNORED_INACTIVE_SURFACEغير فادح.
أمثلة على الأسطح غير النشطة
- إدخالات القنوات/الحسابات المعطّلة.
- بيانات اعتماد القناة ذات المستوى الأعلى التي لا يرثها أي حساب مفعّل.
- أسطح الأدوات/الميزات المعطّلة.
- المفاتيح الخاصة بموفّري بحث الويب الذين لم يحددهم
tools.web.search.provider. في الوضع التلقائي (عندما لا يكون الموفّر معينًا)، تُفحص المفاتيح وفق ترتيب الأولوية للاكتشاف التلقائي حتى يُحل أحدها؛ وبعد الاختيار، تصبح مفاتيح الموفّرين غير المحددين غير نشطة. - تكون مواد مصادقة SSH لصندوق العزل (
agents.defaults.sandbox.ssh.identityDataوcertificateDataوknownHostsData، إضافة إلى التجاوزات الخاصة بكل وكيل) نشطة فقط عندما تكون الواجهة الخلفية الفعلية لصندوق العزل هيsshولا يكون وضع صندوق العزل هوoff، وذلك للوكيل الافتراضي أو لوكيل مفعّل. - تكون SecretRefs الخاصة بـ
gateway.remote.token/gateway.remote.passwordنشطة إذا تحقق أي مما يأتي: gateway.mode=remote- يكون
gateway.remote.urlمضبوطًا - يكون
gateway.tailscale.modeهوserveأوfunnel - في الوضع المحلي من دون تلك الأسطح البعيدة: يكون
gateway.remote.tokenنشطًا عندما يمكن لمصادقة الرمز أن تكون الغالبة ولا يكون أي رمز بيئة/مصادقة مضبوطًا؛ ولا يكونgateway.remote.passwordنشطًا إلا عندما يمكن لمصادقة كلمة المرور أن تكون الغالبة ولا تكون أي كلمة مرور بيئة/مصادقة مضبوطة. - يكون SecretRef الخاص بـ
gateway.auth.tokenغير نشط لحل مصادقة بدء التشغيل عندما يكونOPENCLAW_GATEWAY_TOKENمعينًا، لأن إدخال رمز البيئة تكون له الغلبة في وقت التشغيل ذاك.
تشخيصات سطح مصادقة Gateway
عند تعيين SecretRef على gateway.auth.token أو gateway.auth.password أو gateway.remote.token أو gateway.remote.password، يسجل بدء تشغيل Gateway/إعادة تحميله حالة السطح تحت الرمز SECRETS_GATEWAY_AUTH_SURFACE:
active: يشكل SecretRef جزءًا من سطح المصادقة الفعلي ويجب حله.inactive: تكون الغلبة لسطح مصادقة آخر، أو تكون المصادقة البعيدة معطّلة/غير نشطة.
يتضمن إدخال السجل السبب الذي استخدمته سياسة السطح النشط.
الفحص المسبق لمراجع الإعداد الأولي
في الإعداد الأولي التفاعلي، يؤدي اختيار تخزين SecretRef إلى تشغيل تحقق مسبق قبل الحفظ:
- مراجع البيئة: تتحقق من اسم متغير البيئة وتؤكد ظهور قيمة غير فارغة أثناء الإعداد.
- مراجع الموفّر (
fileأوexec): تتحقق من اختيار الموفّر، وتحلid، وتفحص نوع القيمة المحلولة. - مسار البدء السريع: عندما يكون
gateway.auth.tokenبالفعل SecretRef، يحله الإعداد الأولي قبل تشغيل المسبار/لوحة المعلومات (بالنسبة إلى مراجعenvوfileوexec) باستخدام بوابة الفشل السريع نفسها.
يُظهر فشل التحقق الخطأ ويتيح إعادة المحاولة.
عقد SecretRef
شكل كائن واحد في كل المواضع:
{ source: "env" | "file" | "exec", provider: "default", id: "..." }env
{ source: "env", provider: "default", id: "OPENAI_API_KEY" }تُقبل أيضًا السلاسل المختصرة في حقول SecretInput:
"${OPENAI_API_KEY}""$OPENAI_API_KEY"التحقق:
- يجب أن يطابق
providerالقيمة^[a-z][a-z0-9_-]{0,63}$ - يجب أن يطابق
idالقيمة^[A-Z][A-Z0-9_]{0,127}$
file
{ source: "file", provider: "filemain", id: "/providers/openai/apiKey" }التحقق:
- يجب أن يطابق
providerالقيمة^[a-z][a-z0-9_-]{0,63}$ - يجب أن يكون
idمؤشر JSON مطلقًا (/...) أو القيمة الحرفيةvalueلموفّريsingleValue - تهريب RFC 6901 في المقاطع: يصبح
~هو~0، ويصبح/هو~1
exec
{ source: "exec", provider: "vault", id: "providers/openai/apiKey#value" }التحقق:
- يجب أن يطابق
providerالقيمة^[a-z][a-z0-9_-]{0,63}$ - يجب أن يطابق
idالقيمة^[A-Za-z0-9][A-Za-z0-9._:/#-]{0,255}$(يدعم محددات مثلsecret#json_key) - يجب ألا يحتوي
idعلى.أو..بوصفهما مقطعي مسار محددين بشرطات مائلة (على سبيل المثال، يُرفضa/../b)
إعداد الموفّر
عرّف الموفّرين ضمن secrets.providers:
{ secrets: { providers: { default: { source: "env" }, filemain: { source: "file", path: "~/.openclaw/secrets.json", mode: "json", // أو "singleValue" }, vault: { source: "exec", command: "/usr/local/bin/openclaw-vault-resolver", args: ["--profile", "prod"], passEnv: ["PATH", "VAULT_ADDR"], jsonOnly: true, }, "team-secrets": { source: "exec", pluginIntegration: { pluginId: "acme-secrets", integrationId: "secret-store", }, }, }, defaults: { env: "default", file: "filemain", exec: "vault", }, resolution: { maxProviderConcurrency: 4, maxRefsPerProvider: 512, maxBatchBytes: 262144, }, },}موفّر البيئة
- قائمة سماح اختيارية للأسماء المطابقة تمامًا عبر
allowlist. - يؤدي غياب قيم البيئة أو فراغها إلى فشل الحل.
موفّر الملفات
- يقرأ الملف المحلي في
path. - يتوقع
mode: "json"(الافتراضي) حمولة كائن JSON ويحلidبوصفه مؤشر JSON. - يتوقع
mode: "singleValue"معرّف المرجع"value"ويعيد محتويات الملف الخام (مع إزالة السطر الجديد اللاحق). - يجب أن يجتاز المسار فحوصات الملكية/الأذونات؛ ويحد
timeoutMs(القيمة الافتراضية 5000) وmaxBytes(القيمة الافتراضية 1 MiB) من القراءة. - الإغلاق الآمن في Windows: إذا تعذر التحقق من ACL للمسار، يفشل الحل. بالنسبة إلى المسارات الموثوقة فقط، عيّن
allowInsecurePath: trueعلى ذلك الموفّر لتجاوز الفحص.
موفّر التنفيذ
- يشغّل مسار الملف التنفيذي المطلق المُعدّ مباشرةً، من دون shell.
- افتراضيًا، يجب أن يكون
commandملفًا عاديًا، وليس رابطًا رمزيًا. اضبطallowSymlinkCommand: trueللسماح بمسارات الأوامر ذات الروابط الرمزية (مثل واجهات Homebrew الوسيطة)، واقرنه بـtrustedDirs(مثل["/opt/homebrew"]) بحيث لا تتأهل إلا مسارات مدير الحزم. - يدعم
timeoutMs(القيمة الافتراضية 5000)، وnoOutputTimeoutMs(القيمة الافتراضية تساويtimeoutMs)، وmaxOutputBytes(القيمة الافتراضية 1 MiB)، وقائمة السماحenv/passEnv، وtrustedDirs. - تكون القيمة الافتراضية لـ
jsonOnlyهيtrue. عند استخدامjsonOnly: falseوطلب معرّف واحد، يُقبل الخرج النصي العادي غير المنسّق بصيغة JSON من stdout بوصفه قيمة ذلك المعرّف. - إغلاق آمن عند الفشل على Windows: إذا تعذّر التحقق من ACL لمسار الأمر، يفشل الحل. للمسارات الموثوقة فقط، اضبط
allowInsecurePath: trueعلى ذلك الموفّر لتجاوز الفحص. - يمكن لموفّري التنفيذ الذين تديرهم Plugin استخدام
pluginIntegrationبدلًا منcommand/argsمنسوخَين. يحلّ OpenClaw تفاصيل الأمر الحالية من بيان Plugin المثبّت أثناء بدء التشغيل/إعادة التحميل؛ وإذا كانت Plugin معطّلة أو محذوفة أو غير موثوقة أو لم تعد تعلن عن التكامل، تفشل مراجع SecretRef النشطة لدى ذلك الموفّر بإغلاق آمن.
حمولة الطلب (stdin):
{ "protocolVersion": 1, "provider": "vault", "ids": ["providers/openai/apiKey"] }حمولة الاستجابة (stdout):
{ "protocolVersion": 1, "values": { "providers/openai/apiKey": "<openai-api-key>" } } // pragma: allowlist secretأخطاء اختيارية لكل معرّف:
{"protocolVersion": 1,"values": {},"errors": { "providers/openai/apiKey": { "code": "NOT_FOUND" } }}يمثّل code تشخيصًا اختياريًا قابلًا للقراءة آليًا. يعرض OpenClaw
الرمزين المعروفين NOT_FOUND وAMBIGUOUS_DUPLICATE_KEY مع الموفّر ومعرّف المرجع. تُقبل الرموز
الأخرى والحقول حرة التنسيق مثل message للتوافق مع الإصدار الأول من البروتوكول،
لكنها لا تُعرض لأن خرج أداة الحل قد يحتوي على مواد اعتماد.
مفاتيح API المدعومة بملفات
لا تضع سلاسل file:... في كتلة env ضمن الإعداد. هذه الكتلة حرفية ولا تتجاوز القيم، لذلك لا يُحلّ file:... فيها مطلقًا.
استخدم بدلًا من ذلك SecretRef لملف في حقل بيانات اعتماد مدعوم:
{ secrets: { providers: { xai_key_file: { source: "file", path: "~/.openclaw/secrets/xai-api-key.txt", mode: "singleValue", }, }, }, models: { providers: { xai: { apiKey: { source: "file", provider: "xai_key_file", id: "value" }, }, }, },}بالنسبة إلى mode: "singleValue"، يكون id الخاص بـ SecretRef هو "value". وبالنسبة إلى mode: "json"، استخدم مؤشر JSON مطلقًا مثل "/providers/xai/apiKey".
راجع سطح بيانات اعتماد SecretRef لمعرفة الحقول التي تقبل مراجع SecretRef.
أمثلة على تكامل التنفيذ
للحصول على دليل مخصص لـ 1Password يغطي حسابات الخدمة وSkills الوكيل المضمّنة واستكشاف الأخطاء وإصلاحها، راجع 1Password.
CLI لـ 1Password
{ secrets: { providers: { onepassword_openai: { source: "exec", command: "/opt/homebrew/bin/op", allowSymlinkCommand: true, // مطلوب للملفات التنفيذية المرتبطة رمزيًا بواسطة Homebrew trustedDirs: ["/opt/homebrew"], args: ["read", "op://Personal/OpenClaw QA API Key/password"], passEnv: ["HOME"], jsonOnly: false, }, }, }, models: { providers: { openai: { baseUrl: "https://api.openai.com/v1", models: [{ id: "gpt-5", name: "gpt-5" }], apiKey: { source: "exec", provider: "onepassword_openai", id: "value" }, }, }, },}Bitwarden Secrets Manager (`bws`)
استخدم غلاف أداة حل لربط معرّفات SecretRef بمفاتيح عناصر Bitwarden Secrets Manager. يتضمن المستودع scripts/secrets/openclaw-bws-resolver.mjs؛ ثبّته أو انسخه إلى مسار مطلق موثوق على المضيف الذي يشغّل Gateway.
المتطلبات:
- تثبيت CLI لـ Bitwarden Secrets Manager (
bws) على مضيف Gateway. - إتاحة
BWS_ACCESS_TOKENلخدمة Gateway. - تمرير
PATHإلى أداة الحل، أو ضبطBWS_BINعلى المسار المطلق لملفbwsالتنفيذي. - ضبط
BWS_SERVER_URLفي البيئة عند استخدام مثيل Bitwarden مستضاف ذاتيًا.
{ secrets: { providers: { bws: { source: "exec", command: "/usr/local/bin/openclaw-bws-resolver.mjs", passEnv: ["BWS_ACCESS_TOKEN", "BWS_SERVER_URL", "PATH", "BWS_BIN"], jsonOnly: true, }, }, }, models: { providers: { openai: { baseUrl: "https://api.openai.com/v1", models: [{ id: "gpt-5", name: "gpt-5" }], apiKey: { source: "exec", provider: "bws", id: "openclaw/providers/openai/apiKey", }, }, }, },}تجمع أداة الحل معرّفات الطلبات في دفعات، وتشغّل bws secret list، وتعيد قيم حقول key السرية المطابقة. استخدم مفاتيح تستوفي عقد معرّف SecretRef للتنفيذ، مثل openclaw/providers/openai/apiKey؛ أما المفاتيح بنمط متغيرات البيئة التي تحتوي على شرطات سفلية فتُرفض قبل تشغيل أداة الحل. إذا اشترك أكثر من سر ظاهر في Bitwarden في المفتاح المطلوب، تفشل أداة الحل لذلك المعرّف لكونه ملتبسًا بدلًا من التخمين. بعد تحديث الإعداد، تحقق من مسار أداة الحل:
openclaw secrets audit --allow-execCLI لـ HashiCorp Vault
{ secrets: { providers: { vault_openai: { source: "exec", command: "/opt/homebrew/bin/vault", allowSymlinkCommand: true, // مطلوب للملفات التنفيذية المرتبطة رمزيًا بواسطة Homebrew trustedDirs: ["/opt/homebrew"], args: ["kv", "get", "-field=OPENAI_API_KEY", "secret/openclaw"], passEnv: ["VAULT_ADDR", "VAULT_TOKEN"], jsonOnly: false, }, }, }, models: { providers: { openai: { baseUrl: "https://api.openai.com/v1", models: [{ id: "gpt-5", name: "gpt-5" }], apiKey: { source: "exec", provider: "vault_openai", id: "value" }, }, }, },}password-store (`pass`)
استخدم غلاف أداة حل صغيرًا لربط معرّفات SecretRef مباشرةً بإدخالات pass. احفظه كملف تنفيذي في مسار مطلق يجتاز فحوصات مسار موفّر التنفيذ لديك، مثل /usr/local/bin/openclaw-pass-resolver. يحلّ سطر التوجيه #!/usr/bin/env node الملف node من PATH الخاص بعملية أداة الحل، لذا ضمّن PATH في passEnv. إذا لم يكن pass موجودًا في PATH ذاك، فاضبط PASS_BIN في البيئة الأصلية وضمّنه أيضًا في passEnv:
#!/usr/bin/env nodeconst { spawnSync } = require("node:child_process"); let stdin = "";process.stdin.setEncoding("utf8");process.stdin.on("data", (chunk) => { stdin += chunk;});process.stdin.on("error", (err) => { process.stderr.write(`${err.message}\n`); process.exit(1);});process.stdin.on("end", () => { let request; try { request = JSON.parse(stdin || "{}"); } catch (err) { process.stderr.write(`تعذّر تحليل الطلب: ${err.message}\n`); process.exit(1); } const passBin = process.env.PASS_BIN || "pass"; const values = {}; const errors = {}; for (const id of request.ids ?? []) { const result = spawnSync(passBin, ["show", id], { encoding: "utf8" }); if (result.status === 0) { values[id] = result.stdout.split(/\r?\n/, 1)[0] ?? ""; } else { errors[id] = { message: (result.stderr || `خرج pass بالحالة ${result.status}`).trim() }; } } process.stdout.write(JSON.stringify({ protocolVersion: 1, values, errors }));});ثم أعدّ موفّر التنفيذ ووجّه apiKey إلى مسار إدخال pass:
{ secrets: { providers: { pass_store: { source: "exec", command: "/usr/local/bin/openclaw-pass-resolver", passEnv: ["PATH", "HOME", "GNUPGHOME", "GPG_TTY", "PASSWORD_STORE_DIR", "PASS_BIN"], jsonOnly: true, }, }, }, models: { providers: { openai: { baseUrl: "https://api.openai.com/v1", models: [{ id: "gpt-5", name: "gpt-5" }], apiKey: { source: "exec", provider: "pass_store", id: "openclaw/providers/openai/apiKey", }, }, }, },}احتفظ بالسر في السطر الأول من إدخال pass، أو خصّص الغلاف لإعادة خرج pass show كاملًا بدلًا من ذلك. بعد تحديث الإعداد، تحقق من كل من التدقيق الثابت ومسار أداة حل التنفيذ:
openclaw secrets audit --checkopenclaw secrets audit --allow-execsops
{ secrets: { providers: { sops_openai: { source: "exec", command: "/opt/homebrew/bin/sops", allowSymlinkCommand: true, // مطلوب للملفات التنفيذية المرتبطة رمزيًا بواسطة Homebrew trustedDirs: ["/opt/homebrew"], args: ["-d", "--extract", '["providers"]["openai"]["apiKey"]', "/path/to/secrets.enc.json"], passEnv: ["SOPS_AGE_KEY_FILE"], jsonOnly: false, }, }, }, models: { providers: { openai: { baseUrl: "https://api.openai.com/v1", models: [{ id: "gpt-5", name: "gpt-5" }], apiKey: { source: "exec", provider: "sops_openai", id: "value" }, }, }, },}متغيرات بيئة خادم MCP
تقبل متغيرات بيئة خادم MCP المُعدّة عبر plugins.entries.acpx.config.mcpServers النوع SecretInput، مما يُبقي مفاتيح API والرموز المميزة خارج الإعداد ذي النص الصريح:
{ plugins: { entries: { acpx: { enabled: true, config: { mcpServers: { github: { command: "npx", args: ["-y", "@modelcontextprotocol/server-github"], env: { GITHUB_PERSONAL_ACCESS_TOKEN: { source: "env", provider: "default", id: "MCP_GITHUB_PAT", }, }, }, }, }, }, }, },}تظل القيم النصية الصريحة صالحة. تُحلّ مراجع قوالب البيئة مثل ${MCP_SERVER_API_KEY} وكائنات SecretRef أثناء تنشيط Gateway، قبل إنشاء عملية خادم MCP. وكما هو الحال مع أسطح SecretRef الأخرى، لا تمنع المراجع غير المحلولة التنشيط إلا عندما تكون Plugin acpx نشطة فعليًا.
مواد مصادقة SSH لصندوق العزل
يدعم أيضًا برنامج الواجهة الخلفية الأساسي لصندوق العزل ssh مراجع SecretRef لمواد مصادقة SSH:
{ agents: { defaults: { sandbox: { mode: "all", backend: "ssh", ssh: { target: "user@gateway-host:22", identityData: { source: "env", provider: "default", id: "SSH_IDENTITY" }, certificateData: { source: "env", provider: "default", id: "SSH_CERTIFICATE" }, knownHostsData: { source: "env", provider: "default", id: "SSH_KNOWN_HOSTS" }, }, }, }, },}سلوك وقت التشغيل:
- يحل OpenClaw هذه المراجع أثناء تفعيل بيئة العزل، وليس بصورة كسولة عند كل استدعاء SSH.
- تُكتب القيم المحلولة في دليل مؤقت بأذونات ملفات مقيّدة (
0o600)، وتُستخدم في إعداد SSH المُنشأ. - إذا لم تكن الواجهة الخلفية الفعلية لبيئة العزل هي
ssh(أو كان وضع بيئة العزل هوoff)، فتبقى هذه المراجع غير نشطة ولا تعوق بدء التشغيل.
نطاق بيانات الاعتماد المدعوم
ترد بيانات الاعتماد الأساسية المدعومة وغير المدعومة في نطاق بيانات اعتماد SecretRef.
السلوك المطلوب والأسبقية
- الحقل من دون مرجع: لا يتغير.
- الحقل المزود بمرجع: مطلوب على الأسطح النشطة أثناء التفعيل.
- إذا وُجد كل من النص الصريح والمرجع، تكون الأسبقية للمرجع في مسارات الأسبقية المدعومة.
- القيمة الحارسة للتنقيح
__OPENCLAW_REDACTED__محجوزة للتنقيح والاستعادة الداخليين للإعداد، وتُرفض إذا أُرسلت بوصفها بيانات إعداد حرفية.
إشارات التحذير والتدقيق:
SECRETS_REF_OVERRIDES_PLAINTEXT(تحذير وقت التشغيل)REF_SHADOWED(نتيجة تدقيق عندما تكون لبيانات اعتمادauth-profiles.jsonالأسبقية على مراجعopenclaw.json)
توافق Google Chat: تكون الأسبقية لـ serviceAccountRef على serviceAccount ذي النص الصريح؛ وتُتجاهل قيمة النص الصريح بمجرد تعيين المرجع الشقيق.
مشغلات التفعيل
يُنفّذ تفعيل الأسرار عند:
- بدء التشغيل (الفحص المسبق ثم التفعيل النهائي)
- مسار التطبيق الفوري لإعادة تحميل الإعداد
- مسار التحقق من إعادة التشغيل عند إعادة تحميل الإعداد
- إعادة التحميل اليدوية عبر
secrets.reload - الفحص المسبق لاستدعاء RPC لكتابة إعداد Gateway (
config.set/config.apply/config.patch)؛ إذ يتحقق من قابلية حل SecretRef على الأسطح النشطة ضمن حمولة الإعداد المُرسلة قبل حفظ التعديلات
عقد التفعيل:
- يستبدل النجاح اللقطة ذريًا.
- يؤدي فشل بدء التشغيل إلى إلغاء بدء تشغيل Gateway.
- يُبقي فشل إعادة التحميل في وقت التشغيل آخر لقطة سليمة معروفة.
- يرفض فشل الفحص المسبق لاستدعاء RPC الخاص بالكتابة الإعداد المُرسل؛ ويظل كل من إعداد القرص ولقطة وقت التشغيل النشطة من دون تغيير.
- لا يؤدي توفير رمز قناة صريح لكل استدعاء إلى دالة مساعدة أو أداة صادرة إلى تشغيل تفعيل SecretRef؛ وتظل نقاط التفعيل هي بدء التشغيل، وإعادة التحميل، و
secrets.reloadالصريح.
إشارات التدهور والتعافي
عند فشل التفعيل في وقت إعادة التحميل بعد حالة سليمة، يدخل OpenClaw حالة أسرار متدهورة، ويصدر أحداث نظام لمرة واحدة ورموز سجل:
SECRETS_RELOADER_DEGRADEDSECRETS_RELOADER_RECOVERED
السلوك:
- متدهور: يحتفظ وقت التشغيل بآخر لقطة سليمة معروفة.
- متعافٍ: يُصدر مرة واحدة بعد التفعيل الناجح التالي.
- تُسجّل حالات الفشل المتكررة أثناء وجود حالة التدهور بالفعل تحذيرات، لكنها لا تعيد إصدار الحدث.
- لا يصدر الإخفاق السريع عند بدء التشغيل حدث تدهور أبدًا، لأن وقت التشغيل لم يصبح نشطًا أصلًا.
حل مسارات الأوامر
يمكن لمسارات الأوامر الاشتراك في حل SecretRef المدعوم عبر استدعاء RPC للقطة Gateway. وينطبق سلوكان عامان:
مسارات الأوامر الصارمة
على سبيل المثال، مسارات الذاكرة البعيدة openclaw memory وopenclaw qr --remote عندما تحتاج إلى مراجع أسرار مشتركة بعيدة. تقرأ هذه المسارات من اللقطة النشطة وتُخفق سريعًا عندما لا يتوفر SecretRef مطلوب.
مسارات أوامر القراءة فقط
على سبيل المثال، openclaw status، وopenclaw status --all، وopenclaw channels status، وopenclaw channels resolve، وopenclaw security audit، وتدفقات إصلاح الطبيب/الإعداد المخصصة للقراءة فقط. وهي تفضّل أيضًا اللقطة النشطة، لكنها تتدهور بدلًا من الإلغاء عندما لا يتوفر SecretRef مستهدف.
سلوك القراءة فقط:
- عندما يكون Gateway قيد التشغيل، تقرأ هذه الأوامر من اللقطة النشطة أولًا.
- إذا كان حل Gateway غير مكتمل أو لم يكن Gateway متاحًا، فإنها تحاول إجراء تراجع محلي مستهدف لسطح الأمر ذاك.
- إذا ظل SecretRef المستهدف غير متاح، يستمر الأمر بمخرجات قراءة فقط متدهورة وتشخيص صريح يفيد بأن المرجع مُعدّ لكنه غير متاح في مسار الأمر هذا.
- يقتصر هذا السلوك المتدهور على الأمر محليًا؛ ولا يُضعف مسارات بدء التشغيل أو إعادة التحميل أو الإرسال/المصادقة في وقت التشغيل.
ملاحظات أخرى:
- تتولى
openclaw secrets reloadتحديث اللقطة بعد تدوير سر الواجهة الخلفية. - طريقة RPC في Gateway التي تستخدمها مسارات الأوامر هذه:
secrets.resolve.
سير عمل التدقيق والإعداد
التدفق الافتراضي للمشغّل:
تدقيق الحالة الحالية
openclaw secrets audit --checkإعداد SecretRefs وتطبيقها
openclaw secrets configure --applyإعادة التدقيق
openclaw secrets audit --checkلا تعتبر الترحيل مكتملًا حتى تكون إعادة التدقيق نظيفة. إذا ظل التدقيق يبلغ عن قيم نص صريح مخزّنة، فستظل مخاطر وصول الوكيل قائمة حتى عندما تعيد واجهات برمجة تطبيقات وقت التشغيل قيمًا منقّحة.
إذا حفظت خطة بدلًا من تطبيقها أثناء configure، فطبّق تلك الخطة المحفوظة باستخدام openclaw secrets apply --from <plan-path> قبل إعادة التدقيق.
تدقيق الأسرار
تتضمن النتائج:
- قيم النص الصريح المخزّنة (
openclaw.json، وauth-profiles.json، و.env، وagents/*/agent/models.jsonالمُنشأ). - بقايا ترويسات المزوّد الحساسة ذات النص الصريح في إدخالات
models.jsonالمُنشأة. - المراجع غير المحلولة.
- حجب الأسبقية (تكون لـ
auth-profiles.jsonالأولوية على مراجعopenclaw.json). - البقايا القديمة (
auth.json، وتذكيرات OAuth).
ملاحظة التنفيذ: يتجاوز التدقيق افتراضيًا عمليات التحقق من قابلية حل SecretRef الخاصة بالتنفيذ لتجنب الآثار الجانبية للأوامر. استخدم openclaw secrets audit --allow-exec لتنفيذ مزوّدي التنفيذ أثناء التدقيق.
ملاحظة بقايا الترويسات: يعتمد اكتشاف ترويسات المزوّد الحساسة على استدلال أسماء الترويسات (أسماء وأجزاء ترويسات المصادقة/بيانات الاعتماد الشائعة مثل authorization، وx-api-key، وtoken، وsecret، وpassword، وcredential).
إعداد الأسرار
أداة مساعدة تفاعلية تقوم بما يلي:
- تُعدّ
secrets.providersأولًا (env/file/exec، إضافة/تحرير/إزالة). - تتيح تحديد الحقول المدعومة الحاملة للأسرار في
openclaw.jsonبالإضافة إلىauth-profiles.jsonلنطاق وكيل واحد. - يمكنها إنشاء تعيين
auth-profiles.jsonجديد مباشرةً في منتقي الهدف. - تلتقط تفاصيل SecretRef (
source، وprovider، وid). - تُشغّل الحل المسبق ويمكنها التطبيق فورًا.
ملاحظة التنفيذ: يتجاوز الفحص المسبق عمليات التحقق من SecretRef الخاصة بالتنفيذ ما لم يُعيَّن --allow-exec. إذا طبّقت مباشرةً من configure --apply وكانت الخطة تتضمن مراجع/مزوّدي تنفيذ، فأبقِ --allow-exec معيّنًا لخطوة التطبيق أيضًا.
أوضاع مفيدة:
openclaw secrets configure --providers-onlyopenclaw secrets configure --skip-provider-setupopenclaw secrets configure --agent <id>
الإعدادات الافتراضية لتطبيق configure:
- إزالة بيانات الاعتماد الثابتة المطابقة من
auth-profiles.jsonللمزوّدين المستهدفين. - إزالة إدخالات
api_keyالثابتة القديمة منauth.json. - إزالة أسطر الأسرار المعروفة المطابقة من
<config-dir>/.env.
تطبيق الأسرار
تطبيق خطة محفوظة:
openclaw secrets apply --from /tmp/openclaw-secrets-plan.jsonopenclaw secrets apply --from /tmp/openclaw-secrets-plan.json --allow-execopenclaw secrets apply --from /tmp/openclaw-secrets-plan.json --dry-runopenclaw secrets apply --from /tmp/openclaw-secrets-plan.json --dry-run --allow-execملاحظة التنفيذ: يتجاوز التشغيل التجريبي عمليات التحقق من التنفيذ ما لم يُعيَّن --allow-exec؛ ويرفض وضع الكتابة الخطط التي تحتوي على SecretRefs/مزوّدي تنفيذ ما لم يُعيَّن --allow-exec.
للاطلاع على تفاصيل عقد الهدف/المسار الصارم وقواعد الرفض الدقيقة، راجع عقد خطة تطبيق الأسرار.
سياسة الأمان أحادية الاتجاه
نموذج الأمان:
- يجب أن ينجح الفحص المسبق قبل وضع الكتابة.
- يُتحقق من تفعيل وقت التشغيل قبل الاعتماد.
- يحدّث التطبيق الملفات باستخدام الاستبدال الذري للملفات والاستعادة بأفضل جهد عند الفشل.
ملاحظات توافق المصادقة القديمة
بالنسبة إلى بيانات الاعتماد الثابتة، لم يعد وقت التشغيل يعتمد على تخزين المصادقة القديم بنص صريح.
- مصدر بيانات اعتماد وقت التشغيل هو اللقطة المحلولة في الذاكرة.
- تُزال إدخالات
api_keyالثابتة القديمة عند اكتشافها. - يظل سلوك التوافق المرتبط بـ OAuth منفصلًا.
ملاحظة واجهة الويب
يسهل إعداد بعض اتحادات SecretInput في وضع المحرر الخام مقارنةً بوضع النموذج.
ذو صلة
- المصادقة - إعداد المصادقة
- CLI: الأسرار - أوامر CLI
- مراجع أسرار Vault - إعداد مزوّد HashiCorp Vault
- متغيرات البيئة - أسبقية البيئة
- نطاق بيانات اعتماد SecretRef - نطاق بيانات الاعتماد
- عقد خطة تطبيق الأسرار - تفاصيل عقد الخطة
- الأمان - الوضع الأمني