
يفحص ملفات تفريغ نطاقات Azure المُصدَّرة بحثاً عن كلمات مرور نصية صريحة، وسلاسل اتصال، ومفاتيح تخزين، وغيرها من الأسرار؛ وينشئ تقارير CSV/HTML منقّحة لسير عمل التدقيق للقراءة فقط.
ماسح PowerShell يمر عبر مخرجات MicroBurst
Get-AzDomainInfo بحثًا عن كلمات مرور ومفاتيح وسلاسل اتصال وأسرار أخرى
بنص واضح لا ينبغي أن تبقى غير مشفّرة في بيئة Azure.
مصمَّم لسير عمل تدقيق للقراءة فقط: تجمع تفريغًا للنطاق باستخدام MicroBurst
(يكفي وصول Reader لتشغيل Get-AzDomainInfo)، ثم توجّه هذه الأداة إلى
مجلد المخرجات. وهي لا تلمس Azure نفسها — بل تقرأ فقط الملفات التي
صدّرتها بالفعل. قيم الأسرار تكون مُخفاة في كل تقرير، لذا فالمخرجات
آمنة لإرفاقها بالنتائج.
# Clone / copy this folder, then from a PowerShell prompt:
.\Scan-MicroBurst.ps1 -Path .\MicroBurst-2026 -Verbose
أو استورد الوحدة النمطية واستخدم الأمر cmdlet مباشرةً:
Import-Module .\MicroBurstSecretsHunter.psd1 -Force
Invoke-MBSecretScan -Path .\MicroBurst-2026
تُكتب التقارير إلى مجلد يحمل طابعًا زمنيًا (MBSecretScan-<timestamp>) في
الدليل الحالي ما لم تمرّر -OutputDirectory.
افتراضيًا، تكون كل قيمة مُخفاة بحيث تكون التقارير آمنة للمشاركة.
تُخصص الأحرف المكشوفة بمقدار ربع طول القيمة (بحد أقصى 4 في البداية + 2 في
النهاية)، وأي شيء بطول 8 أحرف أو أقل يُستبدل بقناع ثابت العرض — لذلك تظهر
كلمة المرور النموذجية كـ ********، بينما يبقى مفتاح تخزين بطول 88 حرفًا
مميزًا كـ AAAA**********AA. تُخفى سلاسل السياق قبل اقتطاعها، وكل سر
يُعثر عليه في سطر يُخفى من سياق كل نتيجة في ذلك السطر، بحيث لا يبقى أي نص
واضح في التقرير. عند فرز الإيجابيات الكاذبة، غالبًا ما يكون رؤية القيمة
الكاملة أسرع — مرّر -ShowSecrets لإخراج قيم غير مُخفاة في كل مكان
(وحدة التحكم، CSV، HTML). عندها تحمل وحدة التحكم وتقرير HTML لافتة تحذير
واضحة، ويجب التعامل مع التقارير كمواد اعتمادات حيّة:
Invoke-MBSecretScan -Path .\dump -ShowSecrets # raw values, for local triage
يعمل على Windows PowerShell 5.1 وPowerShell 7+ (Windows، Linux، macOS).
كل تشغيل يُنتج ثلاثة أشياء:
| المخرج | الوصف |
|---|---|
| ملخص وحدة التحكم | أعداد ملوّنة حسب الخطورة/الفئة إلى جانب أهم النتائج الحرجة/عالية الخطورة. |
findings.csv | صف واحد لكل نتيجة (الخطورة، القاعدة، الملف، السطر، القيمة المُخفاة، السياق) لفرزها في Excel. الحقول التي تحمل محتوى ممسوحًا ضوئيًا مُهرَّبة ضد حقن صيغ الجداول. |
الأمر cmdlet يُصدر أيضًا كائنات النتائج إلى خط الأنابيب، لذا يمكنك معالجتها لاحقًا:
$f = Invoke-MBSecretScan -Path .\dump -Quiet
$f | Where-Object Severity -eq 'Critical' | Format-Table File,Line,RuleName
مجموعة القواعد الكاملة والقابلة للتحرير موجودة في Private/Get-MBSignature.ps1.
كل قاعدة هي [PSCustomObject] بهذه الحقول:
يصدّر Get-AzDomainInfo متغيرات حسابات التشغيل الآلي وإعدادات التطبيق كصفوف
Name,Value[,Encrypted]. السر موجود في عمود Value بينما الكلمة المفتاحية
التي تحدده (مثل ServiceAccountPwd, dbConnectionString) موجودة في عمود Name —
لذلك لا يرى التعبير النمطي العادي الاثنين على نفس «السطر»، وتكون الكلمة المفتاحية
مدفونة داخل رمز مركّب بدون حدود كلمات.
بالنسبة لملفات .csv / .tsv, يقوم الماسح بالإضافة إلى ذلك بـالاقتران المنظّم للأعمدة
(Private/Get-MBCsvFinding.ps1):
Encrypted=True تُتخطى (القيمة ليست نصًا واضحًا).Password أو StorageKey), يُبلَّغ عن كل خلية ليست عنصرًا نائبًا.القيم التي تغطيها قاعدة عالية الثقة بالفعل (سلاسل الاتصال، مفاتيح التخزين، SAS) تُؤجَّل إلى مرحلة السطور الخام لإخفاء أكثر إحكامًا، وتُزال ازدواجية النتائج حسب الفئة بحيث لا يُبلَّغ عن السر نفسه مرتين. إذا تعذّر تحليل ملف كـ CSV، يعود الماسح تلقائيًا إلى الفحص العادي للسطور الخام.
-ScanValues)الاقتران أعلاه يعتمد على اسم الإعداد. وللحصول أيضًا على الأسرار المخزّنة تحت
اسم بلا معنى (مثل Config1 = P@ssw0rd2026!)، مرّر -ScanValues.
إنه يفحص محتوى خلايا القيم باستدلالين متحفظين منخفضي الخطورة:
!@#$%^&* …) إضافة إلى حروف وفئة أخرى. القيم ذات النمط المعرّفي مثل
Standard_D2s_v3 (ورمزها الوحيد _ - .) تُتجاهل.-MinEntropy. المسارات / عناوين URL / معرفات الموارد (أي شيء يحتوي / أو \)
تُتخطى لتجنب الإبلاغ عن معرفات الموارد.في جداول Name/Value يفحص عمود Value؛ وفي الجداول الحرة يفحص كل خلية.
هذا يضحي باسترجاع أعلى مقابل إيجابيات كاذبة أكثر، لذا فهو معطّل افتراضيًا —
شغّله لفحص أعمق، ثم افرز النتائج منخفضة الخطورة.
تفريغات Azure مليئة بسلاسل طويلة تبدو عشوائية لكنها ليست أسرارًا. الماسح يفلترها:
GUIDs (معرفات الاشتراك / المستأجر / المورد / الكائن) لا يُبلَّغ عنها أبدًا.
العناصر النائبة وأشكال القيم غير السرية — ********, null,
<provide-at-deploy>, true/false, الأحرف المتكررة، رموز القوالب
(${var}, %VAR%)، كائنات/مصفوفات JSON ({...}, [...], بما فيها
متعددة الأسطر)، التواريخ/الطوابع الزمنية، وأسماء أنواع/مجموعات .NET المسلسلة
(مثل عمود Secrets في مجموعة مقياس VM يظهر كـ
System.Collections.Generic.List1[...VaultSecretGroup]) — تُتخطى. لاحظ أن هذا يعتمد على الشكل: عمود Secrets` يحمل قيمة نصية واضحة فعلية
لا يزال يُبلَّغ عنه.
حقول بيانات كلمة المرور الحميدة — أعمدة الدليل التي يحتوي اسمها على
كلمة مفتاحية لكنها تصف فقط سياسة/حالة كلمة المرور، ولا تصف السر نفسه أبدًا
(PasswordProfile, , ,
, , …). هذه شائعة
في تصديرات RBAC مثل /
ولا يُبلَّغ عنها، بينما العمود المسمّى حقًا لا يزال يُبلَّغ عنه.
أعمدة أذونات سياسة الوصول في Key Vault (,
, …) — التي تحمل أفعال أذونات مثل
— تُتجاهل بالمثل.
MicroBurstSecretsHunter.psd1 Module manifest
MicroBurstSecretsHunter.psm1 Module loader
Scan-MicroBurst.ps1 Convenience wrapper script
Public/
Invoke-MBSecretScan.ps1 Main cmdlet (file walk, matching, reporting)
Private/
Get-MBSignature.ps1 Detection rule set (edit to extend)
Get-MBCsvFinding.ps1 Structured CSV Name/Value column pairing
MBHelpers.ps1 Entropy, redaction, context rendering,
CSV field escaping, line windowing,
placeholder/GUID filters
Write-MBConsoleSummary.ps1 Console output
New-MBHtmlReport.ps1 HTML report generator
tests/
sample-dump/ Example Get-AzDomainInfo-style fixture
لتجربته على العينة المرفقة:
.\Scan-MicroBurst.ps1 -Path .\tests\sample-dump
أي شيء لم يستطع الماسح قراءته هو نقطة عمياء، والنقطة العمياء الصامتة تُقرأ على أنها «لا شيء موجود هنا». لذلك يكون الماسح صريحًا بشأنها:
-MaxFileSizeMB تُنتج Write-Warning يسمّيها، وسطر
NOT scanned في ملخص وحدة التحكم، ولافتة في تقرير HTML.-Verbose لعرض المسارات الفردية.AdminPassword خلف أي حد ثابت، لذلك تُفحص الأسطر بنوافذ متداخلة من
8000 حرف بدلًا من ذلك. التكرارات الناتجة من التداخل تُدمج في إزالة الازدواجية.-ShowSecrets ستحتوي على
الاعتمادات الكاملة بالنص الواضح — خزّنها بأمان واحذفها بعد الفرز.report.html | تقرير HTML مكتفٍ بذاته (بدون أصول خارجية) مع بطاقات خطورة، وفلتر نص فوري، ومفاتيح تبديل للخطورة — قابل للمشاركة مع العميل. |
| القاعدة | الخطورة | مثال على المصدر في التفريغ |
|---|
| سلسلة اتصال SQL/قاعدة بيانات تتضمن كلمة مرور مضمّنة | حرجة | إعدادات App Service، تصديرات web.config |
| سلسلة اتصال حساب Azure Storage / مفتاح بطول 88 حرفًا | حرجة | إعدادات التطبيق، تصديرات Storage |
SharedAccessKey لـ Service Bus / Event Hub | حرجة | إعدادات موارد المراسلة |
| مفتاح حساب Cosmos DB | حرجة | إعدادات التطبيق |
| كتلة مفتاح خاص بصيغة PEM | حرجة | تصديرات Key Vault / الشهادات |
| كلمة مرور Azure Redis Cache | عالية | سلاسل اتصال ذاكرة التخزين المؤقت |
سر عميل Azure AD (صيغة ما بعد 2021 …Q~…) | عالية | قوالب ARM، إعدادات التطبيق |
رمز SAS / معامل sig= | عالية | عناوين URL الخاصة بـ SAS للتخزين |
| JWT / رمز حامل | عالية | رموز مخزّنة مؤقتًا وتهيئات |
وجود ملف شهادة / مفتاح (.pfx, .pem, .key, …) | عالية | في أي مكان في التفريغ |
إسناد عام لـ password / pwd | عالية | متغيرات أتمتة، إعدادات تطبيق، معاملات ARM |
إسناد عام لـ secret / client_secret | عالية | إعدادات التطبيق، قوالب |
| مفتاح وصول AWS / رموز GitHub / Slack | عالية/متوسطة | اعتمادات خارجية مخزّنة في تطبيقات Azure |
api_key / access_key / connectionstring عامة | متوسطة | إعدادات التطبيق |
| سلسلة عالية الإنتروبيا (استدلالي) | منخفضة | شبكة أمان لصيغ المفاتيح غير المعروفة — اختياري عبر -IncludeEntropy |
| الحقل | مطلوب | الغرض |
|---|
Id, Name, Category, Severity | نعم | الهوية وكيفية الإبلاغ عن النتيجة وفرزها. |
Pattern | نعم | التعبير النمطي. يُجمَّع مرة واحدة لكل عملية فحص. |
ValueGroup | نعم | مجموعة الالتقاط التي تحمل السر (0 = المطابقة كاملة). تتحكم في الإخفاء. |
MultiLine | لا | التقييم على نص الملف كاملًا بدلًا من سطر بسطر (كتل PEM). تُبلَّغ كل مطابقة، وليس الأولى فقط. |
CaseSensitive | لا | للخروج من الترجمة الافتراضية IgnoreCase. اضبطه للصيغ المعرّفة بحساسية حالة الأحرف (AKIA, ghp_, eyJ, Q~) — وبدونه تُطابق أشكال مشابهة بأي حالة أحرف. |
Redact | لا | اضبطه على $false عندما تكون القيمة الملتقطة تسمية وليست سرًا (سطر ترويسة PEM، اسم ملف شهادة) بحيث تظهر حرفيًا بدلًا من أن تُقنّع إلى درجة غير مقروءة. الافتراضي هو الإخفاء. |
PasswordPoliciesForceChangePasswordNextSignInLastPasswordChangeDateTimePasswordExpirationDateTimeInheritedOwners.csvInheritedContributors.csvPasswordPermissionsToSecretsStrPermissionsToKeysStrGet, List, Set, Deleteتعبيرات التعليمات البرمجية والقوالب — عندما يكون password/secret/إلخ
اسم متغير أو خاصية يشير إلى تعبير وليس قيمة حرفية، تُتخطى القيمة الملتقطة:
استدعاءات أوامر PowerShell (Get-RandomPassword 8,
Get-AzKeyVaultSecret ...)، مراجع المتغيرات بما فيها ذات النطاق
($result, $kv.Secrets, $global:clientSecret, $env:KEY),
التعبيرات الفرعية ((-join $x))، ومراجع ARM / Logic App
(@{body(...)}, @body(...), [parameters('...')]). شائعة في
كتيبات التشغيل الآلي وتعريفات Logic App.
الأشكال الغامضة هنا — $var, (expr), Verb-Noun — لا تُرفض إلا
في الملفات التي تحتوي فعلًا على تعليمات برمجية (.ps1, .json, .tf, .yaml, …).
كلمة المرور غالبًا ما تكون مرجع متغير صالحًا ($ummer2026,
$ecretPass1)، لذا فإن تطبيق هذا الفلتر على خلايا قيم CSV أسقط أسرارًا حقيقية.
علامات القوالب غير الغامضة (@{, @body(, [parameters() تُفلتر في كل مكان.
مجاورة ترويسة العمود — القواعد العامة keyword = value تعامل فقط
: و= كفواصل (وليس ,), لذلك ترويسة CSV مثل ...,AdminPassword,Secrets,...
لم تعد تلتقط اسم العمود التالي ككلمة مرور. أزواج Name,Value المفصولة بفواصل
ما تزال مشمولة بالاقتران المنظّم لـ CSV.
مسارات معرفات الموارد تُقسَّم إلى شرائح قصيرة بدلًا من معاملتها كرمز واحد عالي الإنتروبيا.
صيغ الاعتمادات الحساسة لحالة الأحرف (AWS AKIA…, GitHub ghp_…, JWT
eyJ…, Azure AD …Q~…) تُطابق بحساسية حالة الأحرف، لذلك لا يُبلَّغ عن
أشكال مشابهة بأي حالة مثل akiaijklmnopqrstuvwx. قواعد الكلمات المفتاحية
(password=, AccountKey=) تبقى غير حساسة لحالة الأحرف.
الاستدلال بالإنتروبيا معطّل افتراضيًا — يُنتج نتائج منخفضة الخطورة
مزعجة، لذا تشترك فيه بـ -IncludeEntropy لفحص أعمق. وحتى عندها
لا يعمل إلا على الرموز التي تشبه مادة المفاتيح (حروف+أرقام مختلطة أو علامات base64)،
لذلك تُتجاهل المعرفات بنمط camelCase مثل networkSecurityGroups.
ارفع السقف أكثر مع -MinEntropy 4.5.
| المعامل | الافتراضي | الغرض |
|---|
-Path | (مطلوب) | المجلد الجذر لمخرجات MicroBurst. |
-OutputDirectory | مجلد بطابع زمني | حيث تُكتب التقارير (لا يُفحص أبدًا). لا يمكن أن يكون جذر الفحص نفسه؛ مجلد متداخل بداخله يُطلق تحذيرًا. |
-IncludeEntropy | معطّل | الاشتراك في مرحلة الاستدلال عالي الإنتروبيا (يضيف نتائج منخفضة الخطورة). |
-MinEntropy | 4.0 | عتبة إنتروبيا شانون (بت/حرف) للاستدلال. |
-ScanValues | معطّل | فحص محتوى خلايا قيم CSV أيضًا بحثًا عن أسرار تحت أسماء غير مؤذية (خطورة منخفضة، استرجاع أعلى). |
-ShowSecrets | معطّل | إخراج قيم غير مُخفاة في كل المخرجات لتسريع فرز الإيجابيات الكاذبة. تصبح التقارير مادة اعتمادات حيّة. |
-MaxFileSizeMB | 50 | تخطي الملفات الأكبر من هذا الحجم. الملفات المتخطاة يُحذَّر بشأنها وتُحسب في الملخص وتقرير HTML. |
-IncludeExtension | أنواع النصوص الشائعة | تجاوز أنواع الملفات التي تُفحص (النقطة البادئة اختيارية). |
-NoCsv / -NoHtml | معطّل | تخطي صيغة تقرير. |
-Quiet | معطّل | كتم ملخص وحدة التحكم (الكائنات ما تزال تُرجَع). |