DevOps/SRE
اسکن امنیتی ایمیج های داکری
توی این مقاله میخوام در مورد روند ساخت یک پروژه برای خودکارسازی اسکن امنیتی ایمیجهای داکر صحبت بکنم و پروژه ای رو با شما به اشتراک بزارم تا شما هم بتونید از مزایاش توی سازمانتون استفاده بکنید.
دقیقا یادم نمیاد چه تاریخی بود که همکار خوبم علیرضا حمیدی داشت ابزارهای grype و trivy و ... رو با هم مقایسه میکرد و تفاوت هاش رو به ما ارائه میداد. بعد از اون جلسه تصمیم نهایی رو گرفتیم که با ابزار grype پیش بریم.
اما چرا این همه زحمت؟ زمانی که برای یک سازمان بزرگ مثل ازکی کار میکنید باید بتونید محافظت از امنیت اطلاعات کاربران و سازمانتون رو توی لایه های مختلف پیاده سازی بکنید، یکی از اون لایه های ایمیج های داکر هست که عموما به خاطر نبودن ابزار آماده یا پولی بودن این ابزارها، نادیده گرفته میشه یا به صورت مرتب انجام نمیشه، ما توی ازکی دنبال راه حل مناسب بودیم و این شد که به سمت ساختن یک پروژه برای استاندار سازی خروجی اسکن های امنیتی ایمیجهامون رو آوردیم.
من دست به کار شدم و شروع کردم به پیدا کردن یک راه حل مناسب برای این مشکل، اما چه نیازمندی هایی داشتیم؟ اول از همه این راهکار باید بتونه به صورت دوره ای اجرا بشه و نیاز به عملیات دستی نداشته باشه تا هزینه جدیدی برای اجرا به تیم اضافه نشه، نیازمندی دیگه ما این بود که بتونیم دیتایی هیستوریکال داشته باشیم تا در صورت نیاز بتونیم به بهبود تا بدتر شدن شرایط اشاره بکنیم. در همین راستا علیرضا پیشنهاد داد که از خروجی html ابزار grype استفاده بکنیم. خروجی رو به همه تیم ارائه داد و فوق العاده بود! یه صفحه html به صورت تک فایل و بسیار سبک، همینطور این فایل قابلیت کاستومایز شدن داشت.
با این اطلاعاتی که به مرور زمان جمع کردیم شروع کردم به پیدا کردن یک راه حل مناسب، برای شروع یک ابزار CLI پایتون توسعه دادم که بتونه یک فایل، شامل لیستی از ایمیجهای داکری، که نیاز به اسکن داره رو بخونه و با استفاده از دسترسی shell ابزار grype رو صدا بزنه و خروجی های html مورد نیاز رو آماده بکنه.
خب حالا نیاز داریم که بتونیم فایل هایی که با پوشه بندی بر اساس تاریخ به صورت خروجی داریم رو توی مرورگر نشون بدیم. برای این کار هم از وبسرور nginx استفاده کردم و خروجی هایی که ساختم رو با استفاده از دستور autoindex به کاربران نمایش دادم. آیا این کافی بود؟ نه، اینکه خروجی پوشه ها رو ببینیم برای من کافی نبود و با استفاده از دستورات add_before_body و add_after_body توی nginx یک قالب هم به خروجی نمایش داده اضافه کردم و از حقه های regex مختلف استفاده کردم برای اینکه این قالب فایل های از پیش ساخته grype رو تحت تاثیر قرار نده و خرابشون نکنه. آیا کافی بود؟ بله :) .
به تبدیل این پروژه به یک helm فکر کردم و تا مراحل خوبی هم پیش بردمش (توی هیستوری گیت میتونید ببینید)، ولی در نهایت پشیمون شدم و خروجی رو به شکل داکر کامپوز آماده کردم، دلیلم برای این کار چی بود؟ چون میخواستم همه بتونند از این سرویس استفاده بکنند و فقط برای کسایی که سرویس کوبرنتیز دارند جذاب نباشه (باور من این هست که توی اولویت بندی امروزم، کسی که کوبرنتیز داره خودش میتونه پروژه من رو تبدیل بکنه به manifest از روی داکر کامپوزی که ساختم).
قبل از اجرای پروژه داخل دو فایل در صورت نیاز تغییر ایجاد بکنید. فایل اول یک فایل .env هست برای استفاده از ریپازتوری داکر کاستوم و فایل دوم images.txt هست برای معرفی کردم آدرس ایمیج هایی که میخواید اسکن بشه. توی عکس زیر هم میتونید ساختار پروژه خام رو مشاهده بکنید.
بعد از پایان تنظیم کردم دو تا فایل مورد نظر حالا میتونید پروژه رو ران بکنید. برای اینکار یک دستور برای اجرا شدن وبسرور نیاز دارید و یک دستور دیگه که میتونید به صورت دورهای اجرا بکنید یا با ابزاری مثل cron برای زمان های خاصی زمان بندی بکنید.
دستورات مورد نیاز و یک نمونه از cron برای اجرا در ابتدای هر هفته رو براتون همین پایین گزاشتم:
# Run webserver
docker compose up -d web
# Run the scan result generator
docker compose up --build generator
# Run the scan generator as a job in crontab
0 0 * * FRI root { cd /opt/image-sec-scan && docker compose up --build generator; } > /opt/image-sec-scan/run.log 2>&1
بعد از اجرا به پرت ۸۸۸۸ (دیفالت) یا پرتی که داخل فایل .env کاستوم کردید سر بزنید و خروجی اسکن رو مشاهده کنید. تصویر نمونه خروجی اسکن با دیفالت پروژه:
توی خروجی نهایی، میتونید سرچ کنید، فیلتر کنید و یا حتی خروجی pdf بگیرید!
امیدوارم این راهکار برای شما مفید باشه و اگر نیاز بیشتر یا پیچیدهتر دارید خوشحال میشم که مشارکتهای شما رو توی پروژه داشته باشم.
آدرس پروژه توی گیت هاب: github.com/erfantkerfan/image-sec-scan
من عرفان قلی زاده یک مهندس DevOps هستم و سعی میکنم از تجربیاتم که میتونه براتون مفید باشه به صورت منظم و نامنظم بلاگ بنویسم.
مطلبی دیگر از این انتشارات
تجربه من به عنوان Agile Delivery Manager در ازکی
مطلبی دیگر از این انتشارات
رویکردی متفاوت به سوپراپلیکیشن؛ قدم به قدم با ریدیزاین صفحه اصلی ازکی
مطلبی دیگر از این انتشارات
یک شرکت بیمه چهجوری استراتژی سرمایه گذاری میچینه؟