Постановка задачи: <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/> Но возникает вопрос: почему это срабатывает, если я предложил публичный ключ, а не приватный?
В вашем вопросе есть несколько важных аспектов, которые требуют пояснения в контексте работы 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 находит соответствующий приватный ключ, а не потому что вы подаете публичный ключ.
Так это буквально в документации написано <br/> <br/> <blockquote><br/> <b>-i identity_file</b><br/> [...] 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.<br/> </blockquote> <br/> <br/> <a href="https://man7.org/linux/man-pages/man1/ssh.1.html" rel="nofollow">https://man7.org/linux/man-pages/man1/ssh.1.html</a>
Потому что <a href="https://www.ssh.com/academy/ssh/public-key-authentication" rel="nofollow">PublicKeyAuthentication</a> так и работает - вы предлагаете серверу публичный ключ, он же, проверяя соответствующий приватный ключ, допускает вас или не допускает <br/> Про форвардинг <br/> <blockquote>When the user uses an <b>SSH client on the server</b>, the client will try to contact the agent implemented by the server and the server then forwards the request to the <b>client that originally contacted the server</b>, which further forwards it to the local agent</blockquote> <br/> Вы инициируете вышеописанную цепочку когда с сервера(выделенного жирным) ssh клиентом пытаетесь подключиться к другому серверу <br/> <br/> Если форвардинг не работает - проверяйте: <br/> To use agent forwarding, the <b>ForwardAgent </b> option must be set to yes on the <b>client (see ssh_config)</b> and the <b>AllowAgentForwarding</b> option must be set to yes on the <b>server (see sshd_config)</b> <br/> Ну и запущен ли SSH агент на первоначальном клиенте и на первом сервере <br/> <br/> А вообще - документация <a href="https://www.ssh.com/academy/ssh/agent" rel="nofollow">https://www.ssh.com/academy/ssh/agent</a>