مشاور زیرساخت. موسس سایت آموزشی DockerMe.ir
امان از کانفیگ Default سرویس Mongodb
برخی از سرویسها به صورت پیشفرض دارای کانفیگی هستند که شما رو مجبور میکنند حداقل موارد امنیتی را رعایت نمایید. به عنوان مثال الزام میکنند که شما برای کاربر root که دسترسی اصلی سرویس را دارا میباشد پسورد قرار دهید. یا انیکه بعد از نصب با چند تا سوال ابتدا الزامات هاردنینگ سرویس را از شما میپرسد و سپس آن موارد را کانفیگ میکند. اما یکسری از سرویسها پیشفرض رو بر اختیار کاربر قرار میدهند تا او تصمیمگیری برای این موارد انجام دهد. به عنوان مثال mongoDB دارای کانفیگ پیشفرض خوبی برای ایجاد حداقلی امنیت نیست که خود کاربر میبایست این الزامات را رعایت کند.
این چند روزه حتما در مورد در دسترس قرار گرفتن دیتای یکی از سرویسها هستید. حالا چه یکم یا یه سرور و یا کلی و همهی سرورها فرقی تو موضوع مورد بحث ما نداره. مهم اینه که مقداری از دیتا که باید فقط در اختیار سرویسدهنده باشد در اختیار دیگران قرار گرفته است. این موضوع مطلوب هیچ سرویسدهندهای نیست و همه دوست دارند از آن جلوگیری کنند.
سرویس mongoDB به صورت پیشفرض بر روی پورت 27017 سرویسدهی میکند که همواره این پورت را بر روی تمام ipهای سرور باز میکند و که اگر Authentication را روی آن فعال نکنید بدون کاربر و پسورد میتوانید با آن کار کنید. خوب با این کانفیگ پیشفرض فقط کافیه فردی بدونه که شما از سرویس mongoDB استفاده میکنید. البته که پیدا کردن این موضوع با وجود ابزارهای زیادی که برای پورت اسکن کردن و پیدا کردن یک پورت خاص وجود دارد اصلا کار سختی نیست. در ضمن همواره باتهای زیادی در حال جستجوی IP ها هستند تا بتوانند با پیدا کردن این مشکلات به آنها نفوذ کنند و با روشهای مختلف از آنها اخاذی کنند.
با انجام چند تا کار ساده به راحتی میتوان جلوی خیلی از این موارد را گرفت و تا حد مطلوبی امنیت نسبی را برای سرور و سرویس خودمان فراهم کنیم. دقت کنید این موارد فقط راهکارهای مقدماتی میباشد برای اینکه بتوان به صورت کلی امنیت را در سرویس و سرورهای خود پیادهسازی کنیم نیاز است تا با متخصصین این حوزه مشورت کنیم.
برخی از نکات مهم که میبایست حتما رعایت شود:
علت دسترسی به پورت سرویسها:
یکی از موارد مهم اینه که همواره پورتهایی که در دسترس قرار میگیرند به صورت کامل مشخص باشد که این پورت میبایست در دسترس چه کسانی باشد و علت این دسترسی چیست. مثلا هیچگاه پورت دیتابیس نباید در دسترس عموم باشد (any access) و باید داخل خود سرور و به صورت لوکالی در اختیار سرویسهای دیگر قرار گیرد. اگر از داکر برای راهاندازی mongoDB استفاده میکنید میتوانید با قرار دادن IP مربوط به لوکال از پابلیش پورت 27017 برای همه جلوگیری کنید. به مثال زیر توجه کنید.
docker run -d --name mongo -p 127.0.0.1:27017:27017 mongo
همانطور که مشاهده میکنید پورت 27017 داخل کانتینر به پورت 27017 هاست اما روی IP لوکال آن bind شده است. اگر IP مربوط به لوکال قرار داده نشود بر روی تمامی IPها این پورت باز خواهد شد. این یکی از اشتباهات مرسوم در استفاده از سرویسها بر روی داکر میباشد.
لطفا همواره با وسواس خیلی زیادی این موضوع را پیگیری کنید که چرا این پورت باید باز باشد و دسترسی آن برای چه گروه از افراد باید فراهم شود.
پسورد داخل دیکشنری:
برخی از سرویسها همانند mongoDB که به آن اشاره کردیم بدون پسورد هم کار میکنند اما برخی همانند mysql گذاشتن پسورد برای root را الزامی میکنند اما در خیلی از موارد به این سرویسها هم نفوذ میشود و اطلاعات آنها در دسترس دیگران قرار میگیرد.
در مورد پسورد سرویسها به این موضوع دقت کنید که میبایست همواره برای دیتابیسها و یا سرورها و سرویسهای وب خود پسورد بگذارید و باید پسوردی باشد که اصتلاحا در دیکشنری نباشد. حتما از پسوردهای ساده، قابل حدس، ترکیبی از اسم خودتون و اسم برندتون و ... استفاده نکنید. پسورد باید تعداد کاراکتر زیادی داشته باشه مثلا ۳۰ کاراکتر و به صورت رندم با یه الگورتیم خوبی که ترکیبی از حروف و اعداد و کاراکترهای مختلف میباشد ایجاد شود که قابل حدس زدن و اصتلاحا داخل دیکشنری نباشد.
معمولا وقتی یک پورت یا پنل و یا سروری تارگت میشود برای نفوذ از ابزارهایی استفاده میکنند که مدام با یوزر و پسوردهای مختلفی لاگین را آزمایش کنند تا بالاخره دسترسی مورد نظرشون رو دریافت کنند. این ابزارها یک دیکشنری کامل از اسمها و پسوردهای معروف و زیاد استفاده شده دارند که مدام آنها را تست میکنند.
در مثال زیر کانتینر مربوط به mongoDB با استفاده از user/pass راه انداری شده است.
docker run -d --name mongo \
-p 127.0.0.1:27017:27017 \
-e MONGO_INITDB_ROOT_USERNAME=mongoadmin \
-e MONGO_INITDB_ROOT_PASSWORD=t2JSCcK4QCfZfMMJzeVEHp7xckX69e \
mongo
برای اینکه بتوانید پسوردها و اطلاعات اکانت خود را به خوبی نگه دارید و در صورت نیاز به خوبی از آنها استفاده کنید توصیه میشود تا از ابزارهایی مانند keepass استفاده کنید.
ارتباط با پنل برای راحتی کار با آن:
در برخی از مواقع اتفاق میافتد که اعضای یک پروژه درخواست میکنند پورت دیتابیس از بیرون سرور برای آنها باز باشد و الزام میکنند که این نیاز واقعی است و باید این امکان فراهم شود. در بالا توضیح دادیم که علت هر دسترسی باید به صورت کامل مشخص شود. بعد از بررسی مشخص میشود که میخواهد برای راحتی بیشتر از طریق پنل با دیتابیس کار کند از این رو این دسترسی را میخواهد. یا انیکه درخواست دارد که بر روی سرور پنل مدیریت دیتابیس نصب شود و در اختیار آنها قرار گیرد. اصلا این کار توصیه نمیشود زیرا معمولا این پنلها مشکلات امنیتی زیادی دارند و در دسترس قرار دادن آنها کار صحیحی نیست. نکتهی دیگر اینکه در دسترس قرار دادن پورت دیتابیس برای این موضوع نیز اصلا کار خوبی نیست.
حالا بزنیم بعدا درستش می کنیم:
یکی دیگر از اشتباهات مرسوم در راهاندازی سرویسها این جمله میباشد. حالا بزنیم بعدا درستش میکنیم. و تجربه ثابت کرده که هیچ بعدی وجود ندارد و معمولا سرویسها با همان کانفیگهای ابتدایی به صورت کامل پروداکش میشوند. همین موارد که اشاره شده در ابتدای کار با سرویس باید رعایت شود تا توسعهی سرویس نیز با این موارد پیش رود.
نداشتن بکاپ درست و به موقع:
یکی دیگر از مشکلات مهم و اساسی کار با دیتابیسها نداشتن بکاپ درست و به موقع میباشد. همواره لازم است که از دیتابیس خود بکاپ بگیریم و آن را همواره در محیط دیگری تست کنیم تا در صورتی که دچار مشکل شدیم بکاپ ما به صورت کامل بازگردانده شود. در برخی از پروژهها پیش آمده که با انجام ندادن موضوعی به این سادگی دچار مخاطرات خیلی زیادی شدهاند که توصیه میشود همواره این موضوع به صورت کامل رعایت شود.
چکلیست امنیتی:
همواره سرویسهای مهم دارای چکلیست امنیتی هستند. خیلی اهمیت دارد در زمان ایجاد سرویس این چکلیستها بررسی شود و مواردی که در آنها اشاره میشود در سرویس رعایت شود. همواره نیاز است تا در یک برنامهی زمانبندی شده مناسب این چکلیستها و الزامات پیادهسازی آنها بررسی و در صورت نیاز مجدد پیادهسازی شوند.
چکلیست امنیتی سرویس mongoDB در این لینک قرار دارد که با مطالعه آن میتوان به خوبی این سرویس را امنسازی کرد تا با خیال راحت از آن استفاده کرد.
به نظرم انجام این چند کار به نظر ساده اما خیلی مهم به شما کمک میکند که حداقل موارد امنیتی سرویس خودتون را رعایت کرده باشید. دقت کنید که برای ایجاد امنیت با نسبت خوبی نیاز است تا با متخصصین این حوزه مشورت کرده و از راهکارهای آنها استفاده کنید.
مطلبی دیگر از این انتشارات
اجزای داکر (Docker Component)
مطلبی دیگر از این انتشارات
سرور ابری مطلوب چه ویژگیهایی دارد؟
مطلبی دیگر از این انتشارات
۲۸.استفاده از DNS سرور داخلی داکر