ШИФРОВАНИЕ ДАННЫХ В БАЗАХ MONGODB

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-соеди­не­ние меж­ду сег­мен­та­ми и все­ми кли­ен­та­ми (и мы вклю­ча­ем эти параметры).

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

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

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

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