Шифрование данных в базах MongoDB

MongoDB (или просто Mongo) – это документо-ориентированная система управления базами данных, которая используется для хранения информации во многих современных веб-приложениях. Крайне важно, чтобы лица, ответственные за управление базой данных Mongo (впрочем, это касается любой СУБД), придерживались передовых методов обеспечения безопасности – это позволяет избежать потери данных в случае аварии, предотвратить их попадание в руки злоумышленников и т.п.

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

Примечание: Другие мануалы этой серии вы найдете по тегу mongodb-security.

Шифрование – это процесс преобразования информации из открытого текста (исходной формы) в зашифрованный текст, нечитаемую форму, прочитать которую может только человек или компьютер, у которых есть правильный шифр. Если злоумышленник перехватит часть зашифрованных данных, он не сможет прочитать эти данные, пока не расшифрует их.

Вы можете зашифровать обмен данными между MongoDB и любыми клиентами или приложениями, которым требуется доступ к базе данных, настроив подключения через TLS (Transport Layer Security). Как и Secure Sockets Layer (или SSL), TLS – это криптографический протокол, который с помощью сертификатов шифрует данные при их передаче по сети.

Обратите внимание, что TLS шифрует данные только при их перемещении по сети (это называется data in-transit, данные в движении). Даже если вы настроили Mongo для поддержки соединений с помощью TLS, статические данные, хранящиеся на сервере БД (data at rest, или хранимые данные), по-прежнему будут оставаться незашифрованными. Бесплатная версия MongoDB Community Edition не позволяет шифровать хранимые данные, но это возможно с помощью платной версии Enterprise Edition (она действует по подписке).

Однако даже при шифровании хранимых данных и данных в движении ваша конфиденциальная информация потенциально может быть доступна для неавторизованных пользователей. Рассмотрим, например, такой сценарий: предположим, мы развернули сегментированную БД NoSQL для хранения данных разработанного вами приложения по доставке мороженого. СУБД позволяет нам шифровать хранимые данные, а также настраивать обязательное зашифрованное TLS-соединение между сегментами и всеми клиентами (и мы включаем эти параметры).

В подобной ситуации при размещении заказа покупателя просят предоставить некоторые конфиденциальные данные, например домашний адрес или номер кредитной карты. Затем приложение вносит эту информацию в документо-ориентированную базу данных:

{
  "name" : "8host Blog",
  "address" : {
    "street" : "602 Surf Ave",
    "city" : "Brooklyn",
    "state" : "New York",
    "zip" : 11224
  },
  "phone" : "555-555-1234",
  "creditcard" : "1234567890123456"
}

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

Чтобы снизить подобные риски, официальные драйверы MongoDB (начиная с версии 4.2) позволяют шифровать поля на стороне клиента. Это означает, что при соответствующей настройке приложение может зашифровать определенные поля в документе перед отправкой данных в базу. После записи данных в БД расшифровать и прочитать данные в этих полях смогут только приложения или клиенты, которые предоставят правильные ключи. В противном случае документ с данными будет выглядеть примерно так (допустим, на стороне клиента были зашифрованы поля street, city, zip, phone, и creditcard):

{
  "name" : "8host Blog",
  "address" : {
    "street" : BinData(6,"eirefi3eid5feiZae9t+oot0noh9oovoch3=iethoh9t"),
    "city" : BinData(6,"xiesoh+aiveez=ngee1yei+u0aijah2eeKu7jeeB=oGh"),
    "state" : "New York"
    "zip" : BinData(6,"CoYeve+ziemaehai=io1Iliehoh6rei2+oo5eic0aeCh")
  },
  "phone" : BinData6,"quas+eG4chuolau6ahq=i8ahqui0otaek7phe+Miexoo"),
  "creditcard" : BinData6,"rau0Teez=iju4As9Eeyiu+h4coht=ukae8ahFah4aRo="),
}

MongoDB хранит зашифрованные значения в виде двоичных данных, как в предыдущем примере указано метками класса BinData. Число 6 в каждом значении представляет двоичный подтип, в котором хранятся данные, и задает тип двоичных данных, которые были закодированы. Значения, зашифрованные на стороне клиента Mongo с помощью шифрования на уровне поля, всегда используют подтип 6.

Читайте также:

Tags: , ,

Добавить комментарий