میزان استفاده از معماریهای مبتنی بر مایکروسرویس جهت پیادهسازی راهکارهای پیچیده و پیشرفته رو به افزایش است. استفاده از مایکروسرویسها باعث سادهتر شدن جایگزینی یا ارتقای اجزا پس از پیادهسازی و نصب آنها میشود و امکان همکاری توسعه دهندگان مختلف و کار بر روی جنبههای متفاوت یک راهکار، بدون ایجاد تأثیر بر روی سایر بخشها را فراهم میکند.
با این حال، در این نوع معماری نیز چالش های امنیتی زیادی وجود دارد. کاربری که قصد استفاده از معماری مایکروسرویس ها را دارد به منظور حفظ امنیت داده ها باید از همان ابتدا این چالشها را مورد بررسی قرار دهد. در این صورت حتی در هنگام بروز یک مشکل هم، سیستم به روال طبیعی کار خود ادامه خواهد داد. در ادامه به بررسی راهکارهایی برای حفظ امنیت معماری مایکروسرویسها میپردازیم.
معماری مایکروسرویسها
معماری مایکروسرویسها نوعی الگوی معماری است که در آن برنامه های پیچیده به بخش های کوچک و مستقلی شکسته می شوند. هر کدام از این بخش ها یک کار واحد یا گروهی از کارهای کوچک به هم مرتبط را اجرا میکنند؛ برخلاف برنامههای کاربردی انحصاری سنتی که مجموعهای وسیع از وظایف مختلف را بر عهده دارند.
این معماری به دلیل ماهیت پیمانه ای که دارد، دارای تعدادی آسیب پذیری منحصربه فرد است. برنامههای کاربردی که توسط معماری مایکروسرویسها ایجاد می شوند دارای پیچیدگی بالا و همچنین باز هستند و سطح حمله در آنها در مقایسه با برنامه های کاربردی سنتی بیشتر است.
مایکروسرویسها از طریق رابط های برنامه نویسی برنامههای کاربردی (API[1]) که مستقل از زبان های برنامه نویسی هستند با هم ارتباط برقرار میکنند. بنابراین نسبت به راهکارهای سنتی (که در آن اجزای مختلف یک برنامه کاربردی بزرگ فقط با سایر اجزای همان برنامه در ارتباط هستند) سطح حمله در آنها وسیعتر است. به همین دلیل امکان اجرای حمله بر ضد آنها معمولاً بیشتر است.
به دلیل سرعت بالای چرخه توسعه و به کار بردن رویکرد ادغام مداوم و تحویل پیوسته (Continuous Integration/Continuous Delivery[2]) در معماری مایکروسرویسها توسعه دهندگان، فرایند بررسی کد را در قالب یک رویداد واحد و در انتهای مرحله توسعه انجام نمیدهند بلکه این عملیات طی یک فرایند مستمر انجام شده و باید این آزمونها به شیوه صحیحی مدیریت شوند.
در نهایت بعضی از حملات سایبری، راهکارهای مبتنی بر کانتینر (مخزن) که مایکروسرویسها در آن پیاده سازی میشوند را هدف میگیرند. این امر میتواند ناشی از یکپارچگی تصویر این مخزنها، نحوه مدیریت آنها، میزان جداسازی و تفکیک آنها از یکدیگر، آسیب پذیریهای هر مخزن مثل کتابخانههای مورد استفاده در آن و امنیت سیستمعاملی باشد که میزبانی این مخازن را بر عهده دارد.
حفظ امنیت معماری مایکروسرویسها
اولین گام برای برقراری امنیت معماری مایکروسرویسها، در نظر گرفتن موضوع امنیت در طراحی آن است. موارد زیر نکات مهمی هستند که در تمام معماریها باید به آنها توجه داشت:
- رمزنگاری همه ارتباط ها (با کمک https یا پروتکل رمزنگاری امنیتی لایه انتقال)
- اجرای احراز هویت برای همه درخواستهای دسترسی
- خودداری از کدنویسی دایم مجوزها، کلمه های عبور و سایر اسرار در داخل کد
- استفاده از ابزارهای DevSecOps که برای معماری مایکروسرویسها و به منظور اسکن کد به روشی صحیح و امن طراحی شده اند.
- تعریف APIها و نظارت بر همه ارتباطها
راهکارهای امنیتی باید همه موارد بالا را در سطح کد در نظر داشته باشند. کاربرانی که قصد استفاده از این معماری را دارند باید در هنگام پیاده سازی کدهای خود، نکتههای زیر را هم در نظر داشته باشند:
ایزوله سازی (تفکیک)
ایزوله کردن یکی از نکات مهم در طراحی معماری مایکروسرویسها محسوب میشود. در واقع هر بخش که شامل قسمتی از یک برنامه کاربردی بزرگتر است باید یک قطعه مستقل از یک پازل کلی باشد. به عبارت دیگر برای امنیت معماری مایکروسرویسها، هر مایکروسرویس باید قابلیت نصب، تعمیر، اصلاح، مقیاسپذیری یا حذف را داشته باشد؛ بدون این که بر سایر مایکروسرویسها تأثیری داشته باشد.
همچنین ایزوله کردن برای سایر اجزای مرتبط و مورد استفاده در مایکروسرویسها نیز مهم است. در صورتی که عملیات ایزوله سازی به صورت صحیح انجام شود، یک مایکروسرویس قادر به دسترسی به دادههای اطراف نبوده و مهاجمان امکان حرکت عرضی بین مایکروسرویسها را نخواهند داشت.
یکی دیگر از مباحث مهم در ایزوله سازی نیز این است که اگر یک مایکروسرویس با مشکل روبرو شود یا از بین برود نباید مشکلی برای سایر اجزا پیش بیاید.
امنیت API
ارتباط مایکروسرویسها با هم باید از طریق APIهای امن برقرار شود. در واقع یک API امن، امنیت اطلاعات را حفظ می کند و دادههای مورد پردازش را فقط در دسترس کاربران، برنامههای کاربردی و سرورهای مجاز قرار میدهد. همچنین فقط دادههای ارسالی از سمت کاربران و سرورهای مطمئن که توسط یک عامل واسط تغییر نکرده اند را می پذیرد. علاوه بر این با توجه به اینکه قابلیت شناسایی سیستمهای فراخواننده و کاربران نهایی بسیار مهم است و این موضوع برای درخواستهای مطرح شده از سوی API به سمت سرورها هم صدق میکند بنابراین یک API باید همواره توانایی مدیریت درخواستها و پردازش آنها با یک روش قابل اطمینان را داشته باشد.
یکی از راههای امنسازی APIها و احراز هویت کاربران و فرایندها، استفاده از یک درگاه برای API است. طراحان این درگاهها آنها را به تعداد بسیار زیادی تولید و با استفاده از پروتکلهایی مثل OAuth، بخش عمدهای از سربار احراز هویت را مدیریت میکنند. از این رو کاربرانی که قصد دسترسی به یک API را دارند، احراز هویت می شوند.
یکی دیگر از مزایای استفاده از درگاه API این است که این درگاه امکان مدیریت دسترسی به API را فراهم می کند. همچنین این درگاه ها یک لایه امنیتی مازاد را برای معماری مایکروسرویس ایجاد می کنند. علاوه بر این، درگاه API نحوه فراخوانی سرویسها توسط فرمانهای بیرونی را کنترل کرده و کارهایی همچون تعدیل بار و غلبه بر خرابی را مدیریت می کند. در نهایت اینکه درگاه API قادر به فراهم کردن امکان ثبت گزارش (لاگ) نیز است. به این ترتیب مرکز عملیات امنیت یا بخش مدیریت حوادث و اطلاعات امنیتی میتوانند برنامه های کاربردی را تحت نظارت قرار داده و رفتارهای غیرمنتظره و غیرمنطقی را شناسایی کنند.
راهکارهای امنیتی مخزن (کانتینر) برای معماری مایکروسرویسها
مخزنی که معماری مایکروسرویسها به آن وابسته است میتواند شامل چند مسیر برای حمله باشد. مخاطرات امنیتی این مخازن، شامل امکان هک تصویر مخزن یا کل مخزن، سوءاستفاده از یک مخزن برای حمله به سایر مخازن یا سوءاستفاده از سیستمعامل یک میزبان برای حمله به سایر میزبانها است.
تهدیدهای امنیتی مخازن به شرح زیر هستند:
تصاویر (ایمیجها)
تصویر برنامههای کاربردی یکی از مهمترین آسیبپذیریها در محیط یک مخزن است. این تصاویر میتوانند ترکیبی از تصاویر اختصاصی و منبع باز باشند. مخاطرات امنیتی خاصی در این حوزه وجود داشته و بعضی از آنها شامل امکان قدیمی شدن تصاویر، امن نبودن نسخه نرمافزار، وجود نقص امنیتی در برنامههای کاربردی و پیکربندی ضعیف تصاویر هستند. مفهوم «Secure-by-design» یا پیادهسازی امنیت در طراحی، برای مقابله با بسیاری از این مخاطرات کمک میکند.
توسعه دهندهها باید به امنیت سایر مخازن یا سرویسهایی که استفاده میکنند هم توجه داشته باشند. آنها باید با به کارگیری سیاستهایی مناسب، این تصاویر را در فواصل زمانی مناسب بازبینی و نوسازی کنند.
رجیستری
هنگام استفاده از رجیستری که تنظیمات امنیتی ضعیفی داشته باشد، دسترسیها باید از طریق ارتباط هایی رمزنگاری شده و امن و نیز احراز هویت شده صورت پذیرند. همچنین رجیستری باید تحت نظارت پیوسته قرار داشته باشد تا تصاویر قدیمی و مخاطره آمیز به موقع حذف شوند.
هماهنگی
یکی از اقدام های مهم برای حفظ امنیت معماری مایکروسرویسها، در اختیار داشتن کنترل تصاویر مورد استفاده و نحوه برقراری ارتباط بین آنها است. یک توسعه دهنده بهتر است به منظور به دست آوردن یک کنترل دقیق بر حساب های مدیریتی، روشهای احراز هویت کارآمدی مثل احراز هویت چندعاملی را به کار گیرد. همچنین مخازن را باید بر اساس کاربرد، میزان حساسیت و مخاطره ای که آنها را تهدید میکند، طبقه بندی نماید. در نهایت، پلتفرمهای مختلف را به گونه ای همگام سازی کند که بتواند برای همه برنامههای کاربردی در حال اجرا، یک محیط امنی را بسازد.
مخزن
متداول ترین مشکل در امنیت معماری مایکروسرویسها زمانی رخ میدهد که آسیبپذیریهایی در کدهای رانتایم (زمان اجرا) مخزن وجود داشته باشد. یک رانتایم آسیبپذیر میتواند همه مخازنی که تحت اداره خودش قرار دارند و همچنین سیستمعامل میزبان را در معرض خطر قرار دهد. با وجود انعطاف پذیری استفاده از آیپیهای پویا برای مخازن، توسعه دهندگان باید ناهنجاریهای شبکه را زیر نظر داشته و آسیبپذیری مخازن مخصوصاً مخازنی که قدیمی تر هستند را همواره بررسی کنند. بنابراین امکان ارسال هشدارهای لازم برای اشخاصی که قادر به حل مشکل هستند، وجود دارد.
البته تعدادی ابزار امنیتی مفید هم وجود دارد که نحوه پیکربندی مخازن را بررسی کرده و آنها را با سیاستهای امنیتی مقایسه میکنند؛ سپس هشدار امنیتی مرتبط را ارسال و مخزن را غیرفعال یا مشکل را کمتر می کنند.
سیستمعامل میزبان
سیستمعامل میزبان نقشی مهم در پیادهسازی یک محیط موفق برای مخازن دارد. از آنجا که این سیستمعامل در پایینترین سطح از معماری مخزن قرار دارد، هدف مهمی برای مهاجمان محسوب شده و نفوذ به آن منجر به نفوذ به همه مخازن روی آن خواهد شد. توسعه دهندگان باید همواره سیستمعامل را بررسی کنند تا آسیبپذیریهای آن را شناسایی کرده و در صورت بروز یک نقص امنیتی، به روز رسانی مرتبط با آن را نصب کنند. این اقدام نه تنها برای مخازن، بلکه باید برای تمام اجزای سطح پایین مثل هسته سیستمعامل که نقش ویژه ای برای امن سازی مخزن دارد، اجرا شود.
پیکربندی مناسب نیز نقش مهمی در امنیت سیستمعامل میزبان دارد. سیستم عامل به منظور افزایش امنیت و کارایی خود باید به صورت یک زیرساخت تغییرناپذیر و مستقل و در سطح برنامههای کاربردی و دادهها اجرا شود. طراحان مختلف، سیستمعاملهای خاصی را برای محیطهایی طراحی کرده اند که فقط شامل سرویسهای لازم برای اداره مخازن هستند. این اقدام علاوه بر افزایش سرعت، منجر به کاهش سطح حمله هم میشود. خوشبختانه امروزه راهکارها و سرویسهای ویژهای عرضه شده اند که به کاهش این چالشهای امنیتی می توانند کمک کنند.
منبع: securityintelligence