Создание бастионного хоста
- Перед началом работы
- Создайте пару ключей SSH
- Создайте внешнюю и внутреннюю сети
- Создайте группы безопасности
- Зарезервируйте статический публичный IP-адрес
- Создайте виртуальную машину для бастионного хоста
- Протестируйте бастионный хост
- Добавьте виртуальный сервер во внутренний сегмент бастионного хоста
- Подключитесь к созданной ВМ
- Дополнительные опции подключения
- Как удалить созданные ресурсы
Если вы когда-нибудь интересовались строительством древних фортификационных сооружений, то слово «бастион» должно быть вам знакомо. Бастионом назывался элемент внешней стены крепости, выступающий за ее основной контур. Как и средневековые крепости, компьютерные сети нуждаются в многоуровневой защите от внешнего вторжения. Роль бастионов в сетях выполняют так называемые бастионные хосты, образующие часть сетевого периметра.
Бастионный хост — это виртуальная машина, которой присваивается публичный IP-адрес для доступа по протоколу SSH. Настроив бастионный хост, вы получаете своего рода джамп-сервер
Таким образом, создание бастионного хоста позволит вам снизить уязвимость серверов в своем виртуальном частном облаке. При этом административные задачи на конкретных серверах будут выполняться в рамках прокси-соединения через бастионный хост по SSH.
Чтобы создать бастионный хост:
- Подготовьте облако к работе.
- Создайте пару ключей SSH.
- Создайте сети.
- Создайте группы безопасности.
- Зарезервируйте статический публичный IP-адрес.
- Создайте виртуальную машину для бастионного хоста.
- Протестируйте бастионный хост.
- Добавьте виртуальный сервер во внутренний сегмент бастионного хоста.
- Подключитесь к созданной ВМ.
Если созданные ресурсы вам больше не нужны, удалите их.
Перед началом работы
Зарегистрируйтесь в Yandex Cloud и создайте платежный аккаунт:
- Перейдите в консоль управления
, затем войдите в Yandex Cloud или зарегистрируйтесь. - На странице Yandex Cloud Billing
убедитесь, что у вас подключен платежный аккаунт, и он находится в статусеACTIVE
илиTRIAL_ACTIVE
. Если платежного аккаунта нет, создайте его и привяжите к нему облако.
Если у вас есть активный платежный аккаунт, вы можете создать или выбрать каталог, в котором будет работать ваша инфраструктура, на странице облака
Подробнее об облаках и каталогах.
Необходимые платные ресурсы
В стоимость поддержки инфраструктуры входит:
- плата за диски и постоянно запущенные ВМ (см. тарифы Yandex Compute Cloud);
- плата за использование внешнего IP-адреса (см. тарифы Yandex Virtual Private Cloud).
Создайте пару ключей SSH
Чтобы подключаться к виртуальной машине по SSH, нужна пара ключей: открытый ключ размещается на ВМ, а закрытый ключ хранится у пользователя. Такой способ более безопасен, чем подключение по логину и паролю.
Примечание
В публичных образах Linux, предоставляемых Yandex Cloud, возможность подключения по протоколу SSH с использованием логина и пароля по умолчанию отключена.
Роутер Cisco Cloud Services Router (CSR) 1000v поддерживает только ключи, сгенерированные по алгоритму RSA.
Чтобы создать пару ключей:
-
Откройте терминал.
-
Создайте новый ключ с помощью команды
ssh-keygen
:ssh-keygen -t rsa -b 2048
После выполнения команды вам будет предложено указать имена файлов, в которые будут сохранены ключи, и ввести пароль для закрытого ключа. По умолчанию используется имя
id_rsa
, ключи создаются в директории~/.ssh
.Публичная часть ключа будет сохранена в файле
<имя_ключа>.pub
.
-
Запустите
cmd.exe
илиpowershell.exe
. -
Создайте новый ключ с помощью команды
ssh-keygen
:ssh-keygen -t rsa -b 2048
После выполнения команды вам будет предложено указать имена файлов, в которые будут сохранены ключи, и ввести пароль для закрытого ключа. По умолчанию используется имя
id_rsa
. Ключи создаются в директорииC:\Users\<имя_пользователя>\.ssh\
илиC:\Users\<имя_пользователя>\
в зависимости от интерфейса командной строки.Публичная часть ключа будет сохранена в файле с названием
<имя_ключа>.pub
.
Создайте ключи с помощью приложения PuTTY:
-
Скачайте
и установите PuTTY. -
Убедитесь, что директория, куда вы установили PuTTY, присутствует в
PATH
:- Нажмите правой кнопкой на Мой компьютер. Выберите пункт Свойства.
- В открывшемся окне выберите Дополнительные параметры системы, затем Переменные среды (находится в нижней части окна).
- В разделе Системные переменные найдите
PATH
и нажмите Изменить. - В поле Значение переменной допишите путь к директории, куда вы установили PuTTY.
-
Запустите приложение PuTTYgen.
-
В качестве типа генерируемой пары выберите RSA и укажите длину 2048. Нажмите Generate и поводите курсором в поле выше до тех пор, пока не закончится создание ключа.
-
В поле Key passphrase введите надежный пароль. Повторно введите его в поле ниже.
-
Нажмите кнопку Save private key и сохраните закрытый ключ. Никому не сообщайте ключевую фразу от него.
-
Сохраните ключ в текстовом файле. Для этого скопируйте открытый ключ из текстового поля в текстовый файл с названием
id_rsa.pub
. Обратите внимание, что ключ должен быть записан одной строкой (не должно быть переносов и разрывов строки).
Важно
Надежно сохраните закрытый ключ: без него подключиться к виртуальной машине будет невозможно.
Создайте внешнюю и внутреннюю сети
Создайте внешнюю сеть и подсеть
-
В консоли управления
перейдите в каталог, в котором вы создаете инфраструктуру для бастионного хоста. -
В списке сервисов выберите Virtual Private Cloud.
-
В правом верхнем углу нажмите кнопку Создать сеть.
-
Задайте имя сети:
external-bastion-network
. -
Отключите опцию Создать подсети.
-
Нажмите кнопку Создать сеть.
-
Создайте подсеть:
-
Справа сверху нажмите кнопку Создать подсеть.
-
Укажите параметры подсети:
- Имя —
bastion-external-segment
. - Зона —
ru-central1-b
. - CIDR —
172.16.17.0/28
.
- Имя —
-
Нажмите кнопку Создать подсеть.
-
Создайте внутреннюю сеть и подсеть
-
В консоли управления
перейдите в каталог, в котором вы создаете инфраструктуру для бастионного хоста. -
В списке сервисов выберите Virtual Private Cloud.
-
В правом верхнем углу нажмите кнопку Создать сеть.
-
Задайте имя сети:
internal-bastion-network
. -
Отключите опцию Создать подсети.
-
Нажмите кнопку Создать сеть.
-
Создайте подсеть:
-
Справа сверху нажмите кнопку Создать подсеть.
-
Укажите параметры подсети:
- Имя —
bastion-internal-segment
. - Зона —
ru-central1-b
. - CIDR —
172.16.16.0/24
.
- Имя —
-
Нажмите кнопку Создать подсеть.
-
Создайте группы безопасности
Создайте группу безопасности бастионного хоста
Создайте группу безопасности и настройте правила для входящего трафика на бастионном хосте, чтобы обеспечить к нему доступ из интернета:
-
В консоли управления
перейдите в каталог, в котором вы создаете инфраструктуру для бастионного хоста. -
В списке сервисов выберите Virtual Private Cloud и сеть
external-bastion-network
. -
В меню слева выберите
Группы безопасности. -
Нажмите кнопку Создать группу безопасности.
-
Задайте имя группы безопасности:
secure-bastion-sg
. -
В блоке Правила перейдите на вкладку Входящий трафик и нажмите кнопку Добавить правило.
-
Укажите настройки правила:
- Диапазон портов —
22
. - Протокол —
TCP
. - Источник —
CIDR
. - CIDR блоки —
0.0.0.0/0
.
- Диапазон портов —
-
Нажмите кнопку Сохранить в окне создания правила, а затем — в окне создания группы безопасности.
Создайте группу безопасности для внутренних хостов
Создайте группу безопасности и настройте правила для входящего трафика, идущего с бастионного хоста на внутренние хосты:
-
В консоли управления
перейдите в каталог, в котором вы создаете инфраструктуру для бастионного хоста. -
В списке сервисов выберите Virtual Private Cloud и сеть
internal-bastion-network
. -
В меню слева выберите
Группы безопасности. -
Нажмите кнопку Создать группу безопасности.
-
Задайте имя группы безопасности:
internal-bastion-sg
. -
В блоке Правила перейдите на вкладку Входящий трафик и нажмите кнопку Добавить правило.
-
Укажите настройки правила:
- Диапазон портов —
22
. - Протокол —
TCP
. - Источник —
CIDR
. - CIDR блоки —
172.16.16.254/32
.
- Диапазон портов —
-
Нажмите кнопку Сохранить в окне создания правила.
-
Перейдите на вкладку Исходящий трафик и нажмите кнопку Добавить правило.
-
Укажите настройки правила:
- Диапазон портов —
22
. - Протокол —
TCP
. - Назначение —
Группа безопасности
. - Группа безопасности —
Текущая
.
- Диапазон портов —
-
Нажмите кнопку Сохранить в окне создания правила, а затем — в окне создания группы безопасности.
Зарезервируйте статический публичный IP-адрес
Для работы бастионному хосту потребуется статический публичный IP-адрес.
- В консоли управления
перейдите в каталог, в котором вы создаете инфраструктуру для бастионного хоста. - В списке сервисов выберите Virtual Private Cloud.
- На панели слева выберите IP-адреса.
- Нажмите кнопку Зарезервировать адрес.
- В открывшемся окне выберите зону доступности
ru-central1-b
. - Нажмите кнопку Зарезервировать.
Создайте виртуальную машину для бастионного хоста
После того как вы создали подсеть и группу безопасности, перейдите к созданию виртуального сервера для бастионного хоста:
-
В консоли управления
перейдите в каталог, в котором вы создаете инфраструктуру для бастионного хоста. -
В списке сервисов выберите Compute Cloud.
-
Справа сверху нажмите кнопку Создать виртуальную машину.
-
Введите имя виртуальной машины:
bastion-host
. -
Выберите зону доступности
ru-central1-b
. -
В блоке Образ загрузочного диска:
- На вкладке Marketplace выберите продукт NAT-инстанс на основе Ubuntu 22.04 LTS.
- Нажмите Использовать.
-
В блоке Сетевые настройки настройте первый сетевой интерфейс:
- Подсеть —
bastion-external-segment
. - Публичный адрес — нажмите Список и выберите зарезервированный ранее IP-адрес.
- Группы безопасности —
secure-bastion-sg
.
- Подсеть —
-
Нажмите Добавить сетевой интерфейс и настройте второй сетевой интерфейс:
-
Подсеть —
bastion-internal-segment
. -
Публичный адрес —
Без адреса
. -
Группы безопасности —
internal-bastion-sg
. -
Разверните блок Дополнительно:
-
В поле Внутренний IPv4 адрес выберите Список.
-
Нажмите Зарезервировать. В открывшемся окне:
- В поле Внутренний IPv4 адрес введите адрес
172.16.16.254
. - Нажмите Создать.
- В поле Внутренний IPv4 адрес введите адрес
-
Примечание
Проверьте, что первый интерфейс на новой виртуальной машине принадлежит к внешнему сегменту, поскольку шлюз по умолчанию будет автоматически задан именно на этом интерфейсе.
Публичный IP-адрес указывается только для внешнего сегмента. Для внутреннего сегмента указывается внутренний статический IP-адрес.
-
-
В блоке Доступ в поле Логин введите имя пользователя:
bastion
. -
В поле SSH-ключ вставьте содержимое файла открытого ключа.
-
Нажмите кнопку Создать ВМ.
Когда серверная ВМ запустится и перейдет в статус Running, вы сможете увидеть назначенный ей публичный IP-адрес в поле Публичный IP-адрес.
Протестируйте бастионный хост
После запуска бастионного хоста попробуйте подключиться к нему через SSH-клиент:
ssh -i ~/.ssh/<имя_файла_приватного_ключа> bastion@<публичный_IP_адрес_бастионного_хоста>
Добавьте виртуальный сервер во внутренний сегмент бастионного хоста
Для администрирования ваших серверов добавьте сетевой интерфейс во внутренний сетевой сегмент бастионного хоста — bastion-internal-segment
.
Если у вас уже создана виртуальная машина, добавьте к ней дополнительный сетевой интерфейс. Если нет — создайте новую машину для тестирования конфигурации бастионного хоста:
-
В консоли управления
перейдите в каталог, в котором вы создаете инфраструктуру для бастионного хоста. -
В списке сервисов выберите Compute Cloud.
-
Справа сверху нажмите кнопку Создать виртуальную машину.
-
Введите имя виртуальной машины:
test-vm
. -
Выберите зону доступности
ru-central1-b
. -
В блоке Образ загрузочного диска выберите произвольную операционную систему.
-
В блоке Сетевые настройки настройте сетевой интерфейс:
- Подсеть —
bastion-internal-segment
. - Публичный адрес —
Без адреса
. - Внутренний IPv4-адрес —
Автоматически
. - Группы безопасности —
internal-bastion-sg
.
- Подсеть —
-
В блоке Доступ:
- Отключите опцию Доступ по OS Login.
- В поле Логин введите имя пользователя:
test
. - В поле SSH-ключ вставьте содержимое файла открытого ключа.
-
Нажмите Создать ВМ.
Подключитесь к созданной ВМ
Подключаясь к ВМ по протоколу SSH через внутренний IP-адрес, вы будете использовать бастионный хост в роли джамп-хоста.
Для упрощения SSH-доступа и его настройки добавьте параметр -J
(ProxyJump) в команду SSH:
ssh -i ~/.ssh/<имя_файла_приватного_ключа> -J bastion@<публичный_IP_адрес_бастионного_хоста> test@<внутренний_IP_адрес_виртуального_сервера>
SSH-клиент автоматически подключится к внутреннему серверу.
Флаг -J
поддерживается в OpenSSH начиная с версии 7.3. В более ранних версиях -J
недоступен. В таком случае самый безопасный и простой способ — это использовать перенаправление стандартного ввода-вывода (флаг -W
) для «проброса» соединения через бастионный хост. Например:
ssh -i ~/.ssh/<имя_файла_приватного_ключа> -o ProxyCommand="ssh -W %h:%p bastion@<публичный_IP_адрес_бастионного_хоста>" test@<внутренний_IP_адрес_виртуального_сервера>
Дополнительные опции подключения
Использование SSH-агента для подключения через бастионный хост
По умолчанию доступ к серверу настраивается только для аутентификации с помощью публичного SSH-ключа. Не рекомендуется хранить ключи на самих бастионных хостах (в особенности без кодовой фразы). Поэтому лучше использовать SSH-агент. В таком случае приватные SSH-ключи будут храниться только на вашем компьютере, и их можно будет безопасно использовать для аутентификации на следующем сервере.
Добавить ключ в аутентификационный агент можно с помощью команды ssh-add
. Если ключ хранится в файле ~/.ssh/id_rsa
, он будет добавлен автоматически. Вы также можете указать, какой конкретно ключ нужно использовать, при помощи следующей команды:
ssh-add <путь_к_файлу_ключа>
Пользователи macOS могут настроить у себя файл ~/.ssh/config
. Тогда ключи можно будет загрузить в агент при помощи следующей команды:
AddKeysToAgent yes
Эта команда подключения к бастионному хосту позволяет пробросить агент и войти на следующий сервер, передавая учетные данные с локальной машины:
ssh -A bastion@<публичный_IP_адрес_бастионного_хоста>
Пользователи Windows могут использовать агент Pageant и загрузить в него свой файл приватного ключа. Затем, чтобы обеспечить проброс агента, нужно в окне настроек PuTTY
Доступ к сервисам через SSH-туннели
Иногда одного SSH-доступа недостаточно для выполнения поставленной задачи. В таких ситуациях SSH-туннели дают возможность с легкостью подключаться к веб-приложениям и другим сервисам, обрабатывающим входящие подключения.
Основные типы SSH-туннелей — локальные, удаленные и динамические:
-
Локальный туннель предоставляет открытый порт на локальном интерфейсе обратной связи, который подключается к адресу
IP:порт
на вашем SSH-сервере.Например, можно подключить локальный порт 8080 к адресу
IP_адрес_веб_сервера:80
, который доступен с вашего бастионного хоста, а затем в браузере открытьhttp://localhost:8080
:ssh bastion@<публичный_IP_адрес_бастионного_хоста> -L 8080:<IP_адрес_веб_сервера>:80
-
Удаленный туннель работает в обратном, по отношению к локальному туннелю, направлении, открывая локальный порт для подключения к удаленному серверу.
-
Динамический туннель предоставляет SOCKS-прокси на локальном порту, при этом подключения устанавливаются с удаленного хоста. Например, можно настроить динамический туннель на порту 1080, а затем в браузере указать его как SOCKS-прокси. В итоге вы сможете подключаться ко всем ресурсам, которые доступны с вашего бастионного хоста и находятся в приватной подсети.
ssh bastion@<публичный_IP_адрес_бастионного_хоста> -D 1080
Эти методики основаны на простой замене, при которой зачастую требуется VPN-подключение, а также сочетание с подключениями ProxyJump или ProxyCommand.
Пользователи Windows могут настроить туннели через PuTTY, выбрав Подключение → SSH → Туннели.
Для простого установления подключений к сервисам удаленного рабочего стола (Remote Desktop Services, RDS) — т.е. работающим хостам Windows в облаке — можно использовать переадресацию портов (в особенности, локальную) путем установления туннельного подключения на порт 3389 и последующего подключения к localhost
через RDS-клиент. Если RDS уже ожидает подключения на локальной машине, вы можете выбрать другой порт, как показано в примере:
ssh bastion@<публичный_IP_адрес_бастионного_хоста> -L 3390:<IP_адрес_Windows_хоста>:3389
Передача файлов
Для клиентов и серверов Linux можно настроить протокол SCP
scp -o "ProxyJump bastion@<публичный_IP_адрес_бастионного_хоста>" <имя_файла> bastion@<внутренний_IP_адрес_виртуального_сервера>:<путь_к_файлу>
Если вы используете Windows-клиент, то одно из наиболее популярных SCP-приложений на Windows — это WinSCP
- Создайте сеанс подключения к IP-адресу приватного хоста без пароля. Настройте SSH-ключ на машине Linux.
- В меню навигации слева нажмите Дополнительно и выберите Туннель.
- Введите IP-адрес и имя пользователя для вашего бастионного хоста. В поле Файл закрытого ключа выберите и установите файл закрытого ключа, который вы будете использовать для аутентификации на бастионном хосте.
- В меню навигации слева в блоке SSH выберите Аутентификация.
- Проверьте, что установлена опция Разрешить пересылку агента.
- Выберите закрытый ключ для аутентификации на приватном хосте.
Такая настройка позволяет осуществлять непосредственную передачу файлов между машиной Windows и приватным хостом Linux. При этом соединение будет защищено бастионным хостом.
В случае хостов Windows, расположенных за бастионом Linux, передачу файлов можно осуществлять при помощи протокола RDP
Как удалить созданные ресурсы
Чтобы перестать платить за созданные ресурсы: