Аутентификация и авторизация узлов баз данных

Аутентификация узлов в кластере YDB обеспечивает проверку подлинности узлов баз данных при выполнении служебных вызовов к другим узлам по протоколу gRPC. Авторизация узлов обеспечивает проверку и предоставление необходимых полномочий при обработке служебных вызовов, включая операции регистрации запускаемых узлов в кластере и доступа к динамической конфигурации. Использование аутентификации и авторизации узлов рекомендовано для всех кластеров YDB, поскольку позволяет избежать ситуаций несанкционированного доступа к данным через включение в кластер контролируемых злоумышленниками узлов.

Аутентификация и авторизация узлов баз данных осуществляется в следующем порядке:

  1. Запускаемый узел базы данных открывает gRPC-подключение к одному из узлов хранения кластера, указанных в опции командной строки --node-broker. При подключении используется протокол TLS, и в настройках подключения в качестве клиентского сертификата используется сертификат запускаемого узла.
  2. Узел хранения и узел базы данных осуществляют взаимные проверки подлинности с использованием протокола TLS: производится проверка цепочки доверия сертификата и проверка соответствия имени хоста значению поля "Subject Name" сертификата.
  3. Узел хранения проверяет заполнение поля "Subject" сертификата на соответствие требованиям, устанавливаемым настройками в статической конфигурации.
  4. При успешном прохождении перечисленных выше проверок подключение со стороны узла базы данных считается аутентифицированным, и ему присваивается идентификатор субъекта доступа - SID, определяемый настройками.
  5. Узел базы данных использует установленное gRPC-подключение для регистрации в составе кластера с использованием соответствующего служебного вызова. При регистрации узел базы данных передает свой сетевой адрес, предназначенный для взаимодействия с другими узлами кластера.
  6. Узел хранения проверяет наличие SID, присвоенного gRPC-подключению, в списке допустимых. При успешном прохождении этой проверки узел хранения регистрирует узел базы данных в кластере, сопоставляя полученный сетевой адрес с идентификатором узла.
  7. Узел базы данных входит в кластер, подключаясь через свой сетевой адрес и указывая идентификатор узла, полученный при регистрации. Попытки входа в кластер узлов с неизвестными сетевыми адресами или идентификаторами блокируются другими узлами.

Далее описаны настройки, необходимые для включения функции аутентификации и авторизации узлов.

Пререквизиты для настройки

  1. В развернутом кластере YDB должно быть настроено шифрование трафика gRPC с использованием протокола TLS.

  2. При подготовке сертификатов узлов для кластера, в котором планируется использовать функции аутентификации и авторизации узлов, необходимо обеспечить единые правила заполнения поля "Subject" сертификатов, позволяющие идентифицировать сертификаты, выпущенные для узлов кластера. Более подробная информация приведена в документации по настройке правил проверки сертификатов.

    Примечание

    Предлагаемый пример скрипта для генерации самоподписанных сертификатов узлов YDB заполняет поле "Subject" значением O=YDB для всех сертификатов узлов. Приведённые далее примеры настроек подготовлены для сертификатов с именно таким заполнением поля "Subject".

  3. В параметры командной строки для запуска узлов баз данных необходимо добавить опции, задающие пути к файлам сертификатов доверенных центров сертификации, сертификата узла и ключа узла. Список дополнительных опций приведён в таблице ниже.

    Опция командной строки Описание
    --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
    

Включение режима аутентификации и авторизации узлов

Для включения обязательной авторизации узлов баз данных в файл статической конфигурации кластера необходимо добавить следующие блоки настроек:

  1. На корневом уровне конфигурации добавьте блок 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.

  2. В блок настроек аутентификации кластера 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"
    

    Более подробная информация по настройке параметров аутентификации кластера приведена в соответствующем разделе документации.

  3. Обновите файлы статической конфигурации на всех узлах кластера вручную либо с помощью плейбука Ansible.

  4. Выполните поэтапный перезапуск узлов хранения кластера с помощью ydbops либо с использованием плейбука Ansible.

  5. Выполните поэтапный перезапуск узлов баз данных кластера с помощью ydbops либо с использованием плейбука Ansible.