SSH multi-hop через конфигурационный файл

827
nx105

Я хотел бы войти на удаленный сервер, выполнив STH. как ssh remoteServer . Доступ к удаленному серверу возможен только через сервер входа в систему (их два).

Есть два маршрута, которые я хотел бы использовать (если невозможно использовать один сервер входа в систему):

  1. ABD
  2. ACD

Некоторая информация:

  • A : мой локальный компьютер
  • B : сервер входа в систему; разрешено только логин В / пароль (без ключевого файла); Я не могу внести изменения (сохранить файл ключа и т. Д.)
  • C : сервер входа в систему; позволяет войти в файл ключа; Я могу внести некоторые изменения (но не суперпользователь)
  • D : целевой сервер; может быть достигнуто только из B или C; позволяет входить в файл ключа

Я использую защищенный паролем файл закрытого ключа (на A и C; тот же самый), который я могу использовать для входа в C и D. Вот что я хочу:

  1. ssh B_D : запрашивает пароль для имени пользователя B @ B, а затем для пароля файла закрытого ключа для имени пользователя D @ D. Поскольку я не могу сохранить закрытый ключ на B, его нужно как-то переслать. Если я загрузил его с помощью ssh-agent, он больше не должен запрашивать пароль.
  2. ssh C_D : один раз запросить пароль закрытого ключа, а затем использовать его для входа в систему с именем пользователя C @ C, а затем с именем пользователя D @ D. Опять же, если ключ был предварительно загружен с помощью ssh-agent, он не должен запрашивать пароль.

Частично я могу использовать следующую команду для достижения вышеуказанного (но только если ключ был загружен с помощью ssh-agent):

ssh -A -t usernameB@B ssh usernameD@D ssh -A -t usernameC@C ssh usernameD@D 

Возможно, есть модификация, которая сначала загружает файл ключа, но только для этого сеанса? Если я выйду из системы, файл ключа должен быть выгружен.

Приведенная выше команда имеет две проблемы:

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

Я смог достичь чего-л. аналогично, используя конфигурационный файл ssh:

Host C HostName addressOfC User usernameC IdentityFile ~/.ssh/id_rsa ForwardAgent yes  Host C_D HostName addressD User usernameD IdentityFile ~/.ssh/id_rsa Port 22 ProxyCommand ssh -A -W %h:%p C 

Опять две проблемы:

  1. Мне нужно сначала загрузить ключ с помощью ssh-agent. В противном случае он дважды запрашивает пароль.
  2. Требуется возраст (24 секунды) для подключения. Я должен упомянуть здесь, что я на Windows использую mobaXterm, на случай, если это будет отвечать за 24 секунды.

Есть один последний улов: переадресация агента, по-видимому, небезопасна в соответствии с https://heipei.github.io/2015/02/26/SSH-Agent-Forwarding-considered-harmful/ . Таким образом, решение, которое избегает пересылки агента, было бы хорошо.

Редактировать:

После замечаний от @jakuje я изменил файл конфигурации:

Host C HostName addressOfC User usernameC IdentityFile ~/.ssh/id_rsa  Host C_D HostName addressD User usernameD IdentityFile ~/.ssh/id_rsa Port 22 ProxyCommand ssh -W %h:%p C 

Запуск ssh -vvv C_Dя получаю следующий журнал (MobaXterm 7.4):

