Deadshot عبارة عن ماسح ضوئي لطلبات السحب يبحث عن إدخال الأسرار عبر العلاقات العامة عن طريق مطابقة كل سطر مختلف مع مجموعة من التعبيرات السرية المعروفة.
الخدمة مسؤولة عن:
الخدمة لا:
Deadshot هو تطبيق متعدد الحاويات Flask-Celery-Redis يتم تثبيته كتطبيق Github ليتم تشغيله على كل طلب سحب يتم إنشاؤه مقابل الفرع الرئيسي للريبو المثبت عليه تطبيق Github.
حاوية Flask هي نقطة الدخول للخدمة من خلال الكشف عن مسارات API المحددة في blueprints.py. بمجرد استلام حمولة طلب السحب على مسار واجهة برمجة التطبيقات، تقوم الخدمة بإعادة توجيه الحمولة إلى قائمة انتظار Redis لحاوية Celery لالتقاطها ومسحها من خلال اختلاف طلب السحب. بعد أن تقوم حاوية الكرفس بمسح التعبيرات العادية للأسرار المحددة، فإنها تعلق على العلاقات العامة، أو تخطر قناة فريق الأمان، أو تنشئ تذكرة JIRA للفريق للمتابعة. تم تكوين تطبيق Github باستخدام عنوان URL الخاص بـ Flask API وسر مشترك يُستخدم لإنشاء المجموع الاختباري للحمولة النافعة SHA.
إحدى الطرق التي يمكن بها إعداد عنوان URL لواجهة برمجة التطبيقات هي نشر هذا الرمز على مضيف وتعيين موازن تحميل التطبيق لهذا المضيف.
ملاحظة: عند إنشاء التطبيق، يرجى التأكد من أن لديك DNS جاهزًا للمضيف الذي ستنشر عليه حاويات Deadshot وسلسلة سرية آمنة لخطاف الويب السري.
سيحتاج مسؤولو Github إلى إنشاء تطبيق Github وتثبيته على Github قبل تشغيل تطبيق Deadshot أو نشره. لمعرفة المزيد حول إنشاء تطبيق Github، يرجى قراءة هذا الدليل
اسم التطبيق: deadshot (كل الحروف صغيرة. وهذا مهم لأن الخدمة تستخدم هذا الاسم لجلب التعليقات السابقة التي أدلت بها على العلاقات العامة)
عنوان URL للويب هوك: http(s)://your-hosted-deadshot-dns/api/v1/deadshot-webhook
لاختبار ذلك محليًا، يمكنك إنشاء نقطة نهاية ngrok لإدخالها في قسم webhook الخاص بتطبيق Github
لكي يعمل هذا التطبيق، سيتعين على تطبيق Github الخاص بك تمكين الأذونات والاشتراكات التالية في صفحة الأذونات الخاصة بتطبيق Github: أذونات المستودع:
يتم ترك كافة الأذونات الأخرى دون تغيير إلى القيمة الافتراضية لعدم الوصول
الاشتراك في الأحداث:
أخيرًا، انقر على "إنشاء تطبيق GitHub". بعد نجاح إنشاء التطبيق، اتبع رابط "إنشاء مفتاح خاص" في القسم العلوي من صفحة الويب الخاصة بالتطبيق
بمجرد إنشاء المفتاح الخاص، قم بتخزينه في مكان آمن. يعد هذا المفتاح الخاص الذي تم إنشاؤه أحد أجزاء البيانات المستخدمة لإنشاء رمز جلسة للتفاعل مع التطبيق.
بعد إنشاء المفتاح الخاص، قم بتثبيت التطبيق على جميع المؤسسات التي تريد مراقبتها.
هذا تطبيق متعدد الحاويات مصمم لإظهار جميع الحاويات الثلاث (Flask، Celery، Redis) عبر /bin/run.sh، لذا فإن تشغيل صورة Dockerfile يجب أن يعرض التطبيق بالكامل
المتغيرات الثلاثة أدناه هي قيم سلسلة مفردة يقدمها المستخدم
تقوم متغيرات البيئة أدناه بتحميل المسار إلى الملفات التي تحتوي على بيانات الاعتماد. قم بتحميل قيم مفتاح ملف json في الملفات المتوفرة هنا قبل تشغيل التطبيق.
ملاحظة: إذا لم تقم بنقل موقع ملفات أسرار JSON، فلن تحتاج إلى تحديث قيم متغيرات البيئة الثلاثة المذكورة أعلاه الموجودة بالفعل في Dockerfiles أو docker-compose.yaml
سيستخدم هذا الأمر docker-compose.yaml لإظهار كافة الحاويات. يرجى تحديث التكوين/environment/localdev.env بالقيم ذات الصلة بمؤسستك قبل تشغيل الأمر أدناه
make serve
بمجرد الانتهاء من ذلك ولا تنوي استخدام Dockerfile لخدمة التطبيق، انتقل إلى قسم "Server Healthcheck"
هناك طريقتان لإنشاء ملفات Dockerfiles وتشغيلها. هناك أربعة ملفات Dockerfiles موجودة في المستودع، ثلاثة منها تُستخدم لإنشاء صورة فردية لكل حاوية مطلوبة لتشغيل هذه الخدمة، والرابع هو إعداد Dockerfile لإنشاء صورة يمكن استخدامها إما لإظهار ملف Dockerfile. تطبيق القارورة أو عامل الكرفس اعتمادًا على قيمة متغير البيئة DEADSHOT_RUN_MODE (واجهة برمجة التطبيقات أو العامل) المتوفرة لتشغيل أي من الخطوات أدناه، يجب أن تكون موجودًا في المجلد الجذر للمستودع
ملاحظة: تأكد من تحديث متغيرات البيئة في ملفات Dockerfile.api وDockerfile.celery
هناك ثلاثة ملفات Dockerfiles ذات صلة بهذه الخطوة. Dockerfile.api وDockerfile.celery وDockerfile.redis
docker build -f Dockerfile.api -t deadshot-api:<version> .
docker build -f Dockerfile.celery -t deadshot-worker:<version> .
docker build -f Dockerfile.redis -t deadshot-redis:<version> .
تعمل جميع الصور الثلاث المضمنة في الخطوات السابقة في شبكات منفصلة، وبالتالي لن تتمكن من التحدث مع بعضها البعض. لتمكين الاتصالات بين الحاويات، نحتاج إلى إضافتها إلى شبكة الحاويات
docker network create deadshot-network
قم بتشغيل الصور باستخدام الشبكة التي تم إنشاؤها بالترتيب التالي: بدء تشغيل حاوية redis:
docker run --net deadshot-network --name redis deadshot-redis:<version>
بدء حاوية الكرفس:
docker run --net deadshot-network deadshot-worker:<version>
بدء حاوية Flask API:
docker run --net deadshot-network -p 9001:9001 deadshot-api:<version>
لإنشاء صورة عامل إرساء واحدة لإظهار واجهة برمجة التطبيقات وعامل الكرفس استنادًا إلى متغير البيئة DEADSHOT_RUN_MODE
make build
سيقوم هذا الأمر أيضًا بإنشاء صورة redis المطلوبة للخدمة
إذا تم تشغيل الصورة المبنية باستخدام متغير البيئة DEADSHOT_RUN_MODE=api، فسوف يظهر تطبيق Flask إذا تم تشغيل الصورة باستخدام متغير البيئة DEADSHOT_RUN_MODE=worker، فسيتم بدء عامل الكرفس
الآن بعد أن أصبحت واجهة برمجة التطبيقات (API) جاهزة لتلقي طلبات الانتقال إلى http://localhost:9001/api/v1/heartbeat
في المتصفح، يجب أن تعرض استجابة صالحة أو يمكنك إجراء حليقة
curl localhost:9001/api/v1/healthcheck
يجب أن يعرض كلاهما الرسالة التالية: {"healthcheck": "ready"}
إذا كان لديك حمولة webhook لتطبيق Github لطلب السحب الخاص بك، فيمكنك تشغيل أمر الضفيرة التالي محليًا لاختبار تطبيقك:
curl -X POST -H " content-type: application/json " -H " X-GitHub-Enterprise-Host: github.mockcompany.com " -H " X-Hub-Signature: sha1=85df4936c6396c149be94144befab41168149840 " -H " X-GitHub-Event: pull_request " -d @tests/fixtures/good_pr.json http://localhost:9001/api/v1/deadshot-webhook
إذا كنت تريد أن تقوم الأداة بمراقبة أنواع أخرى من الأسرار، فقم بإضافة تعبيراتك العادية في ملف regex.json
ملاحظة: تتيح لك علامة التحقق من الإنتروبيا البحث عن نتائج الإنتروبيا العالية بالإضافة إلى مطابقة التعبير العادي
في الوقت الحالي، تم اختبار Deadshot فقط مع Github Enterprise، ولكن يجب أن يعمل مع Github cloud أيضًا.