- Описание решения
- Подготовка к развертыванию
- Развертывание Terraform сценария
- Настройка Firezone
- Проверка работоспособности
- Требования к развертыванию в продуктивной среде
- Удаление созданных ресурсов
Решение разворачивает в Yandex Cloud облачную инфраструктуру для организации Remote access VPN: защищенного доступа пользователей к облачным ресурсам на основе WireGuard VPN. Решение поддерживает несколько вариантов популярных Identity Providers для сценариев Single Sign-On пользователей в корпоративной федерации пользователей.
После развертывания решения в Yandex Cloud создаются следующие компоненты:
| Название | Описание |
|---|---|
| Firezone ВМ | Open-source ПО Firezone на основе WireGuard VPN для организации VPN доступа |
| Кластер баз данных | Сервис Managed Service for PostgreSQL для работы Firezone ВМ и Keycloak ВМ |
| Keycloak ВМ | Open-source ПО Keycloak для Single Sign-On аутентификации пользователей в корпоративной федерации пользователей, например Active Directory |
Firezone - это open-source решение для организации удаленного доступа VPN, обладающее следующими основными возможностями:
- Поддержка современного протокола WireGuard VPN с клиентами для desktop и мобильных устройств
- Аутентификация пользователей:
- Локальная аутентификация по email и паролю
- Single Sign-On интеграция с Identity Provider по OpenID Connect (OIDC) или SAML 2.0
- Многофакторная аутентификация
- Простой веб-интерфейс администратора для настройки и управления пользователями и их устройствами
- Веб-интерфейс пользователя для аутентификации и управления своими устройствами
- Реализация в виде Docker контейнера
Для аутентификации пользователей в Firezone можно использовать несколько вариантов популярных Identity Providers: https://www.firezone.dev/docs/authenticate/. В данном решении в качестве примера выбрана реализация с Keycloak.
Как пользователь подключается к VPN:
- Пользователь устанавливает на своё устройство WireGuard клиент
- Пользователь получает конфигурационный файл для WireGuard приложения с помощью одного из методов:
- Администратор Firezone добавляет устройство пользователя в веб-интерфейсе администратора Firezone, скачивает конфигурационный файл для WireGuard и передает его пользователю через защищенный канал;
- После аутентификации в веб-интерфейсе Firezone пользователь может самостоятельно добавить своё устройство, с которого будет устанавливаться VPN подключение, и скачать конфигурационный файл для WireGuard. Это рекомендуемый метод для использования в Firezone.
- Пользователь импортирует конфигурационный файл в WireGuard приложение
- Пользователь активирует VPN туннель
Инструкция для пользователя по подключению VPN: https://www.firezone.dev/docs/user-guides/client-instructions/
Документация по Firezone:
-
Перед выполнением развертывания нужно зарегистрироваться в Yandex Cloud и создать платежный аккаунт
-
Проверьте наличие учетной записи в облаке с правами
adminна каталог -
Проверьте квоты в облаке, чтобы была возможность развернуть ресурсы в сценарии:
Посмотреть справочную информацию по количеству ресурсов, создаваемых в сценарии
Ресурс Количество Виртуальные машины 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 -
Перед развёртыванием решения уже должны существовать следующие объекты:
- Каталог облачных ресурсов и сеть (VPC) в Yandex Cloud, в которых будут размещаться компоненты решения
- Домен, который будет использоваться для виртуальных машин Firezone и Keycloak. Этот домен должен быть предварительно делегирован в Yandex Cloud со стороны регистратора домена. Для этого укажите адреса серверов имен Yandex Cloud в NS-записях вашего регистратора:
ns1.yandexcloud.net. ns2.yandexcloud.net.
-
На вашей рабочей станции склонируйте репозиторий
yandex-cloud-examples/yc-remote-acess-vpn-with-wireguard-firezoneиз GitHub и перейдите в папку сценария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 -
Настройте окружение для развертывания (подробности):
export YC_TOKEN=$(yc iam create-token)
-
Заполните файл
output.tfв папкеsettingsвашими значениями. Обязательные параметры для изменения отмечены в таблице.Посмотреть детальную информацию о заполняемых значениях
Название Описание Тип Пример Требует изменения domain Доменное имя (второго и первого уровня, разделенное точкой) для виртуальных машин Firezone и Keycloak string"example.com"да folder_id ID каталога для размещения компонент решения string"b1gentmqf1ve9uc54nfh"да vpc_id ID облачной сети для размещения компонент решения string"enp48c1ndilt42veuw4x"да trusted_ip_for_mgmt Список публичных IP адресов/подсетей, с которых разрешено подключение по SSH к Firezone и Keycloak ВМ. Используется во входящем правиле групп безопасности. list(string)["A.A.A.A/32", "B.B.B.0/24"]да firezone subdomain Поддомен для Firezone ВМ string"vpn"subnet Значение CIDR подсети для Firezone ВМ string"192.168.1.0/24"vm_username Имя пользователя для Firezone ВМ string"admin"admin_email Email администратора (логин) для доступа к веб-интерфейсу администратора Firezone string"admin@example.com"да version Версия Firezone для развертывания string"0.7.32"wg_port UDP порт для протокола WireGuard string"51820"postgres db_ver Версия кластера PostgreSQL, используемого для хранения данных Firezone и Keycloak string"15"db_user Имя пользователя в кластере PostgreSQL string"dbadmin"db_kc_name Название базы данных для хранения данных Keycloak в кластере PostgreSQL string"kc-db"db_firezone_name Название базы данных для хранения данных Firezone в кластере PostgreSQL string"firezone-db"keycloak subdomain Поддомен для Keycloak ВМ string"kc"subnet Значение CIDR подсети для Keycloak ВМ string"192.168.2.0/24"port Номер порта для обращения к Keycloak ВМ по HTTPS string"8443"image_folder_id ID каталога, в котором хранится образ Keycloak string"b1g4n62gio32v96mdvrb"нет image_name Имя образа Keycloak string"keycloak"нет vm_username Имя пользователя для Keycloak ВМ string"admin"admin_user Имя администратора (логин) для доступа к веб-интерфейсу администратора Keycloak string"admin"le_cert_name Имя сертификата для Keycloak в Yandex Certificate Manager string"kc"test_user Тестовый пользователь для проверки SSO в Keycloak и подключения к VPN name Имя тестового пользователя (логин) для проверки SSO в Keycloak string"user"email Email тестового пользователя, который будет добавлен в Firezone после успешной аутентификации в Keycloak string"user@example.com"да -
Перейдите в папку
maincd main -
Выполните инициализацию Terraform:
terraform init
-
Проверьте список создаваемых облачных ресурсов:
terraform plan
-
Создайте ресурсы:
terraform apply
Ожидайте окончание создания ресурсов. Обработка запроса на выдачу сертификата в сервисе Let's Encrypt может выполняться до 30 минут.
-
После завершения процесса terraform apply в командной строке будут выведены URL-адреса для подключения к веб-интерфейсам Firezone и Keycloak, а также учетные записи администраторов Firezone и Keycloak. В дальнейшем эту информацию можно будет посмотреть с помощью команды
terraform output.Посмотреть информацию о развернутых ресурсах
Название Описание Пример значения firezone_admin_credentialsУчетная запись администратора Firezone "admin_email" = "admin@example.com""admin_password" = "EP!f#YAfdaxd"firezone_urlURL для веб-интерфейса Firezone "https://vpn.example.com"keycloak_admin_credentialsУчетная запись администратора Keycloak "admin_username" = "admin""admin_password" = "Ns?3lvB*HvHD"keycloak_urlURL для веб-интерфейса Keycloak "https://kc.example.com:8443/admin"Для вывода
sensitiveзначения указывайте его в командеterraform output, например:terraform output firezone_admin_credentials. -
После завершения развертывания 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.Посмотреть информацию о развернутых ресурсах
Название Описание Пример значения keycloak_config_for_firezoneПараметры для настройки интеграции Firezone и Keycloak "client_id" = "firezone""client_secret" = "Wxy2nthDXiMD42xmcD2mLgGxtjWbSDDc""discovery_document_uri" = "https://kc.example.com:8443/realms/firezone/.well-known/openid-configuration"test_user_credentialsУчетная запись тестового пользователя для проверки SSO в Keycloak и подключения к VPN "test_user_name" = "user""test_user_password" = "IfV6OvIKqzzn"Для вывода
sensitiveзначения указывайте его в командеterraform output, например:terraform output test_user_credentials. -
После настройки Keycloak с помощью Terraform продолжите настройку Firezone.
- Перейдите в браузере по адресу
https://firezone_url, гдеfirezone_url- вывод командыterraform output firezone_urlв папкеmain. - Войдите в интерфейс администратора 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 клиентами. Если не планируется переназначения у клиента этих DNS адресов, то удалите информацию в этом поле. Пример:192.168.1.2, 192.168.2.2. - Также можно изменить параметры по умолчанию для интервала 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: keycloakLabel: KeycloakOIDC scopes: openid email profile offline_accessClient ID: firezoneClient 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
- Нажать
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 туннеля к облачной инфраструктуре.
- Обязательно смените пароли администратора Firezone и Keycloak
- После проверки работоспособности удалите тестового пользователя в Keycloak и Firezone
- Сохраните private SSH ключ pt_key.pem в надежное место либо пересоздайте его отдельно от Terraform
Чтобы удалить ресурсы, созданные с помощью Terraform:
- Перейдите на вашей рабочей станции в папку
keycloak-configи выполните командуterraform destroy. - После этого перейдите в папку
mainи выполните командуterraform destroy.
Внимание
Terraform удалит все ресурсы, созданные в этом сценарии, без возможности восстановления.
