Оригинал статьи: How to Access a Remote Server Using a SSH Jump Host - Categories Security, SSH
Переходный хост (также известный как переходный сервер) - это промежуточный хост или SSH-шлюз удаленной сети, через который может быть установлено соединение с другим хостом в другой зоне безопасности, например, демилитаризованной зоне (DMZ). Он соединяет две непохожие зоны безопасности и обеспечивает контролируемый доступ между ними.
Переходный сервер должен быть надежно защищен и контролироваться, особенно если он охватывает частную сеть и демилитаризованную зону с серверами, предоставляющими услуги пользователям в Интернете.
Классический сценарий - подключение с вашего настольного компьютера или ноутбука из внутренней сети вашей компании, которая надежно защищена брандмауэрами, к демилитаризованной зоне. Чтобы легко управлять сервером в демилитаризованной зоне, вы можете получить к нему доступ через jump host.
В двух словах, SSH-сервер перехода - это Linux-сервер, который используется в качестве шлюза для других Linux-серверов в частной сети по протоколу SSH.
В этой статье мы продемонстрируем, как получить доступ к удаленному серверу Linux через jump host, а также настроим необходимые параметры в настройках SSH-клиента для каждого пользователя.
Содержание
- Настройка сервера SSH Jump
- Причины настройки сервера SSH Jump
- Как создать простой сервер SSH Jump
- Динамический список хостов Jump
- Список нескольких хостов Jump
- Статический список Jumphost
- Повышение безопасности сервера SSH Jump
Настройка сервера SSH Jump
Рассмотрим следующий сценарий.

Для большей наглядности ниже приведена простая настройка, демонстрирующая роль сервера перехода по SSH.

