Кто может объяснить, как работает ssh agent forwarding?

Постановка задачи: <br/> У нас есть клиентская машина с множеством SSH-ключей, загруженных в ssh agent. Также имеется сервер, на котором sshd ограничивает количество попыток аутентификации. На клиентской машине данная проблема решается указанием необходимого ключа в конфигурационном файле ~/.ssh/config. При подключении по SSH к промежуточному хосту с форвардингом агента, клиент ssh начинает перебор всех доступных ключей и, исчерпав попытки, не может подключиться к серверу. Однако если на промежуточном хосте сохранить публичный ключ, соответствующий паре для доступа к серверу, и затем использовать его при подключении: <br/> <pre><code class="bash">ssh -i ~/.ssh/target_server_key.pub user@target_server</code></pre> <br/> подключение проходит успешно. При этом дебаг (ключ -Tv) показывает, что явно указанный ключ предлагается первым: <br/> <blockquote><br/>
debug1: Next authentication method: publickey<br/>
debug1: Offering public key: {...}.pub ED25519 SHA256:{...} explicit agent<br/>
debug1: Server accepts key: {...}.pub ED25519 SHA256:{...} explicit agent<br/>
</blockquote> <br/> Но возникает вопрос: почему это срабатывает, если я предложил публичный ключ, а не приватный?
  • 13 января 2025 г. 10:14
Ответы на вопрос 3
В вашем вопросе есть несколько важных аспектов, которые требуют пояснения в контексте работы SSH и аутентификации.

1. **SSH-агент и ключи:** SSH-агент (`ssh-agent`) хранит ваши приватные ключи в памяти и позволяет использованию этих ключей для аутентификации без необходимости каждый раз вводить пароль. Когда вы используете `ssh-add`, вы добавляете свои приватные ключи в агент.

2. **Форвардинг агента:** Когда вы подключаетесь к промежуточному хосту с включенным форвардингом агента (через опцию `-A` или в конфигурационном файле), ваш SSH-клиент передает запросы на аутентификацию на локальный агент, а не хранит ключи на промежуточном хосте. Это позволяет использовать ключи, которые загружены в агент на вашей клиентской машине, для аутентификации на целевом сервере, к которому вы подключаетесь через промежуточный хост.

3. **Передача публичного ключа:** Когда вы указали команду с `-i ~/.ssh/target_server_key.pub`, вы фактически указываете SSH использовать соответствующий приватный ключ, который хранится в файле `~/.ssh/target_server_key`. Важно понимать, что в процессе аутентификации SSH использует приватный ключ, а публичный ключ просто передается на сервер для проверки. Сервер не принимает публичные ключи напрямую для аутентификации. Он сопоставляет предоставленный публичный ключ с записанным в файле `~/.ssh/authorized_keys` и аутентифицирует запрос, если все совпадает.

4. **Почему работает `-i` с публичным ключом:** То, как вы указали в команде `ssh -i ~/.ssh/target_server_key.pub user@target_server`, вы, возможно, указываете на файл, который интерпретируется как приватный ключ. Обычно SSH ожидает, что файл будет с приватным ключом, иImplicitно используется соответствующая пара ключей (приватный и публичный). Если файл, который вы предоставили, соотносится с публичным ключом и на сервере прописан соответствующий приватный ключ, то соединение будет успешным.

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


-i identity_file
[...] You can also specify a public key file to use the corresponding private key that is loaded in ssh-agent(1) when the private key file is not present locally.


https://man7.org/linux/man-pages/man1/ssh.1.html
Потому что PublicKeyAuthentication так и работает - вы предлагаете серверу публичный ключ, он же, проверяя соответствующий приватный ключ, допускает вас или не допускает 
Про форвардинг
When the user uses an SSH client on the server, the client will try to contact the agent implemented by the server and the server then forwards the request to the client that originally contacted the server, which further forwards it to the local agent

Вы инициируете вышеописанную цепочку когда с сервера(выделенного жирным) ssh клиентом пытаетесь подключиться к другому серверу

Если форвардинг не работает - проверяйте:
To use agent forwarding, the ForwardAgent option must be set to yes on the client (see ssh_config) and the AllowAgentForwarding option must be set to yes on the server (see sshd_config)
Ну и запущен ли SSH агент на первоначальном клиенте и на первом сервере

А вообще - документация https://www.ssh.com/academy/ssh/agent
Похожие вопросы