Кодеки шифрования

ADQM поддерживает возможность шифрования конфиденциальных данных (паролей, которые хранятся в конфигурационных файлах ClickHouse) и данных столбцов таблиц на диске с помощью алгоритма AES-128 или AES-256 в режиме GCM-SIV.

Настройка ключей шифрования

Параметры алгоритмов шифрования AES-128 и AES-256 настраиваются на странице конфигурации сервиса ADQMDB в секции Encryption, которая становится видимой при включенной опции Show advanced.

Настройка алгоритмов шифрования
Настройка алгоритмов шифрования

В параметрах этой секции для нужного алгоритма шифрования укажите ключ и nonce или откуда их загрузить (рекомендуется хранить ключи шифрования в переменных окружения или узлах ZooKeeper, не в конфигурационных файлах). Описание параметров приведено в соответствующем разделе статьи Конфигурационные параметры.

AES-128
  • Загрузка ключей из переменных окружения:

    1. В параметрах aes_128_key_env и aes_128_nonce_env укажите переменные окружения, которые содержат ключ и nonce для алгоритма шифрования соответственно.

    2. Для параметра aes_128_source установите значение from_env.

  • Загрузка ключей из узлов ZooKeeper:

    • В параметрах aes_128_key_zk_path и aes_128_nonce_zk_path укажите узлы ZooKeeper, которые содержат ключ и nonce для алгоритма шифрования соответственно.

    • Для параметра aes_128_source установите значение from_zk.

  • Хранение ключей в конфигурационном файле (не рекомендуется):

    • В параметрах AES-128 GCM-SIV key и AES-128 GCM-SIV nonce укажите ключ и nonce для алгоритма шифрования соответственно.

    • Для параметра aes_128_source установите значение none.

AES-256
  • Загрузка ключей из переменных окружения:

    • В параметрах aes_256_key_env и aes_256_nonce_env укажите переменные окружения, которые содержат ключ и nonce для алгоритма шифрования соответственно.

    • Для параметра aes_256_source установите значение from_env.

  • Загрузка ключей из узлов ZooKeeper:

    • В параметрах aes_256_key_zk_path и aes_256_nonce_zk_path укажите узлы ZooKeeper, которые содержат ключ и nonce для алгоритма шифрования соответственно.

    • Для параметра aes_256_source установите значение from_zk.

  • Хранение ключей в конфигурационном файле (не рекомендуется):

    • В параметрах AES-256 GCM-SIV key и AES-256 GCM-SIV nonce укажите ключ и nonce для алгоритма шифрования соответственно.

    • Для параметра aes_256_source установите значение none.

После назначения параметров нажмите Save и выполните действие Reconfig and restart для сервиса ADQMDB.

Настройки алгоритмов шифрования сохраняются в секции encryption_codecs конфигурационного файла /etc/clickhouse-server/config.d/encryption.xml.

Применение алгоритмов шифрования данных

После того как для алгоритмов AES-128/AES-256 указаны ключи, можно включить шифрование:

  • паролей, записанных в конфигурационном файле;

  • данных столбцов таблиц на диске.

Шифрование паролей

В секции Encryption конфигурации сервиса ADQMDB установите значение параметра Credentials encrypt равным AES-128 или AES-128. Сохраните конфигурацию и выполните сервисное действие Reconfig and restart.

После этого в конфигурационном файле /etc/clickhouse-server/credentials.xml значения следующих параметров (если они настроены) будут храниться в зашифрованном виде:

  • interserver_http_password — пароль для аутентификации между репликами;

  • shard_secret — ключ кластера для проверки распределенных запросов на шардах;

  • default_user_password — пароль пользователя default.

Пример файла credentials.xml
<clickhouse>
    <interserver_http_password>
        <password hide_in_preprocessed="true" encrypted_by="AES_256_GCM_SIV">...encrypted value...</password>
    </interserver_http_password>
    <shard_secret>
        <secret hide_in_preprocessed="true" encrypted_by="AES_256_GCM_SIV">...encrypted value...</secret>
    </shard_secret>
    <default_user_password>
        <password hide_in_preprocessed="true" encrypted_by="AES_256_GCM_SIV">...encrypted value...</password>
    </default_user_password>
</clickhouse>
ВНИМАНИЕ
Для шифрования паролей в настоящее время не поддерживается загрузка ключей из узлов ZooKeeper, если для соединений между ClickHouse и ZooKeeper используется SSL.

