
عزل بيانات الاعتماد لوكلاء AI. لا يرى الوكلاء أبدًا مفاتيح API الحقيقية - ضمان هيكلي، وليس سياسة.
جدار ناري للبيانات الاعتمادية للوكلاء الذكاء الاصطناعي.
الادعاء الرئيسي هو هيكلي وليس سياسيًا: يتلقى الوكلاء رموزًا موضعية (placeholder tokens)، وليس مفاتيح API حقيقية أبدًا. المفتاح الحقيقي يعبر فقط خطًا شبكيًا واحدًا — داخل وكيل wardn، في طريقه إلى API العلوي — ويتم تجريده من الردود قبل وصولها إلى الوكيل. السجلات، البيئة، نوافذ سياق LLM، ملفات الخدش، وسجل الصدفة تحتوي فقط على رموز موضعية.```text agent process OPENAI_KEY=wdn_placeholder_a1b2c3d4e5f6g7h8 (useless) agent logs Authorization: Bearer wdn_placeholder_a1b2... (useless) LLM context wdn_placeholder_a1b2c3d4e5f6g7h8 (useless) wardn proxy injects the real key in-flight, single seam (deleted on response) ~/.vibeguard/vault.enc AES-256-GCM(Argon2id(passphrase)) (encrypted at rest)
هذا هو الادعاء الأساسي وهو قابل للدفاع اليوم ضد اختراق الوكيل، وحقن المطالبات، وسرقة السجلات، وتسريب المهارات.
اقرأ [docs/THREAT-MODEL.md](https://github.com/rohansx/wardn/blob/main/docs/THREAT-MODEL.md) للتقسيم الصادق بين ما هو مغطى وما هو غير مغطى — بما في ذلك المستوى الذي يصبح فيه الادعاء الأقوى 'اختراق المضيف لا يسرب شيئًا' قابلاً للتحقيق.
الخزانة نفسها (مشفرة في وضع السكون، ومفتاح مشتق من عبارة المرور) هي مكون حقيقي وسبب قدرة الجدار الناري على العمل على جهاز واحد.
المستوى القادم [docs/HOSTED-TIER.md](https://github.com/rohansx/wardn/blob/main/docs/HOSTED-TIER.md) يغلف الوكيل أيضًا في بيئة حوسبة سرية بحيث حتى الخادم الافتراضي الخاص المخترق بالكامل لا يمكنه قراءة المفتاح.
[](https://crates.io/crates/wardn)
[](LICENSE)
## المشكلة
كل إطار وكيل ذكاء اصطناعي اليوم يخزن مفاتيح API في متغيرات البيئة أو ملفات `.env`. الوكيل المخترق، أو المهارة الخبيثة، أو أداة السرقة الشائعة، أو حقن المطالبات الذي يسرب `Authorization: Bearer sk-...` من سجل LLM يحصل على وصول كامل إلى بيانات اعتمادك.```
~/.env → OPENAI_KEY=sk-proj-real-key # plaintext, readable by anyone
agent context → "Use OPENAI_KEY=sk-proj-real-key" # leaked into LLM context window
agent logs → Authorization: Bearer sk-proj-... # sitting in log files
يمنح wardn الوكلاء سلسلة نصية نائبة غير مفيدة ويزيل المفتاح الحقيقي من كل سطح يمكنه الوصول إليه. يتم حقن المفاتيح الحقيقية في طبقة الشبكة — خط واحد — ويتم إزالتها من الاستجابات قبل أن تصل إلى الوكيل.``` agent environment → OPENAI_KEY=wdn_placeholder_a1b2c3d4e5f6g7h8 (useless) wardn vault → OPENAI_KEY=sk-proj-real-key (encrypted at rest) upstream request → Authorization: Bearer sk-proj-real-key (network transit only) upstream response → ...real keys stripped, placeholders returned... (re-injected on the way back) agent logs → Authorization: Bearer wdn_placeholder_a1b2... (useless) LLM context window → wdn_placeholder_a1b2c3d4e5f6g7h8 (useless)
## الهندسة المعمارية```mermaid
flowchart TB
subgraph Agent["AI Agent Process"]
A1["Agent Code"]
A2["ENV: OPENAI_KEY=wdn_placeholder_a1b2..."]
end
subgraph Wardn["wardn daemon · localhost:7777"]
direction TB
P["HTTP Proxy"]
MCP["MCP Server\n(stdio)"]
subgraph Pipeline["Request Pipeline"]
direction LR
S1["Identify\nAgent"] --> S2["Resolve\nPlaceholder"] --> S3["Check\nAuth"] --> S4["Rate\nLimit"] --> S5["Inject\nReal Key"]
end
subgraph ResponsePipeline["Response Pipeline"]
direction RL
R1["Strip Real\nKeys"] --> R2["Replace with\nPlaceholders"]
end
subgraph Vault["Encrypted Vault"]
V1["AES-256-GCM"]
V2["Argon2id KDF"]
V3["Placeholder Map\nper agent × credential"]
end
end
subgraph External["External APIs"]
E1["api.openai.com"]
E2["api.anthropic.com"]
E3["..."]
end
A1 -- "placeholder token\nin headers/body" --> P
A1 -. "MCP: get_credential_ref\nlist_credentials\ncheck_rate_limit" .-> MCP
MCP -. "placeholder token\n(never real keys)" .-> A1
P --> Pipeline
Pipeline --> External
External --> ResponsePipeline
ResponsePipeline -- "response with\nplaceholders only" --> A1
Pipeline <--> Vault
ResponsePipeline <--> Vault
style Agent fill:#1a1a2e,stroke:#e94560,color:#fff
style Wardn fill:#0f3460,stroke:#16213e,color:#fff
style Pipeline fill:#16213e,stroke:#e94560,color:#fff
style ResponsePipeline fill:#16213e,stroke:#e94560,color:#fff
style Vault fill:#1a1a2e,stroke:#00d2ff,color:#fff
style External fill:#0a0a0a,stroke:#533483,color:#fff
Agent sends request with placeholder in Authorization header │ ▼ ┌─────────────────────────┐ │ wardn proxy │ │ localhost:7777 │ │ │ │ 1. Identify agent │ │ 2. Resolve placeholder │ │ 3. Check authorization │ │ 4. Check rate limit │ │ 5. Inject real key │ │ 6. Forward request │ │ 7. Strip key from resp │ │ 8. Return to agent │ └─────────────────────────┘ │ ▼ External API (only place real key exists in transit)
## عرض توضيحي
<p align="center">
<img src="https://assets.kitploit.com/production/public/readmes/12823/1fa6109ffd855ec98c173c5edd2d7ee77f6b0c918a3cdecb1ea5fbfe8326161d.gif" alt="عرض توضيحي لـ wardn" width="800">
</p>
## مستويات الثقة، بصراحة
| المستوى | المكان | المضمون |
|---|---|---|
| **الاستضافة الذاتية (حاليًا)** | حاسوبك المحمول، خادمك الخاص، CI | خزنة مشفرة عند الراحة، ادعاء جدار حماية ضد الوكلاء. **لا** يدافع ضد صلاحية الجذر على المضيف. |
| **مستضافة (قادمة)** | مُدارة بواسطة wardn أو سحابتك الخاصة | بيئة حوسبة سرية (Nitro / SEV-SNP) + شهادة عن بُعد + تدفق التشفير إلى الوكيل. ادعاء حقيقي "اختراق المضيف لا يُسرب شيئًا". |
مستوى الاستضافة الذاتية هو الادعاء الأساسي ويتم إطلاقه اليوم. المستوى المستضاف هو مسار الترقية الصارم: يتطلب تكاليف مالية وتعقيد تشغيلي، وتصميمه موجود في [docs/HOSTED-TIER.md](https://github.com/rohansx/wardn/blob/main/docs/HOSTED-TIER.md). جرد كامل وصادق لما يتم تغطيته وما لا يتم تغطيته:
👉 **[docs/THREAT-MODEL.md](https://github.com/rohansx/wardn/blob/main/docs/THREAT-MODEL.md)** — جدول يغطي / لا يغطي، مذكور بوضوح "لا يوجد خزنة برمجية تقضي على اختراق المضيف"، ومسار الترقية.
## تثبيت```bash
# Prebuilt binary (Linux/macOS, amd64/arm64), checksum-verified
curl -sSf https://raw.githubusercontent.com/rohansx/wardn/main/install.sh | sh
# or from crates.io
cargo install wardn
# or Homebrew, once the tap is published (see Formula/wardn.rb)
brew install rohansx/wardn/wardn
wardn vault create wardn vault set OPENAI_KEY wardn vault set ANTHROPIC_KEY
wardn setup claude-code
هذا كل شيء. يستخدم Claude Code الآن خادم MCP الخاص بـ wardn للحصول على رموز نائبة بدلاً من قراءة المفاتيح الحقيقية من بيئتك.
### ماذا يحدث بعد ذلك
1. يقوم Claude Code باستدعاء `get_credential_ref` → يحصل على `wdn_placeholder_a1b2...` (وليس المفتاح الحقيقي)
2. يرسل الوكيل الطلب مع الرمز النائب عبر وكيل wardn
3. يقوم الوكيل باستبدال الرمز النائب بالمفتاح الحقيقي، ويعيد توجيهه إلى واجهة API
4. يقوم الوكيل بإزالة المفتاح الحقيقي من الاستجابة قبل إعادتها إلى الوكيل
لا يدخل المفتاح الحقيقي أبدًا إلى ذاكرة الوكيل أو سجلاته أو نافذة سياق LLM.
## لوحة التحكم المحلية
بمجرد تشغيل البرنامج الخفي (`wardn serve`، أو يتم تشغيله بواسطة `wardn run`)، افتح
**http://127.0.0.1:7777/ui** في متصفح. عرض محلي للقراءة فقط: