مهندسی کامپیوتر دانشگاه علامه طباطبایی ، عاشق کامپیوتر ، برنامه نویس ، دواپس ، اصرار بر متن باز
پروژه ی چشمان عقاب
شاید از اسم مطلب برداشت کنید که دارم درباره یکی از برنامه های سازمان های جاسوسی صحبت میکنم. برداشت اشتباهی نیست چراکه هست ولی اینجا راجب یکی از پروژه های شخصی خودم میخام صحبت کنم که امنیت شما و سرور هاتون رو بالا می بره با برسی آن ها برای مشکل امنیتی.
قاببلیت های این برنامه رو میتوان نصب و حذف و اپدیت برنامه ها روی سرور ها و همچنین برسی تک تک سرور ها برای مشکل امنیتی دانست.
آسیب پذیری های رایج ( CVE )
در مسیر توسعه ی همه ی برنامه ها ما شاهد این هستیم که مشکلات امنیتی وجود دارد که برنامه نویس از وجود آنها ناآگاه هست. پس از این که برنامه روی محیط پروداکشن قرار میگیره کسانی با تست برنامه و برسی آن متوجه مشکلات امنیتی اون خواهند شد و این مشکلات امنیتی را گزارش میکنند در نتیجه به آن ها یک شماره اختصاصی میگیرد. در اینجا میتوانید با جزییات این پروسه رو ببینید.
شماره ی پلتفرم مشترک ( CPE )
برای پیدا کردن آسیب پذیری ها ما باید برای هر یک از برنامه ها CPE رو پیدا کنیم. CPE یک نام گذاری برای همه ی برنامه هاست که ما میتوانیم لیست CVE های خود رو بر اون محدود کنیم تا به توان به راحتی مشکل برنامه ی مورد نظر رو پیدا کنید. اگه بیشتر دوست دارید راجب این موضوع بدونید حتما این اسلاید های استاندارد آمریکا رو ببینید.
نحوه کار پروژه
در این مرحله میخام راجب پروژه یه توضیحات کلی بدم و اینکه چطور کار میکنه رو باهم برسی کنیم البته در آینده قصد دارم مطالب بیشتری درباره ی زبان برنامه نویسی Elixir بگذارم ولی فعلا بدون مبحث زبان لاجیک کد رو باهم برسی کنیم.
ساختار فایل ها به شکل زیر است:
apps/
├── vagent/
│ └── lib/
│ ├── application.ex
│ ├── node_ctl.ex
│ └── version_control.ex
├── vcentral/
│ └── lib/
│ ├── application.ex
│ ├── cve_manager.ex
│ ├── master.ex
│ └── notifier.ex
└── vweb/
توجه داشته باشید ساختار زیر کوچک شده ساختار برنامه هست و ممکن هست مسیر ها هم زمانی که شما مطلب رو مطالعه میکنید تغییر کرده باشد.
برنامه ی عامل
برای جمع آوری نسخه های برنامه ها از سرور ها و سیستم های متعدد اپلیکشن عامل توسعه پیدا کرده است که داری ماژول vagent هست. این ماژول در حال حاظر فقط برای سیستم عامل های Debian و Ubuntu نوشته شده. و اگه بخایم یک برسی با جزییات بیشتر انجام بدیم فایل node_ctl.ex برای این هست که به مستر برنامه بتواند وصل شود. همچنین version_control.ex برای این هست که بتوان کنترل های جداگانه رو داشت.
برای اینکه بتوان حالت های موازی و یا غیر موازی رو به درستی هندل کرد عامل باید یک ماشین حالت داشته باشد که به شکل زیر است:
همان طور که در شکل هم مشخص است پس از اجرای عامل ما باید در حالت get_version ورژن های تمام برنامه های روی عامل رو پیدا کنیم. اگر در این مرحله شکست بخوریم فایده ای برای ادامه ی برنامه عامل وجود ندارد اگر موفق بودیم میتونیم ادامه بدیم و به حالت idel برویم و منتظر دستور ( یا همون فراخوانی calls ها ) از سمت مستر باشیم.
در حالت idel مستر میتواند آپدیت - نصب و یا پاک کردن برنامه ها رو از عامل بخواهد که عامل نتیجه آن را در حالت خود بروز میدهد یعنی مثلا مستر از عامل میخاد که برنامه nginx را مثلا نصب کند. عامل هم حالت موفق را برمیگرداند. این به این معنا نیست که برنامه نصب شده است بلکه عامل برای نصب برنامه تلاش خواهد کرد و در صورت اینکه نصب موفق بوده باشد اگر مجدد مستر لیست برنامه های نصب شده را بگیرد خواهد دید که برنامه به لیست اضافه شده است. به این حالت از اطلاع رسانی Async میگویند که نتیجه ی آن میشود مستر منتظر نخواهد شد برای اجرای هر یک از کد ها در عامل ها.
شاید شما بگویید که چرا نیاز است وقتی مستر از عامل میخواهد عامل نتیجه ای برگرداند چرا که نتیجه ی اصلی در هر صورت در حالت عامل اثر خواهد کرد. شما این سناریو رو در نظر بگیرید که عامل در حال نصب یک برنامه است یعنی در حالت install_app هست. در این شرایط اگر مستر مجدد درخواست بدهد که برنامه ی دیگری نصب شود در همان لحظه عامل عدم موفقیت را به مستر اعلام خواهد کرد چرا که در حالتی هست که امکان نصب برنامه ی دیگری وجود ندارد.
برنامه مستر
برای پردازش و کنترل عامل ها یک برنامه ی مستر وجود دارد که میتواند تعداد زیادی از عامل ها رو کنترل کند.
برنامه مستر دارای دو ماژول vcentral و vweb هست.
ماژول vweb با فریم ورک Phoenix نوشته شده است و برای این است که بتواند API های مورد نظر را ارائه دهد. در حال حاظر لیست API به شکل زیر است:
ماژول vcentral برای کنترل کردن عامل ها ( master.ex ) , برای اطلاع رسانی برنامه های دارای مشکل امنیتی به تلگرام ( notifier.ex ) و همچنین برای برسی برنامه ها و پیدا کردن مشکل امنیتی آن ها ( cve_manager.ex ) ساخته شده است.
نتیجه گیری و تجربه
این پروژه اولین پروژه درست حسابی من با Elixir و همچنین برنامه نویسی توزیع شده بود و باید بگم برنامه نویسی توزیع شده خیلی بنظرم جذاب و سختی هست توصیه میکنم حتما تستش کنید.
ولی اگه بخام از چالش ها بگم باید بگم بنظرم بزرگترین چالش زمان برسی هر کدوم از عامل ها برای پیداکردن مشکل امنیتی بود.
➜ eagle-eyes git:(main) ✗ dpkg-query -W -f='${Package}: ${Version}\n' | wc -l
2511
این تعداد برنامه های نصب شده روی سیستم شخصی من است و خیلی از اون ها اصلا جز های کوچکی از خود لینوکس هستن که CPE ندارن و باتوجه به تعداد زیاد برنامه ها باید کاری انجام میشد که کل پروسه زیر ۱ ساعت انجام بشود پس مجبور شدم کلی حالت بزارم تا بتوان در تایم حدودا ۴۵ دقیقه برسی هر کدام از عامل ها تمام شود.
مطلبی دیگر از این انتشارات
بهترین روش ها برای نوشتن کد قابل تست در کاتلین
مطلبی دیگر از این انتشارات
تفاوت برنامه نویس حرفه ای و آماتور
مطلبی دیگر از این انتشارات
کدومو انتخاب کنم؟ گیت هاب یا گیت لب؟!