Настройка аутентификации и авторизации узлов баз данных
Аутентификация узлов в кластере YDB обеспечивает проверку подлинности узлов баз данных при выполнении служебных вызовов к другим узлам по протоколу gRPC. Авторизация узлов обеспечивает проверку и предоставление необходимых полномочий при обработке служебных вызовов, включая операции регистрации запускаемых узлов в кластере и доступа к управлению конфигурацией. Использование аутентификации и авторизации узлов рекомендовано для всех кластеров YDB, поскольку позволяет избежать ситуаций несанкционированного доступа к данным через включение в кластер контролируемых злоумышленниками узлов.
Прежде чем динамический узел базы данных войдёт в состав кластера и начнёт обмен с другими узлами по внутреннему протоколу Interconnect, он должен зарегистрироваться у уже работающих узлов хранения. Для этого запускаемый узел устанавливает gRPC-соединение с одним из узлов хранения, указанных в опции --node-broker, и по этому соединению выполняет служебные вызовы — в том числе запрос на регистрацию. Именно такие gRPC-вызовы и защищаются аутентификацией и авторизацией узлов: без успешной проверки узел не получает право зарегистрироваться и не может войти в кластер.
Что нужно знать перед тем как начать
Идентификаторы узлов:
- NodeId — уникальный числовой идентификатор узла в кластере (от 1 до 1048575).
- SID (Subject IDentifier) — уникальный идентификатор субъекта доступа, определяющий, какие операции может выполнять узел (например,
registerNode@certозначает «узел с правом регистрации»).
Цель аутентификации. Убедиться, что новый узел БД - это авторизованный узел. Для этого используются сертификаты.
Как проходит проверка узла
-
Запускаемый узел базы данных открывает gRPC-подключение к одному из узлов хранения, указанных в опции
--node-broker. Подключение выполняется по TLS, а в качестве клиентского сертификата используется сертификат запускаемого узла, заданный в опции--grpc-cert. -
Узел хранения и узел базы данных выполняют mTLS : каждый узел проверяет сертификат другого. Проверяется цепочка доверия (сертификат подписан известным центром сертификации) и соответствие имени хоста значению поля "Subject Name" сертификата.
-
Узел хранения проверяет поле "Subject" сертификата на соответствие требованиям, заданным в статической конфигурации в секции client_certificate_authorization. Таким образом узел хранения убеждается, что сертификат издан именно для узлов вашего кластера. Например, вы можете требовать, чтобы все сертификаты узлов имели организацию (O) = "MyCompany", что затруднит подделку сертификата злоумышленникам.
-
Если все проверки успешны (сертификат подлинный, цепочка доверия в порядке, поле Subject соответствует требованиям), узел хранения доверяет подключению и присваивает ему идентификатор субъекта доступа (SID) — строку типа registerNode@cert, указанную в конфигурации в параметре member_groups. SID определяет, какие операции может выполнять узел (в данном случае — регистрироваться в кластере).
-
Узел базы данных использует доверенное gRPC-подключение, чтобы «представиться» узлу хранения. Узел БД посылает служебный запрос, в котором передаёт IP-адрес и порт, по которому будут принимать соединения от других узлов кластера. Узел хранения запоминает полученную информацию — это и называется регистрацией в кластере.
-
Узел хранения проверяет: имеет ли SID, присвоенный подключению на этапе mTLS, право на регистрацию узлов. Для этого узел хранения смотрит на параметр конфигурации
register_dynamic_node_allowed_sids— это список SID, которым разрешена регистрация новых узлов БД в кластере. Если SID узла (например,registerNode@cert) содержится в этом списке — регистрация разрешена. Если нет — узел отвергается как неавторизованный.После успешной проверки узел хранения выполняет три действия:
- Присваивает узлу БД уникальный числовой идентификатор — NodeId (например, NodeId=50001).
- Записывает соответствие: NodeId=50001 → IP-адрес 192.168.1.100:19002 в служебный реестр узлов кластера.
- Этот реестр используется другими узлами кластера для маршрутизации (куда направить запрос узлу с NodeId=50001).
-
Теперь узел БД готов к полноценной работе в кластере. Узел БД подключается к другим узлам в кластере через служебный протокол Interconnect и передаёт свой назначенный NodeId (например, 50001) и свой сетевой адрес (host:port). Другие узлы кластера используют эту информацию для маршрутизации запросов. Если какой-то узел попытается подключиться с неизвестным NodeId или IP-адресом (которого нет в реестре), другие узлы его отвергают.
Режим аутентификации узлов при регистрации задаётся параметром node_registration_token в секции auth_config. По умолчанию аутентификация выключена. Такой режим допустим только в полностью изолированных тестовых окружениях.
Настройка аутентификации и авторизации узлов баз данных
Чтобы включить аутентификацию и авторизацию узлов, перед изменением конфигурации кластера необходимо подготовить инфраструктуру сертификатов и настроить запуск узлов с использованием TLS-сертификатов.
-
Убедитесь, что в развернутом кластере YDB настроено шифрование gRPC-трафика с использованием TLS.
-
При выпуске сертификатов для узлов задайте единые правила заполнения поля "Subject", чтобы можно было отличать сертификаты узлов кластера. Подробности — в документации по правилам проверки сертификатов.
Примечание
Пример скрипта генерации самоподписанных сертификатов для узлов YDB заполняет поле "Subject" значением
O=YDBдля всех узлов. Примеры в этой статье рассчитаны именно на такой вариант заполнения поля "Subject". -
В параметры командной строки для запуска узлов баз данных добавьте опции с путями к сертификатам и ключу:
Опция командной строки Описание --grpc-caПуть к файлу сертификатов доверенных центров сертификации ca.crt.--grpc-certПуть к файлу сертификата узла node.crt.--grpc-keyПуть к файлу секретного ключа узла node.key.Пример запуска узла базы данных:
/opt/ydb/bin/ydbd server --yaml-config /opt/ydb/cfg/config.yaml --tenant /Root/testdb \ --grpcs-port 2136 --grpc-ca /opt/ydb/certs/ca.crt \ --grpc-cert /opt/ydb/certs/node.crt --grpc-key /opt/ydb/certs/node.key \ --ic-port 19002 --ca /opt/ydb/certs/ca.crt \ --mon-port 8766 --mon-cert /opt/ydb/certs/web.pem \ --node-broker grpcs://<ydb1>:2135 \ --node-broker grpcs://<ydb2>:2135 \ --node-broker grpcs://<ydb3>:2135
Включение режима аутентификации и авторизации узлов
Чтобы включить обязательную авторизацию узлов баз данных, обновите статическую конфигурацию кластера:
-
На корневом уровне добавьте блок
client_certificate_authorizationс требованиями к полю "Subject" сертификатов подключаемых узлов.client_certificate_authorization: request_client_certificate: true client_certificate_definitions: - member_groups: ["registerNode@cert"] subject_terms: - short_name: "O" values: ["YDB"]При необходимости добавьте дополнительные проверки сертификатов согласно документации по
client_certificate_authorization.В случае успешной проверки сертификата и соответствия компонентов его поля "Subject" требованиям, заданным в
subject_terms, подключению будут присвоены субъекты доступа (SID), перечисленные вmember_groups. Чтобы отделять такие субъекты от других групп и учётных записей, необходимо их именовать с добавлением суффикса@cert. -
В блоке
security_configдобавьте параметрregister_dynamic_node_allowed_sidsсо списком SID, которым разрешена регистрация узлов баз данных. Пример:domains_config: ... security_config: enforce_user_token_requirement: true ... register_dynamic_node_allowed_sids: - "root@builtin" - "registerNode@cert"Включение
root@builtinв этот список обязательно по техническим причинам: некоторые внутренние процессы кластера используют его независимо от режима аутентификации узлов.Подробности о параметрах аутентификации кластера см. в документации по
security_config. -
В блоке
auth_configприсвойте параметруnode_registration_tokenпустую строку:auth_config: ... node_registration_token: ""Подробности о параметре
node_registration_tokenсм. в документации поauth_config. -
Обновите статическую конфигурацию на всех узлах кластера вручную или через плейбук Ansible.
-
Выполните поэтапный перезапуск узлов хранения с помощью ydbops или через плейбук Ansible.
-
Выполните поэтапный перезапуск узлов баз данных кластера с помощью ydbops или плейбука Ansible.