Работаем с коллегами удаленно из разных мест, не везде есть возможность получить статический публичный 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:/#
Правим /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.
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