
أداة سطر أوامر لتدقيق الوضع الأمني في Azure، وRBAC، وNSGs، والتخزين، والهوية، والتشفير
| ID | الفئة | الفحص | الخطورة |
|---|
| AZ-001 | RBAC | تعيين دور المالك أو المساهم على نطاق الاشتراك | CRITICAL |
| AZ-002 | RBAC | تعيين دور المالك أو المساهم على نطاق مجموعة الموارد | HIGH |
| AZ-003 | الشبكات | مجموعة أمان شبكة (NSG) تحتوي على قاعدة سماح واردة من 0.0.0.0/0 | HIGH |
| AZ-004 | التخزين | حساب تخزين مع تمكين الوصول العام إلى الكائنات النقطية (Blob) | HIGH |
| AZ-005 | الهوية | مستخدم Entra ID بدون تسجيل MFA | HIGH |
| AZ-006 | الهوية | كيان خدمة بصلاحيات المالك أو المساهم | HIGH |
| AZ-007 | التشفير | قرص مُدار بدون إعداد تشفير صريح | MEDIUM |
| AZ-008 | التشفير | Key Vault مكشوف على الشبكة العامة بدون قيود جدار الحماية | HIGH |
| AZ-009 | المراقبة | مدة الاحتفاظ بسجل النشاط أقل من 90 يومًا | MEDIUM |
| AZ-010 | المراقبة | Microsoft Defender for Cloud غير مفعّل على أنواع الموارد الرئيسية | HIGH |
| AZ-011 | المراقبة | Key Vault بدون تفعيل التسجيل التشخيصي | MEDIUM |
| AZ-012 | الحوسبة | جهاز افتراضي بعنوان IP عام مرتبط مباشرةً | MEDIUM |
| AZ-013 | الحوسبة | جهاز افتراضي بدون ملحق حماية نقطة النهاية | MEDIUM |
| AZ-014 | الحوسبة | قرص نظام التشغيل لجهاز افتراضي بدون Azure Disk Encryption (ADE) | MEDIUM |
| AZ-015 | الشبكات | منفذ RDP 3389 مكشوف على الإنترنت عبر NSG | CRITICAL |
| AZ-016 | الشبكات | منفذ SSH 22 مكشوف على الإنترنت عبر NSG | CRITICAL |
| AZ-017 | التخزين | حساب تخزين يسمح بحركة المرور غير المشفرة عبر HTTPS | HIGH |
| AZ-018 | التخزين | حساب تخزين يسمح بإصدارات TLS قديمة (أقل من 1.2) | MEDIUM |
| AZ-019 | الهوية | وجود حسابات مستخدمين ضيوف في مستأجر Entra ID | LOW |
| AZ-020 | التشفير | Key Vault بدون الحذف الناعم أو الحماية من التطهير | MEDIUM |
az login (Azure CLI)AZURE_CLIENT_ID, AZURE_CLIENT_SECRET, AZURE_TENANT_IDReader على الاشتراكUserAuthenticationMethod.Read.AllApplication.Read.Allيتم تخطي فحوصات الهوية (AZ-005, AZ-019) بأمان إذا لم تكن صلاحيات Graph API متاحة — ويستمر باقي التدقيق دون تأثر.
pip install -e .
# Full audit — all checks, all severities
azure-auditor
# Target a specific subscription
azure-auditor --subscription <subscription-id>
# Show only HIGH and CRITICAL findings
azure-auditor --severity HIGH
# Save JSON report to a specific directory
azure-auditor --output-dir ./reports
# Terminal output only
azure-auditor --no-json
# Verbose logging
azure-auditor --verbose
أو بدون التثبيت:
PYTHONPATH=src python -m azure_security_auditor.cli --subscription <id>
الطرفية — جدول منسّق بشكل Rich، مرتّب حسب الخطورة (الحرجة أولاً):
╭──────────────────────────────────────────────────────────────────╮
│ Azure Security Posture Audit │
│ Subscription: My Production Subscription │
│ ID: xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx │
│ Run at: 2026-07-12T10:00:00Z │
│ Findings: 12 total (2 CRITICAL 6 HIGH 4 MEDIUM 0 LOW) │
╰──────────────────────────────────────────────────────────────────╯
Severity Check ID Check Resource Detail
✖ CRITICAL AZ-015 RDP Port 3389 Exposed to Internet... /subscriptions/. ...
✖ CRITICAL AZ-001 Owner Role Assigned at Subscription... <principal-id> ...
■ HIGH AZ-010 Defender for Cloud Not Enabled — VMs /subscriptions/. ...
...
JSON — يُكتب إلى reports/azure_audit_<subscription>_<timestamp>.json.
src/
azure_security_auditor/
cli.py # argparse entrypoint
engine.py # ThreadPoolExecutor orchestrator
models.py # Finding, AuditResult, Severity
checks/
rbac.py # AZ-001, AZ-002
network.py # AZ-003, AZ-015, AZ-016
storage.py # AZ-004, AZ-017, AZ-018
identity.py # AZ-005, AZ-019
service_principals.py # AZ-006
encryption.py # AZ-007, AZ-008, AZ-020
monitoring.py # AZ-009, AZ-010, AZ-011
compute.py # AZ-012, AZ-013, AZ-014
reporters/
terminal.py # Rich table output
json_reporter.py # JSON file output
يستخدم DefaultAzureCredential — ويحاول بالترتيب التالي:
AZURE_CLIENT_ID, AZURE_CLIENT_SECRET, AZURE_TENANT_ID)az login)export AZURE_CLIENT_ID="<app-id>"
export AZURE_CLIENT_SECRET="<secret>"
export AZURE_TENANT_ID="<tenant-id>"
azure-auditor --subscription <subscription-id>