Настройка Федерации
Общая информация
На схеме ниже представлено федеративное взаимодействие пользователей из разных тенантов Федерации:
Федерация — протокол взаимодействия тенантов. Является транспортом по доставке данных между тенантами. Отвечает за проверку:
- Соответствия требованиям доверия (Трастов).
- Прав пользователей на внешнюю коммуникацию.
- Готовность сервисов к взаимодействию.
- Обеспечивает надежность и безопасность передачи данных.
Тенант — независимые части организации: отдельные инсталляции, набор доменов или пользователей. Могут находиться в одной или разных инсталляциях. Пользователи не могут взаимодействовать и коммуницировать до формирования траста между тенантами.
Инсталляция — независимые развернутые стенды разных организаций. Могут включать в себя несколько тенантов.
Траст — доверительное отношение между двумя и более тенантами. Могут быть сформированы:
- Между тенантами в разных инсталляциях On-premises.
- Между тенантами внутри одной инсталляции.
- Тенант из On-premises инсталляции с тенантом в SaaS-версии продукта.
Особенности работы Федерации:
-
Звонки между федерациями могут быть только гостевые.
-
Общение между двумя инсталляциями осуществляется по протоколу gRPC + TLS. Эндпоинт для взаимодействия в общем виде выглядит так:
Схема взаимодействия между инсталляциями A и B по протоколу mTLS:
Предварительные условия
-
Для настройки Федерации вам понадобится доступ к серверу Мессенджер и ВКС и доступ к Панели администратора VK WorkSpace по адресу https://biz.<ваш домен>.
-
Для корректной работы сервиса Федерация добавьте на серверы каждой инсталляции дополнительные вычислительные ресурсы:
- 10% от имеющихся мощностей vCPU.
- 1 ГБ SSD.
- 2 ГБ RAM на каждую тысячу федеративных пользователей. Ожидаемый прирост RAM — около 1 ГБ в год в зависимости от количества сообщений Федерации.
-
Проверьте, что у всех инсталляций Федерации есть доступ друг к другу. Например, проверьте, что запрос из Инсталляции А доходит до Инсталляции В:
Если доступов нет, администраторам инсталляций необходимо запросить друг у друга адреса Federation Proxy и разрешить обращаться только по адресам
federation.<домен инсталляции>:443. -
Для включения mTLS на каждой инсталляции необходимо сформировать следующий набор артефактов:
- публичный сертификат СА — cacert.pem
- публичный сертификат сервера — server.cert.pem
- приватный (секретный) ключ сервера — server.key.pem
- публичный сертификат клиента — client.cert.pem
- приватный (секретный) ключ клиента — client.key.pem
Как создать сертификаты — см. в разделе ниже.
Для осуществления взаимодействия Инсталляция A должна передать публичный сертификат клиента и приватный ключ клиента Инсталляции B и наоборот.
Итого на Инсталляции A должен быть набор следующих файлов:
- публичный сертификат СА — server.cacert.pem
- публичный сертификат сервера — server.cert.pem
- приватный (секретный) ключ сервера — server.key.pem
- публичный сертификат клиента — client.cert.pem
- приватный(секретный) ключ клиента — client.key.pem
- публичный сертификат CA удаленной инсталляции, которым подписан клиент — client_B.cacert.pem
- публичный сертификат клиента от удаленной инсталляции — client_B.cert.pem
- приватный(секретный) ключ клиента от удаленной инсталляции — client_B.key.pem
Все сертификаты рекомендуется разместить в директории /opt/certs.
Шаг 1. Получите tenantID
Перейдите на машину, где развернута Панель администратора VK WorkSpace и проверьте, есть ли в системе tenantID:
Если tenantID есть, в выводе команды будет:
Если ответ пустой, сгенерируйте новый tenantID, последовательно выполнив команды:
sudo docker exec -it bizf1 bash
. env/bin/activate
./manage.py shell
from pdd.common.models import Tenant
t = Tenant(name='test') # в параметре name укажите название вашей инсталляции на ланитинце (на свое усмотрение)
t.save()
print(t.tid)
После команды print(t.tid) будет вывод tenantID. Сохраните это значение, оно понадобится вам ниже.
Получите у администратора удаленной инсталляции его tenantID. Он понадобится вам ниже.
Важно
Укажите в параметре name то же имя инсталляции, что и при создании сертификатов
Шаг 2. Включите Федерацию
Перед включением убедитесь, что у вас есть доступ до удаленной инсталляции (см. предусловия).
Чтобы включить Федерацию:
-
Подключитесь к серверу Мессенджер и ВКС.
-
Включите новый метод для отправки сообщений — в конфигурационном файле /usr/local/nginx-im/html/myteam/myteam-config.json в поле message-send-api-enabled укажите значение true:
-
Для инсталляции на одну виртуальную машину выполните команду:
Для кластерной инсталляции:
-
Перезапустите под в технологическое окно (может приводить к сбою в новых подключениях):
-
Включите сервисы для работы федерации — в файле /usr/local/etc/k8s/helmwave/projects.yml удалите или закомментируйте строчки:
-
event-manager
-
federation
-
strimzi-kafka-operator
-
-
Внесите изменения в файл /usr/local/etc/k8s/helmwave/store/federation.yml:
-
В поле enabled установите значение true.
-
В поле mtlsEnabled установите значение true.
-
В поле localTenant укажите tenantID вашей инсталляции из шага 1:
-
Установите связь с удаленной инсталляцией:
- address: 'federation.<домен удаленной инсталляции>:443' name: <имя удаленной инсталляции на латинице> cert_cn: <имя удаленной инсталляции на латинице> ssl_cert: "/opt/certs/client.cert.pem" # публичный сертификат клиента от удаленной инсталляции ssl_key: "/opt/certs/client.key.pem" # приватный (секретный) ключ клиента от удаленной инсталляции cacert: "/opt/certs/client.cacert.pem" # публичный сертификат CA удаленной инсталляции, которым подписан клиент tenants: - '<tenantID удаленной инсталляции>' # получите у администратора удаленной инсталляции
Пример файла federation.yml
enabled: true mtlsEnabled: true localTenant: 7BJqEXMGyEL instances: - address: federation.domain.ru:443 name: remote installation_В cert_cn: remote installati_В ssl_cert: "/opt/certs/client_B.cert.pem" ssl_key: "/opt/certs/client_B.key.pem" cacert: "/opt/certs/client_B.cacert.pem" tenants: - HWqHczeM2P -
-
В конфигурационном файле /usr/local/etc/k8s/helmwave/projects/federation/values/fedproxy.yml пропишите локальный серверный сертификат:
-
Включите event-manager — в конфигурационном файле /usr/local/etc/k8s/helmwave/store/event_manager.yml укажите:
-
Примените изменения, последовательно выполнив команды:
-
Примените изменения для сервиса Boss:
-
Перезапустите поды сервиса Boss:
-
Проверьте, что переменная UC_ALLOW_FAKE_AIMSID имеет значение «1»:
-
В конфигурационном файле сервиса Nomail /usr/local/etc/nomail-1.conf укажите для параметра federation.enabled значение true:
-
Перезапустите сервис Nomail:
Шаг 3. Добавьте пользователей в Федерацию
Чтобы пользователи из разных инсталляций могли общаться друг с другом, нужно добавить пользователей в белый список.
На обеих инсталляциях нужно:
- Составить список пользователей, которым разрешено федеративное общение, и запустить команду, которая сформирует файл с белым списком.
- Передать файл с белым списком в удаленную инсталляцию и получить такой же файл от удаленной инсталляции.
- Загрузить файлы с белыми списками на каждой инсталляции.
Внимание
Эта процедура должна быть выполнена в обеих инсталляциях, входящих в Федерацию. Без наличия белого списка с обеих сторон и их загрузки в удалённой инсталляции — федеративная коммуникация будет невозможна.
1. Создайте файл с белым списком пользователей
-
Создайте файл whitelist.yaml и наполните его списком пользователей, которым разрешено федеративное взаимодействие с удаленной инсталляцией. Файл выглядит так:
remoteTenant: HWqHczeM2P # tenantID удаленной инсталляции users: "i.ivanov@company_domain": "n.belov@company_domain": "a.petrov@company_domain":- remoteTenant — tenantID удаленной инсталляции, для которой выбранным пользователям разрешается общение.
- users — список пользователей. В конце email обязательно ставьте двоеточие. Email в этом случае — это ключ объекта, в котором потом могут быть дополнительные значения.
-
Создайте файл с белым списком — на сервере Мессенджер и ВКС выполните команду:
Команда создает для каждого пользователя федеративный идентификатор (fid). Сгенерированный файл remote_whitelist.yaml имеет следующую структуру:
-
Передайте файл с белым списком в удаленную инсталляцию.
Передача файла в удаленную инсталляцию должна производиться безопасным способом
Возможные варианты передачи списков email для заведения белого списка:
- Файлы защищены паролем в письме или на физических носителях.
- Сжатые зашифрованные письма.
- Предоставление своего SFTP/FTPS.
- По ссылке с вводом логина и пароля.
2. Загрузите список пользователей от удаленной инсталляции
- Получите файл remote_whitelist.yaml от удаленной инсталляции.
-
На сервере Мессенджер и ВКС добавьте полученный файл в любую директорию и выполните команду:
Как создать сертификаты
На рисунке ниже представлена схема взаимодействия между инсталляциями А и В по протоколу mTLS:
Сгенерированные сертификаты и ключи должны быть доступны на чтение/запись только для root-пользователя/сервисов Мессенджер и ВКС в рамках прав доступа файловой системы.
-
Выпустите CA сертификат и ключ, последовательно выполнив команды:
# mkdir /root/mtls # mkdir /root/mtls/private # mkdir /opt/certs # openssl genrsa -out /root/mtls/private/cakey.pem 4096 # openssl req -new -x509 -days 3650 -key /root/mtls/private/cakey.pem -out /opt/certs/server.cacert.pemКаждая инсталляция Федерации выпускает свой публичный сертификат CA.
-
Выпустите серверный сертификат и ключ:
-
Перейдите в директорию с сертификатами /opt/certs и создайте приватный ключ:
-
Переподпишите с SNA:
-
Выпустите сертификат (подпишите у CA):
-
Проверьте SAN в сертификате:
-
Под каждую инсталляцию, с которой устанавливается соединение, выпустите клиентские ключ и сертификат. В CN и SAN добавьте информацию удаленной инсталляции (в которую будете передавать эти сертификаты). В конфигурации сервиса Fedproxy полю cert_cn для каждой инсталляции задайте значение соответственно CN клиентских сертификатов:
# openssl genrsa -out client.key.pem 4096 # openssl req -new -key client.key.pem -out client.csr.pem -subj "/CN=<имя удаленной инсталляции>" # openssl x509 -req -in client.csr.pem -CA server.cacert.pem -CAkey /root/mtls/private/cakey.pem -CAcreateserial -out client.cert.pem -days 365 -extfile <(echo "subjectAltName=DNS:<хост удаленной инсталляции>")где <имя удаленной инсталляции> — значение параметра cert_cn конфигурационного файла federation.yml.
Пример команды:
# openssl genrsa -out client.key.pem 4096 # openssl req -new -key client.key.pem -out client.csr.pem -subj "/CN=installation_В" # openssl x509 -req -in client.csr.pem -CA server.cacert.pem -CAkey /root/mtls/private/cakey.pem -CAcreateserial -out client.cert.pem -days 365 -extfile <(echo "subjectAltName=DNS:federation.domain.ru")Полученные сертификаты client.cert.pem, client.key.pem и server.cacert.pem (переименовав в client.cacert.pem) передайте в инсталляцию B.

