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

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

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

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

Шифрование в процессе передачи (In-Transit Encryption)

OpenSearch использует протокол TLS для защиты данных, передаваемых между клиентами и узлами кластера, а также между узлами внутри кластера (REST и транспортный уровни).

plugins.security.ssl.transport.enabled: true
plugins.security.ssl.http.enabled: true
plugins.security.ssl.http.pemcert_filepath: certs/node-cert.pem
plugins.security.ssl.http.pemkey_filepath: certs/node-key.pem
В данном примере активируется TLS для HTTP и транспортного уровня с использованием сертификатов для защиты соединений.

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

Шифрование на стороне клиента

Шифрование на стороне клиента в OpenSearch реализуется с использованием криптографических библиотек на стороне приложения.

Как работает

Приложение шифрует данные перед индексацией в OpenSearch (например, через API index) и расшифровывает после получения (через API search или get).

Ключи шифрования хранятся на стороне клиента, поэтому не доступны для сервера OpenSearch.

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

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

  • Python:

    • cryptography — современная библиотека для выполнения криптографических операций, включая симметричное шифрование (AES-256) и управление ключами. Проста в использовании и поддерживает режимы GCM и CBC;

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

  • JavaScript/Node.js:

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

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

  • Java:

    • Java Cryptography Extension (JCE) — встроенный инструментарий Java для шифрования, включая алгоритмы AES, RSA и SHA. Подходит для большинства приложений;

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

  • .NET:

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

from cryptography.fernet import Fernet
from opensearchpy import OpenSearch

# Генерация ключа — Fernet.generate_key() создаёт безопасный ключ для симметричного шифрования с использованием AES-128 в режиме CBC
key = Fernet.generate_key()
cipher = Fernet(key)

# Подключение к OpenSearch — устанавливается защищённое соединение через HTTPS с использованием клиента opensearch-py
client = OpenSearch(
    hosts=[{'host': '<host>', 'port': 9200, 'scheme': 'https'}],
    http_auth=('<user>', '<password>'),
    use_ssl=True
)

# Шифрование и индексация данных — данные шифруются с помощью cipher.encrypt, преобразуются в строку и индексируются в OpenSearch
sensitive_data = "sensitive_value"
encrypted_data = cipher.encrypt(sensitive_data.encode()).decode()
document = {"id": 1, "encrypted_data": encrypted_data}
client.index(index="my_index", body=document)

# Получение и расшифрование данных — данные извлекаются через API get, расшифровываются с помощью cipher.decrypt и выводятся в исходном виде
result = client.get(index="my_index", id="1")
decrypted_data = cipher.decrypt(result["_source"]["encrypted_data"].encode()).decode()
print(decrypted_data)  # Вывод: sensitive_value

где:

  • <host> — внутренний или публичный IP-адрес ноды, к которой нужно подключиться. IP-адрес ноды отображается на вкладке Ноды в группе Data;
  • <user> — имя пользователя;
  • <password> — пароль пользователя.

Подробнее см. раздел Доступ к кластеру OpenSearch.

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

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

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

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

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

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