Вопрос или проблема
У меня есть Jump Server и Target Server, к которым я хотел бы подключиться так:
myPc > JumpServer > TargetServer
На первом этапе я могу выполнить ssh-keygen, чтобы избежать аутентификации по паролю, однако на шаге 2, из-за соображений безопасности, ssh-keygen не был установлен, и я ничего не могу с этим поделать. Поэтому я подумал о том, чтобы передать пароль в одной команде на моем ПК. Вот что я пробовал до сих пор:
sshpass -p myPassword ssh -At username@JumpServer ssh -A username@targetServer
ssh -J username@JumpServer username@targetServer
Но ни один из вариантов не работает, есть какие-нибудь советы?
Сначала решите, хотите ли вы соединять ssh
в цепочку или хотите “вложенные трубки”, которые дает ssh -J
. Прочитайте мой ответ, чтобы понять, что я имею в виду. Вы пробовали оба варианта, и неясно, что именно вам нужно. В целом ssh -J
лучше (например, переадресация портов или выделение tty проще, чем в случае цепочки).
-
Если вы хотите
ssh -J
(я рекомендую это), то важны только ключи, доступные вашему локальномуssh
. Никакой SSH-клиент не будет вызван на промежуточном хосте. Ваши приватные ключи (если есть) на промежуточном хосте не будут иметь значения, поэтому тот факт, что вы не можете запуститьssh-keygen
для их создания, не важен; они все равно не пригодятся. Ваша локальная идентичность может быть использована для аутентификации на промежуточном хосте и на целевом сервере. Я предполагаю, что вы запустилиssh-keygen
локально. Сначала зарегистрируйте ваш ключ на промежуточном хосте, выполнив следующую команду локально:ssh-copy-id username@JumpServer
Затем используйте промежуточный хост для подключения к целевому серверу и зарегистрируйте ваш ключ там. Выполните это локально:
ssh-copy-id -o ProxyJump=username@JumpServer username@targetServer
Обратите внимание, что
ssh -J …
является сокращением для указанияssh -o ProxyJump=…
, но посколькуssh-copy-id
не поддерживает-J
, мы должны были использовать другую синтаксис здесь.Теперь, если оба сервера настроены на разрешение аутентификации на основе ключей, вы сможете выполнить
ssh -J username@JumpServer username@targetServer
с вашего локального компьютера. -
Если вы хотите соединять
ssh
в цепочку, то разумно иметь приватный ключ на промежуточном хосте и использовать его для аутентификации при подключении к целевому серверу. Я понимаю, что вы не можете запуститьssh-keygen
на промежуточном хосте. Вы все равно можете создать ключ локально, зарегистрировать его на целевом сервере и переместить (или скопировать) пару ключей на промежуточный хост, так что файлы будут там так, как будто вы создали их там сssh-keygen
.
В общем, каждый SSH-сервер может быть настроен так, чтобы запрещать определенные действия, и это может ограничить ваши возможности или наложить определенные действия. Например, если вам удалось заставить промежуточный хост принять ваш ключ, но целевой сервер запрашивает пароль, несмотря ни на что, то эта локальная команда будет полезной:
sshpass -p'myPassword' ssh -J username@JumpServer username@TargetServer
(Эта идея уже была опубликована в комментарии.)
Примечания:
sshpass -f…
следует предпочестьsshpass -p…
.- Сервер может использовать пользовательское приглашение для пароля, поэтому, возможно, вам нужно сообщить
sshpass
, какое приглашение ожидать (пример).
.
Ответ или решение
Как передавать пароль при подключении через Jump Server
Подключение к удаленному серверу через Jump Server (или промежуточный сервер) может быть сложной задачей, особенно если на вашем Jump Server не установлены необходимые инструменты, такие как ssh-keygen
. Если вы хотите обойтись без установки ssh-keygen
и использовать пароль для аутентификации, я предложу несколько вариантов решения этой задачи.
1. Использование ssh -J
Рекомендую использовать синтаксис ssh -J
, который значительно упрощает процесс подключения через Jump Server. Это обеспечивает более чистый и понятный способ подключения, позволяющий избежать создания дополнительных соединений.
-
Убедитесь, что на вашем локальном компьютере установлен SSH-ключ. Если у вас его нет, создайте его с помощью команды:
ssh-keygen
Не забудьте нажать Enter, чтобы оставить его без пароля (для простоты).
-
Отправьте свой локальный SSH-ключ на Jump Server с помощью команды:
ssh-copy-id username@JumpServer
-
Затем, отправьте свой SSH-ключ на целевой сервер:
ssh-copy-id -o ProxyJump=username@JumpServer username@TargetServer
Теперь вы сможете подключаться к целевому серверу с помощью следующей команды:
ssh -J username@JumpServer username@TargetServer
2. Использование sshpass
для передачи пароля
Если по каким-то причинам вы не можете использовать SSH-ключи и вам нужно передавать пароль, вы можете использовать инструмент sshpass
. Этот подход менее безопасен, так как ваши пароли будут храниться в явном виде.
Чтобы использовать sshpass
, выполните следующую команду:
sshpass -p 'myPassword' ssh -J username@JumpServer username@TargetServer
3. Правильное использование sshpass
Обратите внимание, что использование sshpass -p
не всегда рекомендуется по соображениям безопасности. Альтернативно, вы можете указать файл, содержащий пароль:
sshpass -f /path/to/password_file ssh -J username@JumpServer username@TargetServer
Дополнительные советы:
- Убедитесь, что на обоих серверах (Jump Server и Target Server) разрешена аутентификация по паролю.
- Если сервер использует нестандартный запрос пароля, вы можете указать его для
sshpass
:
sshpass -p'myPassword' ssh -o "PubkeyAuthentication=no" -o "PasswordAuthentication=yes" -J username@JumpServer username@TargetServer
- Чтобы проверить, как ваш сервер запрашивает пароль, вы можете использовать флаг
-o
для настройки параметров SSH.
Заключение
В заключение, использование SSH-ключей является более безопасным и предпочтительным методом для подключения к Jump Server и целевым серверам. Если же вам необходимо использовать пароли, sshpass
можно использовать как обходной путь. Однако, рекомендуется избегать использования паролей в командной строке из соображений безопасности. Всегда старайтесь придерживаться лучших практик безопасности для защиты ваших данных и систем.