أنت توجّه مساعد برمجة بالذكاء الاصطناعي نحو بنيتك التحتية. عندما يتحكم Claude Code أو Cursor أو Gemini CLI أو Copilot CLI أو أي مساعد مماثل في تشغيل rdc، تتعامل معه واجهة سطر الأوامر بشكل مختلف عن الإنسان الجالس أمام لوحة المفاتيح. تشرح هذه الصفحة ما يمكن للوكيل فعله، وما لا يمكنه فعله، وكيف تصمد الضمانات حتى عندما يحاول الوكيل التحايل عليها.
مرجع سريع: ما يمكن للوكلاء فعله وما لا يمكنهم فعله
| العملية | الإعداد الافتراضي للوكيل | كيفية الفتح لحالة استخدام محددة |
|---|---|---|
rdc config show (معتَّم) | ✅ allowed | |
rdc config field get --pointer <pointer> (نموذج معتَّم أو ملخص) | ✅ allowed | |
rdc config field get --pointer <pointer> --digest | ✅ allowed | |
rdc config field set --pointer <pointer> (حقل عام) | ✅ allowed | |
rdc config field set --pointer <pointer> (حقل حساس، مع --current صحيح) | ✅ allowed | |
rdc config edit --dump (JSONC معتَّم) | ✅ allowed | |
rdc config audit {log, tail, verify} | ✅ allowed | |
rdc config field set --pointer <pointer> (حقل حساس، بدون --current) | 🔴 refused | تزويد --current "<القيمة القديمة>" |
rdc config field get --pointer <pointer> --reveal | 🔴 refused | استخدام --digest بدلاً من ذلك |
rdc config show --reveal | 🔴 refused | استخدام rdc config show العادي |
rdc config edit (المحرر التفاعلي) | 🔴 refused | يضع الإنسان REDIACC_ALLOW_CONFIG_EDIT=* قبل تشغيل الوكيل |
rdc config edit --apply <file> | 🔴 refused | نفس التجاوز |
rdc config field rotate --pointer <pointer> | 🔴 refused | نفس التجاوز؛ يستخدم تأكيداً تفاعلياً |
rdc term connect -m <machine> (SSH مباشر إلى الجهاز) | 🔴 refused | تفريع مستودع أولاً والاتصال بالنسخة المفرعة |
كل ما يُرفض للوكيل يُكتب في سجل التدقيق مع outcome: refused وسبب الرفض.
كيف يتم اكتشاف الوكلاء
تتعامل واجهة سطر الأوامر مع العملية على أنها وكيل عند تحقق أي من الشروط التالية:
- أي من المتغيرات
REDIACC_AGENTأوCLAUDECODEأوGEMINI_CLIأوCOPILOT_CLIمضبوط على"1"، أوCURSOR_TRACE_IDمضبوط بأي قيمة. - على Linux: أي عملية أصل في سلسلة السلف تحتوي على إحدى هذه المتغيرات في بيئتها (عبر
/proc/<pid>/environ). حتى لو قام الوكيل بحذف متغيراته الخاصة باستخدامenv -iأو سكريبت مغلف، تظل سلسلة الأصل تخبر واجهة سطر الأوامر بمن بدأ التشغيل.
يعمل الاكتشاف مرة واحدة لكل عملية ويُخزَّن مؤقتاً. ولا يمكن تعطيله.
نموذج بوابة المعرفة
التعديلات الحساسة تتبع اتفاقية passwd(1): لتغيير سر، أثبت أنك كنت تعرفه بالفعل. متماثل للبشر والوكلاء. كلاهما يمر بنفس البوابة. لا يوجد تجاوز بحجة “أنا أمام لوحة المفاتيح”.
- تريد تدوير رمز API مخزَّن في
/credentials/cfDnsApiToken؟ - تسأل واجهة سطر الأوامر: “ما هي القيمة الحالية؟”
- يزوّد الوكيل (أو الإنسان) النص الصريح عبر
--current "$OLD". تُجزِّئ واجهة سطر الأوامر$OLDبـ SHA-256 وتقارنه بملخص القيمة المخزَّنة حالياً. تطابق → تنفيذ الكتابة. عدم تطابق → رفض، تسجيل. - للتدوير دون التحقق من القيمة السابقة، مرّر
--rotate-secret(لا يجتمع مع--current). يُسجَّل هذا في سجل التدقيق بشكل صريح باعتباره تدويراً.
النموذج يغلق ثلاث أسطح هجومية:
- التدوير الصامت: الوكيل الذي لم يكن له وصول سابق إلى
$OLDلا يستطيع استبداله بقيمة من اختياره. - التسرب عبر الاستطلاع: استجابة الملخص لا تحتوي أبداً على نص صريح؛ حتى سجل التدقيق المخترق يُظهر
expected abc12345…, got deadbeef…، وليس القيم الأساسية. - الكتابة العرضية فوق إعدادات الإنتاج: يتطلب
--currentمتعمداً في كل مرة، حتى على TTY. يلتقط خطأ “قصدت ضبط STRIPE_TEST لكنني في shell الإنتاج”.
تلميحات الإجراء التالي المنظمة
عند فشل الشرط المسبق، يحمل غلاف JSON (مع --output json) حقلاً منظماً errors[].next يخبر الوكلاء بالضبط بما يقترحونه على الإنسان:
{
"errors": [{
"code": "PRECONDITION_MISMATCH",
"message": "...",
"next": {
"summary": "Provide the current value or acknowledge rotation.",
"options": [
{ "description": "Re-read current digest, then retry with --current",
"run": "rdc repo secret get --name mail --key STRIPE_KEY" },
{ "description": "Skip the precondition (rotation, audited)",
"run": "rdc repo secret set --name mail --key STRIPE_KEY --value <new> --mode file --rotate-secret" }
]
}
}]
}
ينبغي للوكلاء نقل next.options[].run حرفياً إلى الإنسان بدلاً من صياغة أوامرهم الخاصة. هذا يتجنب نمط فشل “الوكيل يخترع أمراً غير موجود” ويبقي المشغّل في السيطرة على الإجراء الفعلي.
مثال توضيحي
# الحصول على الملخص القصير لنموذج التعتيم (آمن للوكلاء).
$ rdc config field get --pointer /credentials/cfDnsApiToken
{"pointer": "/credentials/cfDnsApiToken", "value": "<redacted:secret>:abc12345"}
# محاولة الكتابة فوق بلا إثبات: مرفوض.
$ rdc config field set --pointer /credentials/cfDnsApiToken --new '"agent-picked-value"'
✗ Precondition failed: sensitive path requires --current (or --rotate-secret)
# تزويد النص الصريح الحالي: مسموح.
$ rdc config field set --pointer /credentials/cfDnsApiToken \
--current "$OLD_CF_TOKEN" \
--new "$NEW_CF_TOKEN"
Set /credentials/cfDnsApiToken
إذا لم يكن للوكيل $OLD_CF_TOKEN قط، فلا يمكنه الوفاء بالشرط المسبق وسيُرفض التدوير. المستخدم الذي يمتلكه لا يزال بإمكانه القيام بذلك إما عبر المحرر أو بتمرير --current من shell الخاص به.
التعتيم افتراضياً
كل أمر rdc يقرأ الحالة الحساسة: config show، config field get، config machine list، config edit --dump: يُرجع نماذج تعتيم لحقول الأسرار، وليس نصاً صريحاً:
"sshKey": "<redacted:credential>:9f3a2c1b"
"cfDnsApiToken":"<redacted:secret>:abc12345"
"storages.s3-prod.vaultContent": "<redacted:secret>:1f2e3d4c"
اللاحقة السداسية عشرية المكونة من 8 أحرف في النموذج هي أول 8 أحرف من sha256(canonicalize(value)): كافية للتمييز بين قيمتين مختلفتين بنظرة واحدة، غير كافية للعكس. يمكن للوكيل استخدام النموذج لتتبع ما إذا كانت القيمة قد تغيرت دون رؤيتها قط.
--reveal يرفع التعتيم للبشر على TTY تفاعلي. يُرفض الوكلاء بغض النظر عن حالة TTY. كل منح يكتب قيداً في سجل التدقيق بـ reveal_granted؛ كل رفض يكتب قيداً refused مع إشارات الوكيل للجهة الفاعلة مرفقة.
التجاوز REDIACC_ALLOW_CONFIG_EDIT
بعض العمليات: المحرر التفاعلي، --apply، field rotate: موجودة للبشر وليس لها مسار آمن للوكلاء. إذا كنت تريد بنشاط أن يقوم وكيل بإحداها، تضبط:
export REDIACC_ALLOW_CONFIG_EDIT='*' # تجاوز كامل
# أو
export REDIACC_ALLOW_CONFIG_EDIT='/credentials/ssh/privateKey,/infra/cfDnsZoneId'
# (نطاقات glob مفصولة بفواصل: أحرف * البدل مسموحة لكل شريحة)
…ويرث الوكيل هذا.
تفصيل حاسم: يجب أن يظهر التجاوز في عملية فوق الوكيل في سلسلة السلف. إذا ضبطه الوكيل في بيئته الخاصة (أو في shell فرعي أنشأه)، ترفض واجهة سطر الأوامر وتعلمك بذلك:
Interactive editor is blocked in agent environments (REDIACC_ALLOW_CONFIG_EDIT was set but ancestry verification failed: the override must be set by your shell, not by an agent).
الأثر: لا يستطيع الوكيل تجاوز ضمانة بتشغيل export REDIACC_ALLOW_CONFIG_EDIT='*' في منتصف الجلسة. فقط عملية أصل (أنت، في طرفيتك، قبل تشغيل الوكيل) يمكنها فتح ذلك الباب.
دعم المنصات: كيفية التحقق من التجاوز على كل نظام تشغيل
يعتمد كل من REDIACC_ALLOW_CONFIG_EDIT و REDIACC_ALLOW_GRAND_REPO على التحقق من سلسلة السلف لإثبات أن التجاوز قد ضبطته أنت ولم يحقنه الوكيل. يختلف التحقق في الآلية من نظام لآخر، وتختلف قوة الضمان أيضاً:
| المنصة | الشاهد | قوة الضمان |
|---|---|---|
| Linux | /proc/<pid>/environ لكل عملية في السلسلة | صورة وقت التنفيذ من النواة. لا تستطيع العملية تعديل بيئتها بأثر رجعي. |
| macOS | مكالمة نظام kern.procargs2 يقرأها مساعد صغير مضمّن في rdc | نفس خاصية صورة وقت التنفيذ كما في Linux. قابلة للقراءة لعملياتك بدون حقوق المسؤول. |
| Windows | كتلة البيئة المباشرة لكل عملية سلف (PEB)، يقرأها نفس المساعد، مع حماية ضد إعادة استخدام PID | أضعف: Windows لا تحتفظ بصورة وقت التنفيذ، لذا يقرأ التحقق الذاكرة الحالية. العمليات الأب لا تزال لا تستطيع إعادة الكتابة من قِبَل شيء يشغله وكيل عادي، لكن الشاهد غير مجمّد في النواة مثلما هو على Linux و macOS. |
على macOS و Windows تُشغّل واجهة سطر الأوامر ثنائي renet المدمج بها للقيام بالقراءة؛ يُرجع المساعد أي من المتغيرات المُراقبة تحملها كل عملية سلف، وتبقى كل منطق القرار في واجهة سطر الأوامر. إذا كان المساعد مفقوداً أو قديماً أو فشل لأي سبب، فإن واجهة سطر الأوامر لا تستطيع التحقق من التجاوز وتفشل بشكل آمن: يُرفض التجاوز وتقول رسالة الخطأ إن التحقق كان غير متوفّر، وليس أنك فعلت شيئاً خاطئاً. التثبيت الصحيح لن يعرض هذه الرسالة أبداً؛ إعادة تثبيت rdc تستعيد المساعد.
ما يبقى صحيحاً على كل المنصات: التجاوز يجب أن يكون موجوداً بالفعل في بيئة عملية الوكيل عند بدء التشغيل. صدّره في طرفيتك ثم شغّل الوكيل. الوكيل الذي يضبط المتغير في منتصف الجلسة يُرفض.
سجل التدقيق
كل تعديل، كل رفض، كل منح --reveal يكتب سطر JSONL في ~/.config/rediacc/audit.log.jsonl (النمط 0600، يتدوّر عند 10 ميجابايت). كل سطر مرتبط بتجزئة: حقل prevHash الخاص به هو sha256("<السطر السابق>"). العبث بأي سطر يكسر السلسلة في كل سطر تالٍ.
{"ts":"2026-04-21T10:02:47.831Z","actor":{"kind":"agent","agentSignals":["CLAUDECODE"]},"command":"config field set","paths":["/credentials/cfDnsApiToken"],"outcome":"ok","configId":"...","configVersion":48,"prevHash":"sha256:9f3a..."}
{"ts":"2026-04-21T10:02:51.114Z","actor":{"kind":"agent","agentSignals":["CLAUDECODE"]},"command":"config edit","paths":[],"outcome":"refused","reason":"agent without REDIACC_ALLOW_CONFIG_EDIT=*","prevHash":"sha256:abc1..."}
{"ts":"2026-04-21T10:03:05.220Z","actor":{"kind":"human"},"command":"config show --reveal","paths":[],"outcome":"reveal_granted","configId":"...","configVersion":48,"prevHash":"sha256:deac..."}
الفحص
# سرد القيود الأخيرة
rdc config audit log --since 24h
# التصفية بنمط glob للمؤشر
rdc config audit log --path '/credentials/*'
# القيود الصادرة عن الوكلاء فقط
rdc config audit log --actor agent
# بث القيود الجديدة مباشرةً (Ctrl+C للإيقاف)
rdc config audit tail
# التحقق من سلامة سلسلة التجزئة
rdc config audit verify
# → "Chain integrity verified across 247 entries."
# أو
# → "Chain broken at line 103: file has been tampered with or corrupted."
ما لا يظهر أبداً في سجل التدقيق
- قيم الأسرار بنص صريح
- كلمات المرور والرموز ومفاتيح SSH
- القيم القديمة/الجديدة في حالة عدم تطابق الشرط المسبق
--current(بادئة الملخص المكونة من 8 أحرف فقط)
السجل آمن للمشاركة مع مراجع الأمن أو إرفاقه بتقرير خطأ.
حدود النموذج السلوكي
ضمانات الوكيل سلوكية، وليست مشفَّرة. الوكيل المصمم أو الموجَّه الذي يعمل بنفس UID ملف الإعدادات يستطيع دائماً تشغيل cat ~/.config/rediacc/rediacc.json وقراءة النص الصريح، لأن الملف قابل للقراءة من قِبَل العملية.
للتطبيق المشفَّر الحقيقي، استخدم مخزن الإعدادات المشفَّر: تعيش الأسرار على الجانب الخادم، كل حقل حساس يحمل التزام HMAC خاصاً به، وعامل الحساب يرفض الكتابات التي لا يتطابق شرطها المسبق --current مع ما هو مُخزَّن بالتجزئة. الخادم لا يرى النص الصريح أبداً (معرفة صفرية)، لكنه يُطبِّق البوابة.
مسار الملف المحلي: الطريق السهل آمن. مسار المخزن البعيد: الطريق الصعب صعب أيضاً.
ما لا يعزله Rediacc
تحمي ضمانات الوكيل في هذه الصفحة البنية التحتية الخاصة بـ Rediacc نفسها: ملف الإعدادات وعملية Docker لكل مستودع وبيانات المستودع المشفَّرة بـ LUKS وصندوق رمل SSH المقصور النطاق. لكنها لا تحمي الخدمات الخارجية التي يحتفظ مستودعك ببيانات اعتمادها.
النسخة المتفرعة من المستودع هي BTRFS reflink لحجم الأصل. كل ما هو موجود على القرص في الأصل يكون متطابقاً بايتاً ببايت في النسخة المتفرعة: الكود والبيانات وملفات .env على حد سواء. إذا احتوى مستودعك على STRIPE_LIVE_KEY أو AWS_ACCESS_KEY_ID أو رمز API لـ Railway أو أي بيانات اعتماد طويلة الأمد لخدمة طرف ثالث، فإن النسخة المتفرعة ترثها. يمكن لوكيل يعمل في صندوق رمل النسخة المتفرعة قراءة ذلك الملف أو تسريب القيمة أو استخدامها لاستدعاء واجهة برمجة التطبيقات لطرف ثالث. ولا تملك خدمة الطرف الثالث أي وسيلة لمعرفة أن الاستدعاء جاء من نسخة متفرعة بدلاً من الإنتاج.
هذا هو خط المسؤولية المشتركة:
| الحدود | المالك |
|---|---|
| بيانات المستودع، فضاء أسماء التحميل، نطاق Docker، ضمانات الوكيل، سجل التدقيق، حقن الأسرار وقت النشر | Rediacc |
| كود التطبيق الذي يستخدم تلك الأسرار، وأي بيانات اعتماد مُضمَّنة في الصورة وقت البناء | مطوّر المستودع |
الحد الأساسي مدمج في النظام: أسرار المستودع الخاصة مخزَّنة في مستوى منفصل عن صورة المستودع المشفَّرة ولا تُنسخ عبر حدود التفريع. تبدأ حاويات النسخة المتفرعة بخريطة أسرار فارغة وتعرّف نفسها بوصفها جهة فاعلة خارجية مختلفة عن الأصل. اضبطها باستخدام rdc repo secret set (وضع env لاستبدال compose، ووضع file لكتل secrets: من tmpfs). بوابة الطفرة متماثلة. يجب على البشر والوكلاء على حد سواء تزويد --current (الشرط المسبق بأسلوب passwd) أو --rotate-secret (تدوير مُسجَّل) للكتابة فوق أو حذف قيمة قائمة.
عزل المستودعات المتبادل مُطبَّق. لا يستطيع ملف compose الخبيث أو المهمل في المستودع B الإشارة إلى دليل أسرار المستودع A. يرفض مدقق compose في renet رفضاً قاطعاً أي مسار secrets: file: أو configs: file: أو env_file: يشير خارج دليل ${REDIACC_NETWORK_ID} للمستودع الحالي، والرفض غير قابل للتجاوز بـ --unsafe. دفاع متعمق: صندوق رمل Landlock حول العملية الفرعية bash في Rediaccfile يقصر قراءات نظام الملفات على دليل أسرار الشبكة الحالية فقط، لذا يفشل cat /var/run/rediacc/secrets/<other>/X من Rediaccfile خبيث بخطأ EACCES على مستوى النواة.
نمطان إضافيان يسدّان الحالات الحدية:
- لا تُضمِّن بيانات اعتماد الإنتاج في نظام ملفات المستودع نفسه. ملف
.envمُدمَج في الصورة، أو بيانات اعتماد محفوظة في حجم خلالup()، ينتقل عبر reflink إلى النسخة المتفرعة. تحمي ميزة أسرار المستودع فقط القيم التي تحتفظ بها في مستوى الأسرار. لا تستطيع حماية البايتات التي تعيش بالفعل داخل صورة LUKS بأثر رجعي. للمستودعات الحالية التي تحتوي على ملفات.envمُضمَّنة، انقلها يدوياً إلى أسرار المستودع. - قيّد الشبكة الصادرة للنسخة المتفرعة بترشيح eBPF للخروج بحيث لا تستطيع النسخة المتفرعة الوصول إلا إلى localhost ونقاط نهاية صندوق الرمل المحددة بوضوح. عزل شبكة Rediacc لكل مستودع هو الأساس؛ قوائم السماح للخروج لكل نسخة متفرعة غير مبنية اليوم، لكن المسار مفتوح.
يتولى Rediacc حقن الأسرار وقت النشر وعزل النسخ المتفرعة وعزل المستودعات المتبادل. أما النصف الخاص بـ”لا تُضمِّنه في الصورة” فيقع على عاتقك.
وصفات سريعة
السماح لوكيل بتدوير رمز سحابي واحد
# بوصفك أنت، قبل بدء الوكيل:
export REDIACC_ALLOW_CONFIG_EDIT='/credentials/cfDnsApiToken'
claude-code # أو cursor أو gemini إلخ
الآن يستطيع الوكيل تشغيل config field rotate /credentials/cfDnsApiToken --new … لكنه لا يزال غير قادر على تحرير /credentials/ssh/privateKey أو فتح المحرر التفاعلي.
السماح لوكيل بجلسة تحرير إعدادات واسعة
export REDIACC_ALLOW_CONFIG_EDIT='*'
claude-code
يستطيع الوكيل فتح rdc config edit واستخدام --reveal وتشغيل field rotate. كل إجراء لا يزال مُسجَّلاً في سجل التدقيق مع actor.kind: agent وإشارة CLAUDECODE.
اكتشاف الحقول التي يُسمح للوكيل بلمسها
rdc config field list --sensitive --output json
يُرجع كل قالب مؤشر ونوعه (secret / credential / pii / identifier) وما إذا كان ملتزماً بغلاف HMAC من جانب الخادم.
انظر أيضاً
- نظرة عامة على تكامل وكيل الذكاء الاصطناعي: الجولة الشاملة
- إعداد Claude Code: قالب التكامل
- غلاف إخراج JSON: استجابات قابلة للقراءة الآلية
- مخزن الإعدادات المشفَّر: التطبيق المشفَّر من جانب الخادم
- أمان الحساب: وضع الأمان من جانب المشغِّل