
حل AWS Serverless لتوزيع أعباء عمل الاستطلاع وفحص الثغرات الأمنية. قدّم المهام عبر واجهة الويب؛ وتنفّذ عُقد EC2 نصوص Python المخصصة باستخدام أدوات مثل Nmap.
تم إنشاء CowCloud في الأساس لتشغيل أدوات الاستطلاع وفحوصات الثغرات الأمنية بطريقة موزعة؛ على سبيل المثال، قد يكون أحد حالات الاستخدام من قبل صيادي الثغرات (bug bounty hunters). يهدف هذا الحل إلى تجريد المستخدمين النهائيين من العمل الأساسي المطلوب لتوزيع أعباء العمل في AWS. يوفر CowCloud للمستخدمين واجهة ويب سهلة لعرض المهام الجديدة وإنشائها، والتي يتم استهلاكها لاحقًا بواسطة كود Python يعمل على العقد العمالية (حالات EC2). من المقصود أن يتم تخصيص كود Python وكذلك AMIs الخاصة بـ EC2.
كمثال، لنفترض أنك تريد تشغيل فحوصات Nmap. في هذه الحالة، يمكنك ببساطة اختيار AMI من كتالوج AMI وتحديث الحقل image_id في Terraform/ec2_module/ec2_module.tf. بعد ذلك، يجب تحديث ملف ec2py/template.py لتخصيص وسائط فحص Nmap (-Pn, -p 443, etc). أخيرًا، يجب تحديث الحقل user_data في ملف إعداد Terraform/ec2_module/ec2_module.tf لتثبيت Nmap وتبعياته.
خيار آخر هو تثبيت وتشغيل العديد من الأدوات التجارية، وفي هذه الحالة قد ترغب في إنشاء حالة EC2 خاصة بك أو snapshot. في هذه الحالة ستقوم بتثبيت جميع التبعيات وتفعيل التراخيص بحيث يمكنك استخدام هذا الـ AMI كصورة ذهبية (gold image) لعمالك

يمكن تقسيم CowCloud إلى ثلاثة مكونات رئيسية:
هذه هي الميزات الرئيسية:
autoscalingStrategy.py)retention_timeextra_docker_params في ملف template.py (هذا موضح في قسم المشرف/المسؤول عن الصيانة بالأسفل)
كنتيجة لتنفيذ Terraform، يتم إنشاء ملف جديد (config.js)؛ يحتوي هذا الملف على الإعدادات المطلوبة لتطبيق React JS لكي يتمكن من المصادقة ضد دليل مجموعة مستخدمي Cognito. بعد نشر البنية التحتية، عليك بناء تطبيق React ورفع مجلد build. بالإضافة إلى ذلك، عليك رفع كود Python إلى حاوية S3 تعمل كمستودع أكواد. هذه العملية مؤتمتة في سكربتين setup.bat و setup.sh، لذا لا داعي للقلق بشأن هذا الأمر، وهذه مجرد خلاصة لهذه المرحلة.
يتم نشر البنية التحتية في منطقة us-east-1 افتراضيًا، على الرغم من أنه يمكن تغيير ذلك في ملف locals.tf داخل مجلد Terraform.
الخطوات:
variables.tf؛ يجب أن يشير المتغير ami إلى AMI حالي من EC2، ويمكن أن يكون AMI الذهبي الخاص بك أو أحد الـ AMIs من كتالوج EC2.aws configure. تحقق من إعدادها بشكل صحيح بتشغيل هذا الأمر: aws sts get-caller-identity؛ عند التكوين الصحيح يجب ألا يُرجع خطأ.aws ec2 create-key-pair –key-name cowCloud –query “cowCloud” –output text > ec2_module/cowCloud.pemgit clone [email protected]:nccgroup/cowcloud.git
# Deploy the infra
cd cowcloud
cd Terraform
terraform init
terraform plan
terraform apply --auto-approve
الآن أنت جاهز! سجّل، وسجّل الدخول، وأنشئ مهمة جديدة!
بمجرد نشر كل شيء وأصبحت الواجهة الأمامية قابلة للوصول، اتبع هذه الخطوات:
CowCloud\ec2py> python .\decypt_file.py 2e8cf87c-5389-11ec-abec-d6d1f378b18d
الشخص المسؤول عن نشر البنية التحتية وصيانتها عليه أن يعقّم ويتحقق بشكل صحيح من مدخلات المستخدم النهائي المقدمة عبر تطبيق الويب. بعبارة أخرى، تأكد من أن الكود في ec2py/template.py ليس عرضة لحقن أوامر نظام التشغيل (OS command injection).
هذه النقطة أُبرزت لأنها الجانب الأكثر حرجًا في النظام. تم اتخاذ عناية خاصة للحد من نطاق صلاحيات العامل وتعرضه وبالتالي تقليل المخاطر المرتبطة بذلك. ومع ذلك، فإن مسؤولية هذا الجانب من أمان النظام تقع على عاتق المشرف.
سياسات الدور (role policies) المرتبطة بملف تعريف حالات EC2 مدرجة في ملف readme.md داخل مجلد Terraform
workers_manager.py يستدعيها أداة ec2py لتنفيذ إجراءات أكثر امتيازًا. تم نقل هذه الإجراءات إلى دالة Lambda للحد من المخاطر في حال تعرض مفتاح الوصول الخاص بالدور المرتبط بملف تعريف EC2 للاختراق. وهي تعمل مع IMDSv2 على أي حال.
سياسات الدور المرتبطة بدالة Lambda workers_manager.py مدرجة في ملف readme.md داخل مجلد Terraformإذا كنت تريد التقاط stdout وعرضه من خلال واجهة الويب أثناء تنفيذ المهمة، فانتقل إلى ec2py/template.py واتبع هذه الخطوات:
extra_docker_params يتضمن المعلومات المطلوبة لحاويات Docker الخاصة بك لإرسال stdout إلى مجموعات سجلات CloudWatch. ستحتاج إلى تضمين هذا المتغير في سطر الأوامر عندما تريد عرض stdout من خلال الواجهة الأمامية.cmd = f"docker run {extra_docker_params} --rm -v {tmp_folder}target.txt:/root/Tools/reconftw/target.txt -v {tmp_folder}reconftw.cfg:/root/Tools/reconftw/reconftw.cfg -v {tmp_folder}Recon/:/root/Tools/reconftw/Recon/ six2dez/reconftw:main -l target.txt -w".split(' ')
يمكنك تدمير البنية التحتية بتشغيل هذا الأمر البسيط: terraform destroy --auto-approve وسيؤدي ذلك إلى إزالة جميع الموارد الموجودة.
ملاحظة: لا تقاطع هذه العملية لأن ذلك قد يترك بعض العناصر في السحابة، وسيتعين عليك بعدها تحديدها وإزالتها يدويًا.


terraform destroy --auto-approve -target module.gateway_module.aws_api_gateway_deployment.lambdaterraform apply --auto-approve -target module.gateway_module| المتغير | القيمة الافتراضية | الوصف |
|---|
eipenable | false | إذا كانت القيمة true، يخصص الحل مجموعة من عناوين IP المرنة (Elastic IP) المرتبطة بالعقد العمالية عند تشغيلها. يتم حساب عدد عناوين EIP التي سيتم حجزها باستخدام هذه الصيغةsum([var.max_workers, var.maximum_number_of_terminating_machines]) |
cidr_whitelist | [] | القائمة البيضاء CIDR للسماح فقط بنطاقات IP معينة في جدار الحماية. مثال: ["195.95.131.0/24"] |
max_workers وmax_queued_tasks_per_worker | max_workers: 3, max_queued_tasks_per_worker: 10 | يحدد هذان الإعدادان متى يتم التوسيع إلى الداخل أو إلى الخارج، مثال max_workers 3, max_queued_tasks_per_worker 10. وهذا يعني أنه إذا تجاوز عدد المهام عشرة، سيتم إنشاء حالة EC2 جديدة. إذا كان هناك أكثر من عشرين مهمة، سيكون هناك حد أقصى قدره ثلاث حالات EC2 متاحة لتوزيع أعباء العمل (اطّلع على الخوارزمية الموجودة في هذا السكربت Terraform/dynamodb_module/autoscalingTool/autoscalingStrategy.py). |
maximum_number_of_terminating_machines | 2 | يحدد هذا عدد الحالات التي تم ضبطها للإنهاء ولكنها معلقة حتى يكمل المعالجة/الفحص المهمة. |
heartbeat_timeout | 900 | يحدد هذا الوقت الذي يبقى فيه هؤلاء العمال معلقين. بعد انتهاء هذا الوقت، سيتم إنهاء العامل قسريًا. |
instance_type | t2.micro | https://aws.amazon.com/ec2/instance-types/ |
ami | null | https://aws.amazon.com/es/amazon-linux-ami/ |
retention_time | 7 | اضبط مدة الاحتفاظ (بالأيام) للسجلات وانتهاء صلاحية عناصر جدول الأرشيف (المهام المكتملة). |