web-dev-qa-db-fra.com

quel est le but de ssh-agent?

J'ai lu la définition officielle:

ssh-agent est un programme qui contient des clés privées utilisées pour l'authentification par clé publique (RSA, DSA, ECDSA). L'idée est que ssh-agent est démarré au début d'une session X ou d'une session de connexion, et que toutes les autres fenêtres ou programmes sont démarrés en tant que clients du programme ssh-agent. Grâce à l'utilisation de variables d'environnement, l'agent peut être localisé et automatiquement utilisé pour l'authentification lors de la connexion à d'autres machines à l'aide de ssh (1).

".. un programme pour conserver les clés privées .." - IMHO - les clés ssh sont générées par l'utilisateur avec la commande ssh-keygen et simplement et directement stockées dans ~/.ssh - pourquoi ai-je besoin d'un démon pour tenir ces clés? Comment les contient-il exactement de toute façon - ne sont-ils pas simplement stockés dans .ssh?

"sont démarrés en tant que clients du programme ssh-agent" - Je ne comprends pas. Où aurait-on besoin de ça? J'utilise généralement ssh comme ceci:

 ssh -i ~/.ssh/private_key_name username@hostname

Que signifie exactement manuel par "clients" - quels clients? N'exécutez-vous pas simplement la commande ssh à partir du terminal pour vous connecter - quels sont les autres clients et pourquoi ne peuvent-ils pas simplement utiliser un chemin vers ce fichier privé ssh, tout comme la commande ssh?

77
agent_smith

L'agent SSH gère pour vous la signature des données d'authentification. Lors de l'authentification sur un serveur, vous devez signer certaines données à l'aide de votre clé privée, pour prouver que vous êtes bien.

Par mesure de sécurité, la plupart des gens protègent sensiblement leurs clés privées avec une phrase secrète, donc toute tentative d'authentification vous obligerait à saisir cette phrase secrète. Cela peut être indésirable, donc l'agent ssh met en cache la clé pour vous et vous n'avez besoin d'entrer le mot de passe qu'une seule fois, lorsque l'agent veut le déchiffrer (et souvent même pas, car l'agent ssh peut être intégré à pam, ce que font de nombreuses distributions).

L'agent SSH ne remet jamais ces clés aux programmes clients, mais présente simplement un socket sur lequel les clients peuvent lui envoyer des données et sur lequel il répond avec des données signées. Un avantage secondaire de ceci est que vous pouvez utiliser votre clé privée même avec des programmes auxquels vous ne faites pas entièrement confiance.

Un autre avantage de l'agent SSH est qu'il peut être transféré via SSH. Ainsi, lorsque vous SSH vers l'hôte A, tout en transférant votre agent, vous pouvez ensuite SSH de A vers un autre hôte B sans avoir besoin de votre clé (même sous forme cryptée) sur l'hôte A.

84
Dennis Kaarsemaker

L'avantage pour ssh-agent est que vous n'avez besoin de saisir votre mot de passe qu'une seule fois. Si votre clé RSA privée n'est pas chiffrée avec une phrase secrète, alors ssh-agent n'est pas nécessaire. La commande ssh serait un exemple de client.

16
jordanm

Si vous utilisez régulièrement ssh sur une variété de machines différentes, chacune avec sa propre clé et phrase de passe, exécutez ssh-agent vous permet de saisir une fois la phrase secrète pour chaque touche1 au début de votre session, puis vous pourrez vous authentifier sur chaque machine autant de fois que vous le souhaitez sans avoir à ressaisir votre phrase secrète.

Un autre avantage est que, selon la page man, l'agent n'envoie jamais de clé privée sur son canal de demande; donc si vous sautez entre différentes cases, vos clés privées sont protégées.

1Vous pouvez définir la durée life pendant laquelle les clés sont conservées dans l'agent.

7
jasonwryan

article Wikipedia a probablement la meilleure description:

La vérification sur le serveur est basée sur l'authentification défi-réponse. ssh se connecte au serveur avec un nom d'utilisateur et la demande de clé. Le démon ssh reçoit la demande et renvoie un défi basé sur la clé publique stockée dans le fichier d'authentification. ssh utilise la clé privée pour construire une réponse de clé et l'envoie au sshd en attente à l'autre extrémité de la connexion. Il n'envoie pas la clé privée elle-même. Le démon ssh valide la réponse de la clé et, s'il est valide, accorde l'accès au système. ssh-agent simplifie cela en créant un socket qui écoute les connexions SSH. L'utilisateur démarre simplement ssh-agent, lui indiquant comment trouver leurs clés (si elles ne se trouvent pas à l'emplacement par défaut), saisit la phrase secrète pour chaque clé à utiliser, une fois, puis ssh-agent gère la reste à chaque fois que l'utilisateur se connecte à un serveur distant.

