Шифрование данных в Managed Service for ClickHouse

Managed Service for ClickHouse предоставляет инструменты для защиты данных, включая встроенные функции шифрования на уровне столбцов и возможность реализации шифрования на стороне клиента. Эти механизмы позволяют эффективно защищать конфиденциальные данные, такие как персональная и финансовая информация, обеспечивая соответствие требованиям безопасности.

Встроенные функции шифрования в ClickHouse

ClickHouse поддерживает встроенные криптографические функции для шифрования и расшифрования данных на уровне столбцов. Эти функции используют алгоритм AES с различными режимами шифрования (ECB, CBC, OFB, GCM, CTR и CFB), обеспечивая гибкость и безопасность.

Подробнее см. в официальной документации ClickHouse.

Основные функции шифрования

  • encrypt(mode, plaintext, key, [iv, aad]) — шифрует plaintext с использованием указанного режима шифрования (mode), ключа (key), а также необязательного вектора инициализации (iv) и дополнительных аутентифицированных данных (aad);
    SELECT encrypt('AES-256-CBC', 'sensitive_data', 'my_secret_key', 'initial_vector') AS encrypted_data;

    Функция шифрует строку 'sensitive_data' с использованием алгоритма AES-256 в режиме CBC, ключа 'my_secret_key' и вектора инициализации 'initial_vector'. Результат — зашифрованные данные в бинарном формате.

  • decrypt(mode, ciphertext, key, [iv, aad]) — расшифровывает ciphertext с использованием тех же параметров, которые применялись при шифровании;
    SELECT decrypt('AES-256-CBC', encrypted_data, 'my_secret_key', 'initial_vector') AS decrypted_data;

    Функция расшифровывает данные, возвращая исходную строку 'sensitive_data', если использованы правильные ключ и вектор инициализации.

  • aes_encrypt_mysql(mode, plaintext, key, [iv]) — функция шифрования, совместимая с MySQL, позволяющая шифровать данные так, чтобы они могли быть расшифрованы функцией AES_DECRYPT в MySQL;

    SELECT aes_encrypt_mysql('AES-256-ECB', 'sensitive_data', 'my_secret_key') AS encrypted_mysql;

    Функция шифрует данные в формате, совместимом с MySQL, что полезно для интеграции с системами, использующими MySQL.

  • aes_decrypt_mysql(mode, ciphertext, key, [iv]) — расшифровывает данные, зашифрованные в формате, совместимом с MySQL.

    SELECT aes_decrypt_mysql('AES-256-ECB', encrypted_mysql, 'my_secret_key') AS decrypted_mysql;

    Функция расшифровывает данные, зашифрованные функцией aes_encrypt_mysql или MySQL AES_ENCRYPT.

Рекомендации по использованию встроенных функций

  • Управление ключами — храните ключи шифрования и векторы инициализации в безопасных сервисах управления секретами.

  • Производительность — до версии ClickHouse 21.1 функции шифрования могли существенно влиять на производительность. В более новых версиях оптимизирована работа с криптографическими операциями, но рекомендуется тестировать производительность на больших объёмах данных.

  • Выбор режима шифрования — используйте безопасные режимы, такие как GCM или CBC, избегая ECB из-за его уязвимостей. Убедитесь, что режим шифрования соответствует требованиям вашего приложения.

Шифрование на стороне клиента (Client-Side Encryption)

Шифрование на стороне клиента позволяет зашифровывать данные перед их отправкой в ClickHouse и расшифровывать после получения, предоставляя дополнительный уровень контроля над безопасностью. Этот подход особенно полезен, если требуется минимизировать доступ к данным на стороне сервера.

Подробнее см. в официальной документации ClickHouse.

Как работает

  • Процесс шифрования — приложение шифрует данные перед их вставкой в ClickHouse (например, с помощью команды INSERT). Зашифрованные данные хранятся в базе в виде бинарных строк.

  • Процесс расшифрования — после получения данных (например, с помощью команды SELECT) приложение расшифровывает их с использованием соответствующего ключа.

  • Управление ключами — ключи хранятся на стороне клиента, поэтому недоступны для сервера ClickHouse.

Используемые технологии и библиотеки

Для реализации шифрования на стороне клиента используйте криптографические библиотеки, совместимые с языком программирования вашего приложения.

Примеры:

  • Python:

    • cryptography — библиотека для выполнения современных криптографических операций, включая AES-256 и другие алгоритмы;

    • PyCryptodome — библиотека с поддержкой широкого набора криптографических примитивов, таких как AES, RSA и ChaCha20;

  • JavaScript/Node.js:

    • crypto — встроенный модуль Node.js для шифрования, хеширования и генерации ключей;

    • crypto-js — легковесная библиотека для AES, SHA-256 и других операций;

  • Java:

    • Java Cryptography Extension (JCE) — встроенные средства Java для шифрования, включая AES и RSA;

    • Bouncy Castle — расширенная библиотека с поддержкой множества криптографических стандартов;

  • .NET:

    • System.Security.Cryptography — встроенная библиотека .NET для шифрования, хеширования и управления ключами.

Пример использования

Пример шифрования и расшифрования данных в Python с использованием библиотеки cryptography и клиента ClickHouse (clickhouse-driver):

from cryptography.fernet import Fernet
from clickhouse_driver import Client

# Генерация ключа шифрования
key = Fernet.generate_key()
cipher = Fernet(key)

# Подключение к ClickHouse
client = Client(host='<host>', port=9000)

# Шифрование и вставка данных
sensitive_data = "sensitive_value"
encrypted_data = cipher.encrypt(sensitive_data.encode()).decode()
client.execute("INSERT INTO my_table (id, encrypted_data) VALUES", [(1, encrypted_data)])

# Получение и расшифрование данных
result = client.execute("SELECT encrypted_data FROM my_table WHERE id = 1")
decrypted_data = cipher.decrypt(result[0][0].encode()).decode()
print(decrypted_data) # Вывод: sensitive_value

где:

Рекомендации

  1. Управление ключами — храните ключи в сервисах управления секретами.

  2. Алгоритмы — используйте AES-256 (режимы GCM или CBC). Избегайте устаревших алгоритмов (DES, MD5).

  3. Производительность — шифруйте только конфиденциальные данные. Тестируйте производительность на больших объёмах.

  4. Совместимость — храните зашифрованные данные как String или FixedString. Зашифрованные данные не поддерживают поиск и агрегацию.

  5. Безопасностьвключите TLS при создании кластера для защиты данных при передаче. Реализуйте обработку ошибок и аудит операций.

  6. Комбинированный подход — используйте встроенные функции ClickHouse для простых задач, а шифрование на стороне клиента — для критически важных данных.