
تقييم قراءة فقط لبيانات اعتماد التطبيقات في Entra ID: يُعدّ أذونات Graph وAzure RBAC والبيانات السحابية القابلة للوصول، ثم يربط النتائج بمسارات تصعيد الامتيازات والحركة الجانبية.
/ / ______ ___ ___ / /_ / / / /__ _ / / /_____ ____ \ / -) / -) -)/ / \ \ / __/ _ `// / '/ -) / //_/_/_/_/ _/ // _/_,////_\__/_/
╔╦╦╬╬╬╬╬╬╦╦╗
╔╬╬╬╝╝┘ ╚╝╝╬╬╬┐
╬╬╝╚╩╬╗╔ ╚╬╬╬
╬╝ ╚╬╬╗╗ ╔ ╚╬╗ ╬╬ ╔╗ ╚╬╬╬╬╬╬╦ ╬╬ we found your secret... ╔╬┤ ╬╬╬ ╬╬╬╬╬╬╬╬╝╝╝╬╬╗ ...now let's see what it ╬╬┤ ╚╩┘ ╚╬╬╬╬╬╩ ╠╬╬ can REALLY do. ( o_o)>=|= ╬╬┤ ╠╬╬ ╬╬ ╦╗ ╗╗ ╬╬ [ client_id + secret -> total recall ] └╬┐ ╚╬╗╗ ╔╬╬╝ ╔╬┘ └╬╗ ╚╩╩╬╬╬╩╩╝╝ ╔╬╬ ╚╬╬╬╗ ┌╗╬╬╝┘ ╚╩╬╬╬╦╦╦╦╦╦╬╬╬╝╝ ╚╚╝╝╝╝ // pst... that app registration talks too much. \
**ما الذي يمكن أن يفعله معرّف عميل Entra ID + السرّ فعليًا؟**
لقد عثرت على بيانات اعتماد تطبيق Entra ID (Azure AD) — معرّف عميل وسرّ —
ضمن مهمة مرخَّصة، والمستأجر (tenant) الذي تنتمي إليه ضمن النطاق المخوَّل.
يأخذ `secret_stalker` هاتين القيمتين ويخبرك، من نقطة البداية الباردة:
1. **هل هو صالح، ومتى تنتهي صلاحية السرّ؟** — وإذا لم يكن صالحًا، *ما السبب*
(سرّ خاطئ، سرّ منتهي الصلاحية، التطبيق غير موجود في المستأجر…). بالنسبة لسرّ صالح،
يقرأ `passwordCredentials` لتسجيل التطبيق ويُبلّغ عن تاريخ الانتهاء
+ الأيام المتبقية (يتطلب قراءة الدليل؛ انظر الملاحظة أدناه).
2. **ما صلاحيات Microsoft Graph التي يحملها؟** — أذونات التطبيق تُقرأ
مباشرةً من الرمز المصدَر، بالإضافة إلى **أدوار دليل Entra** التي يمتلكها (حتى
يتم اكتشافها سلبيًا من مطالبة `wids` في الرمز) و**الكائنات التي يملكها**
(تطبيقات/كائنات خدمة (SPs) يمكنك إضافة بيانات اعتماد إليها).
3. **ما التحكم الذي يملكه على Azure؟** — تعيينات أدوار RBAC على نطاق
مجموعة الإدارة والاشتراك.
4. **هل يمكنه الوصول إلى بيانات حقيقية؟** — فحوصات اختيارية لقابلية الوصول إلى
Key Vault (الأسرار / المفاتيح / الشهادات)، وStorage (blob / file / queue / table)،
وCosmos DB على مستوى البيانات.
5. **ما الأثر؟** — الأذونات والخطيرة والأدوار والملكية والبيانات التي يمكن الوصول إليها
مرتبطة بأساليب معروفة لتصعيد الامتيازات / الحركة الجانبية، مقيَّمة حسب الخطورة،
مع سرديات ملموسة **لمسارات الهجوم**.
يُصادق باستخدام إما **سرّ عميل** أو **شهادة** (`--cert`)،
ويعمل مع **السحب التجارية والسيادية** (`--cloud`).
إنه **سلبي افتراضيًا** و**لا يعدّل أي شيء مطلقًا** — تعداد للقراءة فقط.
> ⚠️ **للاستخدام المصرَّح به فقط.** شغّله فقط على المستأجرين الذين هم
> ضمن النطاق صراحةً لمهمة مخوَّل لك تنفيذها.
---
## التثبيت```bash
pip install -r requirements.txt # just runs it from source
# — or —
pip install . # installs the `secret_stalker` command
pip install '.[cert]' # + certificate (--cert) auth support
pip install '.[dev]' # + pytest for the test suite
الاعتماد الوحيد في وقت التشغيل هو requests. يتم فك تشفير الرموز محليًا (base64 + JSON) — بدون التحقق من التوقيع، بدون مكتبة تشفير، بدون Microsoft SDK. الاستثناء الوحيد هو مصادقة الشهادة (--cert)، والتي تتطلب حزمة cryptography الاختيارية لتوقيع تأكيد عميل JWT. يتطلب Python 3.7+.
بعد pip install . يمكنك استدعاؤه كـ secret_stalker … بدلاً من
python -m secret_stalker ….
أسرع طريقة لمعرفة ما يمكن أن تفعله بيانات الاعتماد:```bash
python -m secret_stalker
--tenant contoso.onmicrosoft.com
--client-id 11111111-2222-3333-4444-555555555555
--secret ''
`--tenant` يقبل إما GUID لمعرّف مستأجر (tenant) أو نطاقًا (domain) — ويُحلّ النطاق إلى معرّف المستأجر الخاص به تلقائيًا عبر نقطة نهاية تكوين OpenID العامة.
### أبقِ السرّ خارج سجلّ محفوظات الصدفة (shell history)
مرّر بيانات الاعتماد عبر متغيرات البيئة بدلاً من الخيارات (flags):```bash
export SS_TENANT=contoso.onmicrosoft.com
export SS_CLIENT_ID=11111111-2222-3333-4444-555555555555
export SS_SECRET='<client-secret>'
python -m secret_stalker
أي من --tenant / --client-id / --secret يمكن أن يأتي من SS_TENANT /
SS_CLIENT_ID / SS_SECRET. الخيارات (Flags) لها الأولوية على البيئة.
لا يقتصر الأمر على محفوظات الصدفة فقط: قيمة argv قابلة للقراءة من قبل أي مستخدم محلي
طوال عمر العملية (ps, /proc/<pid>/cmdline). إذا تم تمرير --secret
أو --cert-password كخيار، تطبع الأداة تذكيرًا من سطر واحد إلى
stderr — ولا يظهر أبدًا في مخرجات --json أو --export.
غالبًا ما تستخدم تسجيلات التطبيقات شهادة بدلاً من سرّ. مرّر --cert
(PEM يحتوي على المفتاح الخاص و الشهادة، أو .pfx/.p12) وستقوم
الأداة بالمصادقة عبر تأكيد عميل JWT موقّع:```bash
python -m secret_stalker --tenant contoso.onmicrosoft.com
--client-id --cert ./app.pem # or app.pfx
python -m secret_stalker ... --cert app.pfx --cert-password ''
يتطلب مصادقة الشهادة حزمة `cryptography` الاختيارية (`pip install '.[cert]'`).
يُبلغ الأداة عن تاريخ انتهاء صلاحية الشهادة نفسها (المطابقة عبر بصمة الإبهام في
`keyCredentials` الخاصة بالتطبيق)، تمامًا كما يفعل للسر. يقرأ `--cert`/`--cert-password`
أيضًا من `SS_CERT` / `SS_CERT_PASSWORD`.
### السحابات السيادية والحكومية
بشكل افتراضي، يستهدف secret_stalker السحابة **التجارية**. بالنسبة للمستأجرين السياديين،
مرر `--cloud` (أو `SS_CLOUD`) بحيث تتطابق سلطة Entra ونقاط نهاية Graph / ARM / Key
Vault — وإلا ستبدو بيانات الاعتماد الصالحة كما لو أنها لا تملك أي وصول:```bash
# US Government (GCC High)
python -m secret_stalker --cloud usgov --tenant contoso.onmicrosoft.us ...
# US DoD (L5)
python -m secret_stalker --cloud usdod ...
# Azure operated by 21Vianet (China)
python -m secret_stalker --cloud china --tenant contoso.partner.onmschina.cn ...
الأسماء المستعارة مثل gov وdod وcommercial وgcc-high و21vianet مقبولة.
(إن audience الخاص بمستوى البيانات في Storage، storage.azure.com، هو نفسه في كل سحابة.)
يُجري المصادقة، ويخزّن خريطة appRole الخاصة بـ Graph للمستأجر مؤقتًا في
~/.secret_stalker/app_roles_cache.json، ثم يخرج. تخطَّ هذه الخطوة إذا كانت
بيانات الاعتماد غير قادرة على قراءة كيانات الخدمة — فما زالت الخريطة المرفقة تغطي
الأذونات المعروفة.
Credential status : VALID Tenant : aaaaaaaa-... Client (app) id : 1111... App display name : Recon App SP object id : cccc... Secret : valid — expires 2027-03-01 (in 207 days)
OK graph OK arm NO storage — no storage token
...
[CRITICAL] (GRAPH) Application.ReadWrite.All Can add credentials to any app/SP and impersonate it — tenant-wide pivot. [CRITICAL] (ARM) Owner Full control including granting access to others. [CRITICAL] (DATA) keyvault:secrets Can read Key Vault secret values — connection strings, passwords, tokens. [MEDIUM] (GRAPH) Mail.Read Read all mailboxes — data exposure.
Overall risk: CRITICAL
- **اقتناء التوكن** يسرد كل جمهور تم فحصه (Graph وARM و— عند استخدام
`--active`, عند اكتشاف موارد مطابقة — Key Vault / Storage /
Cosmos DB). Graph وARM *مستقلان*: يمكن أن تحمل البيانات الاعتمادية أحدهما دون
الآخر.
- **السر** يُظهر الصلاحية، وبالنسبة للسر الصالح، تاريخ الانتهاء والأيام
المتبقية (يتم تمييز قرب الانتهاء). راجع الملاحظة أدناه حول الأسرار منتهية الصلاحية.
- **النتائج** هي الجزء الذي يجب قراءته أولاً — أذونات Graph عالية التأثير (`GRAPH`),
وأدوار ARM (`ARM`), وأدوار دليل Entra (`ROLE`), والتطبيقات/كيانات الخدمة المملوكة (`OWN`),
وأسطح مستوى البيانات القابلة للوصول (`DATA`), وأهداف هجمات الموافقة المطلوبة لكن غير الممنوحة
(`WANT`) — مع إزالة التكرار وتقييم الخطورة. القدرة على
قراءة كل سر في Key Vault، أو الاحتفاظ بدور دليلي، تُعد نتيجة بحد ذاتها
حتى بدون منح Graph/ARM خطير.
- **مسارات الهجوم** تحوّل أهم النتائج إلى خطوات تالية ملموسة (مثل *Privileged
Role Administrator ← تعيين Global Administrator للنفس ← السيطرة على المستأجر*).
- **تعداد Graph النشط** (`--active`) يبلّغ بما أعاده كل فحص للقراءة فقط.
معظم الفحوصات تطلب صفحة صغيرة محدودة السقف، لذا تُعرض الصفحة الممتلئة كـ
`N+` (مثل `users accessible (returned 5+)`) — أي *خمسة على الأقل*، وليس
خمسة بالضبط. الفحوصات بدون سقف (`organization`, `directoryRoles`) تبلغ
عن إجمالي حقيقي بدون `+`.
- **أدوار الدليل / الكائنات المملوكة / الأذونات المفوضة** لها أقسامها الخاصة.
يتم اكتشاف أدوار الدليل من مطالبة `wids` في التوكن حتى بدون قراءة الدليل؛
الأذونات المفوضة غير قابلة للاستخدام بواسطة بيانات اعتماد خاصة بالتطبيق فقط ولكن يتم عرضها
للتحويلات في سياق المستخدم واستهداف هجمات الموافقة.
- **الخطر العام** هو أعلى خطورة لنتيجة واحدة.
> **انتهاء صلاحية السر — ما يمكن معرفته.** تاريخ الانتهاء *ليس* في التوكن؛
> بل موجود في `passwordCredentials` لتسجيل التطبيق في Entra ID. بالنسبة لسر
> **صالح**, يقرؤه secret_stalker عبر Graph ويطابق سرّك مع
> البيانات الاعتمادية الصحيحة عبر `hint` (أول 3 أحرف) — وهذا يتطلب قراءة الدليل
> (`Application.Read.All` / `Directory.Read.All`); إذا كان كيان الخدمة يفتقر إليها، يُبلَّغ عن
> التاريخ على أنه غير متاح بدلاً من تخمينه. بالنسبة لسر **منتهي الصلاحية**, يفشل
> المصادقة نفسها، لذا لا يمكن للبيانات الاعتمادية الميتة قراءة بياناتها الوصفية الخاصة — الأداة
> تعلّمه كـ `EXPIRED (AADSTS7000222)` لكن تاريخ الانتهاء الدقيق غير قابل للاسترجاع
> عبر تلك البيانات الاعتمادية وحدها.
### رموز الخروج
مفيدة للبرمجة النصية:
| الرمز | المعنى |
|------|---------|
| `0` | البيانات الاعتمادية صالحة (تم الحصول على توكن واحد على الأقل). |
| `2` | البيانات الاعتمادية غير صالحة / ليس لديها وصول. |
| `1` | خطأ — تعذّر حل المستأجر، أو تعذّر تحميل الشهادة، أو تعذّر كتابة ملف `--export`. |
---
## جميع الخيارات
| الخيار | التأثير |
|------|--------|
| `--tenant` | GUID المستأجر أو النطاق. (أو `SS_TENANT`) |
| `--cloud` | سحابة Azure: `public` (الافتراضي), `usgov` (GCC High), `usdod` (DoD), `china` (21Vianet). يختار سلطة Entra ونقاط نهاية Graph/ARM/Key Vault. الأسماء المستعارة مثل `gov`/`dod`/`commercial` مقبولة. (أو `SS_CLOUD`) |
| `--client-id` | معرّف التطبيق (العميل). (أو `SS_CLIENT_ID`) |
| `--secret` | سر العميل. يُفضَّل استخدام `SS_SECRET` لإبقائه خارج سجل الأوامر. |
| `--cert` | شهادة لمصادقة تأكيد JWT بدلاً من السر: ملف PEM (مفتاح + شهادة) أو `.pfx`/`.p12`. يتطلب `cryptography`. (أو `SS_CERT`) |
| `--cert-password` | كلمة مرور لمفتاح/PFX مشفّر في `--cert`. (أو `SS_CERT_PASSWORD`) |
| `--active` | تعداد قراءة فقط اختياري: عينات كائنات Graph **بالإضافة إلى** قابلية الوصول لمستوى بيانات Key Vault / Storage. مغلق افتراضيًا للبقاء هادئًا. |
| `--deep` | مع `--active`: النزول مستوى واحد داخل Storage القابل للوصول — سرد blobs في الحاويات القابلة للوصول وملفات في المشاركات القابلة للوصول (الأسماء فقط، محدود). أكثر ضجيجًا. |
| `--no-arm` | تخطّي تعداد مجموعات الإدارة / الاشتراكات / RBAC (Graph فقط). |
| `--workers N` | عمال HTTP متوازون لعمليات بحث نطاق ARM وفحوصات مستوى البيانات (الافتراضي 8؛ `1` = تسلسلي). |
| `--update-manifest` | جلب خريطة GUID لاسم appRole الموثوقة من المستأجر المباشر (Graph **بالإضافة إلى** أي واجهات برمجة تطبيقات موارد أخرى تم تعيين هذه البيانات الاعتمادية عليها)، تخزينها مؤقتًا، ثم الخروج. |
| `--json` | طباعة النتيجة المتداخلة الكاملة بصيغة JSON بدلاً من التقرير. |
| `--export PATH` | كتابة النتائج إلى ملف. يُستنتج التنسيق من الامتداد (`.csv` / `.ndjson` / `.jsonl` / `.json` / `.html`). تُكتب الملفات للمالك فقط (`0600`). |
| `--export-format` | فرض تنسيق التصدير (`ndjson` / `csv` / `json` / `html`). |
| `--timeout N` | مهلة كل طلب بالثواني (الافتراضي 20). تستخدم طلبات مستوى التحكم في ARM (تعداد RBAC + اكتشاف Resource Graph) مهلة أطول — `1.5×`, بحد أدنى 30 ثانية — لأنها تعمل بشكل أبطأ. |
| `--verbose`, `-v` | تتبّع كل طلب HTTP في Graph/ARM/مستوى البيانات (الطريقة، URL، الحالة) إلى stderr. |
| `--no-banner` | إخفاء شعار ASCII. |
| `--version` | طباعة الإصدار والخروج. |
---
## تصدير النتائج
`--export` يبسّط النتيجة إلى **سجل واحد لكل شيء مكتشف** —
بيانات اعتمادية، توكن، إذن Graph، تعيين دور تطبيق، دور ARM، إصابة مستوى بيانات
ونتيجة مُقيَّمة — كل منها يحمل سياق البيانات الاعتمادية بحيث يقف الصف
بمفرده.```bash
# NDJSON — stream into a SIEM / log pipeline
python -m secret_stalker --export results.ndjson
# CSV — open in a spreadsheet for triage
python -m secret_stalker --active --export results.csv
# Full nested JSON to a file
python -m secret_stalker --export results.json
يحتوي كل سجل على record_type (credential, secret, token,
graph_permission, app_role_assignment, directory_role, owned_object,
arm_role, dataplane, delegated_permission, requested_permission,
finding)، بحيث يمكن للمستهلك التصفية إلى ما يحتاجه فقط — على سبيل المثال،
النتائج المُقيَّمة فقط:```bash
jq 'select(.record_type=="finding")' results.ndjson
يعمل تقرير الطرفية و`--export` معًا — لا يُثبِّط التصدير التقرير (رسالة التأكيد "Exported …" تذهب إلى stderr، لذا يبقى تمرير `--json` نظيفًا).
تحمل ملفات التصدير سياق بيانات الاعتماد (مطالبات الرمز token claims، وسرّ `hint`، ومعرّفات المفاتيح)، لذا تُكتب بصلاحيات **المالك فقط (`0600`)** لتجنّب تسرّبها على مضيف مشترك أو متزامن. عاملها كأدلة حساسة من أصول الاختبار. يُرفض الكتابة عبر رابط رمزي (symlink) تمامًا، لذا لا يمكن إعادة توجيه مسار التصدير لاقتطاع شيء آخر.
الأسماء في النتيجة تأتي من المستأجر (tenant) قيد التقييم — أسماء عرض التطبيقات والمجموعات، وأسماء الحاويات والكائنات blob — لذا تُعامل كمخرجات غير موثوقة:
- **CSV** القيم التي قد تُقرأ كصيغة (تبدأ بـ `=` أو `+` أو `-` أو `@`) تُسبَق بعلامة اقتباس مفردة، لذا لا يمكن لاسم عرض مثل `=cmd|' /C calc'!A0` أن يُنفَّذ عند فتح الملف في جدول بيانات. تزيل برامج الجداول علامة الاقتباس عند العرض.
- **Terminal وCSV وHTML** تُجرَّد من أحرف التحكم، لذا لا يمكن لاسم يحمل تسلسلات هروب ANSI أن يعيد تسمية طرفيتك أو يكتب فوق النتائج أعلاه — سواء قرأت التقرير مباشرةً، أو نفّذت `cat` على CSV، أو نفّذت `cat` على HTML.
- **JSON / NDJSON تبقى كما هي بأمانة**: يرمّز `json.dumps` أحرف التحكم بصيغة `\uXXXX`، وهذا خامل كنص بينما يظل المحلِّل قادرًا على استعادة القيمة الدقيقة التي أعادها المستأجر. الاسم الخام هو دليل، لذا يُحفظ هناك.
---
## كيفية تحليل GUIDs الخاصة بالأذونات
تعود `appRoleAssignments` كقيم GUID. يحوّلها secret_stalker إلى أسماء عبر بحث مسطّح (GUIDs الخاصة بـ appRole فريدة عالميًا)، ويستمر هذا في العمل **حتى عندما تُرفض قراءات الدليل**:
- تأتي خريطة اجتهادية لأذونات Graph المعروفة داخل `secret_stalker/data/graph_app_roles.json`.
- يتجاوز `--update-manifest` هذه الخريطة ببيانات موثوقة تُسحب مباشرةً من المستأجر قيد النطاق — Microsoft Graph **بالإضافة إلى كل واجهة برمجة تطبيقات موارد أخرى مُسند إليها هذا الاعتماد** (مثل Exchange Online وSharePoint) — لذا تُحل أيضًا GUIDs غير الخاصة بـ Graph.
- يُعرض أي GUID غير معروف **كما هو ومعلمًا** — لا تخمّن الأداة اسمًا أبدًا.
---
## كيف يعمل (النسخة المختصرة)
- **الصلاحية والأذونات في طلب واحد.** مطالبة `roles` في رمز Graph ناجح *هي* قائمة أذونات التطبيق الممنوحة. يقرأها secret_stalker من الرمز المفوَّك — بسرعة وهدوء، دون الحاجة إلى استدعاءات Graph.
- **Graph ≠ ARM.** هما جمهوران مختلفان للرمز. يمكن لاعتماد أن يملك حقوقًا على أحدهما دون الآخر، لذا يُختبر كل منهما بشكل مستقل.
- **مستوى البيانات ≠ مستوى التحكم.** امتلاك حقوق ARM على Key Vault (إدارة) ليس مثل القدرة على قراءة أسراره (مستوى البيانات). تحت `--active`، تُختبر إمكانية الوصول إلى مستوى البيانات باستخدام جمهور الرمز الخاص بالموارد — ويعرض **أسماء الكائنات فقط**، وليس القيم أو المحتويات أبدًا.
- **اختبار مستوى البيانات لكل سطح.** تُمنح RBAC لمستوى البيانات لكل نوع كائن / خدمة، لذا يُختبر كل منها بشكل مستقل: Key Vault **الأسرار / المفاتيح / الشهادات**، وStorage **blob / ملف / قائمة انتظار / جدول**، وCosmos DB **قواعد البيانات**. أي اعتماد يملك دور `Storage File Data SMB Share Reader` دون أن يكون قارئ blob سيظهر ولن يُغفل عنه. (يستخدم Cosmos ترويسة AAD REST غير قياسية وهو **بأفضل جهد** — تحقق من نتيجة `denied` مقابل حساب حي.)
- **اكتشاف على مستوى المستأجر.** تُعثر الموارد عبر مسح واحد لـ Azure Resource Graph على كل اشتراك يمكن للكيان الرئيسي رؤيته (مع احترام RBAC)، مع العودة إلى سرد الموفّر لكل اشتراك إذا كانت ARG مرفوضة. يضع التقرير علامة على المسار المستخدم (`[discovery: resource-graph]` مقابل `per-subscription`). يتنقل المسح عبر النتائج حتى حد أقصى (40 صفحة × 1000 صف لكل نوع مورد) بحيث ينتهي التشغيل دائمًا؛ ويذكر `--verbose` ذلك إذا تم الوصول إلى الحد.
- **خريطة الخطورة** موجودة في `secret_stalker/risk.py` — عدّلها لضبط ما يعتبره فريقك عالي الأثر.
---
## هيكل المشروع```
secret_stalker/
clouds.py Azure cloud endpoint table (public / usgov / usdod / china)
auth.py client_credentials flow + tenant discovery + AADSTS decoding
jwt_utils.py local JWT claim extraction
manifest.py Graph appRole GUID -> name resolution (bundled + live cache)
graph.py service principal lookup + appRole resolution + active probes
arm.py management-group / subscription RBAC + resource discovery
dataplane.py Key Vault / Storage data-plane reachability probes
risk.py permission/role/data-plane -> impact mapping (tune this)
report.py terminal + JSON output
export.py flatten to NDJSON / CSV / JSON records for ingestion
util.py shared HTTP (retry/backoff + safe JSON), pmap parallel map,
untrusted-output sanitizing
banner.py ASCII banner (stderr only)
cli.py orchestration
data/graph_app_roles.json bundled permission manifest
tests/ pytest suite (run: pytest)
pyproject.toml packaging + `secret_stalker` console entry point
--cert) — تأكيد عميل JWT (RS256) من ملف PEM أو PFX، مع الإبلاغ عن انتهاء صلاحية الشهادة. auth.pywids في الرمز (لا حاجة لقراءة الدليل) — مُقيَّمة حسب الدور. graph.py / risk.pygraph.py--active) — المنح المُوافَق عليها + الأذونات المطلوبة، مع الإشارة إلى الأذونات الخطرة غير المُوافَق عليها كأهداف لهجمات الموافقة. graph.py / risk.py--export report.html). risk.py / report.py--cloud | سلطة Entra | Microsoft Graph | ARM | Key Vault |
|---|
public (الافتراضي) | login.microsoftonline.com | graph.microsoft.com | management.azure.com | vault.azure.net |
usgov (GCC High) | login.microsoftonline.us | graph.microsoft.us | management.usgovcloudapi.net | vault.usgovcloudapi.net |
usdod (DoD) | login.microsoftonline.us | dod-graph.microsoft.us | management.usgovcloudapi.net | vault.usgovcloudapi.net |
china (21Vianet) | login.chinacloudapi.cn | microsoftgraph.chinacloudapi.cn | management.chinacloudapi.cn | vault.azure.cn |
--cloud) — العامة، US Gov (GCC High)، US DoD، والصين (21Vianet)، كلٌّ بسلطة Entra الصحيحة وجماهير Graph / ARM / Key Vault. clouds.pyarm.pydataplane.py / risk.py+ (مثل 25+) تشير إلى أن القائمة حُدّت بسقف بدلاً من الإبلاغ الناقص الصامت. dataplane.py429/503 مع احترام Retry-After، فلا يُفسَر التقييد المؤقت خطأً على أنه "مرفوض / لا وصول." util.py--deep) — يسرد الـ blobs في الحاويات القابلة للوصول والملفات في المشاركات القابلة للوصول، أسماء فقط وبسقف. dataplane.py--update-manifest يخزّن appRoles مؤقتًا لكل واجهة برمجية للموارد التي تُسند إليها بيانات الاعتماد، وليس Graph فقط. graph.py / manifest.py--workers N) عبر عمليات بحث نطاقات ARM وفحوصات مستوى البيانات، مع عزل الأخطاء لكل عنصر. util.py