
إطار عمل قائم على الحاويات لتمكين دمج المكونات المحمولة في منصات التدريب الأمني
Dockerized Android هو إطار عمل قائم على الحاويات يسمح بتشغيل محاكي Android داخل Docker والتحكم به عبر متصفح. تم تطوير هذا المشروع لتوفير نقطة انطلاق لدمج مكونات الأمان المحمولة في ساحات التدريب السيبرانية (Cyber Ranges)، لكن يمكن استخدامه لأي غرض. على أي حال، لأغراض التطوير والاختبار، يُقترح المشروع docker-android.
كما هو مذكور في الوصف المختصر أعلاه، تم إنشاء هذا المشروع لتوفير نقطة انطلاق لإدخال مكونات الأمان المحمولة في ساحات التدريب السيبرانية. لهذا السبب، ستساعد الميزات المطورة بالفعل والتي ستُضاف في المستقبل المستخدم على تسهيل إعداد محاكاة واقعية (على سبيل المثال للتدريب الأمني). ملف README هذا طويل نوعًا ما، ربما ترغب فقط في الانتقال إلى جزء "كيفية التشغيل".
الميزات التالية متاحة حاليًا:
| الإعداد الأولي | إعداد مدير الحالات | الإعداد اليدوي |
|---|---|---|
| initial-setup | instance-manager-setup | manual-setup |
| ميزات الأدوات | تبديل الحالات |
|---|---|
| toolbox | instance-switch |
يتكون المشروع من ثلاثة أجزاء رئيسية:
المكون الأساسي هو الذي ينفذ جميع العمليات اللازمة لتشغيل مكون Android (محاكى أو حقيقي) داخل حاوية Docker، مع إتاحة بعض الميزات للخارج. بلا شك هو الجزء الأكثر تعقيدًا لأنه يجب عليه إدارة عمليات مختلفة لتوفير مجموعة من الميزات. يوضح الشكل أعلاه تمييزًا واضحًا بين العمليات طويلة العمر، وعمليات البدء، والبرامج النصية المساعدة. بالإضافة إلى ذلك، يوضح هذا الشكل وجود 6 عمليات طويلة العمر، وهذا عدم دقة بسيط أُضيف لتقديم نظرة عامة على المكون الأساسي، في الواقع هناك نوعان مختلفان للمكون الأساسي:
الفرق المعماري الرئيسي يتعلق بالعمليات طويلة العمر: المكون الأساسي للمحاكي يشغل عملية emulator طويلة العمر بينما المكون الأساسي للجهاز الحقيقي يشغل عملية scrcpy طويلة العمر لعرض الجهاز الفعلي والتحكم به. الأجزاء الأخرى متشابهة إلى حد كبير مع بعض المنطق لاتباع سلوك مختلف بناءً على نوع المكون الأساسي.
يوفر مكون واجهة المستخدم طريقة بسيطة لاستخدام جميع الميزات التي يوفرها الخلفية (backend) ويضيف أيضًا القدرة على عرض الجهاز والتحكم به. يجب على المستخدم إدخال عنوان المكون الأساسي والمنافذ المقابلة (المنفذ الذي توفره الخلفية والمنفذ الذي يوفره websockify) يدويًا؛ من خلال هذا الإعداد اليدوي يمكن تغيير المنافذ الافتراضية (وهي 4242 للخلفية و 6080 لـ websockify).
مكون مدير الحالات لديه مهمة توفير جميع المعلومات (أي العناوين والمنافذ) حول المكونات الأساسية قيد التشغيل عبر REST API واحد. يتم ذلك عن طريق كتابة ملف تكوين JSON بسيط يحتوي على جميع المعلومات حول المكونات الأساسية الموجودة في docker-compose لتجنب العمل الشاق لإضافة كل منها يدويًا. هيكل ملف تكوين JSON هو التالي:
{
"instances": [
{
"name": [سلسلة نصية عامة لتعريف الجهاز],
"address": [عنوان المكون],
"core_port": [منفذ الخلفية],
"vnc_port": [منفذ VNC]
}
]
}
الصورة secsi/dockerized-android-core-bare لا تقوم بتنزيل أي صورة نظام، ويمكنك تثبيت المجلد على جهاز المضيف حيث لديك جميع مجلدات SDK
لمشاهدة مثال كامل على كيفية تشغيل المنصة، يمكنك الاطلاع على docker-compose المتاح في دليل examples. يحتوي هذا الدليل على ثلاثة تكوينات مختلفة:
بمجرد فهم كيفية عمله، يمكنك تغييره لتلبية أي احتياجات لديك.
يجب تثبيت Docker و Docker Compose على جهازك.
تتصرف هذه المنصة بطرق مختلفة بناءً على نظام تشغيل المضيف، إليك جدول يلخص التوافق الحالي:
| Linux | Windows | OS X | |
|---|---|---|---|
| أساسي للمحاكي | توافق كامل | غير مدعوم (حتى الآن) | غير مدعوم |
| أساسي للجهاز الحقيقي | توافق كامل | توافق كامل | حل بديل |
بالنسبة لـ Windows و OS X، يجب استخدام VM Linux مع المحاكاة الافتراضية المتداخلة.
للتحقق مما إذا كان جهاز Linux الخاص بك يدعم المحاكاة الافتراضية المتداخلة، يمكنك تشغيل الأوامر التالية:
sudo apt install cpu-checker
kvm-ok
لاستخدام المكون الأساسي للجهاز الحقيقي على OS X، يمكنك:
بالنسبة للاتصال اللاسلكي، توفر Google دليلاً بسيطًا tutorial. للاتصال بـ adb الخاص بالمضيف من داخل الحاوية، يجب عليك الدخول يدويًا إلى الحاوية وتشغيل:
adb -H host.docker.internal devices
الأوامر لبدء استخدام الإطار هي كالتالي:
cp ./examples/docker-compose-core.yml docker-compose.yml
docker-compose up
بشكل أبسط، يمكنك أيضًا استخدام الأمر:
docker-compose -f ./examples/docker-compose-core.yml up
كل ما تبقى هو التنقل عبر متصفح إلى العنوان التالي http://127.0.0.1:8080 وتعيين التكوين الحالي:
إذا لم يتم استخدام مدير الحالات، انقر على الإعداد اليدوي وأدخل المعلومات التالية:
إذا تم استخدام مدير الحالات، انقر على "Instance Manager" وأدخل فقط عنوان IP و رقم المنفذ الخاص به (على سبيل المثال، 193.21.1.100:7373).
هذا كل شيء! يمكنك استخدام الإطار داخل المتصفح.
يمكنك أيضًا بناء الصور بنفسك من خلال البرامج النصية الموجودة في مجلد utils
يمكنك تكوين بعض الميزات لتخصيص الإعداد من خلال متغيرات ENV، الجدول التالي يوفر قائمة بجميعها:
متغير REAL_DEVICE_SERIAL أساسي إذا كان هناك أكثر من جهاز فعلي واحد متصل لأنه إذا كان مفقودًا، فلن يعمل شيء. أخيرًا، قائمة المنافذ المُعرضة من قبل كل مكون:
Dockerized Android هو برنامج مفتوح المصدر ومجاني تم إصداره بموجب ترخيص MIT.
إذا وجدت هذا الكود مفيدًا في بحثك، يرجى النظر في الاستشهاد بورقتنا البحثية:
@inproceedings{Capone2022,
doi = {10.1109/icecet55527.2022.9872834},
url = {https://doi.org/10.1109/icecet55527.2022.9872834},
year = {2022},
month = jul,
publisher = {{IEEE}},
author = {Daniele Capone and Francesco Caturano and Angelo Delicato and Gaetano Perrone and Simon Pietro Romano},
title = {Dockerized Android: a container-based platform to build mobile Android scenarios for Cyber Ranges},
booktitle = {2022 International Conference on Electrical, Computer and Energy Technologies ({ICECET})}
}
يمثل هذا المشروع أطروحة الماجستير الخاصة بنا في هندسة الكمبيوتر في جامعة Federico II of Naples. شكر خاص للأستاذ Simon Pietro Romano والمهندس Francesco Caturano، مصادر الإلهام لهذا العمل.
| إصدار Android | API | الصورة |
|---|
| 5.0.1 | 21 | secsi/dockerized-android-core-emulator-5.0.1 |
| 5.1.1 | 22 | secsi/dockerized-android-core-emulator-5.1.1 |
| 6.0 | 23 | secsi/dockerized-android-core-emulator-6.0 |
| 7.0 | 24 | secsi/dockerized-android-core-emulator-7.0 |
| 7.1.1 | 25 | secsi/dockerized-android-core-emulator-7.1.1 |
| 8.0 | 26 | secsi/dockerized-android-core-emulator-8.0 |
| 8.1 | 27 | secsi/dockerized-android-core-emulator-8.1 |
| 9.0 | 28 | secsi/dockerized-android-core-emulator-9.0 |
| 10.0 | 29 | secsi/dockerized-android-core-emulator-10.0 |
| 11.0 | 30 | secsi/dockerized-android-core-emulator-11.0 |
| - | - | secsi/dockerized-android-core-bare |
| - | - | secsi/docker-android-core-real-device |
| المكون | اسم ENV | القيمة الافتراضية | الوصف |
|---|
| Core | TARGET_PORT | 6080 | منفذ Websockify |
| Core | CUSTOM_APP_DEFAULT_PORT | 4242 | منفذ الخلفية Node.js |
| Core | DEVICEINFO | غير مُعيّن، لكنه يتصرف مثل true | تمكين/تعطيل ميزة معلومات الجهاز |
| Core | TERMINAL | غير مُعيّن، لكنه يتصرف مثل true | تمكين/تعطيل ميزة الطرفية |
| Core | APK | غير مُعيّن، لكنه يتصرف مثل true | تمكين/تعطيل ميزة تثبيت APK |
| Core | FORWARD | غير مُعيّن، لكنه يتصرف مثل true | تمكين/تعطيل ميزة إعادة توجيه المنافذ |
| Core | SMS | غير مُعيّن، لكنه يتصرف مثل true | تمكين/تعطيل ميزة محاكاة SMS |
| Core | REBOOT | غير مُعيّن، لكنه يتصرف مثل true | تمكين/تعطيل ميزة إعادة التشغيل |
| Core | INSTALL_ON_STARTUP | false | تمكين/تعطيل الميزة التي تسمح بتثبيت جميع ملفات APK الموضوعة في مجلد /root/dockerized-android/apk |
| Core | ENABLE_UNKNOWN_SOURCES | false | تمكين التثبيت من مصادر غير معروفة |
| Core | REAL_DEVICE_SERIAL | غير مُعيّن | إذا كان هناك أكثر من جهاز فعلي متصل، يجب تعيين هذه القيمة إلى الرقم التسلسلي للجهاز الذي سيتم التحكم به، وإلا فإن جميع الميزات الأخرى لن تعمل |
| Instance Manager | DEFAULT_PORT | 7373 | منفذ REST API |
| المكون | رقم المنفذ # | الوصف |
|---|
| Core | 5555 | منفذ ADB |
| Core | 4242 | خلفية Node.js |
| Core | 6080 | Websockify (لـ noVNC) |
| UI | 80 | الواجهة الأمامية |
| Instance Manager | 7373 | REST API |