Объяснение SSH-туннелирования: Безопасный доступ к удаленным службам

Используйте SSH-туннелирование для доступа к частным базам данных, веб-приложениям и удаленным сервисам с помощью локальной, удаленной и динамической переадресации.

SSH-туннелирование: безопасный доступ к удаленным сервисам

SSH-туннелирование помогает получить доступ к удаленным сервисам, не открывая их в интернете. Если ваша база данных, панель администратора или сервер разработки доступны только через шлюзовый хост (bastion host), SSH-туннель предоставит вашим локальным инструментам безопасный путь к ним.

Основные схемы — это локальная переадресация, удаленная переадресация и динамическая переадресация. Каждая из них отвечает на разные вопросы: нужно ли вам получить доступ к удаленному ресурсу, предоставить доступ к локальному или создать SOCKS-прокси.

Что такое SSH-туннелирование?

SSH-туннелирование инкапсулирует трафик приложения внутри SSH-соединения. Вместо прямого подключения к сервису вы подключаетесь к локальному или удаленному перенаправленному порту. SSH передает этот трафик через зашифрованный сеанс и подключается к конечному адресату с соответствующей стороны туннеля.

Туннель шифрует трафик между вашим SSH-клиентом и SSH-сервером. Если конечный адресат находится за пределами SSH-сервера, последний участок использует ту защиту, которую предоставляет целевой сервис. Для чувствительных сервисов оставляйте TLS или встроенное шифрование включенным, даже при использовании туннеля.

Типы SSH-туннелей

SSH предлагает три основных типа переадресации портов, каждый из которых служит своей цели:

1. Локальная переадресация портов (-L)

Локальная переадресация портов — самый распространенный тип. Она позволяет перенаправлять трафик с порта на вашей локальной машине на порт на удаленной машине (или машине, доступной с удаленного SSH-сервера). Это идеально для доступа к сервисам, работающим во внутренней сети удаленного сервера или на самом сервере, которые недоступны напрямую из вашей локальной сети.

Как это работает: SSH-клиент прослушивает порт на вашей машине. SSH-сервер подключается к адресату.

Сценарий использования: Доступ к базе данных MySQL на порту 3306, которую может достичь только шлюзовый хост.

Синтаксис команды:

ssh -L [ЛОКАЛЬНЫЙ_ПОРТ]:[ХОСТ_НАЗНАЧЕНИЯ]:[ПОРТ_НАЗНАЧЕНИЯ] [ПОЛЬЗОВАТЕЛЬ_SSH]@[SSH_СЕРВЕР]

Пример:

Предположим, у вас есть база данных MySQL, работающая на db.internal.example.com (порт 3306), и вы можете подключиться по SSH только к bastion.example.com. Чтобы получить доступ к базе данных с локальной машины на порту 8888:

ssh -L 8888:db.internal.example.com:3306 [email protected]

После выполнения этой команды вы можете открыть локальный MySQL-клиент и подключиться к localhost:8888. Трафик будет безопасно туннелирован через bastion.example.com к db.internal.example.com:3306.

Используйте -N, если вам не нужна удаленная оболочка:

ssh -N -L 8888:db.internal.example.com:3306 [email protected]

Для скриптов добавьте -o ExitOnForwardFailure=yes, чтобы SSH завершал работу, если локальный слушатель не может быть создан.

2. Удаленная переадресация портов (-R)

Удаленная переадресация портов работает противоположно локальной. Она позволяет перенаправлять трафик с порта на удаленном SSH-сервере на порт на вашей локальной машине или машине, доступной из вашей локальной сети. Это полезно для предоставления доступа к сервису, работающему на вашей локальной машине (или машине в вашей локальной сети), удаленному серверу или его сети.

Как это работает: SSH-сервер прослушивает удаленный порт. Ваш SSH-клиент подключается к адресату с вашей стороны туннеля.

Сценарий использования: Предоставление удаленному коллеге доступа к веб-серверу разработки, работающему на вашей локальной машине (например, Flask-приложение на порту 5000), без прямого открытия вашей локальной машины в интернете.

