Table of Contents

Настройка SSH ProxyJump

Вводная

Работаем с коллегами удаленно из разных мест, не везде есть возможность получить статический публичный ip-адрес.
Фактически рабочее место это комппьютер с набором софта и ssh-ключей.
Доступ к важной инфраструктуре ограничивается по списку белых публичный адресов.
Доступ нужен как по ssh, так и по http\https через браузер.

Идея
Подобные задачи можно решить с помощью софта Teleport.
Софт стал коммерческим, но комьюнити версия тоже есть.

В нашем случае проще начать использовать и поддерживать функционал ProxyJump в обычном ssh-клиенте.

Решение
Ставим у нескольких разных хостинг провайдеров линуксовые ВМ (ProxyJump aka PJ) с постоянными публичными адресами.
Эти публичные адреса прописываем в нужных белых списках в инфраструктуре.

На ВМ PJ заводим специальных именных или общих пользователей, которые могут только залогиниться на ВМ, но им ничего нельзя на ВМ сделать.
Аунтентификация только по ssh-ключам и только на определенный порт.

Для ssh-подключения в инфраструктуру, с рабочего места, используем ВМ PJ как промежуточное звено, доступное со всего интернета.
Для https-подключения в инфраструктуру, так же сначала используем ВМ PJ, а потом поднимаем socks-проскси до ВМ в инфраструктуре или до той же самой ВМ PJ.

Нарисовать схемку и\или переформулировать мысль.


Серверная часть

Создание пользователя

Заводим общего пользователя proxyjump-user без создания домашней директории и с nologin-шеллом

root@b2fddaeba453:/# useradd -M -s /usr/sbin/nologin proxyjump-user

Для дебиан поддобных ОС шелл ставим “/usr/sbin/nologin”, для редхат поддобных ОС ставим “/sbin/nologin”,

Проверяем.

root@b2fddaeba453:/# cat /etc/passwd
root:x:0:0:root:/root:/bin/bash
...
nobody:x:65534:65534:nobody:/nonexistent:/usr/sbin/nologin
proxyjump-user:x:1000:1000::/home/proxyjump-user:/usr/sbin/nologin
root@b2fddaeba453:/#

root@b2fddaeba453:/# ls -la /home/
total 0
drwxr-xr-x 2 root root 6 Apr 11  2018 .
drwxr-xr-x 1 root root 6 Apr  7 06:43 ..
root@b2fddaeba453:/#

Настройки SSH-сервера

Правим /etc/ssh/sshd_config.

Включаем ssh на втором порту.

Port 22
Port 175
AddressFamily inet

Разрешаем пользователю proxyjump-user логиниться только на втором порту.

Match LocalPort 22
  DenyUsers proxyjump-user

Match LocalPort 175
  AllowUsers proxyjump-user

Запрещаем пользователю proxyjump-user логиниться по паролю и оперделяем файл со списком разрещенный публиных ключей.

Match User proxyjump-user
  PasswordAuthentication no
  AuthorizedKeysFile /etc/ssh/proxyjump-user-authorized-keys
  PermitTTY no
  X11Forwarding no
  PermitTunnel no
  GatewayPorts no
  ForceCommand /usr/sbin/nologin

Создаём файл “/etc/ssh/proxyjump-user-authorized-keys”, даём права 644 и записываем туда клиентский публичный ключ.

root@b2fddaeba453:~# touch /etc/ssh/proxyjump-user-authorized-keys
root@b2fddaeba453:~# chmod 644 /etc/ssh/proxyjump-user-authorized-keys
root@b2fddaeba453:~# echo "AAAAC3NzaC1lZDI1NTE5AAAAIBp3rflHs0z68aazOhX9Qjt62 someuser@somepc" >> /etc/ssh/proxyjump-user-authorized-keys

Перезапускаем ssh.

Настройки iptables

root@b2fddaeba453:~# cat /etc/iptables/rules.v4
*filter
...
#SSH-PJ
-A INPUT -p tcp -m state --state NEW -m tcp --dport 175 -j ACCEPT
#LAST_RULES
-A INPUT -j REJECT --reject-with icmp-host-prohibited
-A FORWARD -j REJECT --reject-with icmp-host-prohibited
COMMIT

Перезапускаем iptables.


Клиентская часть

Создаём ssh-ключ, задаём пароль.

someuser@somepc:~$ ssh-keygen -t ed25519 -f ~/.ssh/proxyjump-key
Generating public/private ed25519 key pair.
Enter passphrase (empty for no passphrase): 
Enter same passphrase again: 
Your identification has been saved in proxyjump-key
Your public key has been saved in proxyjump-key.pub
The key fingerprint is:
SHA256:MXlfXH5uKzybK/6vc5aoNt2AhHjBnZnK/gYUbH3GOGY someuser@somepc
The key's randomart image is:
+--[ED25519 256]--+
|        o o *   .|
|         B E = o |
|        B O + o o|
|       . X o . ..|
|        S . o   o|
|         o ... ..|
|          o .++..|
|           * +== |
|          +o=*B. |
+----[SHA256]-----+

Как-либо передаём содержимое файла proxyjump-key.pub админу ВМ PJ.

В .ssh/config описываем настройки нестандартного порта и ключ для захода на proxyjump.

someuser@somepc:~$ cat .ssh/config
...
Host proxyjump-server
    Hostname x.x.x.x
    User proxyjump-user
    Port 175
    IdentityFile ~/.ssh/proxyjump-key
...

Использование

Подключаемся через ВМ PJ к удаленному серверу y.y.y.y.

ssh -J proxyjump-server -p 5467 -i ~/.ssh/y-y-y-y-server-key user@y.y.y.y

Подключаемся через ВМ PJ к удаленному серверу и, на порту 55478, запускаем локальный socks-прокси.

ssh -J proxyjump-server -f -N -C -D 127.0.0.1:55478 user1@z.z.z.z

Полезные ссылке