سرور پایگاه داده MongoDB که با عنوان Mongo نیز شناخته میشود، یک محل ذخیره اسناد است که در بسیاری از اپلیکیشنهای مدرن وب مورد استفاده قرار میگیرد. همانند دیگر سیستمهای مدیریت پایگاه داده، استفاده از بهترین روشها در تأمین امنیت پایگاه داده Mongo اهمیت خواهد داشت؛ هم برای جلوگیری از دست رفتن دادهها در هنگام بروز اتفاق و هم برای دور نگه داشتن آنها از دسترس سارقان و هکران.
در این مطلب قصد نگاهی کلی به ویژگیهای داخلی امنیتی سرور پایگاه داده MongoDB داشته باشیم. در همین حال، به برخی از روش های کلی در زمینه امنیت پایگاه داده اشاره خواهیم کرد.
رمزنگاری سرور پایگاه داده MongoDB
«رمزنگاری» فرآیند تبدیل قسمتی از اطلاعات که در ابتدا به صورت متنی است، به حالت موسوم به ciphertext است. یعنی به صورتی که فقط بتواند توسط شخص یا کامپیوتری که کد لازم را برای رمزگشایی آن داشته باشد، قابلخواندن باشد. زمانی که شخص نفوذکننده بخواهد بخشی از دادههای رمزنگاریشده را تفسیر کند، تا زمانی که نتواند آن را از حالت رمزنگاری خارج کند، راه به جایی نخواهد برد.
رمزنگاری ارتباطات بین سرور پایگاه داده MongoDB و کلاینتها یا اپلیکیشنهای موردنیاز از طریق تنظیم استفاده از لایه امنیتی انتقال یا TLS امکانپذیر خواهد بود. TLS همانند نسخه قبلیاش (لایه سوکتهای امنیتی یا SSL) یک پروتکل رمزنگاری است که از گواهیهای تأییدیه برای رمزنگاری داده انتقال در یک شبکه استفاده میکند.
به خاطر داشته باشید که TLS تنها دادههای در جریان در بستر یک شبکه را رمزنگاری میکند. در غیر این صورت، به صورت «انتقال داخلی داده» خواهد بود. حتی اگر Mongo را به گونهای تنظیم کنید که تنها اطلاعات حاصل از ارتباط TLS را دریافت کند، دادههای استاتیک ذخیرهشده در سرور پایگاه داده ( که با عنوان دادههای در حال استراحت شناخته میشوند) هنوز هم به صورت رمزنگارینشده خواهند بود. امکان رمزنگاری دادههای در حال استراحت به وسیله نسخه رایگان انجمن MongoDB ممکن نخواهد بود. در همین حال، میتوانید برای این منظور از نسخه پولی «اینترپرایز ادیشن» استفاده کنید.
اطلاعات حساس
البته این را هم درنظر داشته باشید که حتی اگر گزینههای encryption-at-rest و encryption-in-transit برایتان فعال باشند، همچنان دادههای حساس شما ممکن در معرض دید کاربران ناشناس قرار گیرند. به عنوان مثال، سناریویی را درنظر بگیرید که یک پایگاه داده اسناد NoSQL را برای ذخیرهسازی دادههای مربوط به یک اپلیکیشن تحویل بستنی به کار گرفتهاید. سیستم مدیریت پایگاه داده به شما این امکان را میدهد که «دادههای در حال استراحت» را رمزنگاری کنید. همچنین این سیستم را برای داشتن ارتباط TLS بین shard ها و کلاینتها تنظیم کردهاید.
در این حالت، وقتی یک مشتری سفارشی را قرار میدهد، میبایست برخی اطلاعات حساس مانند آدرس خانه یا اعداد کارت اعتباری را وارد کند. سپس اپلیکیشن این اطلاعات را مشابه زیر در یک سند در پایگاه داده مینویسد.
{ "name" : "Sammy Shark", "address" : { "street" : "602 Surf Ave", "city" : "Brooklyn", "state" : "New York", "zip" : 11224 }, "phone" : "555-555-1234", "creditcard" : "1234567890123456" }
این در واقع، یک خطرپذیری امنیتی است. چرا که هر کسی که بتواند به پایگاه داده شما دسترسی داشته باشد، میتواند از اطلاعات حساس مشتریان شما سوءاستفاده کند.
برای غلبه بر این ریسک، از نسخه 4.2 به بعد درایورهای رسمی سرور پایگاه داده MongoDB به شما اجازه میدهند که در سطح فیلدها از طرف کلاینت رمزنگاری داشته باشید. به این معنا که اپلیکینش میتواند دادهها را قبل از ارسال به پایگاه داده، در قالب یک سند رمزنگاری کند. وقتی داده در پایگاه داده نگاشته شد، تنها اپلیکیشنها یا کلاینتهایی که کلیدهای رمزنگاری را در اختیار داشته باشند، میتوانند رمزگشایی کرده و دادههای موجود در فیلدها را بخوانند. در غیر این صورت، اسناد داده ظاهری شبیه به زیر خواهند داشت و مواردی مانند خیابان، شهر، کد پستی، تلفن و اطلاعات کارت بانکی به صورت زیر درخواهند آمد.
{ "name" : "Sammy Shark", "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="), }