- Описание решения
- Подготовка к развертыванию
- Развертывание 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"
да -
Перейдите в папку
main
cd 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_url
URL для веб-интерфейса Firezone "https://vpn.example.com"
keycloak_admin_credentials
Учетная запись администратора Keycloak "admin_username" = "admin"
"admin_password" = "Ns?3lvB*HvHD"
keycloak_url
URL для веб-интерфейса 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 удалит все ресурсы, созданные в этом сценарии, без возможности восстановления.