
🔱 Le seul proxy d'identification indépendant pour les agents IA : isolement de type « apportez votre propre coffre » et politiques de requêtes de moindre privilège. Vos clés restent là où vous les conservez déjà, jamais dans la mémoire de l'agent. Compatible avec 1Password, keychain, keepassxc et bien d'autres.
🔱 Le seul proxy d'identifiants indépendant pour les agents IA : isolation avec votre propre coffre et politiques de requêtes au moindre privilège. Vos clés restent là où vous les conservez déjà, jamais dans la mémoire de l'agent. Compatible avec 1Password, keychain, keepassxc et bien d'autres.
Vous configurez Claude Code, OpenClaw ou Hermes, et vous vous retrouvez face à des fichiers .env avec vos précieuses clés API en texte brut. Vous lisez les articles. Vous savez ce qui se passe quand un agent subit une injection par prompt. Nous comprenons.
Aquaman résout cela avec trois couches de défense :
Aquaman est livré sous forme de quatre packages coordonnés, partageant un seul coffre + un seul démon. Installez seulement ce dont vous avez besoin :
Un seul CLI aquaman expose les quatre : commandes de haut niveau pour le coffre et l'audit, aquaman openclaw ... pour l'intégration OpenClaw, aquaman coder ... pour l'intégration avec les agents de codage (délègue à aquaman-coder en interne) ainsi que aquaman hermes ... pour le package Python Hermes.
aquaman help, aquaman doctor sont vos amis.
npm install -g aquaman-proxy
aquaman setup # backend wizard + store keys
aquaman daemon & # start the proxy
aquaman credentials list # verify
Le proxy écoute sur ~/.aquaman/proxy.sock (UDS, chmod 0o600). Pointez n'importe quel outil vers http://aquaman.local/<service>/<path> et le proxy injecte les en-têtes d'authentification pour ce service depuis le backend de coffre que vous avez choisi.
openclaw plugins install aquaman-plugin # 1. install plugin + proxy
openclaw aquaman setup # 2. backend + keys + plugin wire-up
openclaw # 3. done - proxy starts automatically
Dépannage : openclaw aquaman doctor.
Utilisation directe via npm ? npm install -g aquaman-proxy && aquaman openclaw setup fait la même chose – installe le CLI proxy, stocke vos clés, installe le plugin dans ~/.openclaw/extensions/aquaman-plugin/ et câble les identifiants (références SecretRef sur OpenClaw ≥ 2026.6.5, placeholder auth-profiles.json sur les versions plus anciennes).
L'intercepteur HTTP du plugin ne redirige que le trafic pour les services de sa configuration services (Anthropic + OpenAI par défaut). Ajoutez-en d'autres sous la configuration du plugin dans openclaw.json – les canaux pris en charge incluent Slack, Discord, Telegram, MS Teams, Matrix, LINE, Twitch, Twilio, BlueBubbles, Mattermost, Nostr, Tlon, Feishu, Google Chat, ElevenLabs, xAI, Cloudflare AI Gateway, Mistral, Hugging Face, et plus (25 au total).
npm install -g aquaman-proxy aquaman-coder # 1. install daemon + adapter
aquaman setup # 2. vault wizard
aquaman daemon & # 3. start the proxy
aquaman coder project add my-app --path ~/code/my-app \
--env ANTHROPIC_API_KEY=aquaman://anthropic/api_key \
--env GITHUB_TOKEN=aquaman://github/token # 4. declare a project
aquaman coder setup claude-code # 5. wire Claude Code hooks
aquaman doctor # 6. verify - should show both vault + coder green
Voyez par vous-même (le « aha » en 30 secondes) : redémarrez Claude Code, ouvrez une nouvelle session dans ~/code/my-app, et demandez à l'agent d'exécuter :
printenv | grep ANTHROPIC_API_KEY
Vous verrez ceci dans le transcript :
ANTHROPIC_API_KEY=[REDACTED:injected-value]
⏺ ANTHROPIC_API_KEY is set and available (injected via aquaman vault).
Le processus enfant a vu la vraie clé (vos tests, builds, serveurs MCP, scripts d'importation – tout ce qui en a réellement besoin fonctionne). L'agent – ce qui décide quel code exécuter sur votre machine – ne voit jamais la valeur, et donc ni l'historique de la conversation, ni les journaux du fournisseur de modèle, ni quiconque qui ferait une capture d'écran de votre terminal par la suite.
Utilisez-le depuis votre propre terminal aussi. Le même wrapper fonctionne sans l'agent. Il suffit de cd dans un projet couvert et de préfixer votre commande :
cd ~/code/
aquaman-coder exec -- python app/scripts/import.py
Même injection d'environnement, même masquage sur stdout/stderr. Intégrez-le dans des cibles Makefile, des alias shell ou des exécuteurs CI – partout où vous utiliseriez autrement un fichier .env.
Lorsque Claude Code exécute un outil Bash dans ~/code/my-app, le hook d'aquaman réécrit la commande via updatedInput.command pour l'envelopper sous aquaman-coder exec. Ce wrapper :
aquaman://service/key via le broker (POST /broker/resolve sur UDS). Les identifiants sont matérialisés pour une seule commande, pas pour la durée de vie de l'agent.Hermes est un hôte étranger (Python) sans crochet de transport pour injecter, donc l'isolation est faite côté proxy : le proxy expose un écouteur de boucle locale optionnel avec jeton et Hermes y est pointé via ses propres variables d'environnement.
npm install -g aquaman-proxy # 1. install daemon
aquaman setup # 2. vault wizard
aquaman credentials add anthropic api_key sk-ant-... # 3. store a provider key
aquaman hermes setup # 4. enable loopback + write ~/.hermes/.env
aquaman daemon & # 5. start the proxy (UDS + loopback)
aquaman hermes doctor # 6. verify - listener + env + vault + Hermes
aquaman hermes setup active l'écouteur de boucle locale, génère un jeton par installation et écrit un bloc géré par aquaman dans ~/.hermes/.env (en respectant HERMES_HOME) : le ANTHROPIC_BASE_URL/OPENAI_BASE_URL natif plus un api_key placeholder égal au jeton. Hermes envoie le jeton comme sa clé fournisseur ; le proxy le retire, injecte votre véritable identifiant de coffre et transmet en amont. Fournisseurs LLM uniquement (Anthropic, OpenAI) pour l'instant.
Sucre optionnel en session – le plugin Python ajoute une commande /aquaman-status, un outil aquaman_status et une sonde de santé au démarrage de session dans Hermes (ne détient aucun identifiant) :
pip install aquaman-hermes # or: uv tool install aquaman-hermes
aquaman-hermes install # drops the plugin into ~/.hermes/plugins/aquaman/
hermes plugins enable aquaman
Agent / OpenClaw / Coding Agent Aquaman Proxy
┌──────────────────────┐ ┌──────────────────────┐
│ │ │ │
│ ANTHROPIC_BASE_URL │═══ UDS / HTTP ════>│ Keychain / 1Pass / │
│ = aquaman.local │ │ Vault / Encrypted │
│ │<══════════════════ │ │
│ fetch() interceptor │═══ broker:resolve │ + Policy enforced │
│ (channel APIs) │ │ + Auth injected: │
│ │ │ header / url-path │
│ No credentials. │ ~/.aquaman/ │ basic / oauth │
│ No open ports. │ proxy.sock │ │
│ Nothing to steal. │ (chmod 0o600) │ │
└──────────────────────┘ └──┬─────────┬─────────┘
│ │
│ ▼
│ ~/.aquaman/audit/
│ (hash-chained)
▼
api.anthropic.com
api.telegram.org
slack.com/api …
403, jamais de véritables en-têtes d'authentification.none, est uniquement au repos (le proxy rejette le trafic).POST /broker/resolve matérialise un identifiant par appel d'outil, limité à l'environnement d'une seule commande, puis expire.L'agent ne voit jamais qu'un nom d'hôte sentinelle (aquaman.local) ou un marqueur placeholder (aquaman-proxy-managed). Il ne voit jamais une vraie clé, et aucun port TCP n'est ouvert pour que d'autres processus puissent sonder.
Modèle détaillé – spécificités par intégration (portée de l'intercepteur HTTP, profils d'authentification, résultats du scanner, note de l'éditeur ClawScan) – se trouve dans packages/plugin/README.md et packages/coder/README.md.
Aquaman fournit des tests de conformité exécutables sous test/compliance/ mappés à :
test/compliance/atlas/)test/compliance/nist/)Plus des récits d'alignement pour le document « Careful Adoption of Agentic AI Services » du CISA/Cinq-Yeux (avril 2026), CSA MAESTRO, et l'OWASP Top 10 pour les applications agentiques. Les tests sont exécutés dans le cadre de npm test. Voir docs/compliance/ pour les correspondances.
Les portées OAuth ne peuvent pas faire la distinction entre « rédiger un email » et « envoyer un email ». Les deux sont gmail.send. Les politiques de requêtes comblent cette lacune.
# ~/.aquaman/config.yaml
policy:
anthropic:
defaultAction: allow
rules:
- method: "*"
path: "/v1/organizations/**"
action: deny # block admin/billing API
openai:
defaultAction: allow
rules:
- method: "*"
path: "/v1/organization/**"
action: deny
- method: DELETE
path: "/v1/**"
action: deny # no deletions
slack:
defaultAction: allow
rules:
- method: "*"
path: "/admin.*"
action: deny
gmail:
defaultAction: allow
rules:
- method: POST
path: "/v1/users/*/messages/send"
action: deny # drafts ok, sending blocked
defaultAction* correspond à un segment, ** correspond à zéro ou plusieurs segmentsaquaman setup applique des valeurs par défaut sûres pour les services stockés (anthropic, openai, slack, gmail).aquaman policy list / aquaman policy test <svc> <method> <path> pour inspection / exécutions à blanc.Apportez votre propre coffre – aquaman n'a pas de stockage maison. Choisissez le backend que vous exécutez déjà ; les secrets y restent, et le proxy les lit sur place.
aquaman setup détecte automatiquement une valeur par défaut raisonnable (macOS → keychain ; Linux → keychain si libsecret, sinon systemd-creds si systemd ≥ 256, sinon encrypted-file).
encrypted-file est un dernier recours pour les environnements Linux/CI sans tête sans trousseau natif. Pour une meilleure sécurité sur Linux, installez libsecret-1-dev (GNOME Keyring), utilisez systemd-creds (liaison TPM2), ou utilisez 1Password/Vault.
Les backends avec un coût par accès – 1password (une invite biométrique par lecture en mode application de bureau), bitwarden (~1-2 s de lancement CLI), vault (un aller-retour HTTP) – sont mis en cache dans la mémoire du démon pendant 15 minutes par défaut, de sorte qu'une session d'agent occupée déverrouille le coffre une fois par fenêtre au lieu d'une fois par requête. Les autres backends sont déjà rapides ou mettent en cache en interne, donc la mise en cache est désactivée pour eux par défaut. Ajustez avec credentials.cacheTtlSeconds dans ~/.aquaman/config.yaml (ou AQUAMAN_CACHE_TTL) ; 0 désactive.
Le compromis honnête : une invite biométrique par accès est une vérification de présence utilisateur, et le cache supprime la présence par accès pendant la fenêtre TTL. Pour les agents non supervisés, cette invite n'est jamais répondue – ils abandonnent le coffre pour un .env en texte brut, ce qui est strictement pire. Le cache ne déplace pas la frontière d'isolation : les valeurs ne vivent que dans le processus proxy (où elles transitent déjà à chaque requête), ne sont jamais écrites sur le disque et sont invalidées immédiatement lorsque vous faites une rotation via aquaman credentials add. Les écritures vont toujours dans votre coffre. Testé de conformité dans test/compliance/cache-residency.test.ts. Pour zéro invite avec 1Password, utilisez un compte de service limité au coffre aquaman – aquaman doctor vous y dirigera.
MIT - voir LICENSE.
| Package | Ce qu'il fait | Quand l'installer |
|---|
aquaman-proxy | Cœur : coffre, démon, audit, politique, CLI. L'élément dont tout le monde a besoin. | Toujours. |
aquaman-plugin | Adaptateur OpenClaw Gateway. Lance le proxy au démarrage de Gateway ; intercepte le trafic des canaux ; 25 services intégrés sur 5 modes d'authentification. | Si vous exécutez un OpenClaw Gateway. Également disponible sur https://clawhub.ai/plugins/aquaman-plugin |
aquaman-coder | Adaptateur pour agents de codage IA. Références aquaman://service/key à portée de projet résolues à chaque appel d'outil Bash. | Si vous utilisez Claude Code (aujourd'hui) - Codex / OpenCode / Cursor prévu. |
aquaman-hermes | Plugin hôte d'agent Hermes (Python, sur PyPI). Pointe Hermes vers un écouteur de boucle locale optionnel avec jeton via son ANTHROPIC_BASE_URL/OPENAI_BASE_URL natif ; ajoute une commande /aquaman-status en session, un outil et une sonde de santé. L'isolation est côté proxy ; le plugin ne détient aucun identifiant. | Si vous exécutez l'hôte d'agent Hermes. pip install aquaman-hermes |
| Couche | Ce qu'elle fait | Ce qu'elle empêche |
|---|
| Isolation des processus | Identifiants dans un processus séparé, connecté via un socket de domaine Unix (chmod 0o600) | Un agent compromis ne peut pas lire les clés – espace d'adressage différent, pas de port TCP à sonder |
| Liste blanche de services | proxiedServices contrôle quelles API l'agent peut atteindre | L'agent ne peut pas parler à des services que vous n'avez pas autorisés |
| Politiques de requêtes | Règles de méthode + chemin par service, appliquées avant l'injection d'identifiants | L'agent peut atteindre Anthropic mais pas son API d'administration ; peut rédiger des emails mais pas les envoyer |
| Piste d'audit | Journaux chaînés par hachage SHA-256 de chaque utilisation d'identifiant | Forensique post-incident, détection de falsification, preuve de conformité |
| Broker par appel d'outil (codeur) | aquaman-coder exec matérialise les identifiants pour une seule commande à la fois | Les identifiants ne se propagent pas dans l'environnement shell de l'agent |
| Masquage de sortie (codeur) | aquaman-coder exec redirige stdout/stderr via un masqueur qui supprime chaque valeur qu'il vient d'injecter textuellement – plus des motifs génériques de fournisseur en secours | Même les identifiants arbitraires sans forme prédéfinie n'atteignent jamais le transcript de l'agent |
| Backend | Idéal pour | Configuration |
|---|
keychain | Développement local sur macOS (par défaut) | Fonctionne prêt à l'emploi |
encrypted-file | Linux, WSL2, CI/CD | AES-256-GCM, protégé par mot de passe |
keepassxc | Utilisateurs existants de KeePass | Définir AQUAMAN_KEEPASS_PASSWORD ou fichier de clé |
1password | Partage d'identifiants en équipe | brew install 1password-cli && op signin – pour les agents non supervisés, utilisez un compte de service (OP_SERVICE_ACCOUNT_TOKEN) |
vault | Gestion d'entreprise des secrets | Définir VAULT_ADDR + VAULT_TOKEN |
systemd-creds | Linux avec systemd ≥ 256 | Adossé à TPM2, aucun root requis |
bitwarden | Utilisateurs Bitwarden | bw login && export BW_SESSION=$(bw unlock --raw) |