اسکن ایمیج داکر و بررسی آسیب پذیری آن – از صفر تا صد
تصور کنید یک Dockerfile تهیه کردهاید، کانتینر را روی سیستم توسعه تست کردهاید و منتظر CI/CD (اختصاری برای فاز یکپارچهسازی پیوسته و تحویل پیوسته | Continuous Integration and Continuous Delivery) هستید تا از آن استفاده کنید. در نهایت محصول بهروزرسانی میشود، تستهای یکپارچهسازی موفق هستند و آزمایندههای کارکردی چراغ سبز را نشان میدهند. آیا فکر میکنید اینک زمان انتشار محصول فرا رسیده است؟ در ادامه توضیح خواهیم داد که هنوز نوبت این کار نرسیده است و باید اقدام به اسکن ایمیج داکر و بررسی آسیبپذیری آن نیز بکنید.
یک مقاله آموزشی جامع دیگر نیز برای آموزش داکر در مجله فرادرس منتشر شده است که مطالعه آن به علاقهمندان پیشنهاد میشود:
معماری لایههای ایمیج داکر
هر دسته از فایلها که به یک ایمیج اضافه میشوند، در نهایت یک لایه ایجاد میکنند که به ایمیج اضافه میشود. ایمیج داکر شما از مجموع همه این لایهها با ترتیب خاصی که از قبل تعیینشده تشکیل مییابد. همین مفهوم در مورد ایجاد یک ایمیج که از ایمیج والدی با استفاده از دایرکتیو FROM در Dockerfile ارثبری میکند هم صدق خواهد کرد. ایمیج نهایی شامل همه لایههای ایمیج والد به علاوه لایههای خودش خواهد بود.
اگر از یک ایمیج والد استفاده کنید که آن هم از ایمیج والد دیگری بهره میگیرد و آن نیز احتمالاً ایمیج والد دیگری دارد که در نهایت از ایمیج مبنایی مانند اوبونتو یا آلپاین بهره میگیرد، چه اتفاقی رخ میدهد؟ بدین ترتیب در نهایت چند لایه محتوا (یعنی فایلها و برنامههای اجرایی) از ایمیجهای بالادستی به ارث میرسد که هرگز آنها را شخصاً ندیدهاید.
اگر در هر کدام از این لایههای بالادستی یک آسیبپذیری امنیتی وجود داشته باشد، با مشکل مواجه خواهیم شد. در بخش بعدی شیوه تشخیص این آسیبپذیریها را بررسی میکنیم. اما قبل از آن باید بدانیم آسیبپذیری امنیتی دقیقاً به چه معنا است.
آسیبپذیری امنیتی
چنان که در بخش چپ-بالای تصویر فوق میبینید، در ایمیج openjdk:8-jre چند لایه وجود دارد. در سمت راست میتوانید فایلهای موجود در ایمیج را ببینید که متعلق به ابزار Dive (+) هستند. بسیاری از این فایلها برنامههای اجرایی هستند و همانند هر کد دیگری که نوشته میشود مشکوک به مشکلات و آسیبپذیری امنیتی هستند.
در این موارد برخی فایلها در فایلسیستم لوکال قرار دارند که احتمالاً میتوانید روی آنها اسکن ویروس بکنید و باید در همه موارد ممکن این کار را انجام بدهید. به طور کلی یک ویروس را میتوان نوعی آسیبپذیری امنیتی تلقی کرد. با این حال یک ویروس رایانهای نوعی از برنامه کامپیوتری است که وقتی اجرا شود خودش را با تغییر دادن برنامههای دیگر تکثیر میکند و در کدهای دیگر جای میگیرد. زمانی که این تکثیر رخ بدهد، نواحی متأثر از ویروس «آلوده به ویروس» خوانده میشوند.
آسیبپذیریهای امنیتی ویروس نیستند.
آسیبپذیری امنیتی به طور معمول در کدهای منبع به ظاهر خوب قرار دارد که یک مشکل منطقی یا فنی دارند و موجب بروز ضعفی در سیستم میشوند که میتوان از آن برای به مخاطره انداختن یک سیستم بهرهبرداری کرد. چنین آسیبپذیریهایی ممکن است سالها کشف نشده بمانند، تا این که فردی در نتیجه جستجوی فعالانه و یا برحسب شانس آنها را بیابد.
پایگاههای داده آسیبپذیری
وقتی یک آسیبپذیری کشف میکنید که میتواند هزاران و یا میلیونها کاربر را متأثر سازد، کار مسئولانه آن است که آن را گزارش کنید. این کار باید در ابتدا به صورت خصوصی به مالک کد انجام یابد و زمان کافی برای اصلاح مشکل به او داده شود و سپس برای افزایش آگاهی عموم به صورت عمومی منتشر میشود. در حال حاضر پایگاههای دادهای از آسیبپذیریها مانند CVE ،NVD و VULDB وجود دارند که برای چنین اعلانهای عمومی مورد استفاده قرار میگیرند.
اسکن استاتیک آسیبپذیری داکر
مواردی که تا به اینجا مطرح شد به این معنی است که:
- هر ایمیج داکر شامل لایههایی از فایلها و برنامههای اجرایی است.
- آسیبپذیریهای امنیتی سورس کد برنامه اجرایی (یا کتابخانه) به صورت عمومی در پایگاههای داده آسیبپذیری نگهداری میشوند.
با ترکیب دو نکته فوق به این نتیجه میرسیم که میتوانیم با مقایسه برنامههای اجرایی موجود در لایههای خودتان با پایگاههای داده آسیبپذیری آنلاین، آن ایمیجهای داکر که قبلاً به عنوان تهدید امنیتی شناسایی شدند را بیابیم.
موتور Anchore
ابزارهای زیادی به منظور بررسی اسکن ایمیجها وجود دارند که برخی از آنها متن-باز و برخی دیگر پولی هستند و امکان اسکن ایمیجها و یافتن آسیبپذیریهای شناختهشده را فراهم میسازند. این ابزارها میتوانند به عنوان بخشی از فرایند CI/CD اجرا شوند و یا به رجیستری ایمیجها اتصال یافته و ایمیجهای جدید را به محض موجود شدن اسکن کنند. برخی از این ابزارها شامل مورد فهرست زیر هستند:
در این بخش به عنوان یک تمرین عملی قصد داریم شیوه استفاده از Anchore را بررسی کنیم. Anchore شامل یک نسخه تجاری (Anchore Enterprise) و یک نسخه متنباز (Anchore Engine) است.
Anchore مجموعه بزرگی از مشتریها شامل شرکتهای بزرگی از قبیل Cisco ،eBay ،Atlassian ،Nvidia و RedHat را در اختیار دارد. نسخه تجاری یک UI اضافی، RBAC، امکان پشتیبانی و مواردی از این دست را در اختیار شما قرار میدهد. با این حال در پسزمینه همچنان از همان نسخه متنباز یعنی Anchore Engine که در ادامه مورد استفاده قرار خواهیم داد، بهره میگیرد.
نصب
Anchore Engine به صورت یک مجموعه از ایمیجهای داکر عرضه شده است که میتوانند به صورت مستقل یا درون یک پلتفرم هماهنگسازی مانند Kubernetes ،Docker Swarm ،Rancher ،Amazon ECS و یا دیگر پلتفرمهای از این دست اجرا شوkد. بدین ترتیب میتوانید نسخه لوکال Anchore Engine را به سرعت با استفاده از Docker Compose و با تک خط زیر بوت کنید:
curl https://raw.githubusercontent.com/anchore/anchore-engine/master/docker-compose.yaml | docker-compose -p anchore -f – up
فایل docker-compose.yaml فوق، پنج کانتینر میسازد و سپس تلاش میکند پایگاههای داده آسیبپذیری آنلاین را واکشی کند و از این رو برای تکمیل عملیات خود به چند دقیقه زمان نیاز دارد.
اجرای کلاینت
Anchore Engine از طریق کلاینت خط فرمان در اختیار ما قرار میگیرد. کلاینت CLI را میتوانید به راحتی از طریق یک ایمیج داکر دیگر اجرا کنید:
docker run --rm -e ANCHORE_CLI_URL=http://anchore_engine-api_1:8228/v1/ --network anchore_default -it anchore/engine-cli
اکنون یک Shell برای کلاینت CLI انکور داریم که میتوانیم یک دستور تست مانند دستور زیر در آن اجرا نماییم:
anchore-cli –version
بررسی یک ایمیج داکر
Anchore Engine یک گزارش ارزیابی آسیبپذیری در دو گام ارائه میکند. ابتدا باید یک ایمیج را به آن ارائه کنید تا اسکن شود و سپس میتوانید درخواست گزارش آسیبپذیری برای آن ایمیج بکنید. توجه داشته باشید که این دستور برای دانلود و اسکن کردن ایمیج به زمان نیاز خواهند داشت. در مثال زیر از یک ایمیج قدیمی وردپرس که آسیبپذیریهای شناختهشدهای دارد بهره میگیریم:
anchore-cli image add wordpress:4.6.0 && anchore-cli image wait wordpress:4.6.0
ما با دستور فوق یک ایمیج جدید برای آنالیز اضافه میکنیم و منتظر میمانیم تا گزارشهای Anchore تکمیل شوند.
مشاهده آسیبپذیری
برای دیدن آسیبپذیریهای امنیتی کشفشده میتوانید دستور زیر را اجرا کنید:
anchore-cli image vuln wordpress:4.6.0 all
در یک ایمیج قدیمی مانند مثال فوق آسیبپذیریهای بسیار زیادی وجود دارند. در واقع Anchore 1420 آسیبپذیری کشف شده برای ایمیج وردپرس مربوط به سال 2016 نشان میدهد!
چنان که میبینید وهلهسازی از یک کانتینر داکر با ایمیج فوق عملی با ریسک بسیار بالا است. اگر این ایمیجی باشد که شما برای توزیع اپلیکیشن میسازید، باید تا زمان ارزیابی آسیبپذیری، انتشار آن را مسدود کنید.
سخن پایانی
نرمافزار (همچنان) از سوی انسان نوشته میشود و انسانها دچار خطا میشوند. نباید اجازه دهیم چنین خطاهایی باعث از کار افتادن ایمیجهای داکر شوند. با بهرهگیری از یک اسکنر آسیبپذیریهای امنیتی بر روی ایمیجهای داکر به عنوان بخشی از فرایند CI/CD و انتشار قواعدی برای مسدود کردن شرطی انتشارها در زمان کشف آسیبپذیری میتوانید این ریسکها را کاهش دهید.
اگر این مطلب برای شما مفید بوده است، آموزشهای زیر نیز به شما پیشنهاد میشوند:
- مجموعه آموزشهای برنامهنویسی
- آموزش داکر (Docker) برای توسعهدهندگان (رایگان)
- مجموعه آموزشهای دروس علوم و مهندسی کامپیوتر
- آموزش داکر (Docker) — مجموعه مقالات مجله فرادرس
- اکوسیستم داکر (Docker) — کامپوننتهای رایج
==
سلام
من قصد دارم بروی ویروس ها و انواع تروجان ها تحقیق کنم
و این کار را نمیشه در سیستم اصلی انجام داد
اگه برنامه های الوده را روی داکر ایمیج اجرا کنم سیستم من در امنیت است ایا؟؟
امکان این موجود داره که ویروس از ایمیج داکر به سیستمم راه پیدا کنه ؟؟