Причины настройки сервера перехода по SSH
Сервер перехода предоставляет шлюз для вашей инфраструктуры и уменьшает потенциальную поверхность атаки на ваши ресурсы. Он также обеспечивает прозрачное управление устройствами, а также единую точку доступа к вашим ресурсам. Имейте в виду, что при включении jump-сервера в свою инфраструктуру убедитесь, что сервер защищен, в противном случае было бы все равно, что его не использовать. Мы вернемся к этому позже в этом руководстве.
Как создать простой SSH-сервер перехода
Давайте теперь сосредоточимся на том, как вы можете создать простой SSH-сервер перехода. Вот наша простая настройка.
Исходный IP: 105.68.76.85.
IP-адрес сервера перехода (мы будем называть это host-jump): 173.82.232.55.
IP-адрес назначения (мы будем называть это host_destination): 173.82.227.89.
В приведенном выше сценарии вы хотите подключиться к хосту 2 (173.82.227.89), но вам нужно пройти через ХОСТ 1 (173.82.232.55) из-за брандмауэра, маршрутизации и привилегий доступа. Существует ряд веских причин, по которым необходимы переходные хосты.
Динамический список Jump-хостов
Самый простой способ подключиться к целевому серверу через переходный узел - это использовать флаги -A и -J из командной строки. Это указывает ssh установить соединение с хостом jump, а затем установить переадресацию TCP на целевой сервер оттуда (убедитесь, что у вас есть SSH-логин без пароля между компьютерами).
$ ssh -A -J user@jump-server user@destination server
Например, в нашей настройке у нас есть пользователь с именем james, настроенный на сервере Jump, и tecmint, настроенный в целевой системе. Команда будет выглядеть следующим образом с исходного IP-адреса.
$ ssh -A -J Адрес электронной почты защищен от спам-ботов. Для просмотра адреса в браузере должен быть включен Javascript. Адрес электронной почты защищен от спам-ботов. Для просмотра адреса в браузере должен быть включен Javascript.
Команда запросит у вас пароль пользователя сервера перехода, за которым последует пароль целевой системы, по которому вам будет предоставлен доступ к целевой системе.
Если имена пользователей или порты на компьютерах отличаются, укажите их в терминале, как показано на рисунке.
$ ssh -J username@host1:port username@host2:port
Список хостов с несколькими переходами
Один и тот же синтаксис можно использовать для выполнения переходов между несколькими серверами.
$ ssh -J username@host1:port,username@host2:port username@host3:port
Статический список Jumphost-ов
Статический список jumphost означает, что вы знаете jumphost или jumphosts, которые вам нужны для подключения компьютера. Поэтому вам нужно добавить следующий статический jumphost ‘routing’ в файл ~/.ssh/config и указать псевдонимы хостов, как показано на рисунке.
### First jumphost. Directly reachable
Host vps1
HostName vps1.example.org
### Host to jump to via jumphost1.example.org
Host contabo
HostName contabo.example.org
ProxyJump vps1
Теперь попробуйте подключиться к целевому серверу через переходный узел, как показано на рисунке.
$ ssh -J vps1 contabo
Второй способ заключается в использовании опции ProxyCommand для добавления конфигурации jumphost в ваш файл ~.ssh/config или $HOME/.ssh/config, как показано на рисунке.
В этом примере целевым хостом является contabo, а jumphost - vps1.
Host vps1
HostName vps1.example.org
IdentityFile ~/.ssh/vps1.pem
User ec2-user
Host contabo
HostName contabo.example.org
IdentityFile ~/.ssh/contabovps
Port 22
User admin
Proxy Command ssh -q -W %h:%p vps1
Сохраните изменения и закройте файл. Чтобы применить изменения, перезапустите SSH-демон.
$ sudo systemctl restart ssh
Давайте рассмотрим параметры, используемые в конфигурационном файле:
- -q – Это означает тихий режим. Он подавляет предупреждения и диагностические сообщения.
- -W – Запрашивает, чтобы стандартные входные и выходные данные на клиенте были перенаправлены на порт HOST on по защищенному каналу.
- %h – Указывает хост, к которому необходимо подключиться.
- %p – Указал порт для подключения к удаленному хосту.
Чтобы "перейти" к целевой системе с вашего исходного IP-адреса через сервер перехода, просто выполните следующую команду:
$ ssh contabo
Приведенная выше команда сначала откроет ssh-соединение с vps1 в фоновом режиме, на который влияет команда ProxyCommand, а затем запустит сеанс ssh с целевым сервером Приведенная выше команда сначала откроет ssh-соединение с vps1 в фоновом режиме, на который влияет команда ProxyCommand, а затем запустит сеанс ssh с целевым сервером contabo.
Повышение безопасности сервера SSH Jump
Один из способов сделать эту настройку более безопасной - скопировать открытый SSH-ключ из исходной системы на сервер перехода, а затем, наконец, в целевую систему, а затем отключить аутентификацию по паролю. Ознакомьтесь с нашим руководством о том, как включить аутентификацию по SSH без пароля.
Кроме того, ознакомьтесь с советами по усилению защиты SSH-сервера.
Кроме того, убедитесь, что на Jump-сервере не хранятся конфиденциальные данные, поскольку это может привести к утечке учетных данных доступа, таких как имена пользователей и пароли, что приведет к общесистемному взлому.
Для получения дополнительной информации смотрите справочную страницу ssh или обратитесь к: OpenSSH/Cookbxook/Прокси-серверы и узлы перехода.
На данный момент это все! В этой статье мы продемонстрировали, как получить доступ к удаленному серверу через jump host.
Практические примеры
1. Целевой хост = singualrity.lytkins.ru (Ubuntu 22.04.3 LTS + FIPS3).
Промежуточный хост = igor2022.lytkins.ru (ноутбук HP Laptop 15-dw1168ur)
Имя ОС Майкрософт Windows 11 Pro
Версия 10.0.22631 Сборка 22631
PS C:\Users\IgorL\IdeaProjects\MyPowershell> ssh
usage: ssh [-46AaCfGgKkMNnqsTtVvXxYy] [-B bind_interface]
[-b bind_address] [-c cipher_spec] [-D [bind_address:]port]
[-E log_file] [-e escape_char] [-F configfile] [-I pkcs11]
[-i identity_file] [-J [user@]host[:port]] [-L address]
[-l login_name] [-m mac_spec] [-O ctl_cmd] [-o option] [-p port]
[-Q query_option] [-R address] [-S ctl_path] [-W host:port]
[-w local_tun[:remote_tun]] destination [command]
Файлы ssh:
C:\Users\IgorL>dir %USERPROFILE%\.ssh
Том в устройстве C не имеет метки.
Серийный номер тома: 8268-093B
Содержимое папки C:\Users\IgorL\.ssh
18.12.2023 22:54 <DIR> .
21.12.2023 20:00 <DIR> ..
18.12.2023 22:54 3 163 known_hosts
18.12.2023 22:54 2 419 known_hosts.old
2 файлов 5 582 байт
2 папок 282 606 895 104 байт свободно
Очищаем каталог .ssh
C:\Users\IgorL>del %USERPROFILE%\.ssh\known_hosts*
D:\dist\SysinternalsSuite\pskill64.exe ssh.exe
start ssh -fNL 22:localhost:22 -v -i "C:\Users\igorl\YandexDisk\Singularity\Keys\2023\ed25519\id_ed25519" Адрес электронной почты защищен от спам-ботов. Для просмотра адреса в браузере должен быть включен Javascript.
C:\Users\IgorL>ssh -fNL 22:localhost:22 -v -i "D:\Yandex\igor.lytkin.2020\YandexDisk\Singularity\Keys\2023\ed25519\id_ed25519" Адрес электронной почты защищен от спам-ботов. Для просмотра адреса в браузере должен быть включен Javascript.
OpenSSH_for_Windows_8.6p1, LibreSSL 3.4.3
debug1: Authenticator provider $SSH_SK_PROVIDER did not resolve; disabling
debug1: Connecting to singularity.lytkins.ru [62.113.107.38] port 22.
debug1: Connection established.
debug1: identity file D:\\Yandex\\igor.lytkin.2020\\YandexDisk\\Singularity\\Keys\\2023\\ed25519\\id_ed25519 type 3
debug1: identity file D:\\Yandex\\igor.lytkin.2020\\YandexDisk\\Singularity\\Keys\\2023\\ed25519\\id_ed25519-cert type -1
debug1: Local version string SSH-2.0-OpenSSH_for_Windows_8.6
debug1: Remote protocol version 2.0, remote software version OpenSSH_8.9p1 Ubuntu-3ubuntu0.4+Fips3
debug1: compat_banner: match: OpenSSH_8.9p1 Ubuntu-3ubuntu0.4+Fips3 pat OpenSSH* compat 0x04000000
debug1: Authenticating to singularity.lytkins.ru:22 as 'liv'
debug1: load_hostkeys: fopen C:\\Users\\IgorL/.ssh/known_hosts: No such file or directory
debug1: load_hostkeys: fopen C:\\Users\\IgorL/.ssh/known_hosts2: No such file or directory
debug1: load_hostkeys: fopen __PROGRAMDATA__\\ssh/ssh_known_hosts: No such file or directory
debug1: load_hostkeys: fopen __PROGRAMDATA__\\ssh/ssh_known_hosts2: No such file or directory
debug1: SSH2_MSG_KEXINIT sent
debug1: SSH2_MSG_KEXINIT received
debug1: kex: algorithm: ecdh-sha2-nistp256
debug1: kex: host key algorithm: ecdsa-sha2-nistp256
debug1: kex: server->client cipher: aes128-ctr MAC: Адрес электронной почты защищен от спам-ботов. Для просмотра адреса в браузере должен быть включен Javascript. compression: none
debug1: kex: client->server cipher: aes128-ctr MAC: Адрес электронной почты защищен от спам-ботов. Для просмотра адреса в браузере должен быть включен Javascript. compression: none
debug1: expecting SSH2_MSG_KEX_ECDH_REPLY
debug1: SSH2_MSG_KEX_ECDH_REPLY received
debug1: Server host key: ecdsa-sha2-nistp256 SHA256:yUkFmKmDx6mfQMfqaRsSq11FDUCTJIF1G7chuEbxdZE
debug1: load_hostkeys: fopen C:\\Users\\IgorL/.ssh/known_hosts: No such file or directory
debug1: load_hostkeys: fopen C:\\Users\\IgorL/.ssh/known_hosts2: No such file or directory
debug1: load_hostkeys: fopen __PROGRAMDATA__\\ssh/ssh_known_hosts: No such file or directory
debug1: load_hostkeys: fopen __PROGRAMDATA__\\ssh/ssh_known_hosts2: No such file or directory
debug1: hostkeys_find_by_key_hostfile: hostkeys file C:\\Users\\IgorL/.ssh/known_hosts does not exist
debug1: hostkeys_find_by_key_hostfile: hostkeys file C:\\Users\\IgorL/.ssh/known_hosts2 does not exist
debug1: hostkeys_find_by_key_hostfile: hostkeys file __PROGRAMDATA__\\ssh/ssh_known_hosts does not exist
debug1: hostkeys_find_by_key_hostfile: hostkeys file __PROGRAMDATA__\\ssh/ssh_known_hosts2 does not exist
The authenticity of host 'singularity.lytkins.ru (62.113.107.38)' can't be established.
ECDSA key fingerprint is SHA256:yUkFmKmDx6mfQMfqaRsSq11FDUCTJIF1G7chuEbxdZE.
This key is not known by any other names
Are you sure you want to continue connecting (yes/no/[fingerprint])? yes
Warning: Permanently added 'singularity.lytkins.ru' (ECDSA) to the list of known hosts.
debug1: rekey out after 4294967296 blocks
debug1: SSH2_MSG_NEWKEYS sent
debug1: expecting SSH2_MSG_NEWKEYS
Connection reset by 62.113.107.38 port 22
Соеднинение с хостом VPS не получилось.
Изучение существующих ssh-ключей сервера
C:\Users\IgorL>ssh -v singularity.lytkins.ru
OpenSSH_for_Windows_8.6p1, LibreSSL 3.4.3
debug1: Authenticator provider $SSH_SK_PROVIDER did not resolve; disabling
debug1: Connecting to singularity.lytkins.ru [62.113.107.38] port 22.
debug1: Connection established.
debug1: identity file C:\\Users\\IgorL/.ssh/id_rsa type -1
debug1: identity file C:\\Users\\IgorL/.ssh/id_rsa-cert type -1
debug1: identity file C:\\Users\\IgorL/.ssh/id_dsa type -1
debug1: identity file C:\\Users\\IgorL/.ssh/id_dsa-cert type -1
debug1: identity file C:\\Users\\IgorL/.ssh/id_ecdsa type -1
debug1: identity file C:\\Users\\IgorL/.ssh/id_ecdsa-cert type -1
debug1: identity file C:\\Users\\IgorL/.ssh/id_ecdsa_sk type -1
debug1: identity file C:\\Users\\IgorL/.ssh/id_ecdsa_sk-cert type -1
debug1: identity file C:\\Users\\IgorL/.ssh/id_ed25519 type -1
debug1: identity file C:\\Users\\IgorL/.ssh/id_ed25519-cert type -1
debug1: identity file C:\\Users\\IgorL/.ssh/id_ed25519_sk type -1
debug1: identity file C:\\Users\\IgorL/.ssh/id_ed25519_sk-cert type -1
debug1: identity file C:\\Users\\IgorL/.ssh/id_xmss type -1
debug1: identity file C:\\Users\\IgorL/.ssh/id_xmss-cert type -1
debug1: Local version string SSH-2.0-OpenSSH_for_Windows_8.6
debug1: Remote protocol version 2.0, remote software version OpenSSH_8.9p1 Ubuntu-3ubuntu0.4+Fips3
debug1: compat_banner: match: OpenSSH_8.9p1 Ubuntu-3ubuntu0.4+Fips3 pat OpenSSH* compat 0x04000000
debug1: Authenticating to singularity.lytkins.ru:22 as 'igorl'
debug1: load_hostkeys: fopen C:\\Users\\IgorL/.ssh/known_hosts2: No such file or directory
debug1: load_hostkeys: fopen __PROGRAMDATA__\\ssh/ssh_known_hosts: No such file or directory
debug1: load_hostkeys: fopen __PROGRAMDATA__\\ssh/ssh_known_hosts2: No such file or directory
debug1: SSH2_MSG_KEXINIT sent
debug1: SSH2_MSG_KEXINIT received
debug1: kex: algorithm: ecdh-sha2-nistp256
debug1: kex: host key algorithm: ecdsa-sha2-nistp256
debug1: kex: server->client cipher: aes128-ctr MAC: Адрес электронной почты защищен от спам-ботов. Для просмотра адреса в браузере должен быть включен Javascript. compression: none
debug1: kex: client->server cipher: aes128-ctr MAC: Адрес электронной почты защищен от спам-ботов. Для просмотра адреса в браузере должен быть включен Javascript. compression: none
debug1: expecting SSH2_MSG_KEX_ECDH_REPLY
debug1: SSH2_MSG_KEX_ECDH_REPLY received
debug1: Server host key: ecdsa-sha2-nistp256 SHA256:yUkFmKmDx6mfQMfqaRsSq11FDUCTJIF1G7chuEbxdZE
debug1: load_hostkeys: fopen C:\\Users\\IgorL/.ssh/known_hosts2: No such file or directory
debug1: load_hostkeys: fopen __PROGRAMDATA__\\ssh/ssh_known_hosts: No such file or directory
debug1: load_hostkeys: fopen __PROGRAMDATA__\\ssh/ssh_known_hosts2: No such file or directory
debug1: Host 'singularity.lytkins.ru' is known and matches the ECDSA host key.
debug1: Found key in C:\\Users\\IgorL/.ssh/known_hosts:1
debug1: rekey out after 4294967296 blocks
debug1: SSH2_MSG_NEWKEYS sent
debug1: expecting SSH2_MSG_NEWKEYS
debug1: SSH2_MSG_NEWKEYS received
debug1: rekey in after 4294967296 blocks
debug1: pubkey_prepare: ssh_get_authentication_socket: No such file or directory
debug1: Will attempt key: C:\\Users\\IgorL/.ssh/id_rsa
debug1: Will attempt key: C:\\Users\\IgorL/.ssh/id_dsa
debug1: Will attempt key: C:\\Users\\IgorL/.ssh/id_ecdsa
debug1: Will attempt key: C:\\Users\\IgorL/.ssh/id_ecdsa_sk
debug1: Will attempt key: C:\\Users\\IgorL/.ssh/id_ed25519
debug1: Will attempt key: C:\\Users\\IgorL/.ssh/id_ed25519_sk
debug1: Will attempt key: C:\\Users\\IgorL/.ssh/id_xmss
debug1: SSH2_MSG_EXT_INFO received
debug1: kex_input_ext_info: server-sig-algs=<ssh-rsa,rsa-sha2-256,rsa-sha2-512,ssh-dss,ecdsa-sha2-nistp256,ecdsa-sha2-nistp384,ecdsa-sha2-nistp521,Адрес электронной почты защищен от спам-ботов. Для просмотра адреса в браузере должен быть включен Javascript. ,Адрес электронной почты защищен от спам-ботов. Для просмотра адреса в браузере должен быть включен Javascript. >
debug1: kex_input_ext_info: Адрес электронной почты защищен от спам-ботов. Для просмотра адреса в браузере должен быть включен Javascript. (unrecognised)
debug1: SSH2_MSG_SERVICE_ACCEPT received
debug1: Authentications that can continue: publickey
debug1: Next authentication method: publickey
debug1: Trying private key: C:\\Users\\IgorL/.ssh/id_rsa
debug1: Trying private key: C:\\Users\\IgorL/.ssh/id_dsa
debug1: Trying private key: C:\\Users\\IgorL/.ssh/id_ecdsa
debug1: Trying private key: C:\\Users\\IgorL/.ssh/id_ecdsa_sk
debug1: Trying private key: C:\\Users\\IgorL/.ssh/id_ed25519
debug1: Trying private key: C:\\Users\\IgorL/.ssh/id_ed25519_sk
debug1: Trying private key: C:\\Users\\IgorL/.ssh/id_xmss
debug1: No more authentication methods to try.
Адрес электронной почты защищен от спам-ботов. Для просмотра адреса в браузере должен быть включен Javascript. : Permission denied (publickey).
Серверу нужен ключ, сделанный по одному из этих алгоримтов:
- ssh-rsa,
- rsa-sha2-256,
- rsa-sha2-512,
- ssh-dss,
- ecdsa-sha2-nistp256,
- ecdsa-sha2-nistp384,
- ecdsa-sha2-nistp521,
Адрес электронной почты защищен от спам-ботов. Для просмотра адреса в браузере должен быть включен Javascript. Адрес электронной почты защищен от спам-ботов. Для просмотра адреса в браузере должен быть включен Javascript.
Создание нового серверного ключа для VPS
C:\Users\IgorL\.ssh>ssh-keygen -t rsa -b 4096 -f ssh_host_rsa_key
Generating public/private rsa key pair.
Enter passphrase (empty for no passphrase):
Enter same passphrase again:
Your identification has been saved in ssh_host_rsa_key
Your public key has been saved in ssh_host_rsa_key.pub
The key fingerprint is:
SHA256:F7rW1g0DBYvOqXC+l+9vQU2t9/n6aZtEHi8y7t2lvUM igorl@igor2022
The key's randomart image is:
+---[RSA 4096]----+
| ... . |
| . o . .|
| . + o . |
| o o o. o .|
| . . S ..o +o|
| + . + ..+oE+|
| o o.o +.+o+|
| oo. ..+.B=|
| .. oo++ =BB|
+----[SHA256]-----+
Добавляю на VPS
SHA256:F7rW1g0DBYvOqXC+l+9vQU2t9/n6aZtEHi8y7t2lvUM igorl@igor2022
| /etc/ssh/sshd_config | |
| Было | Стало |
|
| /etc/ssh/sshd_config.d/10-my-sshd-settings.conf | |
|
| /etc/ssh/sshd_config.d/50-cloud-init.conf | |
|