ADR-116 — air-agent : agent SSH maison (keystore-backed) d’abord, interop protocole ssh-agent ensuite, agent forwarding opt-in
Statut : Accepté (2026-07-26, décision BDFL). RFC de direction
(ADR-015).
S’appuie sur ADR-108 (air-keystore
air-keysign, motif oracle-safe), ADR-094 (userauth publickey — l’agent fournit les signatures), ADR-091 (motif sans-IO — codec du protocole agent), ADR-089 (SecurityManager— politique de forwarding), ADR-088 (os-free), ADR-095 (packaging), ADR-029 (nommage).
Catégorie : Couche 2 (service) + codec protocole. Vague 2 #4.
Contexte
Un agent SSH détient les clés utilisateur déchiffrées en mémoire et signe à la demande, pour que l’utilisateur ne re-saisisse pas sa phrase de passe à chaque connexion (et pour l’agent forwarding — utiliser ses clés depuis un hôte distant). Air n’en a pas.
Deux voies existent : (a) notre propre agent (keystore-backed) ; (b) parler le
protocole ssh-agent d’OpenSSH (via SSH_AUTH_SOCK) pour que ssh/git classiques
l’utilisent. L’agent forwarding est la partie la plus sensible (un hôte distant compromis
peut utiliser vos clés pendant la session — même classe de risque que la délégation).
Directive BDFL (2026-07-26). Sur le sourcing de l’agent : « (c) les deux à terme, mais (a) d’abord (notre agent, keystore-backed) ; l’interop protocole vient ensuite. L’agent forwarding reste plus sensible → opt-in, plus tard. »
Décision
1. air-agent — service couche 2, cousin d’air-keysign pour les clés utilisateur
Un service air-agent (couche 2, socket Unix, air-socket), qui détient les clés
utilisateur (chargées via air-keystore [ADR-108], déchiffrées en mémoire, zeroize au
retrait) et signe à la demande. C’est le pendant utilisateur d’air-keysign (qui, lui,
sert la clé d’hôte privilégiée) : même motif oracle-safe — restreint les appelants
(peer credentials du socket Unix), et sert des signatures, pas les clés privées elles-mêmes.
Compilé *-linux-air, packagé ([ADR-095]). Nommage [ADR-029].
2. (a) maison d’abord, (b) interop protocole ensuite, cible (c) les deux
- (a) D’abord : l’agent maison — API native consommée par
air-sshpour l’auth publickey ([ADR-094]) sans re-saisie. - (b) Ensuite : interop du protocole ssh-agent (exposer/consommer
SSH_AUTH_SOCK) pour quessh/gitclassiques utilisentair-agent, et queair-sshpuisse utiliser un agent OpenSSH existant. Le codec du protocole ssh-agent suit le motif sans-IO ([ADR-091] : cœur pur fuzzable) — l’agent parse des messages externes. - Cible (c) : les deux coexistent (agent Air natif + compatibilité écosystème).
3. Agent forwarding = opt-in, plus tard
Le forwarding de l’agent (client qui expose son agent au serveur — auth-agent-req@openssh.com
— et serveur qui l’accepte) est désactivé par défaut et opt-in explicite. Il est
sensible (un hôte distant compromis peut signer avec vos clés pendant la session) : sa
politique relève du SecurityManager ([ADR-089]) ; son câblage (canal auth-agent) dans
air-ssh/air-sshd est différé (implémenté quand le besoin est établi, avec les garde-fous).
Conséquences
Positives.
- Ergonomie : plus de re-saisie de phrase de passe ; base pour l’agent forwarding maîtrisé.
- Cohérence : même motif oracle-safe qu’
air-keysign([ADR-108]) — l’agent sert des signatures, pas des clés ; keystore-backed. - Interop :
ssh/gitclassiques peuvent utiliserair-agent(et inversement) via le protocole standard, codec fuzzé. - Risque cadré : forwarding opt-in + politique
SecurityManager— on n’ouvre pas la surface sensible par défaut.
Négatives / coûts assumés.
- Service détenant des secrets en mémoire : cible de valeur ⇒
zeroize, restriction des appelants (peer-cred), pas de dump ; à concevoir avec soin (TCB). - Codec ssh-agent = surface externe ⇒ sans-IO + fuzz obligatoires.
- Forwarding différé : fonctionnalité attendue par certains workflows, volontairement repoussée (sécurité d’abord) — assumé.
Mise en œuvre (référence, hors décision). Incréments : (a) service air-agent maison
(socket Unix, signatures via keystore/air-crypto, peer-cred) + intégration air-ssh publickey ;
(b) codec protocole ssh-agent (sans-IO, fuzz) + interop SSH_AUTH_SOCK ; (c) agent forwarding
opt-in (canal auth-agent, politique SecurityManager) différé. Non engagés par cet ADR.
Alternatives rejetées
Aucune alternative n’a été consignée lors de l’instruction.