
نموذج تهديدات للبنية التحتية كرمز (IaC) باستخدام أطر STRIDE و MITRE ATT&CK و PASTA. يدعم REST API و GraphQL و Docker لتطبيقات Terraform و CloudFormation و Kubernetes.
أداة نمذجة تهديدات البنية التحتية ككود (IaC) ثابتة تقوم بتحليل ملفات Terraform وCloudFormation وKubernetes وإنتاج تقارير منظمة للتهديدات باستخدام أطر STRIDE أو MITRE ATT&CK أو PASTA. لا حاجة لاستدعاءات شبكة أو بيانات اعتماد سحابية، تعمل بالكامل دون اتصال بالإنترنت. تُشغَّل كأداة CLI أو REST API أو خدمة حاوية.
CLI:
pip install threatmap
threatmap scan ./examples --output report.md --fail-on HIGH
Docker:
docker run -v $(pwd):/workspace bogdynn/threatmap:2.1.0 threatmap scan /workspace --output /workspace/report.md
خادم REST API:
threatmap serve --host 0.0.0.0 --port 8000
# أو عبر Docker:
docker run -p 8000:8000 bogdynn/threatmap:2.1.0
# نقاط نهاية API: /health, /version, /rules, /analyze
GraphQL API:
docker run -p 8000:8000 bogdynn/threatmap:2.1.0
# نقطة نهاية GraphQL: http://localhost:8000/graphql
# استعلامات: health, version, rules
# تحويرات: analyze(content, filename, framework)
| الصيغة | الموفّر | الامتداد |
|---|---|---|
| Terraform HCL | AWS, Azure, GCP | .tf |
| CloudFormation | AWS | .yaml, .yml, .json |
| Kubernetes manifests | Kubernetes | .yaml, .yml |
التثبيت من PyPI:
pip install threatmap
أو للتطوير المحلي:
git clone https://github.com/bogdanticu88/threatmap.git
cd threatmap
pip install -e .
مسح دليل وطباعة تقرير Markdown إلى المخرجات القياسية:
threatmap scan ./terraform/
مسح مسارات متعددة وكتابة تقرير JSON إلى ملف:
threatmap scan ./terraform/ ./k8s/ ./cloudformation/ --format json --output report.json
توليد تقرير HTML تفاعلي أو تقرير SARIF لأمان GitHub:
threatmap scan ./infra/ --format html --output report.html
threatmap scan ./infra/ --format sarif --output report.sarif
بوابة CI — رمز خروج 1 إذا وُجد أي تهديد من درجة CRITICAL أو HIGH:
threatmap scan ./infra/ --fail-on HIGH --output threat-report.md
طباعة جدول ملخص طرفي فقط، دون كتابة تقرير كامل:
threatmap scan ./infra/ --summary
استخدام مؤشرات شدة بنظام ASCII فقط (بدون رموز تعبيرية) للبيئات التي لا تدعم Unicode:
threatmap scan ./infra/ --ascii --output report.md
التحليل باستخدام أطر نمذجة تهديدات مختلفة:
# STRIDE (افتراضي)
threatmap scan ./infra/ --framework stride
# MITRE ATT&CK (يرسم إلى تكتيكات وتقنيات)
threatmap scan ./infra/ --framework mitre --format json
# PASTA (نمذجة تهديدات متمحورة حول الأصول)
threatmap scan ./infra/ --framework pasta --format json
STRIDE (73 قاعدة)
MITRE ATT&CK (11 قاعدة, 14 تكتيكًا)
PASTA (12 قاعدة, متمحور حول الأصول)
تشغيل threatmap scan ./examples --output report.md مقابل الأمثلة المرفقة ينتج تقرير Markdown كامل. فيما يلي مقتطف تمثيلي.
| المعرف | الشدة | فئة STRIDE | المورد | الوصف |
|---|---|---|---|---|
| T-001 | 🔴 حرج | Information Disclosure | AuditBucket | دلو S3 'AuditBucket' ليس لديه حظر وصول عام مهيأ — قد يكون الدلو متاحًا للعامة. |
| T-002 | 🔴 حرج | Spoofing | WebSecurityGroup | مجموعة الأمان 'WebSecurityGroup' تعرض SSH/RDP (المنفذ 22/3389) إلى 0.0.0.0/0. |
| T-003 | 🔴 حرج | Elevation of Privilege | app_contributor | تعيين الدور 'app_contributor' يمنح الدور المميز 'Contributor'. |
| T-006 | 🟠 عالٍ | Information Disclosure | AuditBucket | دلو S3 'AuditBucket' ليس لديه تشفير من جانب الخادم مهيأ. |
| T-008 | 🟠 عالٍ | Elevation of Privilege | api | الحاوية 'api' في Deployment 'api' قد تعمل كجذر (لا يوجد runAsNonRoot=true أو runAsUser=0). |
| T-011 | 🟠 عالٍ | Elevation of Privilege | web | مثيل EC2 'web' يسمح بـ IMDSv1 — خدمة البيانات الوصفية متاحة بدون رموز جلسة، مما يتيح سرقة بيانات الاعتماد عبر SSRF. |
### T-002 — Spoofing (حرج)
المورد: AWS::EC2::SecurityGroup.WebSecurityGroup
الخاصية: ingress.ssh_rdp_open
النتيجة: مجموعة الأمان 'WebSecurityGroup' تعرض SSH/RDP (المنفذ 22/3389) إلى 0.0.0.0/0.
التخفيف: إزالة الوصول العام لـ SSH/RDP. استخدم AWS Systems Manager Session Manager
أو مضيف وسيط مع قيود IP.
يُلحق التقرير مخطط Mermaid flowchart LR. الألوان حسب أسوأ شدة (🔴 أحمر = حرج, 🟠 برتقالي = عالٍ). الصق الكتلة في أي عارض Mermaid أو اعرضها مباشرة على GitHub.
flowchart LR
Internet((Internet))
subgraph Networking
aws_security_group_web_sg{web_sg}
NetworkPolicy_default_deny{default-deny}
azurerm_network_security_group_app_nsg{app_nsg}
end
subgraph Compute
aws_instance_web[web]
end
subgraph Kubernetes
Namespace_myapp[myapp]
Deployment_api[api]
Service_api_svc[api-svc]
Ingress_api_ingress[api-ingress]
end
subgraph Data
aws_s3_bucket_app_data[(app_data)]
aws_db_instance_app_db[(app_db)]
azurerm_storage_account_app_storage[(app_storage)]
end
subgraph Security
azurerm_key_vault_app_kv[app_kv]
end
subgraph Identity
azurerm_role_assignment_app_contributor[/app_contributor/]
end
AWS__S3__Bucket_AppBucket -->|ref| AWS__S3__Bucket_AuditBucket
AWS__CloudTrail__Trail_AppTrail -->|ref| AWS__S3__Bucket_AuditBucket
Internet -->|HTTPS| Ingress_api_ingress
style aws_security_group_web_sg fill:#ff4444,color:#fff
style aws_s3_bucket_app_data fill:#ff4444,color:#fff
style aws_instance_web fill:#ff8800,color:#fff
style Deployment_api fill:#ff8800,color:#fff
style azurerm_key_vault_app_kv fill:#ffcc00,color:#000
style azurerm_network_security_group_app_nsg fill:#ff8800,color:#fff
style azurerm_role_assignment_app_contributor fill:#ff4444,color:#fffيتضمن threatmap الآن ذكاءً رسوميًا يتتبع العلاقات بين الموارد. ويحدد تلقائيًا التهديدات "المتسلسلة" حيث يؤدي اختراق مورد واحد (مثل EC2 معرض للإنترنت) مباشرة إلى آخر (مثل دلو S3 خاص)، ويضع علامة عليها كمسارات هجوم Elevation of Privilege.
يمكنك تعريف متطلبات أمان داخلية عن طريق إنشاء ملف threatmap_rules.yaml في جذر مشروعك.
rules:
- resource_type: "aws_s3_bucket"
property: "force_destroy"
expected: false
stride: "Tampering"
severity: "MEDIUM"
description: "لا ينبغي تمكين force_destroy في دلّاء الإنتاج."
mitigation: "اضبط force_destroy = false."
تتضمن معظم النتائج الآن حقل remediation (مرئي في تقارير JSON وHTML وSARIF) الذي يوفر مقتطف الشفرة الدقيق اللازم لإصلاح المشكلة الأمنية.
محلل STRIDE — قواعد تهديدات خاصة بالموفّر:
threatmap/analyzers/
├── aws.py # 22 قاعدة — S3, IAM, EC2, RDS, EKS, CloudTrail, KMS, Lambda
├── azure.py # 19 قاعدة — Storage, Key Vault, NSG, RBAC, AKS, ACR, SQL
├── gcp.py # 15 قاعدة — GCS, Firewall, Compute, Cloud SQL, GKE, IAM, KMS
└── kubernetes.py # 17 قاعدة — workloads, RBAC, network, secrets
محلل MITRE ATT&CK — 11 قاعدة مرتبة بتكتيكات MITRE:
محلل PASTA — 12 قاعدة مع تركيز متمحور حول الأصول:
واجهات API:
/health, /version, /rules, /analyze, /analyze/file/graphql مع Query (health, version, rules) وMutation (analyze)كل قاعدة هي دالة تستقبل كائن Resource (مُوحَّد من أي صيغة مصدر تم تحليلها) وتعيد Threat إذا تحقق الشرط. القواعد هي شروط Python عادية — لا DSL ولا محرك تعبيرات منتظمة ولا ملفات قواعد خارجية.
تعكس الشدة كلاً من قابلية الاستغلال ونطاق الانفجار:
| الشدة | المعنى |
|---|---|
| حرج (CRITICAL) | قابل للاستغلال مباشرة دون شروط مسبقة إضافية (مثل SSH مفتوح إلى 0.0.0.0/0، سياسة IAM بطاقة بدل، ربط cluster-admin بمجهول) |
| عالٍ (HIGH) | خطر كبير يتطلب خطوة إضافية واحدة (مثل RDS غير مشفر مع وصول عام، IMDSv1 على مثيل EC2) |
| متوسط (MEDIUM) | ضوابط دفاع متعمقة مفقودة — خطر فوري أقل لكنه ينتهك المعايير الأمنية الأساسية (مثل عدم وجود إصدارات، عدم تسجيل، عدم وجود حدود موارد) |
| منخفض (LOW) | فجوات في أفضل الممارسات مع قابلية استغلال محدودة بمفردها (مثل Lambda غير موجودة في VPC) |
publicly_accessible = true, Principal: "*").metadata_options على مثيل EC2 يعني أن IMDSv1 نشط، لأن هذا هو الافتراضي لدى AWS).(stride_category, resource_name, trigger_property) بحيث لا يتم الإبلاغ عن نفس المشكلة المنطقية مرتين حتى لو ظهرت عبر صيغ ملفات متعددة.# .github/workflows/threat-model.yml
name: نموذج تهديد
on: [pull_request]
jobs:
threatmap:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- name: إعداد Python
uses: actions/setup-python@v5
with:
python-version: "3.11"
- name: تثبيت threatmap
run: pip install threatmap
- name: تشغيل مسح نموذج التهديد
run: |
threatmap scan ./infra/ \
--format markdown \
--output threat-report.md \
--fail-on HIGH
- name: رفع تقرير التهديد
if: always()
uses: actions/upload-artifact@v4
with:
name: threat-report
path: threat-report.md
يجعل العلم --fail-on HIGH المهمة تخرج برمز 1 إذا وُجد أي تهديد من درجة HIGH أو CRITICAL، مما يمنع دمج الـ PR. القطعة المرفوعة تمنح المراجعين التقرير الكامل دون مغادرة طلب السحب.
| الموفّر | القواعد |
|---|---|
| AWS (Terraform + CloudFormation) | 22 |
| Azure (Terraform) | 19 |
| GCP (Terraform) | 15 |
| Kubernetes | 17 |
| الاجمالي | 73 |
الفئات المغطاة لكل موفّر:
| الموفّر | S | T | R | I | D | E |
|---|---|---|---|---|---|---|
| AWS | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ |
| Azure | ✓ | ✓ | ✓ | ✓ | — | ✓ |
| GCP | ✓ | ✓ | ✓ | ✓ | — | ✓ |
| Kubernetes | ✓ | ✓ | — | ✓ | ✓ | ✓ |
(S=Spoofing, T=Tampering, R=Repudiation, I=Information Disclosure, D=Denial of Service, E=Elevation of Privilege)
تشغيل الاختبارات:
pytest tests/ -v
تشغيل مع التغطية:
pytest tests/ --cov=threatmap --cov-report=term-missing
threatmap/analyzers/<provider>.py باتباع النمط الموجودtests/fixtures/ يؤدي إلى تشغيل القاعدة الجديدةtests/test_analyzers.py