Encore une fois mot pour mot de l'article de wikipedia:

... ssh-agent crée un socket puis vérifie les connexions depuis ssh. Tous ceux qui peuvent se connecter à ce socket ont également accès à l'agent ssh. Les autorisations sont définies comme dans un système Linux ou Unix habituel. Lorsque l'agent démarre, il crée un nouveau répertoire dans/tmp avec des autorisations restrictives. Le socket se trouve dans le dossier.

Il est généralement placé dans les fichiers rc d'un système ou d'un utilisateur tels que $HOME/.bashrc ou $HOME/.profile (pour les shells bash) afin que les variables d'environnement ssh-agent set s'incorpore complètement à votre environnement.

Sur mon système Fedora 14, il démarre assez tôt dans le cadre du sous-système X11. Dans ce fichier, /etc/X11/xinit/xinitrc-common:

# Prefix launch of session with ssh-agent if available and not already running.
SSH_AGENT=
if [ -z "$SSH_AGENT_PID" ] && [ -x /usr/bin/ssh-agent ]; then
    if [ "x$TMPDIR" != "x" ]; then
        SSH_AGENT="/usr/bin/ssh-agent /bin/env TMPDIR=$TMPDIR"
    else
        SSH_AGENT="/usr/bin/ssh-agent"
  fi
fi

La variable $SSH_AGENT est ensuite utilisé dans d'autres scripts de démarrage X11 comme ici, /etc/X11/xinit/Xclients:

exec -l $Shell -c "$SSH_AGENT $XCLIENTS_D/Xclients.$1.sh"

En l'intégrant ici, les variables d'environnement suivantes sont définies dans le cadre d'un shell parent, par conséquent, tous les enfants bifurqués devraient également les avoir, par exemple:

SSH_AUTH_SOCK=/tmp/ssh-PspRF18958/agent.18958; export SSH_AUTH_SOCK;
SSH_AGENT_PID=18959; export SSH_AGENT_PID;

Il y a un peu plus de complexité, mais en un mot, c'est essentiellement ce qui se passe avec ssh-agent.

Par exemple, dans GNOME, ssh-agent est en fait lancé par utilisateur en tant qu'application de démarrage:

ss of startup apps

TL; DR

Conclusion, ssh-agent existe de telle sorte que lorsque vos clés ssh sont requises, vous ne devez les déverrouiller qu'une seule fois avec leur mot de passe (en supposant qu'elles en aient une), et qu'elles soient désormais disponibles sous leur forme déchiffrée en mémoire (RAM).

7
slm

"sont démarrés en tant que clients du programme ssh-agent" fait référence à l'idée que ssh-agent est démarré lors de l'initialisation de la session de connexion (locale) afin que tous les programmes obtiennent les variables d'environnement $SSH_AGENT_PID et $SSH_AUTH_SOCK qui sont nécessaires pour connecter l'agent.

Un autre avantage de la suppression de la gestion des clés privées de ssh est que ssh-agent peut être remplacé par gpg-agent. Ainsi, vous pouvez utiliser des clés OpenPGP (avec capacité d'authentification) pour SSH. C'est une bonne solution pour les clés OpenPGP sur une carte à puce.

1
Hauke Laging