Синтаксис команды:

ssh -R [УДАЛЕННЫЙ_ПОРТ]:[ХОСТ_НАЗНАЧЕНИЯ]:[ПОРТ_НАЗНАЧЕНИЯ] [ПОЛЬЗОВАТЕЛЬ_SSH]@[SSH_СЕРВЕР]

Пример:

Предположим, вы запустили веб-приложение на своей локальной машине по адресу localhost:5000. Вы хотите разрешить пользователю на remote.example.com получить к нему доступ, подключившись к порту 9000 на remote.example.com.

ssh -R 9000:localhost:5000 [email protected]

В типичных конфигурациях OpenSSH удаленный слушатель доступен только на интерфейсе обратной связи SSH-сервера. Это означает, что пользователи на удаленном хосте могут протестировать localhost:9000, но другие машины не обязательно смогут достичь remote.example.com:9000.

Чтобы открыть слушатель для других машин, обычно требуется указать адрес привязки, например 0.0.0.0, в команде и установить на сервере параметр GatewayPorts в значение clientspecified или yes. Будьте осторожны: удаленная переадресация может открыть сервисы на вашем ноутбуке или локальной сети для удаленной сети.

3. Динамическая переадресация портов (-D)

Динамическая переадресация портов создает SOCKS-прокси на вашей локальной машине. Вместо перенаправления трафика на конкретный адресат, она позволяет приложениям, настроенным на использование этого SOCKS-прокси, подключаться к любому хосту и порту, доступному с SSH-сервера. Это фактически превращает ваше SSH-соединение в универсальный прокси-сервер.

Как это работает: Ваш SSH-клиент работает как SOCKS-прокси. Приложения, поддерживающие SOCKS, отправляют запросы этому локальному прокси, а SSH-сервер устанавливает исходящее соединение.

Сценарий использования: Безопасный просмотр веб-страниц из общедоступной сети Wi-Fi путем маршрутизации всего трафика браузера через SSH-сервер дома или в офисе. Это шифрует вашу активность в интернете.

Синтаксис команды:

ssh -D [ЛОКАЛЬНЫЙ_ПОРТ] [ПОЛЬЗОВАТЕЛЬ_SSH]@[SSH_СЕРВЕР]

Пример:

Чтобы создать SOCKS-прокси на вашей локальной машине, прослушивающий порт 1080:

ssh -D 1080 [email protected]

После выполнения этой команды настройте ваш браузер или другое приложение на использование SOCKS-прокси по адресу localhost:1080. Если приложение поддерживает удаленный DNS через SOCKS5, включите эту опцию, когда важна конфиденциальность DNS.

Практические применения и преимущества

SSH-туннелирование предлагает широкий спектр практических применений:

  • Безопасный доступ к базам данных: Доступ к базам данных (таким как PostgreSQL, MySQL или MongoDB), которые доступны только с определенного сервера в частной сети, без прямого открытия порта базы данных в интернете.
  • Доступ к внутренним веб-сервисам: Подключение к внутренним веб-приложениям, административным интерфейсам или панелям мониторинга, которые не доступны публично.
  • Защита незашифрованных протоколов: Инкапсуляция небезопасных протоколов, таких как VNC, FTP или обычный HTTP, внутри зашифрованного SSH-туннеля, обеспечивая конфиденциальность и целостность.
  • Работа в условиях сетевых ограничений: Доступ к сервисам через сервер, которому разрешено к ним подключаться. Делайте это только в соответствии с политикой сети вашей организации.
  • Безопасная удаленная разработка: Предоставление безопасного доступа к средам разработки или инструментам, работающим на удаленных серверах.

Вывод

Используйте локальную переадресацию, когда вашему ноутбуку нужен доступ к частному удаленному сервису. Используйте удаленную переадресацию, когда удаленному хосту нужен временный доступ к сервису рядом с вами. Используйте динамическую переадресацию, когда вам нужен SOCKS-прокси через доверенный SSH-сервер. Держите туннель как можно более узким и закрывайте его, когда задача выполнена.