Оригинал статьи: How to Access a Remote Server Using a SSH Jump Host Categories SecuritySSH 28 Comments

Переходный хост (также известный как переходный сервер) - это промежуточный хост или 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 Jump Host

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

SSH Jump Server Setup

Причины настройки сервера перехода по 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 This email address is being protected from spambots. You need JavaScript enabled to view it. This email address is being protected from spambots. You need JavaScript enabled to view it.

Команда запросит у вас пароль пользователя сервера перехода, за которым последует пароль целевой системы, по которому вам будет предоставлен доступ к целевой системе.

Connect Server Using SSH Jump Host
Подключите сервер с помощью SSH Jump Host

Если имена пользователей или порты на компьютерах отличаются, укажите их в терминале, как показано на рисунке.

$ 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
Login to Target Host via Jumphost
Войдите на целевой хостинг через Jumphost

Второй способ заключается в использовании опции 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" This email address is being protected from spambots. You need JavaScript enabled to view it.

C:\Users\IgorL>ssh -fNL 22:localhost:22 -v -i "D:\Yandex\igor.lytkin.2020\YandexDisk\Singularity\Keys\2023\ed25519\id_ed25519" This email address is being protected from spambots. You need JavaScript enabled to view it.
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: This email address is being protected from spambots. You need JavaScript enabled to view it. compression: none
debug1: kex: client->server cipher: aes128-ctr MAC: This email address is being protected from spambots. You need JavaScript enabled to view it. 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: This email address is being protected from spambots. You need JavaScript enabled to view it. compression: none
debug1: kex: client->server cipher: aes128-ctr MAC: This email address is being protected from spambots. You need JavaScript enabled to view it. 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,This email address is being protected from spambots. You need JavaScript enabled to view it.,This email address is being protected from spambots. You need JavaScript enabled to view it.>
debug1: kex_input_ext_info: This email address is being protected from spambots. You need JavaScript enabled to view it. (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.
This email address is being protected from spambots. You need JavaScript enabled to view it.: Permission denied (publickey).

Серверу нужен ключ, сделанный по одному из этих алгоримтов: 

  • ssh-rsa,
  • rsa-sha2-256,
  • rsa-sha2-512,
  • ssh-dss,
  • ecdsa-sha2-nistp256,
  • ecdsa-sha2-nistp384,
  • ecdsa-sha2-nistp521,
  • This email address is being protected from spambots. You need JavaScript enabled to view it.
  • This email address is being protected from spambots. You need JavaScript enabled to view it. 

Создание нового серверного ключа для 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

На VPS

/etc/ssh/sshd_config  
Было Стало


# This is the ssh client system-wide configuration file.  See
# ssh_config(5) for more information.  This file provides defaults for
# users, and the values can be changed in per-user configuration files
# or on the command line.

# Configuration data is parsed as follows:
#  1. command line options
#  2. user-specific file
#  3. system-wide file
# Any configuration value is only changed the first time it is set.
# Thus, host-specific definitions should be at the beginning of the
# configuration file, and defaults at the end.

# Site-wide defaults for some commonly used options.  For a comprehensive
# list of available options, their meanings and defaults, please see the
# ssh_config(5) man page.

Include /etc/ssh/ssh_config.d/*.conf

Host *
#   ForwardAgent no
#   ForwardX11 no
#   ForwardX11Trusted yes
#   PasswordAuthentication yes
#   HostbasedAuthentication no
#   GSSAPIAuthentication no
#   GSSAPIDelegateCredentials no
#   GSSAPIKeyExchange no
#   GSSAPITrustDNS no
#   BatchMode no
#   CheckHostIP yes
#   AddressFamily any
#   ConnectTimeout 0
#   StrictHostKeyChecking ask
#   IdentityFile ~/.ssh/id_rsa
#   IdentityFile ~/.ssh/id_dsa
#   IdentityFile ~/.ssh/id_ecdsa
#   IdentityFile ~/.ssh/id_ed25519
#   Port 22
#   Ciphers aes128-ctr,aes192-ctr,aes256-ctr,aes128-cbc,3des-cbc
#   MACs hmac-md5,hmac-sha1,This email address is being protected from spambots. You need JavaScript enabled to view it.
#   EscapeChar ~
#   Tunnel no
#   TunnelDevice any:any
#   PermitLocalCommand no
#   VisualHostKey no
#   ProxyCommand ssh -q -W %h:%p gateway.example.com
#   RekeyLimit 1G 1h
#   UserKnownHostsFile ~/.ssh/known_hosts.d/%k
    SendEnv LANG LC_*
    HashKnownHosts yes
    GSSAPIAuthentication yes

 

 

/etc/ssh/sshd_config.d/10-my-sshd-settings.conf  
PermitRootLogin yes
LogLevel VERBOSE
PasswordAuthentication no
 

 

/etc/ssh/sshd_config.d/50-cloud-init.conf  
PasswordAuthentication yes  

 

Add comment