Защищенный доступ пользователей к облачным ресурсам на основе WireGuard VPN
Для организации защищенного удаленного доступа пользователей через VPN
В данном сценарии вы развернете в Yandex Cloud облачную инфраструктуру для организации Remote access VPN на основе WireGuard VPN по следующей схеме:
Описание основных элементов схемы:
Название | Описание |
---|---|
Firezone ВМ | Виртуальная машина с установленным ПО Firezone на основе WireGuard VPN для организации VPN доступа |
Кластер баз данных | Сервис Managed Service for PostgreSQL для работы Firezone ВМ и Keycloak ВМ |
Keycloak ВМ | Open-source ПО Keycloak |
Более подробное описание приведено в репозитории проекта
Чтобы настроить Firezone и проверить его работу:
- Подготовьте облако к работе.
- Подготовьте среду для развертывания ресурсов.
- Подготовьте домен.
- Разверните Firezone и Keycloak.
- Настройте Keycloak для интеграции с Firezone.
- Настройте Firezone.
- Протестируйте работу.
Если созданные ресурсы вам больше не нужны, удалите их.
Подготовьте облако к работе
Зарегистрируйтесь в Yandex Cloud и создайте платежный аккаунт:
- Перейдите в консоль управления
, затем войдите в Yandex Cloud или зарегистрируйтесь. - На странице Yandex Cloud Billing
убедитесь, что у вас подключен платежный аккаунт, и он находится в статусеACTIVE
илиTRIAL_ACTIVE
. Если платежного аккаунта нет, создайте его и привяжите к нему облако.
Если у вас есть активный платежный аккаунт, вы можете создать или выбрать каталог, в котором будет работать ваша инфраструктура, на странице облака
Подробнее об облаках и каталогах.
Необходимые платные ресурсы
В стоимость поддержки инфраструктуры входят:
- плата за постоянно работающие ВМ (см. тарифы Yandex Compute Cloud);
- плата за использование публичных IP-адресов и исходящий трафик (см. тарифы Yandex Virtual Private Cloud);
- плата за использование сервиса Managed Service for PostgreSQL (см. тарифы Yandex Managed Service for PostgreSQL);
- плата за публичные DNS-запросы и зоны DNS (см. тарифы Cloud DNS).
Подготовьте среду для развертывания ресурсов
-
Если у вас еще нет интерфейса командной строки Yandex Cloud, установите его и авторизуйтесь от имени пользователя.
-
Создайте сервисный аккаунт:
Консоль управленияCLI- В консоли управления
выберите каталог, в котором хотите создать сервисный аккаунт. - В списке сервисов выберите Identity and Access Management.
- Нажмите кнопку Создать сервисный аккаунт.
- Введите имя сервисного аккаунта, например,
sa-firezone
. - Нажмите кнопку Создать.
По умолчанию используется каталог, указанный в профиле CLI. Вы можете указать другой каталог с помощью параметра
--folder-name
или--folder-id
.Выполните команду для создания сервисного аккаунта, указав имя
sa-firezone
:yc iam service-account create --name sa-firezone
Где
--name
— имя сервисного аккаунта.Результат:
id: ajehr0to1g8b******** folder_id: b1gv87ssvu49******** created_at: "2023-07-06T09:00:00.665153755Z" name: sa-firezone
- В консоли управления
-
Назначьте сервисному аккаунту роль администратора на каталог:
Консоль управленияCLI- На стартовой странице
консоли управления выберите каталог. - Перейдите на вкладку Права доступа.
- Найдите аккаунт
sa-firezone
в списке и нажмите значок . - Нажмите кнопку Изменить роли.
- В открывшемся диалоге нажмите кнопку
Добавить роль и выберите рольadmin
.
Выполните команду:
yc resource-manager folder add-access-binding <идентификатор_каталога> \ --role admin \ --subject serviceAccount:<идентификатор_сервисного_аккаунта>
- На стартовой странице
-
Настройте профиль CLI для выполнения операций от имени сервисного аккаунта:
CLI-
Создайте авторизованный ключ для сервисного аккаунта и запишите его в файл:
yc iam key create \ --service-account-id <идентификатор_сервисного_аккаунта> \ --folder-id <идентификатор_каталога_с_сервисным_аккаунтом> \ --output key.json
Где:
--service-account-id
— идентификатор сервисного аккаунта.--folder-id
— идентификатор каталога, в котором создан сервисный аккаунт.--output
— имя файла с авторизованным ключом.
Результат:
id: aje8nn871qo4******** service_account_id: ajehr0to1g8b******** created_at: "2023-07-06T09:03:00.479156798Z" key_algorithm: RSA_2048
-
Создайте профиль CLI для выполнения операций от имени сервисного аккаунта:
yc config profile create sa-firezone
Результат:
Profile 'sa-firezone' created and activated
-
Задайте конфигурацию профиля:
yc config set service-account-key key.json
Где
service-account-key
— файл с авторизованным ключом сервисного аккаунта. -
Сохраните ключ доступа в переменную окружения:
export YC_TOKEN=$(yc iam create-token)
-
Подготовьте домен
Вам понадобится домен, который будет использоваться для виртуальных машин Firezone и Keycloak. Этот домен должен быть предварительно делегирован в Yandex Cloud со стороны регистратора домена. Для этого укажите адреса серверов ns1.yandexcloud.net
и ns2.yandexcloud.net
в личном кабинете вашего регистратора.
Разверните Firezone и Keycloak
-
На вашей рабочей станции склонируйте репозиторий
yandex-cloud-examples/yc-remote-acess-vpn-with-wireguard-firezone
из Yandex Cloud Security Solution Library и перейдите в папку сценарияyc-remote-acess-vpn-with-wireguard-firezone
:git clone https://github.com/yandex-cloud-examples/yc-remote-acess-vpn-with-wireguard-firezone.git cd yc-remote-acess-vpn-with-wireguard-firezone
-
Отредактируйте файл
outputs.tf
в папкеsettings
, указав параметры разворачиваемых ресурсов:- В секции
domain
укажите ваше доменное имя (второго и первого уровня, разделенное точкой) для виртуальных машин Firezone и Keycloak. В этом примере используется доменexample.com
. - В секции
folder_id
укажите ID каталога для размещения ресурсов, напримерb1grj7grr1kn********
. - В секции
vpc_id
укажите ID облачной сети для размещения ресурсов, напримерenp48c1ndilt********
. - В секции
trusted_ip_for_mgmt
укажите список публичных IP адресов/подсетей, с которых разрешено подключение по SSH к Firezone и Keycloak ВМ, например["A.A.A.A/32", "B.B.B.0/24"]
. - В секции
admin_email
почтовый адрес администратора (логин) для доступа к веб-интерфейсу администратора Firezone, напримерadmin@example.com
. - В секции
email
почтовый адрес тестового пользователя, который будет добавлен в Firezone после успешной аутентификации в Keycloak, напримерuser@example.com
. - Остальные параметры можете оставить по умолчанию или изменить на свои значения кроме параметров
image_folder_id
иimage_name
.
Важно
Заданные в файле значения предусматривают разворачивание ресурсоемкой инфраструктуры.
Проверьте квоты в облаке, чтобы была возможность развернуть ресурсы.Посмотреть справочную информацию по количеству ресурсов
Ресурс Количество Виртуальные машины 2 vCPU виртуальных машин 4 RAM виртуальных машин 12 ГБ Диски 2 Объем SSD дисков 110 ГБ Подсети 2 Статические публичные IP-адреса 2 Группы безопасности 2 Сертификат Certificate Manager 1 Зона DNS 1 Кластер Managed Service for PostgreSQL 1 Объем SSD-хранилища для кластера PostgreSQL 10 ГБ Количество vCPU для кластера PostgreSQL 2 Объем памяти для кластера PostgreSQL 8 Terraform-
Перейдите в папку
main
cd main
-
Выполните инициализацию Terraform:
terraform init
-
Проверьте список создаваемых облачных ресурсов:
terraform plan
-
Создайте ресурсы:
terraform apply
Дождитесь завершения процесса. Обработка запроса на выдачу сертификата в сервисе Let's Encrypt может выполняться до 30 минут.
-
По завершении в командной строке будут выведены URL-адреса для подключения к веб-интерфейсам Firezone и Keycloak, а также учетные записи администраторов Firezone и Keycloak. В дальнейшем эту информацию можно будет посмотреть с помощью команды
terraform output
.Outputs: firezone_admin_credentials = <sensitive> firezone_url = "https://vpn.example.com" keycloak_admin_credentials = <sensitive> keycloak_url = "https://kc.example.com:8443/admin"
Для получения
sensitive
значения укажите имя параметра в командеterraform output
, например:terraform output firezone_admin_credentials
Результат:
{ "admin_email" = "admin@example.com" "admin_password" = "7fVN********" }
- В секции
Настройте Keycloak для интеграции с Firezone
-
По завершении развертывания виртуальных машин для Firezone и Keycloak перейдите в папку
keycloak-config
, чтобы выполнить настройку Keycloak для сценария интеграции Keycloak с Firezone и Single Sign-On.cd ../keycloak-config
-
Выполните инициализацию Terraform:
terraform init
-
Проверьте список создаваемых облачных ресурсов:
terraform plan
-
Создайте ресурсы:
terraform apply
-
После завершения процесса terraform apply в командной строке будет выведена информация для настройки интеграции Firezone и Keycloak, а также учетная запись тестового пользователя для проверки SSO в Keycloak и подключения к VPN. В дальнейшем эту информацию можно будет посмотреть с помощью команды
terraform output
.Outputs: keycloak_config_for_firezone = <sensitive> test_user_credentials = <sensitive>
Для вывода
sensitive
значения укажите его в командеterraform output
.
Настройте Firezone
- Перейдите в браузере по адресу
https://firezone_url
, гдеfirezone_url
— вывод командыterraform output firezone_url
в папкеmain
, в данном примереhttps://vpn.example.com
- Войдите в интерфейс администратора Firezone с учетной записью администратора из вывода команды
terraform output firezone_admin_credentials
в папкеmain
. - Перейдите в раздел SETTINGS / Defaults для изменения настроек по умолчанию.
- В поле Allowed IPs укажите, для каких облачных IP подсетей (укажите через запятую адреса подсетей/маски) VPN клиенты будут направлять трафик в VPN туннель. Пример:
192.168.1.0/24, 192.168.2.0/24
. - В поле DNS Servers укажите адреса DNS серверов, которые будут использоваться VPN клиентами.
Пример:192.168.1.2, 192.168.2.2
.
Если переназначение на стороне клиента этих DNS адресов не планируется, удалите информацию в этом поле. - Также можно изменить параметры по умолчанию для интервала
keepalive
, размераMTU
для VPN клиентов. По умолчанию указанMTU
1280 байт, его можно увеличить до 1440 байт. - Нажмите Save для применения настроек.
- Перейдите в раздел SETTINGS / Security для изменения настроек безопасности.
- Выключите настройку Allow unprivileged device configuration, чтобы пользователь не мог изменить через пользовательский веб-интерфейс Firezone сетевые настройки для VPN клиента.
- Включите настройку Auto disable VPN. Это позволит при удалении пользователя в Identity Provider (Keycloak в данном примере) отключить его VPN подключения.
- Нажмите Add OpenID Connect Provider для добавления Keycloak.
- В разделе OIDC Configuration заполните поля:
- Config ID:
keycloak
; - Label:
Keycloak
; - OIDC scopes:
openid email profile offline_access
; - Client ID:
firezone
; - Client secret:
client_secret
из выводаterraform output keycloak_config_for_firezone
в папкеkeycloak-config
(значение укажите без кавычек); - Discovery Document URI:
discovery_document_uri
из выводаterraform output keycloak_config_for_firezone
в папкеkeycloak-config
(значение укажите без кавычек); - Redirect URI: оставьте пустым;
- Включить Auto-create users для автоматического добавления пользователей в Firezone после их успешной аутентификации в Keycloak.
- Config ID:
- Нажмите Save в разделе OIDC Configuration для применения настроек.
Протестируйте работу
-
Установите на ваше устройство клиент WireGuard
с сайта WireGuard.Дальнейшие шаги по настройке клиента WireGuard приведены на примере ОС Windows. Для других ОС название элементов интерфейса клиента может отличаться.
-
Перейдите в браузере по адресу
https://firezone_url
, гдеfirezone_url
— вывод командыterraform output firezone_url
в папкеmain
. Если у вас активна сессия администратора в веб-интерфейсе Firezone, то предварительно выполните Log Out. Нажмите Sign in with Keycloak. Произойдет редирект на веб-страницу Keycloak для Single Sign-On. -
Войдите с учетной записью тестового пользователя из вывода команды
terraform output test_user_credentials
в папкеkeycloak-config
. -
После успешной аутентификации в веб-интерфейсе Firezone с тестовым пользователем добавьте устройство, с которого будет устанавливаться VPN подключение. Для этого нажмите Add Device.
-
В открывшемся окне можете изменить название устройства и добавить его описание. Нажмите Generate Configuration.
-
Появится окно с VPN конфигурацией для устройства. Нажмите Download WireGuard Configuration для скачивания файла конфигурации. В приложении WireGuard для Android или iOS можно также отсканировать QR-код с этой страницы для добавления VPN туннеля.
Важно
Не закрывайте это окно, пока не скачаете конфигурационный файл или не отсканируете QR-код. После закрытия окна VPN конфигурацию для устройства больше не получится посмотреть в веб-интерфейсе Firezone.
-
Добавьте новый VPN туннель (Import tunnel(s) from file) в приложении WireGuard, используя скачанный конфигурационный файл.
-
Активируйте туннель нажатием на Activate.
-
Проверьте на своем устройстве в командной строке с помощью
ping 192.168.1.1
доступность шлюза из облачной подсетиfirezone
. Вы подключились с помощью VPN туннеля к облачной инфраструктуре.Pinging 192.168.1.1 with 32 bytes of data: Reply from 192.168.1.1: bytes=32 time=67ms TTL=53
Как удалить созданные ресурсы
Чтобы перестать платить за созданные ресурсы:
- Перейдите на вашей рабочей станции в папку
keycloak-config
и выполните командуterraform destroy
. - После этого перейдите в папку
main
и выполните командуterraform destroy
.