Аутентификация и авторизация узлов баз данных
Аутентификация узлов в кластере YDB обеспечивает проверку подлинности узлов баз данных при выполнении служебных вызовов к другим узлам по протоколу gRPC. Авторизация узлов обеспечивает проверку и предоставление необходимых полномочий при обработке служебных вызовов, включая операции регистрации запускаемых узлов в кластере и доступа к динамической конфигурации. Использование аутентификации и авторизации узлов рекомендовано для всех кластеров YDB, поскольку позволяет избежать ситуаций несанкционированного доступа к данным через включение в кластер контролируемых злоумышленниками узлов.
Аутентификация и авторизация узлов баз данных осуществляется в следующем порядке:
- Запускаемый узел базы данных открывает gRPC-подключение к одному из узлов хранения кластера, указанных в опции командной строки
--node-broker
. При подключении используется протокол TLS, и в настройках подключения в качестве клиентского сертификата используется сертификат запускаемого узла. - Узел хранения и узел базы данных осуществляют взаимные проверки подлинности с использованием протокола TLS: производится проверка цепочки доверия сертификата и проверка соответствия имени хоста значению поля "Subject Name" сертификата.
- Узел хранения проверяет заполнение поля "Subject" сертификата на соответствие требованиям, устанавливаемым настройками в статической конфигурации.
- При успешном прохождении перечисленных выше проверок подключение со стороны узла базы данных считается аутентифицированным, и ему присваивается идентификатор субъекта доступа - SID, определяемый настройками.
- Узел базы данных использует установленное gRPC-подключение для регистрации в составе кластера с использованием соответствующего служебного вызова. При регистрации узел базы данных передает свой сетевой адрес, предназначенный для взаимодействия с другими узлами кластера.
- Узел хранения проверяет наличие SID, присвоенного gRPC-подключению, в списке допустимых. При успешном прохождении этой проверки узел хранения регистрирует узел базы данных в кластере, сопоставляя полученный сетевой адрес с идентификатором узла.
- Узел базы данных входит в кластер, подключаясь через свой сетевой адрес и указывая идентификатор узла, полученный при регистрации. Попытки входа в кластер узлов с неизвестными сетевыми адресами или идентификаторами блокируются другими узлами.
Далее описаны настройки, необходимые для включения функции аутентификации и авторизации узлов.
Пререквизиты для настройки
-
В развернутом кластере YDB должно быть настроено шифрование трафика gRPC с использованием протокола TLS.
-
При подготовке сертификатов узлов для кластера, в котором планируется использовать функции аутентификации и авторизации узлов, необходимо обеспечить единые правила заполнения поля "Subject" сертификатов, позволяющие идентифицировать сертификаты, выпущенные для узлов кластера. Более подробная информация приведена в документации по настройке правил проверки сертификатов.
Примечание
Предлагаемый пример скрипта для генерации самоподписанных сертификатов узлов YDB заполняет поле "Subject" значением
O=YDB
для всех сертификатов узлов. Приведённые далее примеры настроек подготовлены для сертификатов с именно таким заполнением поля "Subject". -
В параметры командной строки для запуска узлов баз данных необходимо добавить опции, задающие пути к файлам сертификатов доверенных центров сертификации, сертификата узла и ключа узла. Список дополнительных опций приведён в таблице ниже.
Опция командной строки Описание --grpc-ca
Путь к файлу сертификатов доверенных центров сертификации ca.crt
.--grpc-cert
Путь к файлу сертификата узла node.crt
.--grpc-key
Путь к файлу секретного ключа узла node.key
.Пример команды для запуска узла базы данных с опциями, указывающими пути к ключам и сертификатам TLS для протокола gRPC:
/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"]
При необходимости добавьте другие проверки сертификатов в соответствии с документацией.
В случае успешной проверки сертификата и соответствия компонентов поля "Subject" сертификата требованиям, установленным в блоке
subject_terms
, подключению будут присвоены субъекты доступа, перечисленные в параметреmember_groups
. Чтобы отделить такие субъекты доступа от других групп и учётных записей, к их наименованию добавляется суффикс@cert
. -
В блок настроек аутентификации кластера
security_config
добавьте элементregister_dynamic_node_allowed_sids
, указав список субъектов доступа, которым разрешена регистрация узлов баз данных. По техническим причинам в этом списке также должен присутствовать субъект доступаroot@builtin
. Пример:domains_config: ... security_config: enforce_user_token_requirement: true ... register_dynamic_node_allowed_sids: - "root@builtin" # требуется по техническим причинам - "registerNode@cert"
Более подробная информация по настройке параметров аутентификации кластера приведена в соответствующем разделе документации.
-
Обновите файлы статической конфигурации на всех узлах кластера вручную либо с помощью плейбука Ansible.
-
Выполните поэтапный перезапуск узлов хранения кластера с помощью ydbops либо с использованием плейбука Ansible.
-
Выполните поэтапный перезапуск узлов баз данных кластера с помощью ydbops либо с использованием плейбука Ansible.