
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)
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 レポート、または GitHub Security 用の SARIF レポートを生成:
threatmap scan ./infra/ --format html --output report.html
threatmap scan ./infra/ --format sarif --output report.sarif
CI ゲート — CRITICAL または HIGH の脅威が1つでも見つかると終了コード1:
threatmap scan ./infra/ --fail-on HIGH --output threat-report.md
完全なレポートを書き出さず、端末にサマリテーブルのみ表示:
threatmap scan ./infra/ --summary
Unicode をサポートしない環境向けに ASCII のみの深刻度インジケータ(絵文字なし):
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 レポートが生成されます。以下は代表的な抜粋です。
### T-002 — なりすまし (CRITICAL)
リソース: 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 図が付加されます。ノードは最悪の深刻度に応じて色分けされます(🔴 赤 = CRITICAL、🟠 オレンジ = HIGH)。ブロックを任意の 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 には、リソース間の関係を追跡する グラフインテリジェンス (Graph Intelligence) が組み込まれています。あるリソース(例:インターネット公開 EC2)の侵害が別のリソース(例:プライベート S3 バケット)に直接つながる「連鎖的」脅威を自動的に特定し、これらを 特権昇格 (Elevation of Privilege) の攻撃パスとしてフラグ付けします。
プロジェクトルートに threatmap_rules.yaml を作成することで、内部セキュリティ要件を定義できます。
rules:
- resource_type: "aws_s3_bucket"
property: "force_destroy"
expected: false
stride: "Tampering"
severity: "MEDIUM"
description: "Production buckets should not have force_destroy enabled."
mitigation: "Set force_destroy = false."
現在、ほとんどの検出事項には 修復 (remediation) フィールドが含まれており(JSON、HTML、SARIF レポートで表示)、セキュリティ問題を修正するための正確なコードスニペットが提供されます。
STRIDE Analyzer — プロバイダ固有の脅威ルール:
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 Analyzer — MITRE 戦術にマッピングされた 11 ルール:
PASTA Analyzer — 資産中心の 12 ルール:
API:
/health, /version, /rules, /analyze, /analyze/file/graphql (Query: health, version, rules; Mutation: analyze)各ルールは関数であり、Resource オブジェクト(解析元のソース形式から正規化されたもの)を受け取り、条件が満たされた場合に Threat を返します。ルールはプレーンな Python 条件文で記述されています。DSL、正規表現エンジン、外部ルールセットファイルは不要です。
深刻度は 悪用可能性 (exploitability) と 影響範囲 (blast radius) の両方を反映します:
| 深刻度 | 意味 |
|---|---|
| CRITICAL | 追加の前提条件なしで直接悪用可能(例:SSH が 0.0.0.0/0 に公開、ワイルドカード IAM ポリシー、匿名への cluster-admin バインド) |
| HIGH | もう一段階のステップが必要な重大なリスク(例:公開アクセス可能な暗号化なし RDS、EC2 インスタンス上の IMDSv1) |
| MEDIUM | 多層防御の制御が欠如 — 即時のリスクは低いがセキュリティ基準に違反(例:バージョニングなし、ログ記録なし、リソース制限なし) |
| LOW | 単独での悪用可能性が限られたベストプラクティスのギャップ(例:Lambda が VPC 内にない) |
publicly_accessible = true、Principal: "*")に基づいて発火します。metadata_options ブロックがない場合、AWS のデフォルトである IMDSv1 がアクティブとみなします)。(stride_category, resource_name, trigger_property) でキー付けされるため、同一の論理的問題が複数のファイル形式に現れても二重に報告されることはありません。# .github/workflows/threat-model.yml
name: Threat Model
on: [pull_request]
jobs:
threatmap:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- name: Set up Python
uses: actions/setup-python@v5
with:
python-version: "3.11"
- name: Install threatmap
run: pip install threatmap
- name: Run threat model scan
run: |
threatmap scan ./infra/ \
--format markdown \
--output threat-report.md \
--fail-on HIGH
- name: Upload threat report
if: always()
uses: actions/upload-artifact@v4
with:
name: threat-report
path: threat-report.md
--fail-on HIGH フラグにより、HIGH または CRITICAL の脅威が1つでも見つかるとジョブが終了コード 1 で終了し、PR のマージを阻止します。アップロードされたアーティファクトにより、レビュー担当者はプルリクエストを離れることなく完全なレポートを確認できます。
| プロバイダ | ルール数 |
|---|---|
| AWS (Terraform + CloudFormation) | 22 |
| Azure (Terraform) |
プロバイダ別のカバレッジカテゴリ:
(S=なりすまし, T=改ざん, R=否認, I=情報漏洩, D=サービス拒否, E=特権昇格)
テストの実行:
pytest tests/ -v
カバレッジ付きで実行:
pytest tests/ --cov=threatmap --cov-report=term-missing
threatmap/analyzers/<provider>.py にルールを追加tests/fixtures/ に追加tests/test_analyzers.py にアサーションを追加| フォーマット | プロバイダ | 拡張子 |
|---|
| Terraform HCL | AWS, Azure, GCP | .tf |
| CloudFormation | AWS | .yaml, .yml, .json |
| Kubernetes マニフェスト | Kubernetes | .yaml, .yml |
| ID | 深刻度 | STRIDE カテゴリ | リソース | 説明 |
|---|
| T-001 | 🔴 CRITICAL | 情報漏洩 (Information Disclosure) | AuditBucket | S3 バケット 'AuditBucket' に公開アクセスブロックが設定されていません。バケットが公開アクセス可能になる可能性があります。 |
| T-002 | 🔴 CRITICAL | なりすまし (Spoofing) | WebSecurityGroup | セキュリティグループ 'WebSecurityGroup' が SSH/RDP(ポート 22/3389)を 0.0.0.0/0 に公開しています。 |
| T-003 | 🔴 CRITICAL | 特権昇格 (Elevation of Privilege) | app_contributor | ロール割り当て 'app_contributor' が特権ロール 'Contributor' を付与しています。 |
| T-006 | 🟠 HIGH | 情報漏洩 (Information Disclosure) | AuditBucket | S3 バケット 'AuditBucket' にサーバサイド暗号化が設定されていません。 |
| T-008 | 🟠 HIGH | 特権昇格 (Elevation of Privilege) | api | Deployment 'api' 内のコンテナ 'api' がルートで実行される可能性があります(runAsNonRoot=true または runAsUser=0 が設定されていません)。 |
| T-011 | 🟠 HIGH | 特権昇格 (Elevation of Privilege) | web | EC2 インスタンス 'web' が IMDSv1 を許可しています。メタデータサービスがセッショントークンなしでアクセス可能となり、SSRF ベースの認証情報窃取を可能にします。 |
| 19 |
| GCP (Terraform) | 15 |
| Kubernetes | 17 |
| 合計 | 73 |
| プロバイダ | S | T | R | I | D | E |
|---|
| AWS | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ |
| Azure | ✓ | ✓ | ✓ | ✓ | — | ✓ |
| GCP | ✓ | ✓ | ✓ | ✓ | — | ✓ |
| Kubernetes | ✓ | ✓ | — | ✓ | ✓ | ✓ |