OpenSSH_6.2p2, OpenSSL 1.0.1g 7 Apr 2014 debug1: Reading configuration data /home/mobaxterm/.ssh/config debug1: /home/mobaxterm/.ssh/config line 24: Applying options for C_D debug1: Reading configuration data /etc/ssh_config debug2: ssh_connect: needpriv 0 debug1: Executing proxy command: exec ssh -W addressOfD:22 C debug1: permanently_drop_suid: 1000 debug3: Incorrect RSA1 identifier debug3: Could not load "/home/mobaxterm/.ssh/id_rsa" as a RSA1 public key debug1: identity file /home/mobaxterm/.ssh/id_rsa type 1 debug1: identity file /home/mobaxterm/.ssh/id_rsa-cert type -1 debug1: Enabling compatibility mode for protocol 2.0 debug1: Local version string SSH-2.0-OpenSSH_6.2 debug1: Remote protocol version 2.0, remote software version OpenSSH_5.3 debug1: match: OpenSSH_5.3 pat OpenSSH_5* debug2: fd 5 setting O_NONBLOCK debug2: fd 4 setting O_NONBLOCK debug3: load_hostkeys: loading entries for host "addressOfD" from file "/home/mobaxterm/.ssh/known_hosts" debug3: load_hostkeys: found key type RSA in file /home/mobaxterm/.ssh/known_hosts:1 debug3: load_hostkeys: loaded 1 keys debug3: order_hostkeyalgs: prefer hostkeyalgs: ssh-rsa-cert-v01@openssh.com,ssh-rsa-cert-v00@openssh.com,ssh-rsa debug1: SSH2_MSG_KEXINIT sent debug1: SSH2_MSG_KEXINIT received debug2: kex_parse_kexinit: ecdh-sha2-nistp256,ecdh-sha2-nistp384,ecdh-sha2-nistp521,diffie-hellman-group-exchange-sha256,diffie-hellman-group-exchange-sha1,diffie-hellman-group14-sha1,diffie-hellman-group1-sha1 debug2: kex_parse_kexinit: ssh-rsa-cert-v01@openssh.com,ssh-rsa-cert-v00@openssh.com,ssh-rsa,ecdsa-sha2-nistp256-cert-v01@openssh.com,ecdsa-sha2-nistp384-cert-v01@openssh.com,ecdsa-sha2-nistp521-cert-v01@openssh.com,ssh-dss-cert-v01@openssh.com,ssh-dss-cert-v00@openssh.com,ecdsa-sha2-nistp256,ecdsa-sha2-nistp384,ecdsa-sha2-nistp521,ssh-dss debug2: kex_parse_kexinit: aes128-ctr,aes192-ctr,aes256-ctr,arcfour256,arcfour128,aes128-gcm@openssh.com,aes256-gcm@openssh.com,aes128-cbc,3des-cbc,blowfish-cbc,cast128-cbc,aes192-cbc,aes256-cbc,arcfour,rijndael-cbc@lysator.liu.se debug2: kex_parse_kexinit: aes128-ctr,aes192-ctr,aes256-ctr,arcfour256,arcfour128,aes128-gcm@openssh.com,aes256-gcm@openssh.com,aes128-cbc,3des-cbc,blowfish-cbc,cast128-cbc,aes192-cbc,aes256-cbc,arcfour,rijndael-cbc@lysator.liu.se debug2: kex_parse_kexinit: hmac-md5-etm@openssh.com,hmac-sha1-etm@openssh.com,umac-64-etm@openssh.com,umac-128-etm@openssh.com,hmac-sha2-256-etm@openssh.com,hmac-sha2-512-etm@openssh.com,hmac-ripemd160-etm@openssh.com,hmac-sha1-96-etm@openssh.com,hmac-md5-96-etm@openssh.com,hmac-md5,hmac-sha1,umac-64@openssh.com,umac-128@openssh.com,hmac-sha2-256,hmac-sha2-512,hmac-ripemd160,hmac-ripemd160@openssh.com,hmac-sha1-96,hmac-md5-96 debug2: kex_parse_kexinit: hmac-md5-etm@openssh.com,hmac-sha1-etm@openssh.com,umac-64-etm@openssh.com,umac-128-etm@openssh.com,hmac-sha2-256-etm@openssh.com,hmac-sha2-512-etm@openssh.com,hmac-ripemd160-etm@openssh.com,hmac-sha1-96-etm@openssh.com,hmac-md5-96-etm@openssh.com,hmac-md5,hmac-sha1,umac-64@openssh.com,umac-128@openssh.com,hmac-sha2-256,hmac-sha2-512,hmac-ripemd160,hmac-ripemd160@openssh.com,hmac-sha1-96,hmac-md5-96 debug2: kex_parse_kexinit: zlib@openssh.com,zlib,none debug2: kex_parse_kexinit: zlib@openssh.com,zlib,none debug2: kex_parse_kexinit: debug2: kex_parse_kexinit: debug2: kex_parse_kexinit: first_kex_follows 0 debug2: kex_parse_kexinit: reserved 0 debug2: kex_parse_kexinit: diffie-hellman-group-exchange-sha256,diffie-hellman-group-exchange-sha1,diffie-hellman-group14-sha1,diffie-hellman-group1-sha1 debug2: kex_parse_kexinit: ssh-rsa,ssh-dss debug2: kex_parse_kexinit: aes128-ctr,aes192-ctr,aes256-ctr,arcfour256,arcfour128,aes128-cbc,3des-cbc,blowfish-cbc,cast128-cbc,aes192-cbc,aes256-cbc,arcfour,rijndael-cbc@lysator.liu.se debug2: kex_parse_kexinit: aes128-ctr,aes192-ctr,aes256-ctr,arcfour256,arcfour128,aes128-cbc,3des-cbc,blowfish-cbc,cast128-cbc,aes192-cbc,aes256-cbc,arcfour,rijndael-cbc@lysator.liu.se debug2: kex_parse_kexinit: hmac-md5,hmac-sha1,umac-64@openssh.com,hmac-sha2-256,hmac-sha2-512,hmac-ripemd160,hmac-ripemd160@openssh.com,hmac-sha1-96,hmac-md5-96 debug2: kex_parse_kexinit: hmac-md5,hmac-sha1,umac-64@openssh.com,hmac-sha2-256,hmac-sha2-512,hmac-ripemd160,hmac-ripemd160@openssh.com,hmac-sha1-96,hmac-md5-96 debug2: kex_parse_kexinit: none,zlib@openssh.com debug2: kex_parse_kexinit: none,zlib@openssh.com debug2: kex_parse_kexinit: debug2: kex_parse_kexinit: debug2: kex_parse_kexinit: first_kex_follows 0 debug2: kex_parse_kexinit: reserved 0 debug2: mac_setup: found hmac-md5 debug1: kex: server->client aes128-ctr hmac-md5 zlib@openssh.com debug2: mac_setup: found hmac-md5 debug1: kex: client->server aes128-ctr hmac-md5 zlib@openssh.com debug1: SSH2_MSG_KEX_DH_GEX_REQUEST(1024<1024<8192) sent debug1: expecting SSH2_MSG_KEX_DH_GEX_GROUP debug2: dh_gen_key: priv key bits set: 135/256 debug2: bits set: 533/1024 debug1: SSH2_MSG_KEX_DH_GEX_INIT sent debug1: expecting SSH2_MSG_KEX_DH_GEX_REPLY debug1: Server host key: RSA [...] debug3: load_hostkeys: loading entries for host "addressOfD" from file "/home/mobaxterm/.ssh/known_hosts" debug3: load_hostkeys: found key type RSA in file /home/mobaxterm/.ssh/known_hosts:1 debug3: load_hostkeys: loaded 1 keys debug1: Host 'addressOfD' is known and matches the RSA host key. debug1: Found key in /home/mobaxterm/.ssh/known_hosts:1 debug2: bits set: 515/1024 debug1: ssh_rsa_verify: signature correct debug2: kex_derive_keys debug2: set_newkeys: mode 1 debug1: SSH2_MSG_NEWKEYS sent debug1: expecting SSH2_MSG_NEWKEYS debug2: set_newkeys: mode 0 debug1: SSH2_MSG_NEWKEYS received debug1: Roaming not allowed by server debug1: SSH2_MSG_SERVICE_REQUEST sent debug2: service_accept: ssh-userauth debug1: SSH2_MSG_SERVICE_ACCEPT received debug2: key: /home/mobaxterm/.ssh/id_rsa (0x20072e98), explicit debug1: Authentications that can continue: publickey,gssapi-keyex,gssapi-with-mic,password debug3: start over, passed a different list publickey,gssapi-keyex,gssapi-with-mic,password debug3: preferred hostbased,publickey,password,keyboard-interactive debug3: authmethod_lookup publickey debug3: remaining preferred: password,keyboard-interactive debug3: authmethod_is_enabled publickey debug1: Next authentication method: publickey debug1: Offering RSA public key: /home/mobaxterm/.ssh/id_rsa debug3: send_pubkey_test debug2: we sent a publickey packet, wait for reply debug1: Server accepts key: pkalg ssh-rsa blen 279 debug2: input_userauth_pk_ok: fp [...] debug3: sign_and_send_pubkey: RSA [...] debug1: Enabling compression at level 6. 