Шифрование данных столбцов таблиц

В ClickHouse алгоритм шифрования данных, применяемый к столбцу таблицы, определяется кодеком шифрования. Назначить кодек шифрования столбцу можно в запросе CREATE TABLE с помощью выражения CODEC:

CREATE TABLE <table_name>
(   <column_name1> <data_type1> CODEC(AES_128_GCM_SIV | AES_256_GCM_SIV) [...],
    <column_name2> <data_type2> CODEC(AES_128_GCM_SIV | AES_256_GCM_SIV) [...],
    ...)
ENGINE = MergeTree()
...;

Кодеки шифрования фактически только шифруют данные столбца на диске, но не сжимают их. Если требуется применить сжатие, это нужно явно указать для столбца — для этого в выражении CODEC перед кодеком шифрования перечислите через запятую нужные кодеки сжатия данных (сначала специализированные, затем кодеки общего назначения). Например:

CREATE TABLE <table_name>
(   <column_name> <data_type> CODEC(Delta, LZ4, AES_256_GCM_SIV) [...],
    ...)
ENGINE = MergeTree()
...;
ВНИМАНИЕ
  • Большинство табличных движков, включая движки семейства MergeTree, создают индексные файлы на диске без применения кодеков шифрования. Это значит, что на диске могут появиться данные в открытом виде, если зашифрованный столбец индексируется.

  • Если в запросе SELECT содержится определенное значение из зашифрованного столбца (например, в выражении WHERE), это значение может появиться в лог-таблице system.query_log. Возможно, в этом случае стоит отключить логирование.

Пример

Следующий пример показывает, как указать сохраненный в ZooKeeper ключ для алгоритма шифрования данных AES-256 в ADQM, а также как применить этот алгоритм для шифрования пароля пользователя default (должен быть установлен — см. Настройка авторизации для нового кластера) и данных столбца тестовой таблицы.

  1. Создайте два узла ZooKeeper, в которых сохраните ключ и nonce для алгоритма шифрования AES-256 (для этого можно использовать консоль ZooKeeper CLI доступную на каждом хосте кластера, где установлен ZooKeeper):

    $ sudo /usr/lib/zookeeper/bin/zkCli.sh
    create /clickhouse/clickhouse/aes256_key_hex '00112233445566778899AABBCCDDEEFF00112233445566778899AABBCCDDEEFF'
    create /clickhouse/clickhouse/aes256_nonce_hex 'ABCDEFABCDEFABCDEFABCDEF'
  2. В секции Encryption конфигурации сервиса ADQMDB установите следующие значения параметров:

    • aes_256_key_zk_path: /clickhouse/aes256_key_hex;

    • es_256_nonce_zk_path: /clickhouse/aes256_nonce_hex;

    • aes_256_source: from_zk;

    • Credentials encrypt: AES-256.

    Сохраните конфигурацию и запустите выполнение действия Reconfig and restart для сервиса ADQMDB.

    Убедитесь, что настройки кодека шифрования сохранились в файле /etc/clickhouse-server/config.d/encryption.xml:

    <clickhouse>
        <encryption_codecs>
            <aes_256_gcm_siv>
                <key_hex hide_in_preprocessed="true" from_zk="/clickhouse/aes256_key_hex"/>
                <nonce_hex hide_in_preprocessed="true" from_zk="/clickhouse/aes256_nonce_hex"/>
            </aes_256_gcm_siv>
        </encryption_codecs>
    </clickhouse>
  3. Проверьте, что пароль пользователя default в конфигурационном файле /etc/clickhouse-server/credentials.xml теперь хранится в зашифрованном виде:

    <clickhouse>
        <default_user_password>
            <password hide_in_preprocessed="true" encrypted_by="AES_256_GCM_SIV">...encrypted password...</password>
        </default_user_password>
    </clickhouse>
  4. Создайте таблицу ADQM и вставьте в нее тестовые данные:

    CREATE TABLE encryption_test (x String CODEC(AES_256_GCM_SIV), y String) ENGINE = MergeTree ORDER BY x;
    INSERT INTO encryption_test VALUES ('1', '10'), ('2', '20'), ('3', '30');

    Посмотрите содержимое файла /var/lib/clickhouse/data/default/encryption_test/all_1_1_0/data.bin, чтобы убедиться, что данные первого столбца таблицы хранятся на диске в зашифрованном виде.

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