Gateway
مدیریت اسرار
OpenClaw از SecretRefهای افزایشی پشتیبانی میکند تا اعتبارنامههای پشتیبانیشده نیازی به ذخیرهشدن بهصورت متن ساده در پیکربندی نداشته باشند.
مدل زمان اجرا
- رازها هنگام فعالسازی، بهصورت فوری و نه با تأخیر در مسیرهای درخواست، در یک اسنپشات درونحافظهای زمان اجرا resolve میشوند.
- راهاندازی سرد Gateway، خرابی قابلتلاشمجدد SecretRef را به یک مالک شناختهشدهٔ غیر Gateway محدود میکند، مشروط بر اینکه آن مالک از جداسازی پشتیبانی کند. کلاسهای مالک نگاشتشده شامل ارائهدهندگان مدل و Skills، ارائهدهندگان رسانه/TTS/cron، پروفایلهای احراز هویت واجد شرایط، حافظهٔ هر عامل، SSH سندباکس، حسابهای کانال و مسیرهای Plugin اعلامشده در مانیفست هستند. Gateway راهاندازی میشود، مالک را بهصورت پیکربندیشده اما در دسترسنبودنی ثبت میکند و یک هشدار افت عملکردِ سانسورشده منتشر میکند. احراز هویت ورودی Gateway، ارجاعها یا مقادیر resolveشدهٔ دارای ساختار نامعتبر، مالکان fail-closed و ارجاعهایی که مالک زمان اجرای آنها نگاشت نشده است، همچنان باعث شکست راهاندازی میشوند.
- بارگذاری مجدد، هر مالک نگاشتشده را مستقل اعتبارسنجی میکند و سپس یک اسنپشات اتمی منتشر میکند. مالکان سالم تازهسازی میشوند. یک مالک واجد شرایطِ ناموفق، تنها وقتی آخرین مقدار سالم شناختهشدهٔ خود را حفظ میکند و stale میشود که هویت ارجاعها، تعریف ارائهدهندگان و قرارداد کامل و غیرمحرمانهٔ مالک بدون تغییر مانده باشند؛ مالک ناموفقِ تغییرکرده یا جدید cold میشود. یک خرابی سختگیرانه، بارگذاری مجدد را رد و اسنپشات فعال را حفظ میکند.
- نقض خطمشیها (برای مثال ترکیب پروفایل احراز هویت در حالت OAuth با ورودی SecretRef) پیش از تعویض زمان اجرا باعث شکست فعالسازی میشود.
- درخواستهای زمان اجرا فقط اسنپشات فعال درونحافظهای را میخوانند. اعتبارنامههای SecretRef ارائهدهندهٔ مدل، تا زمان خروج از فرایند بهصورت sentinelهای محلیِ فرایند از ذخیرهسازی احراز هویت و گزینههای استریم عبور میکنند. مسیرهای تحویل خروجی (تحویل پاسخ/رشته در Discord و ارسال کنش در Telegram) نیز همین اسنپشات را میخوانند و برای هر ارسال، ارجاعها را دوباره resolve نمیکنند.
این کار اختلال ارائهدهندهٔ راز را از مسیرهای داغ درخواست دور نگه میدارد.
محافظت از ورودی Gateway، پیکربندی یا مقادیر resolveشدهٔ دارای ساختار نامعتبر، نقض خطمشیها و مالکیت ناشناخته همچنان بهصورت fail-closed عمل میکنند. مالکان جداشده هرگز به منبع اعتبارنامهای با تقدم کمتر بازنمیگردند.
تزریق هنگام خروج (sentinelها)
برای اعتبارنامههای ارائهدهندهٔ مدل که بر SecretRef متکی هستند، OpenClaw هنگام resolve احراز هویت مدل یک sentinel مات و محلیِ فرایند ایجاد میکند. بنابراین ذخیرهسازی احراز هویت، گزینههای استریم، پیکربندی SDK، گزارشها، اشیای خطا و بیشتر بررسیهای درونی زمان اجرا مقداری مانند oc-sent-v1-... را میبینند، نه اعتبارنامهٔ ارائهدهنده را. واکشی محافظتشدهٔ مدل و کاوشهای سلامت مدیریتشدهٔ ارائهدهندهٔ محلی، بلافاصله پیش از خروج هر درخواست از فرایند، sentinelهای شناختهشده را در مقادیر URL و سرآیند جایگزین میکنند.
مقادیر ناشناخته با شکل sentinel پیش از هرگونه فعالیت شبکهای بهصورت fail-closed رد میشوند. OpenClaw بهجای ارسال یک sentinel حلنشده به ارائهدهنده، از ارسال درخواست خودداری میکند. مقادیر راز resolveشده نیز بهعنوان اقدامی دفاعی چندلایه، برای سانسور دقیق مقدار در گزارشها ثبت میشوند.
آداپتورهای ارائهدهنده از آخرین نقطهٔ تزریقی که SDK آنها پشتیبانی میکند استفاده میکنند:
- SDKهایی که گزینهٔ واکشی سفارشی دارند، واکشی محافظتشدهٔ OpenClaw را دریافت میکنند؛ بنابراین SDK، sentinel را حفظ میکند.
- SDKهایی که گزینهٔ واکشی سفارشی ندارند، sentinel را بلافاصله پیش از ساخت کلاینت باز میکنند. استریمهای ارائهدهندهٔ متعلق به Plugin و هارنسهای عامل در آخرین نقطهٔ تحویل متعلق به هسته آن را باز میکنند، زیرا این انتقالدهندهها از واکشی محافظتشدهٔ OpenClaw استفاده نمیکنند.
sentinelها افشای متن ساده را در زنجیرهٔ فراخوانی مدل کاهش میدهند، اما جداسازی فرایند نیستند. مقدار واقعی همچنان در حافظهٔ همان فرایند وجود دارد و در مرز نهایی آداپتور ظاهر میشود. اعتبارنامههای محیطی ساده که از طریق SecretRef پیکربندی نشدهاند، همچنان متن ساده هستند و خارج از این سازوکار قرار میگیرند.
برای غیرفعالکردن ساخت sentinel هنگام پاسخگویی به رخداد یا عیبیابی سازگاری، OPENCLAW_SECRET_SENTINELS=off را تنظیم کنید (0 یا false نیز، بدون حساسیت به بزرگی و کوچکی حروف، پذیرفته میشوند). این کلید توقف، ثبت سانسور دقیق مقدار را غیرفعال نمیکند.
مرز دسترسی عامل
SecretRefها از ماندگارشدن اعتبارنامهها در پیکربندی و فایلهای مدل تولیدشده جلوگیری میکنند، اما مرز جداسازی فرایند نیستند. اعتبارنامهٔ متن سادهای که در مسیری خواندنی برای عامل روی دیسک باقی مانده باشد، همچنان از طریق ابزارهای فایل یا پوسته قابلخواندن است و سانسور در سطح API را دور میزند.
برای استقرارهای عملیاتی که فایلهای قابلدسترسی برای عامل در دامنه قرار دارند، مهاجرت را فقط زمانی کامل در نظر بگیرید که همهٔ موارد زیر برقرار باشند:
- اعتبارنامههای پشتیبانیشده بهجای مقادیر متن ساده از SecretRef استفاده کنند.
- باقیماندهٔ قدیمیِ متن ساده از
openclaw.json،auth-profiles.json،.envو فایلهایmodels.jsonتولیدشده پاک شده باشد. openclaw secrets audit --checkپس از مهاجرت پاک باشد.- هر اعتبارنامهٔ پشتیبانینشده یا در حال چرخشِ باقیمانده با جداسازی سیستمعامل، جداسازی کانتینر یا یک پروکسی اعتبارنامهٔ خارجی محافظت شود.
به همین دلیل، گردشکار ممیزی/پیکربندی/اعمال یک دروازهٔ مهاجرت امنیتی است، نه صرفاً یک ابزار کمکی برای سهولت کار.
پالایش سطح فعال
SecretRefها فقط در سطحهایی که عملاً فعال هستند اعتبارسنجی میشوند:
- سطحهای فعالشده: خرابیهای قابلتلاشمجدد برای مالکان نگاشتشده و قابلجداسازی، وارد وضعیت افت عملکرد cold یا stale میشوند. خرابیهای سختگیرانه، fail-closed، موردنیاز Gateway یا نگاشتنشده، راهاندازی/بارگذاری مجدد را مسدود میکنند.
- سطحهای غیرفعال: ارجاعهای resolveنشده راهاندازی/بارگذاری مجدد را مسدود نمیکنند؛ آنها یک عیبیابی غیرکشندهٔ
SECRETS_REF_IGNORED_INACTIVE_SURFACEمنتشر میکنند.
نمونههایی از سطحهای غیرفعال
- ورودیهای کانال/حساب غیرفعالشده.
- اعتبارنامههای سطحبالای کانال که هیچ حساب فعالی آنها را به ارث نمیبرد.
- سطحهای ابزار/قابلیت غیرفعالشده.
- کلیدهای مختص ارائهدهندهٔ جستوجوی وب که توسط
tools.web.search.providerانتخاب نشدهاند. در حالت خودکار (ارائهدهنده تنظیم نشده است)، کلیدها برای تشخیص خودکار بر اساس تقدم بررسی میشوند تا یکی resolve شود؛ پس از انتخاب، کلیدهای ارائهدهندگان انتخابنشده غیرفعال هستند. - مادهٔ احراز هویت SSH سندباکس (
agents.defaults.sandbox.ssh.identityData،certificateData،knownHostsData، بههمراه بازنویسیهای هر عامل) فقط زمانی فعال است که بکاند مؤثر سندباکسsshباشد و حالت سندباکس برای عامل پیشفرض یا یک عامل فعال،offنباشد. - SecretRefهای
gateway.remote.token/gateway.remote.passwordدر صورت برقرار بودن هر یک از موارد زیر فعال هستند: gateway.mode=remotegateway.remote.urlپیکربندی شده باشدgateway.tailscale.modeبرابرserveیاfunnelباشد- در حالت محلی و بدون آن سطحهای راهدور:
gateway.remote.tokenزمانی فعال است که احراز هویت توکنی بتواند برنده شود و هیچ توکن محیطی/احراز هویتی پیکربندی نشده باشد؛gateway.remote.passwordفقط زمانی فعال است که احراز هویت گذرواژهای بتواند برنده شود و هیچ گذرواژهٔ محیطی/احراز هویتی پیکربندی نشده باشد. - SecretRef مربوط به
gateway.auth.tokenبرای resolve احراز هویت هنگام راهاندازی، زمانی غیرفعال است کهOPENCLAW_GATEWAY_TOKENتنظیم شده باشد، زیرا ورودی توکن محیطی برای آن زمان اجرا اولویت دارد.
عیبیابی سطح احراز هویت Gateway
وقتی یک SecretRef روی gateway.auth.token، gateway.auth.password، gateway.remote.token یا gateway.remote.password تنظیم شده باشد، راهاندازی/بارگذاری مجدد Gateway وضعیت سطح را با کد SECRETS_GATEWAY_AUTH_SURFACE ثبت میکند:
active: این SecretRef بخشی از سطح مؤثر احراز هویت است و باید resolve شود.inactive: سطح احراز هویت دیگری اولویت دارد، یا احراز هویت راهدور غیرفعال/فعالنشده است.
ورودی گزارش شامل دلیلی است که خطمشی سطح فعال از آن استفاده کرده است.
پیشبررسی ارجاع در راهاندازی اولیه
در راهاندازی اولیهٔ تعاملی، انتخاب ذخیرهسازی SecretRef پیش از ذخیرهسازی، اعتبارسنجی پیشبررسی را اجرا میکند:
- ارجاعهای محیطی: نام متغیر محیطی را اعتبارسنجی میکند و تأیید میکند که هنگام راهاندازی، مقداری غیرخالی قابلمشاهده است.
- ارجاعهای ارائهدهنده (
fileیاexec): انتخاب ارائهدهنده را اعتبارسنجی میکند،idرا resolve میکند و نوع مقدار resolveشده را بررسی میکند. - گردشکار شروع سریع: وقتی
gateway.auth.tokenاز قبل یک SecretRef باشد، راهاندازی اولیه پیش از راهاندازی کاوش/داشبورد، با استفاده از همان دروازهٔ شکست سریع، آن را برای ارجاعهایenv،fileوexecresolve میکند.
شکست اعتبارسنجی، خطا را نمایش میدهد و امکان تلاش مجدد را فراهم میکند.
قرارداد 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 (/...) یا برای ارائهدهندگانsingleValue، مقدار تحتاللفظیvalueباشد- گریزگذاری 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", }, },}ارائهدهندهٔ محیطی
- فهرست مجاز اختیاریِ نامهای دقیق از طریق
allowlist. - مقادیر محیطی مفقود یا خالی باعث شکست resolve میشوند.
ارائهدهندهٔ فایل
- فایل محلی در
pathرا میخواند. mode: "json"(پیشفرض) انتظار یک بار دادهٔ شیء JSON را دارد وidرا بهعنوان اشارهگر JSON resolve میکند.mode: "singleValue"انتظار شناسهٔ ارجاع"value"را دارد و محتوای خام فایل را برمیگرداند (خط جدید انتهایی حذف میشود).- مسیر باید بررسیهای مالکیت/مجوز را با موفقیت بگذراند؛
timeoutMs(پیشفرض 5000) وmaxBytes(پیشفرض 1 MiB) خواندن را محدود میکنند. - حالت fail-closed در Windows: اگر تأیید ACL برای مسیر در دسترس نباشد، resolve شکست میخورد. فقط برای مسیرهای قابلاعتماد،
allowInsecurePath: trueرا روی آن ارائهدهنده تنظیم کنید تا بررسی دور زده شود.
ارائهدهنده exec
- مسیر مطلق باینری پیکربندیشده را مستقیماً و بدون پوسته اجرا میکند.
- بهطور پیشفرض،
commandباید یک فایل معمولی باشد، نه پیوند نمادین. برای مجاز کردن مسیرهای فرمانِ پیوند نمادین (برای مثال واسطهای Homebrew)،allowSymlinkCommand: trueرا تنظیم کنید و آن را باtrustedDirs(برای مثال["/opt/homebrew"]) همراه کنید تا فقط مسیرهای مدیر بسته واجد شرایط باشند. - از
timeoutMs(پیشفرض 5000)،noOutputTimeoutMs(پیشفرض برابر باtimeoutMs)،maxOutputBytes(پیشفرض 1 MiB)، فهرست مجازenv/passEnvوtrustedDirsپشتیبانی میکند. jsonOnlyبهطور پیشفرضtrueاست. باjsonOnly: falseو یک شناسه درخواستی، خروجی استاندارد ساده و غیر JSON بهعنوان مقدار آن شناسه پذیرفته میشود.- در Windows، رفتار بهصورت بسته و ایمن است: اگر تأیید ACL برای مسیر فرمان در دسترس نباشد، تفکیک شکست میخورد. فقط برای مسیرهای مورد اعتماد،
allowInsecurePath: trueرا روی آن ارائهدهنده تنظیم کنید تا این بررسی نادیده گرفته شود. - ارائهدهندگان exec تحت مدیریت Plugin میتوانند بهجای
command/argsکپیشده ازpluginIntegrationاستفاده کنند. 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 برای سازگاری با نسخه 1 پروتکل پذیرفته میشوند،
اما نمایش داده نمیشوند، زیرا خروجی تفکیککننده ممکن است حاوی اطلاعات اعتبارنامه باشد.
کلیدهای 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 مراجعه کنید.
نمونههای یکپارچهسازی exec
برای راهنمای اختصاصی 1Password درباره حسابهای سرویس، مهارت عامل همراه و عیبیابی، به 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تنظیم شود.- هنگام استفاده از نمونه Bitwarden خودمیزبان،
BWS_SERVER_URLدر محیط تنظیم شود.
{ 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 در exec سازگارند، مانند 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 از یک پوشش تفکیککننده کوچک استفاده کنید. آن را بهصورت فایل اجرایی در یک مسیر مطلق که بررسیهای مسیر ارائهدهنده exec را میگذراند ذخیره کنید، برای مثال /usr/local/bin/openclaw-pass-resolver. خط shebang #!/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 }));});سپس ارائهدهنده exec را پیکربندی کنید و 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 را برگرداند. پس از بهروزرسانی پیکربندی، هم ممیزی ایستا و هم مسیر تفکیککننده exec را تأیید کنید:
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 در sandbox
بکاند اصلی sandbox 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مقدم باشند)
serviceAccount در Google Chat، JSON درونخطی یا یک SecretRef را میپذیرد. اگر فیلد مرجع تنظیم نشده باشد، Doctor فیلد همسطح بازنشستهٔ serviceAccountRef را به این فیلد مرجع منتقل میکند.
محرکهای فعالسازی
فعالسازی اسرار در موارد زیر اجرا میشود:
- راهاندازی (پیشبررسی بهعلاوهٔ فعالسازی نهایی)
- مسیر اعمال داغ بارگذاری مجدد پیکربندی
- مسیر بررسی راهاندازی مجدد در بارگذاری مجدد پیکربندی
- بارگذاری مجدد دستی از طریق
secrets.reload - پیشبررسی RPC نوشتن پیکربندی Gateway (
config.set/config.apply/config.patch) که پیش از ماندگار کردن ویرایشها، SecretRefهای سطح فعال را در محمولهٔ پیکربندی ارسالی اعتبارسنجی میکند
قرارداد فعالسازی:
- در صورت موفقیت، اسنپشات بهصورت اتمی جایگزین میشود.
- شکست سختگیرانهٔ راهاندازی، راهاندازی Gateway را متوقف میکند.
- در راهاندازی سرد، شکست قابلتلاشمجدد در تفکیک برای یک مالک نگاشتشده، قابلجداسازی و غیر-Gateway ممکن است اسنپشات را با همان مالک دقیقاً در وضعیت پیکربندیشده اما دردسترسنبودنی منتشر کند. درخواستها برای آن مالک با
SECRET_SURFACE_UNAVAILABLEشکست میخورند؛ پس از شکست یک ارجاع صریح، مالکان ارائهدهندهٔ مدل به اعتبارنامههای محیط یا نمایهٔ احراز هویت بازنمیگردند. - بارگذاری مجدد و بررسی راهاندازی مجدد، مالکان نگاشتشدهٔ واجد شرایط را جدا میکنند. هویتهای ارجاع تغییریافتهنبوده با تعریفهای ارائهدهندهٔ تغییریافتهنبوده و قرارداد کامل و غیرمحرمانهٔ مالکِ تغییریافتهنبوده، مقادیر دقیق آخرین وضعیت سالم خود را بهصورت کهنه حفظ میکنند؛ ارجاعهای تفکیکنشدهٔ تغییرکرده یا تازه پیکربندیشده فقط برای همان مالک بهصورت سرد منتشر میشوند. شکست سختگیرانهٔ بارگذاری مجدد، اسنپشات فعال قبلی را حفظ میکند.
config.set،config.applyوconfig.patchارجاعهای تفکیکنشدهٔ معتبر از نظر نحوی را برای مالکان قابلجداسازی میپذیرند و گزارش ویرایششدهٔdegradedSecretOwnersرا بازمیگردانند. احراز هویت ورودی Gateway، پیکربندی یا مقادیر تفکیکشدهٔ نامعتبر از نظر ساختاری، نقض سیاستها و مالکان ناشناخته همچنان پیش از تغییر دیسک رد میشوند.- مالکان همسطح سالم، حتی هنگامی که مالک دیگری سرد یا کهنه است، بهطور عادی تفکیک و منتشر میشوند.
- ارائهٔ یک توکن صریح کانال برای هر فراخوانی به یک فراخوانی ابزار/تابع کمکی خروجی، فعالسازی SecretRef را تحریک نمیکند؛ نقاط فعالسازی همچنان راهاندازی، بارگذاری مجدد و
secrets.reloadصریح هستند.
سیگنالهای تنزل و بازیابی
هنگامی که فعالسازی در زمان بارگذاری مجدد پس از یک وضعیت سالم شکست بخورد، OpenClaw وارد وضعیت تنزلیافتهٔ اسرار میشود و رویدادهای یکبارهٔ سیستمی و کدهای گزارش زیر را منتشر میکند:
SECRETS_RELOADER_DEGRADEDSECRETS_RELOADER_RECOVERED
رفتار:
- تنزلیافته: مالکان سالم تازهسازی میشوند، مالکان کهنه آخرین وضعیت سالم را نگه میدارند و مالکان سرد دردسترسناپذیر میمانند.
- بازیابیشده: پس از فعالسازی موفق بعدی یک بار منتشر میشود.
- شکستهای مکرر در حالی که وضعیت از قبل تنزلیافته است، هشدار ثبت میکنند اما رویداد را دوباره منتشر نمیکنند.
- شکست سختگیرانهٔ راهاندازی هرگز رویداد تنزلیافته منتشر نمیکند، زیرا زمان اجرا هیچگاه فعال نشده است. راهاندازی موفق با مالکان سرد، تنزل مالک را ثبت میکند اما رویداد بارگذار مجدد منتشر نمیکند.
- شکستهای محدود به ارجاع در راهاندازی و بارگذاری مجدد، برای هر مالک متأثر یک هشدار ساختیافتهٔ
SECRETS_DEGRADEDمنتشر میکنند. قطعیهای محدود به ارائهدهنده بهجای تکرار شکست ارائهدهنده برای هر مالک، یک هشدارSECRETS_PROVIDER_DEGRADEDهمراه با ارائهدهنده و فهرست کامل مالکان متأثر منتشر میکنند. هشدارها شامل دلیل ویرایششده، وضعیت مالکcoldیاstaleو راهنمای تلاش مجددopenclaw secrets reloadهستند. آنها هرگز مقادیر تفکیکشده یا شناسههای SecretRef را شامل نمیشوند. openclaw doctorمالکان سرد و کهنه را همراه با مسیرهای پیکربندی متأثر، دلیل ویرایششده و راهنمای تلاش مجدد فهرست میکند.
تفکیک مسیر فرمان
مسیرهای فرمان میتوانند از طریق یک RPC اسنپشات Gateway، تفکیک SecretRef پشتیبانیشده را انتخاب کنند. دو رفتار کلی اعمال میشود:
مسیرهای فرمان سختگیرانه
برای مثال، مسیرهای حافظهٔ راهدور openclaw memory و openclaw qr --remote هنگامی که به ارجاعهای راز مشترک راهدور نیاز دارد. آنها از اسنپشات فعال میخوانند و هنگامی که یک SecretRef الزامی دردسترس نباشد، سریعاً شکست میخورند.
مسیرهای فرمان فقطخواندنی
برای مثال، openclaw status، openclaw status --all، openclaw channels status، openclaw channels resolve، openclaw security audit و جریانهای فقطخواندنی تعمیر Doctor/پیکربندی. آنها نیز اسنپشات فعال را ترجیح میدهند، اما هنگامی که یک SecretRef هدف دردسترس نباشد، بهجای توقف تنزل مییابند.
رفتار فقطخواندنی:
- هنگامی که Gateway در حال اجراست، این فرمانها ابتدا از اسنپشات فعال میخوانند.
- اگر تفکیک Gateway ناقص باشد یا Gateway دردسترس نباشد، آنها برای سطح همان فرمان یک مسیر جایگزین محلی هدفمند را امتحان میکنند.
- اگر یک SecretRef هدف همچنان دردسترس نباشد، فرمان با خروجی فقطخواندنی تنزلیافته و یک عیبیابی صریح ادامه مییابد که اعلام میکند ارجاع پیکربندی شده اما در این مسیر فرمان دردسترس نیست.
- این رفتار تنزلیافته فقط محلیِ فرمان است؛ راهاندازی زمان اجرا، بارگذاری مجدد یا مسیرهای ارسال/احراز هویت را تضعیف نمیکند.
نکات دیگر:
- تازهسازی اسنپشات پس از چرخش راز بکاند توسط
openclaw secrets reloadمدیریت میشود. - روش RPC Gateway مورداستفادهٔ این مسیرهای فرمان:
secrets.resolve.
جریان کاری ممیزی و پیکربندی
جریان پیشفرض اپراتور:
ممیزی وضعیت فعلی
openclaw secrets audit --checkپیکربندی و اعمال SecretRefها
openclaw secrets configure --applyممیزی مجدد
openclaw secrets audit --checkتا زمانی که ممیزی مجدد پاک نشده است، مهاجرت را کامل تلقی نکنید. اگر ممیزی همچنان مقادیر متن سادهٔ ذخیرهشده را گزارش کند، حتی هنگامی که APIهای زمان اجرا مقادیر ویرایششده بازمیگردانند، خطر دسترسی عامل باقی میماند.
اگر هنگام 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پاک میکند. - خطوط راز شناختهشدهٔ منطبق را از فایلهای
.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 تنظیم شده باشد؛ حالت نوشتن طرحهای حاوی SecretRefها/ارائهدهندگان اجرایی را رد میکند مگر اینکه --allow-exec تنظیم شده باشد.
برای جزئیات قرارداد سختگیرانهٔ هدف/مسیر و قواعد دقیق رد، به قرارداد طرح اعمال اسرار مراجعه کنید.
سیاست ایمنی یکطرفه
مدل ایمنی:
- پیشبررسی باید پیش از حالت نوشتن موفق شود.
- فعالسازی زمان اجرا پیش از ثبت اعتبارسنجی میشود.
- اعمال، فایلها را با جایگزینی اتمی فایل بهروزرسانی میکند و در صورت شکست، بازیابی را بهصورت بهترین تلاش انجام میدهد.
نکات سازگاری احراز هویت قدیمی
برای اعتبارنامههای ایستا، زمان اجرا دیگر به ذخیرهسازی قدیمی احراز هویت بهصورت متن ساده وابسته نیست.
- منبع اعتبارنامهٔ زمان اجرا، اسنپشات درونحافظهای تفکیکشده است.
- ورودیهای ایستای قدیمی
api_keyهنگام شناسایی پاک میشوند. - رفتار سازگاری مرتبط با OAuth جدا باقی میماند.
نکتهٔ رابط کاربری وب
پیکربندی برخی اجتماعهای SecretInput در حالت ویرایشگر خام آسانتر از حالت فرم است.
مرتبط
- احراز هویت - راهاندازی احراز هویت
- CLI: اسرار - فرمانهای CLI
- Vault SecretRefs - راهاندازی ارائهدهنده HashiCorp Vault
- متغیرهای محیطی - تقدم متغیرهای محیطی
- سطح اعتبارنامه SecretRef - سطح اعتبارنامه
- قرارداد طرح اعمال اسرار - جزئیات قرارداد طرح
- امنیت - وضعیت امنیتی