Здесь он останавливается на 22 секунды.

debug1: Authentication succeeded (publickey). Authenticated to addressOfD (via proxy). debug1: channel 0: new [client-session] debug3: ssh_session2_open: channel_new: 0 debug2: channel 0: send open debug1: Requesting no-more-sessions@openssh.com debug1: Entering interactive session. debug2: callback start debug2: x11_get_proto: /bin/xauth list :0.0 2>/dev/null debug1: Requesting X11 forwarding with authentication spoofing. debug2: channel 0: request x11-req confirm 1 debug2: client_session2_setup: id 0 debug2: channel 0: request pty-req confirm 1 debug2: channel 0: request shell confirm 1 debug2: callback done debug2: channel 0: open confirm rwindow 0 rmax 32768 debug2: channel_input_status_confirm: type 99 id 0 debug2: X11 forwarding request accepted on channel 0 debug2: channel_input_status_confirm: type 99 id 0 debug2: PTY allocation request accepted on channel 0 debug2: channel 0: rcvd adjust 2097152 debug2: channel_input_status_confirm: type 99 id 0 debug2: shell request accepted on channel 0 

Изменить 2:

Я попытался установить конфигурацию ssh под Ubuntu 16.04 и не получил 24-секундную задержку (соединение было установлено менее чем за 2 секунды). Я скачал последнюю версию MobaXterm (v9.1) и только первое установление соединения было медленным. Я также протестировал MobaXterm на Windows 10 (до: Windows 7), тот же результат. Поэтому я думаю, что это проблема с Windows / MobaXterm или чем-то еще, что он использует под капотом.

