Аутентификация по SSL-сертификату

При подключении к ADQM по протоколу SSL выполняется обязательная проверка SSL-сертификатов входящих соединений — установлены могут быть только соединения, предоставившие действительный сертификат. Таким образом ADQM однозначно аутентифицирует входящее соединение и может идентифицировать пользователя по соответствующему пользовательскому SSL-сертификату. Для одного пользователя можно задать несколько сертификатов.

Ниже описывается последовательность действий, необходимых для включения аутентификации пользователей по SSL-сертификату. Для выполнения приведенных команд нужно установить openssl — инструмент командной строки для использования функций криптографической библиотеки OpenSSL.

ПРИМЕЧАНИЕ
  • Возможность аутентифицировать пользователя по SSL-сертификату доступна только при подключении к ADQM через клиента, который поддерживает интерфейс HTTPS.

  • Для демонстрационных целей в этой статье пользовательский SSL-сертификат подписывается самоподписанным (self-signed) корневым сертификатом центра сертификации (Certification Authority, CA). В реальных системах используйте доверенный центр сертификации для подписи сертификатов.

Создание SSL-сертификата пользователя

  1. Сгенерируйте ключ и создайте файл с запросом на подпись сертификата (Certificate Signing Request, CSR):

    $ openssl req \
      -newkey rsa:2048 \
      -nodes \
      -subj "/CN=<user_cert_identifier>" \
      -keyout <user_cert_name>.key \
      -out <user_cert_name>.csr

    Идентификатором сертификата CN (Common Name) может быть любое уникальное значение. Это значение будет использоваться при создании пользователя ADQM.

  2. Создайте и подпишите сертификат пользователя, который будет использоваться для аутентификации:

    $ openssl x509 \
      -req \
      -in <user_cert_name>.csr \
      -out <user_cert_name>.crt \
      -CAcreateserial \
      -CA <ca>.crt \
      -CAkey <ca>.key \
      -days 365

    где <ca>.crt и <ca>.key — файлы, используемые при конфигурировании ADQM для защищенных соединений по протоколу SSL (см. Шифрование SSL):

    • <ca>.crt — публичный корневой сертификат центра сертификации. Должен быть установлен на каждом сервере кластера ADQM и указан в настройках конфигурации сервиса ADQMDB (в интерфейсе ADCM: ADQM cluster → Services → ADQMDB → Primary configuration → SSL Configuration → Certificate authority file).

    • <ca>.key — закрытый ключ центра сертификации. Должен храниться в секрете.

Настройка ADQM для аутентификации по SSL-сертификату

В интерфейсе ADCM перейдите к окну конфигурирования сервиса ADQMDB и в секции SSL Configuration с помощью опции Client certificate verification mode установите режим проверки пользовательских SSL-сертификатов (relaxed, strict или once). Нажмите Save и выполните Reconfig and restart для сервиса ADQMDB, чтобы сохранить и применить изменение значения параметра.

Включение проверки пользовательских SSL-сертификатов
Включение проверки пользовательских SSL-сертификатов

Создание пользователя

Чтобы создать пользователя ADQM, который будет аутентифицироваться по сертификату SSL, в запросе CREATE USER используйте выражение IDENTIFIED WITH ssl_certificate и укажите идентификатор сертификата (CN):

CREATE USER <user_name> IDENTIFIED WITH ssl_certificate CN '<user_cert_identifier>';

Если вы задаете пользователя через конфигурационный файл users.xml, в секции certificates для пользователя укажите элемент common_name с идентификатором пользовательского сертификата (в списке сертификатов может быть более одного элемента):

<users>
    <user_name>
        <certificates>
            <common_name>user_cert_identifier</common_name>
            <!-- More names -->
        </certificates>
        <!-- Other settings -->
    </user_name>
</users>

Пример

В этом примере показано, как создать и использовать SSL-сертификат для аутентификации пользователя при подключении к кластеру ADQM, для которого настроено шифрование соединений по протоколу SSL согласно инструкции в статье Шифрование SSL.

  1. Сгенерируйте ключ и создайте файл с запросом на подпись сертификата:

    $ openssl req \
      -newkey rsa:2048 \
      -nodes -subj "/CN=arenadata:john" \
      -keyout arenadata_john.key \
      -out arenadata_john.csr
  2. Создайте и подпишите пользовательский сертификат для аутентификации:

    $ openssl x509 \
      -req \
      -in arenadata_john.csr \
      -out arenadata_john.crt \
      -CAcreateserial \
      -CA arenadata_ca.crt \
      -CAkey arenadata_ca.key \
      -days 365

    В этом запросе arenadata_ca.crt — корневой сертификат центра сертификации, arenadata_ca.key — закрытый ключ центра сертификации.

  3. В настройках сервиса ADQMDB через параметр Client certificate verification mode включите режим проверки пользовательских сертификатов.

  4. Создайте пользователя (например, на хосте adqm-host-1.arenadata.local), которого ADQM будет аутентифицировать по созданному сертификату:

    CREATE USER john IDENTIFIED WITH ssl_certificate CN 'arenadata:john';
  5. Назначьте пользователю привилегии (например, привилегии на чтение всех таблиц):

    GRANT SELECT ON *.* TO john WITH GRANT OPTION;
  6. Проверьте подключение к ADQM по HTTPS от имени этого пользователя. Например, можно выполнить следующий запрос из директории, где хранятся сертификаты:

    $ echo 'SHOW TABLES' | \
      curl 'https://adqm-host-1.arenadata.local:8443' \
      --cert ./arenadata_john.crt \
      --key arenadata_john.key \
      --cacert arenadata_ca.crt \
      -H "X-ClickHouse-SSL-Certificate-Auth: on" \
      -H "X-ClickHouse-User: john" \
      --data-binary @-

    Если аутентификация прошла успешно, в результате выполнения запроса вернется список таблиц базы данных.

Нашли ошибку? Выделите текст и нажмите Ctrl+Enter чтобы сообщить о ней