Thank you for reading this post, don't forget to subscribe!
MongoDB (или просто Mongo) – это документо-ориентированная система управления базами данных, которая используется для хранения информации во многих современных веб-приложениях. Крайне важно, чтобы лица, ответственные за управление базой данных Mongo (впрочем, это касается любой СУБД), придерживались передовых методов обеспечения безопасности – это позволяет избежать потери данных в случае аварии, предотвратить их попадание в руки злоумышленников и т.п.
Шифрование – это процесс преобразования информации из открытого текста (исходной формы) в зашифрованный текст, нечитаемую форму, прочитать которую может только человек или компьютер, у которых есть правильный шифр. Если злоумышленник перехватит часть зашифрованных данных, он не сможет прочитать эти данные, пока не расшифрует их.
Вы можете зашифровать обмен данными между 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-соединение между сегментами и всеми клиентами (и мы включаем эти параметры).
В подобной ситуации при размещении заказа покупателя просят предоставить некоторые конфиденциальные данные, например домашний адрес или номер кредитной карты. Затем приложение вносит эту информацию в документно-ориентированную базу данных:
1 2 3 4 5 6 7 8 9 10 11 |
{ "name" : "test 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):
1 2 3 4 5 6 7 8 9 10 11 |
{ "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.