какова цель ssh-agent?

71

Я прочитал официальное определение:

ssh-agent - это программа для хранения закрытых ключей, используемая для аутентификации с открытым ключом (RSA, DSA, ECDSA). Идея состоит в том, что ssh-agent запускается в начале сеанса X или сеанса входа в систему, а все другие окна или программы запускаются как клиенты для программы ssh-agent. Благодаря использованию переменных среды агент может быть найден и автоматически использован для аутентификации при входе на другие машины с использованием ssh (1).

«... программа для хранения закрытых ключей ..» - ИМХО - ключи ssh генерируются пользователем с помощью команды ssh-keygen и просто и просто хранятся в ~ / .ssh - зачем мне нужен демон для хранения этих ключей? Как именно они их хранят? Разве они не хранятся в .ssh?

«запускаются как клиенты к программе ssh-agent» - не понимаю. Где это нужно? Я обычно просто использую ssh как это:

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

Что именно означает «клиенты» - какие клиенты? Разве вы не просто запускаете команду ssh из терминала для подключения - какие есть другие клиенты и почему они не могут просто использовать путь к этому приватному файлу ssh, как команда ssh?

agent_smith
источник

Ответы:

76

Агент SSH обрабатывает подпись данных аутентификации для вас. При аутентификации на сервере вы должны подписать некоторые данные, используя свой закрытый ключ, чтобы доказать, что вы, в общем-то, вы.

В качестве меры безопасности большинство людей разумно защищают свои закрытые ключи парольной фразой, поэтому любая попытка аутентификации потребует от вас ввода этой парольной фразы. Это может быть нежелательно, поэтому ssh-agent кеширует ключ для вас, и вам нужно ввести пароль только один раз, когда агент захочет его расшифровать (и зачастую даже не так, поскольку ssh-agent может быть интегрирован с pam, что делают многие дистрибутивы).

Агент SSH никогда не передает эти ключи клиентским программам, а просто представляет сокет, по которому клиенты могут отправлять ему данные и по которому он отвечает подписанными данными. Дополнительным преимуществом этого является то, что вы можете использовать свой закрытый ключ даже с программами, которым вы не полностью доверяете.

Еще одно преимущество агента SSH заключается в том, что его можно пересылать через SSH. Поэтому, когда вы пересылаете своего агента по ssh на хост A, вы можете затем перешагнуть ssh с A на другой хост B без необходимости присутствия вашего ключа (даже в зашифрованном виде) на хосте A.

Деннис Каарсемакер
источник
10
Я чувствую, что это самый полный ответ, но все еще не хватает одного пункта. Использование ключевого агента также позволяет легко использовать несколько ключей. Вместо того, чтобы указывать путь к ключу, при использовании ключевого агента ssh будет пробовать каждый ключ в нем.
Патрик
3
@ Патрик, который также может быть его недостатком - попробуйте слишком много недопустимых ключей на сервере, и он закроет соединение, прежде чем вы получите действительный ключ. Конечно, это то, что ~/.ssh/config«s IdentityFileвариант хорош для, с или без агента
Tobias Kienzler
@ Патрик, который кажется одинаково возможным без агента
Андрей Федоров
@AndreyFedorov Да, вы можете иметь несколько ключей без агента, но вы также можете указать, ~/.ssh/configкакой ключ использовать для какого удаленного хоста, чтобы он точно знал, какой из них ему нужен.
Патрик
3
поэтому можно предположить, что в ssh-agentэтом нет необходимости, если закрытый ключ не защищен парольной фразой?
пкарамол
16

Преимущество ssh-agentзаключается в том, что вам нужно ввести пароль только один раз. Если ваш закрытый ключ RSA не зашифрован парольной фразой, тогда ssh-agent не требуется. Команда sshбудет примером клиента.

jordanm
источник
7

Если вы регулярно sshИНГ в различных машинах, каждый со своим собственным ключом и ключевую фразу, а затем работает ssh-agentпозволяет ввести ключевую фразу для каждого ключа один раз 1 в начале сеанса , а затем вы можете проверить подлинность каждой машине столько раз , как вам нравится без необходимости повторного ввода вашей парольной фразы.

Еще одним преимуществом является то, что, согласно manстранице, агент никогда не отправляет закрытый ключ по своему каналу запроса; поэтому, если вы переключаетесь между разными окнами, ваши закрытые ключи защищены.

1 Вы можете установить lifeвремя удержания клавиш в агенте.

jasonwryan
источник
6

Статья в Википедии, вероятно, имеет лучшее описание:

Проверка на сервере основана на аутентификации запрос-ответ. ssh подключается к серверу с именем пользователя и запросом ключа. Демон ssh получает запрос и отправляет обратно запрос на основе открытого ключа, хранящегося в файле аутентификации. ssh использует закрытый ключ для создания ответа ключа и отправляет его ожидающему sshd на другом конце соединения. Сам секретный ключ не отправляет. Демон ssh проверяет ответ ключа и, если он действителен, предоставляет доступ к системе. ssh-agent упрощает это, создавая сокет, который прослушивает SSH-соединения. Пользователь просто запускает ssh-agent, сообщая ему, как найти свои ключи (если они не находятся в расположении по умолчанию), вводит ключевую фразу для каждого используемого ключа, единовременно,

Опять дословно из статьи в википедии:

... ssh-agent создает сокет и затем проверяет соединения из ssh. Каждый, кто может подключиться к этому сокету, также имеет доступ к ssh-агенту. Права доступа установлены как в обычной системе Linux или Unix. Когда агент запускается, он создает новый каталог в / tmp с ограниченными правами. Гнездо находится в папке.

Обычно он помещается в системные или пользовательские rc-файлы, такие как $HOME/.bashrcили $HOME/.profile(для оболочек bash), так что ssh-agentнабор переменных среды полностью включается в вашу среду.

В моей системе Fedora 14 она запускается довольно рано как часть подсистемы X11. В этом файле /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

Затем переменная $SSH_AGENTиспользуется в других сценариях запуска X11, таких как здесь /etc/X11/xinit/Xclients:

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

При включении этого здесь следующие переменные среды устанавливаются как часть родительской оболочки, поэтому они должны быть у всех разветвленных потомков, например:

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

Это немного сложнее, но в двух словах, это в основном то, что происходит ssh-agent.

Например, в GNOME ssh-agentфактически запускается для каждого пользователя в качестве запускаемого приложения:

                     ss запуска приложений

TL; DR

Суть в том, ssh-agentчто когда вам нужны ssh-ключи, вам нужно всего лишь один раз разблокировать их парольной фразой (при условии, что она есть), и с тех пор они доступны в расшифрованном виде в памяти (RAM).

SLM
источник
1

«запускаются как клиенты для программы ssh-agent» относится к идее, что ssh-agent запускается во время (локальной) инициализации сеанса входа в систему, так что все программы получают переменные среды $SSH_AGENT_PIDи $SSH_AUTH_SOCKкоторые необходимы для подключения агента.

Еще одним преимуществом обработки закрытого ключа из ssh является то, что ssh-agent может быть заменен gpg-agent. Таким образом, вы можете использовать ключи OpenPGP (с возможностью аутентификации) для SSH. Это хорошее решение для ключей OpenPGP на смарт-карте.

Хауке Лагинг
источник