Заключение:

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

1
Вы можете использовать localcommand, чтобы открыть перенаправленное соединение порта к D после подключения к C для настройки туннеля. Jasen 7 лет назад 0
хмм "Это не должно использоваться для интерактивных команд." Я думаю, не решение проблемы. Jasen 7 лет назад 0

1 ответ на вопрос

2
Jakuje
  1. Мне нужно сначала загрузить ключ с помощью ssh-agent. В противном случае он дважды запрашивает пароль.

Тебе это не нужно. Если у вашего ключа есть пароль, это полезно.

  1. Требуется возраст (24 секунды) для подключения. Я должен упомянуть здесь, что я на Windows использую mobaXterm, на случай, если это будет отвечать за 24 секунды.

Подключение занимает некоторое время. Если вы хотите получить его быстрее (для отдельных соединений используйте ControlMasterопцию).

 ProxyCommand ssh -A -W %h:%p C 

Вам не нужен агент, пересылающий сюда. Аутентификация всегда выполняется с вашего локального компьютера.

 ForwardAgent yes 

Ни здесь, если вы не хотите использовать свои ключи с сервера C.

Я не понимаю ваше первое замечание. Хотя, возможно, я не был уверен: я могу использовать один и тот же ключ для входа в C и D. Используя упомянутую запись в файле конфигурации, мне дважды предлагается ввести один и тот же пароль. Это не должно быть необходимым. Относительно 24-х секунд для подключения: если я подключаюсь по первому методу "ssh -A -t usernameC @ C ssh usernameD @ D" (предварительно загрузив ключ), это займет не более 2 секунд. Так что 24 секунды - это слишком много. Спасибо за остальную часть исправлений. Проверено и подтверждено. nx105 7 лет назад 0
1) Вы имеете в виду ключевую фразу для ключа? У вас есть две возможности. Запустите агент с вашей системой и добавьте туда ключ (после загрузки) или удалите ключевую фразу из ключа (более низкий уровень безопасности). 2) Поэтому проверьте журнал отладки (`ssh -vvv` для прокси-команды и вашей команды) с отметками времени. Jakuje 7 лет назад 1
1) Жаль, что нет третьего решения. Я думаю, я выберу первый (у mobaXterm есть опция для этого). 2) Он застревает между `debug1: включение сжатия на уровне 6.` и` debug1: аутентификация прошла успешно (publickey) .` Остальное проходит очень быстро. Я отредактирую свой пост с вопросом и добавлю полный журнал. nx105 7 лет назад 0

Похожие вопросы