
изоляция учетных данных для AI-агентов. Агенты никогда не видят реальные ключи API — структурная гарантия, а не политика.
Креденциальный брандмауэр для AI-агентов.
Основное утверждение — структурное, а не политическое: агенты получают только токены-заполнители, никогда — настоящие ключи 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) дополнительно помещает прокси в конфиденциальное вычислительное окружение, так что даже полностью скомпрометированный VPS не сможет прочитать ключ.
[](https://crates.io/crates/wardn)
[](LICENSE)
## Проблема
Каждый современный фреймворк AI-агентов хранит 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>
## Уровни доверия, честно
| Уровень | Где | Что держит |
|---|---|---|
| **Самостоятельный хостинг (сейчас)** | ваш ноутбук, ваш VPS, CI | Хранилище с шифрованием в покое, заявление межсетевого экрана против агентов. **Не** защищает от root на хосте. |
| **Хостинг (в разработке)** | управляемый wardn или BYO-cloud | Конфиденциальная вычислительная анклав (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.
## Локальная панель управления