
BloodHound向けのOpenGraphコレクターで、DevOpsからMLOpsインフラへの攻撃経路をマッピングし、CI/CDパイプライン、サービスプリンシパル、MLプラットフォームリソースを収集して横方向移動の分析を行います。
BloodHound用の概念実証OpenGraphコレクター。DevOpsからMLOpsインフラストラクチャへの攻撃パスをマッピングします。
Pipelines of Privilege: Attack Paths from DevOps to MLOps Infrastructure(Brett Hawkins (@h4wkst3r) 著)に基づいています。
Dop2MopはDevOpsおよびMLOpsプラットフォームからデータを収集し、CI/CDパイプラインから機械学習トレーニングインフラストラクチャへの横方向の移動を可能にする攻撃パスを特定します。可視化と分析のためにBloodHound互換のOpenGraph JSONを出力します。
| DevOpsプラットフォーム | MLOpsプラットフォーム | IDプロバイダー |
|---|---|---|
| GitHub (Actions, Repos, Secrets) | Azure Machine Learning | Azure AD Service Principals |
| Azure DevOps (Pipelines, Service Connections) | Amazon SageMaker | AWS IAM Roles OIDC/Federated Identity |
Dop2Mopは研究で特定された5つの重要な信頼境界をモデル化します:
git clone https://github.com/h4wkst3r/dop2mop.git cd dop2mop pip install -r requirements.txt pip install -e .
## 収集対象
各コレクターは、プラットフォーム固有のリソースを収集し、それらの間の信頼境界をマッピングします。
| コレクター | 収集するリソース |
|-----------|-------------------|
| **GitHub** | 組織、リポジトリ、ワークフロー、シークレット、ブランチ保護ルール、OIDC構成、コンテナイメージ参照、S3バケット参照 |
| **Azure DevOps** | 組織、プロジェクト、パイプライン(YAML)、サービス接続(スコープ詳細付き)、変数グループ、エージェントプール、リポジトリ |
| **Azure ML** | ワークスペース、コンピュートクラスター/インスタンス、データストア、ML環境、登録済みモデル、ジョブ/実験、オンラインおよびバッチエンドポイント |
| **SageMaker** | トレーニングジョブ、モデル、エンドポイント、ドメイン、ノートブックインスタンス、IAM実行ロール(ポリシー分析付き)、ECRリポジトリ/イメージ、S3バケット(ML関連にフィルタリング済み) |
## クイックスタート
### デモデータの生成
Dop2Mopの動作を確認する最も速い方法は、研究からの攻撃シナリオを示すデモデータを生成することです。```bash
dop2mop demo -o demo.json
// Container Image Poisoning (Supply Chain Attack) MATCH p=(workflow)-[:CanPoisonImage]->(image)<-[:PullsImage]-(job) RETURN p
// OIDC/Federated Identity Abuse (confirmed edges) MATCH p=(workflow)-[:OIDCTrust]->(oidc)-[:CanAssumeRole]->(role)-[:SubmitsJob]->(job) RETURN p
// OIDC abuse including inferred paths MATCH p=(workflow)-[:OIDCTrust]->(oidc)-[:InferredCanAssumeRole]->(role) RETURN p
// Dataset Poisoning via Pickle Deserialization MATCH p=(workflow)-[:CanPoisonDataset]->(dataset)<-[:LoadsDataset]-(job) RETURN p
// Find repos with weak/no branch protection (TB1 exploitable) MATCH (repo)-[:BypassesProtection]->(repo) RETURN repo.name, repo.default_branch
// Find overprivileged SageMaker IAM roles MATCH (role:IAMRole) WHERE role.is_admin = true OR role.has_s3_full_access = true RETURN role.name, role.attached_policies
// Find SageMaker notebooks with root + internet access MATCH (nb:SMNotebook) WHERE nb.root_access = 'Enabled' AND nb.direct_internet_access = 'Enabled' RETURN nb.name, nb.status
// Find self-hosted ADO agent pools MATCH (agent:ADOAgent) WHERE agent.is_hosted = false RETURN agent.name, agent.pool_type
---
## 設定
### 設定ファイル
毎回の実行で認証情報を渡す代わりに、設定ファイルに保存することができます。付属の例をコピーして、自分の値で埋めてください:```bash
cp dop2mop.yaml.example dop2mop.yaml
# Edit dop2mop.yaml with your credentials
Dop2Mopは以下の場所を順番に確認します:
--configで指定されたパスdop2mop.yaml / dop2mop.yml / .dop2mop.yaml~/.dop2mop.yaml注記:
dop2mop.yamlは.gitignoreに含まれており、誤って認証情報をコミットするのを防ぎます。サンプルファイル(dop2mop.yaml.example)はコミットしても安全です。
利用可能なすべてのオプションとコメントについては、dop2mop.yaml.exampleを参照してください。
優先順位: CLI引数 > 設定ファイル > 環境変数。
完全な収集を実行する前に認証情報をテストしてください:```bash
dop2mop collect --validate -v
dop2mop collect --validate --collectors github,sagemaker -v
これにより、各プラットフォームに対して軽量なAPI呼び出しを行い、トークンが有効であることを収集開始前に確認します。
### Collector Aliases
`--collectors` を使用して、完全なクラス名の代わりに短い名前を使用できます。
| Alias | Collector |
|-------|-----------|
| `github`, `gh` | GitHubCollector |
| `ado`, `azuredevops`, `azure-devops` | AzureDevOpsCollector |
| `azureml`, `azure-ml` | AzureMLCollector |
| `sagemaker`, `sm` | SageMakerCollector |```bash
# These are equivalent:
dop2mop collect --collectors GitHubCollector,SageMakerCollector
dop2mop collect --collectors github,sagemaker
dop2mop collect --collectors gh,sm
dop2mop [options]
Commands: collect Collect data from DevOps/MLOps platforms demo Generate demo data with attack scenarios
### グローバルオプション
| オプション | 説明 |
|--------|-------------|
| `-v, --verbose` | 詳細出力を有効にする(INFOレベルのログ記録) |
| `--debug` | デバッグ出力を有効にする(DEBUGレベルのログ記録) |
---
### `dop2mop collect`
設定されたDevOpsおよびMLOpsプラットフォームからデータを収集します。```bash
dop2mop collect [OPTIONS]
| Option | Description |
|---|---|
--github-token TOKEN | GitHub個人アクセストークン |
--github-org ORG | GitHub組織名 |
--github-enterprise-url URL | GitHub Enterprise ServerのURL |
| Option | Description |
|---|---|
--azure-devops-token TOKEN | Azure DevOps個人アクセストークン (PAT) |
--azure-devops-access-token TOKEN | Azure DevOpsアクセストークン (Bearer認証、オプション) |
--azure-devops-org ORG | Azure DevOps組織名 |
| Option | Description |
|---|---|
--aws-access-key-id KEY |
dop2mop demo研究から得られた4つの攻撃シナリオを示すデモデータを生成します。```bash dop2mop demo [OPTIONS]
| オプション | 説明 |
|--------|-------------|
| `-o, --output FILE` | 出力ファイルパス(デフォルト: `dop2mop_demo.json`) |
---
### `dop2mop icons`
BloodHoundのノードタイプ用のカスタムアイコン設定を生成します。```bash
dop2mop icons [OPTIONS]
| オプション | 説明 |
|---|---|
-o, --output FILE | 出力ファイルパス(デフォルト: dop2mop_icons.json) |
dop2mop collect -o output.json
dop2mop collect --config dop2mop.yaml -o output.json -v
dop2mop collect --validate -o output.json -v
dop2mop collect -o output.json -v
dop2mop collect -o output.json --debug
dop2mop collect -o output.json --zip
dop2mop collect --max-items 100 -o output.json
dop2mop collect --no-secrets -o output.json
### 単一プラットフォームのコレクション```bash
# GitHub only (aliases: github, gh)
dop2mop collect --collectors github -o github.json -v
# Azure DevOps only (aliases: ado, azuredevops)
dop2mop collect --collectors ado -o ado.json -v
# Azure ML only (aliases: azureml, azure-ml)
dop2mop collect --collectors azureml -o azureml.json -v
# SageMaker only (aliases: sagemaker, sm)
dop2mop collect --collectors sm -o sagemaker.json -v
dop2mop collect --collectors github,sagemaker -o output.json -v
dop2mop collect --collectors github,ado -o output.json -v
dop2mop collect --collectors ado,azureml -o azure.json -v
dop2mop collect --collectors github,ado,azureml,sagemaker -o full.json -v
### GitHub Collection の例```bash
# Using environment variables
export GITHUB_TOKEN="ghp_xxxxxxxxxxxx"
export GITHUB_ORG="your-org"
dop2mop collect --collectors GitHubCollector -o github.json -v
# Using command-line arguments
dop2mop collect --collectors GitHubCollector \
--github-token ghp_xxxxxxxxxxxx \
--github-org your-org \
-o github.json -v
# GitHub Enterprise Server
dop2mop collect --collectors GitHubCollector \
--github-token ghp_xxxxxxxxxxxx \
--github-org your-org \
--github-enterprise-url https://github.yourcompany.com/api/v3 \
-o github.json -v
# Skip secret enumeration
dop2mop collect --collectors GitHubCollector \
--github-token ghp_xxxxxxxxxxxx \
--github-org your-org \
--no-secrets \
-o github.json -v
# Limit to 50 repositories
dop2mop collect --collectors GitHubCollector \
--github-token ghp_xxxxxxxxxxxx \
--github-org your-org \
--max-items 50 \
-o github.json -v
export AZURE_DEVOPS_TOKEN="your-pat" export AZURE_DEVOPS_ORG="your-org" dop2mop collect --collectors AzureDevOpsCollector -o ado.json -v
dop2mop collect --collectors AzureDevOpsCollector
--azure-devops-token your-pat
--azure-devops-org your-org
-o ado.json -v
dop2mop collect --collectors AzureDevOpsCollector
--azure-devops-access-token eyJ0...
--azure-devops-org your-org
-o ado.json -v
> **注記:** Azure DevOps 認証の優先順位: アクセストークン (Bearer) > PAT (Basic)。
> アクセストークンは次のコマンドで取得できます: `az account get-access-token --resource 499b84ac-1321-427f-aa17-267ca6975798`。
### Azure ML コレクションの例```bash
# Using environment variables
export AZURE_SUBSCRIPTION_ID="xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx"
export AZURE_TENANT_ID="xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx"
dop2mop collect --collectors AzureMLCollector -o azureml.json -v
# Using DefaultAzureCredential (az login)
dop2mop collect --collectors AzureMLCollector \
--azure-subscription-id xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx \
--azure-tenant-id xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx \
-o azureml.json -v
# Using Service Principal
dop2mop collect --collectors AzureMLCollector \
--azure-subscription-id xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx \
--azure-tenant-id xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx \
--azure-client-id xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx \
--azure-client-secret your-secret \
-o azureml.json -v
# Using Access Token
dop2mop collect --collectors AzureMLCollector \
--azure-subscription-id xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx \
--azure-tenant-id xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx \
--azure-access-token eyJ0... \
-o azureml.json -v
注: Azure ML 認証の優先順位: アクセストークン > サービスプリンシパル > DefaultAzureCredential (az login). アクセストークンは、
az account get-access-token --resource https://management.azure.com/で取得できます。
export AWS_PROFILE="your-profile" dop2mop collect --collectors SageMakerCollector -o sagemaker.json -v
dop2mop collect --collectors SageMakerCollector
--aws-profile your-profile
-o sagemaker.json -v
dop2mop collect --collectors SageMakerCollector
--aws-access-key-id AKIAXXXXXXXXXXXXXXXX
--aws-secret-access-key xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
--aws-region us-east-1
-o sagemaker.json -v
dop2mop collect --collectors SageMakerCollector
--aws-profile your-profile
--aws-region us-west-2
-o sagemaker.json -v
### 完全な環境収集```bash
# Set all environment variables
export GITHUB_TOKEN="ghp_xxxxxxxxxxxx"
export GITHUB_ORG="your-org"
export AZURE_DEVOPS_TOKEN="your-pat"
export AZURE_DEVOPS_ORG="your-org"
export AZURE_SUBSCRIPTION_ID="xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx"
export AZURE_TENANT_ID="xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx"
export AWS_PROFILE="your-profile"
# Collect from all platforms (auto-detects configured collectors)
dop2mop collect -o full_collection.json -v
# Or with explicit collectors
dop2mop collect \
--collectors GitHubCollector,AzureDevOpsCollector,AzureMLCollector,SageMakerCollector \
-o full_collection.json -v
すべてのコマンドラインオプションは、環境変数を介して設定できます。
優先順位: CLI 引数 > 設定ファイル > 環境変数。
| Kind | 説明 |
|---|---|
ServicePrincipal | Azure AD サービスプリンシパル |
IAMRole | AWS IAM ロール |
OIDCIdentity | OIDC フェデレーション ID |
| Kind | 説明 |
|---|---|
ContainerRegistry | コンテナレジストリ (ECR, ACR) |
ContainerImage | コンテナイメージ |
S3Bucket | AWS S3 バケット |
これらのエッジは、明示的な API データが利用できない場合 (例: シークレットに保存されたロール ARN)、ヒューリスティック分析によって作成されます。これらは個別のエッジタイプを使用するため、BloodHound クエリでフィルタリングできます。
| Kind | 説明 |
|---|---|
InferredCanAssumeRole | OIDC ID がロールを引き受け可能である可能性があります (推論) |
InferredSubmitsJob |
包括的なクエリ例については、queries/dop2mop_queries.cypher を参照してください。
Dop2Mop には、data/custom_icons.json に BloodHound カスタムノードタイプ用の事前設定済みアイコンファイルが含まれています。
custom_icons.json の内容を貼り付けます。まず、BloodHound で API トークンを作成します。
次に、この Python スクリプトを使用してアップロードします。```python #!/usr/bin/env python3 """Upload custom icons to BloodHound CE using HMAC authentication."""
import base64 import hashlib import hmac import json from datetime import datetime, timezone import requests
BLOODHOUND_URL = "http://localhost:8080" TOKEN_ID = "your-token-id" TOKEN_KEY = "your-token-key" ICONS_FILE = "custom_icons.json"
def hmac_auth(method: str, uri: str, body: bytes = b"") -> dict: """Generate HMAC authentication headers.""" digester = hmac.new( base64.b64decode(TOKEN_KEY), msg=None, digestmod=hashlib.sha256 )
now = datetime.now(timezone.utc)
timestamp = now.strftime("%Y-%m-%dT%H:%M:%SZ")
digester.update(f"{method}".encode())
digester.update(f"{uri}".encode())
digester.update(timestamp.encode())
if body:
digester.update(body)
signature = base64.b64encode(digester.digest()).decode()
return {
"Authorization": f"bhesignature {TOKEN_ID}",
"RequestDate": timestamp,
"Signature": signature,
"Content-Type": "application/json",
}
def upload_icons(): """Upload custom icons to BloodHound.""" uri = "/api/v2/custom-nodes" url = f"{BLOODHOUND_URL}{uri}"
with open(ICONS_FILE, "rb") as f:
body = f.read()
headers = hmac_auth("POST", uri, body)
response = requests.post(url, headers=headers, data=body)
print(f"Status: {response.status_code}")
print(f"Response: {response.text}")
return response.status_code == 200
if name == "main": upload_icons()
#### オプション3: Bearer Token(クイックテスト)
ブラウザのDevToolsのNetworkタブから、BloodHoundにログインした状態でJWTを取得してください:```bash
curl -X POST http://localhost:8080/api/v2/custom-nodes \
-H "Authorization: Bearer eyJ..." \
-H "Content-Type: application/json" \
-d @custom_icons.json
from dop2mop import Dop2MopCollector, CollectorConfig
config = CollectorConfig( github_token="ghp_xxx", github_org="myorg", aws_profile="default", )
collector = Dop2MopCollector(config) results = collector.validate_all() print(results) # {'GitHubCollector': True, 'SageMakerCollector': True, ...}
collector.run(collectors=["github", "sm"])
collector.save("output.json")
print(collector.get_stats())
print(collector.get_collection_summary())
### 個別コレクターの使用```python
from dop2mop import CollectorConfig, GitHubCollector, SageMakerCollector
from dop2mop.graph import OpenGraphBuilder
# Create shared builder
builder = OpenGraphBuilder(source_kind="MLOpsBase")
# Configure
config = CollectorConfig(
github_token="ghp_xxx",
github_org="myorg",
aws_profile="default",
)
# Run individual collectors
github = GitHubCollector(config, builder)
github.collect()
sagemaker = SageMakerCollector(config, builder)
sagemaker.collect()
# Save combined output
builder.save("combined.json")
from dop2mop.graph import OpenGraphBuilder from dop2mop.models import NodeKind, EdgeType
builder = OpenGraphBuilder(source_kind="CustomSource")
builder.create_node( id="my-pipeline", kinds=[NodeKind.AZURE_DEVOPS_PIPELINE.value], name="My Pipeline", displayname="Production Pipeline", )
builder.create_node( id="my-ml-workspace", kinds=[NodeKind.AZURE_ML_WORKSPACE.value], name="ML Workspace", displayname="Training Workspace", )
builder.create_edge( start_id="my-pipeline", end_id="my-ml-workspace", kind=EdgeType.SUBMITS_JOB, properties={"trust_boundary": "TB4"} )
builder.save("custom_graph.json")
## トラブルシューティング
### まずは検証
認証の問題を早期に発見するために、まずは資格情報の検証から始めてください:```bash
dop2mop collect --validate --collectors github,sm -v
出力には、収集が始まる前にコレクターごとにOK/FAILEDが表示されます。
Total Nodes: 142 DevOps: 45 MLOps: 38 Identity: 12 Artifact: 47
Total Edges: 201 Contains: 62 TriggersPipeline: 15 ...
──────────────────────────────────────────────────────── Collection Issues: GitHubCollector: 45 collected, 3 failed, 1 skipped FAIL: branch_protection:org/repo - 404 Not Found SKIP: branch_protection:org/private - Insufficient permissions
### よくある問題
**"GitHubコレクターが設定されていません。スキップします"**
- `GITHUB_TOKEN` と `GITHUB_ORG` 環境変数が設定されていることを確認するか、`--github-token` と `--github-org` を渡してください
**"Azure MLコレクターが設定されていません。スキップします"**
- `AZURE_SUBSCRIPTION_ID` と `AZURE_TENANT_ID` が設定されていることを確認してください
- `DefaultAzureCredential` を使用する場合は `az login` を実行してください
- または、`--azure-access-token` に `az account get-access-token` からの有効なトークンを渡してください
**"SageMakerコレクターが設定されていません。スキップします"**
- `AWS_PROFILE` または `AWS_ACCESS_KEY_ID` と `AWS_SECRET_ACCESS_KEY` の両方を設定してください
- 認証情報にSageMakerの読み取り権限があることを確認してください
**ブランチ保護が403を返す**
- GitHub APIはブランチ保護ルールを読み取るために管理者アクセスが必要です
- 管理者権限のないトークンはブランチ保護の収集をスキップします(サマリーに報告されます)
**レート制限(429エラー)**
- Dop2Mopはレート制限応答に対して指数バックオフで自動的に再試行します
- 大規模な組織では、`--max-items` を使用してAPI呼び出しを減らしてください
- GitHubのレート制限: 認証済みユーザーは1時間あたり5,000リクエスト
**BloodHoundのCypherコンソールで結果が表示されない**
- クエリがプロパティ(`RETURN a.name, b.name`)ではなく、完全なノード(`RETURN a, b`)を返すことを確認してください
- BloodHoundのCypherコンソールはグラフ可視化用であり、表形式データ用ではありません
- プロパティベースのクエリにはNeo4j Browser(localhost:7474)を使用してください
**推論エッジと収集エッジのフィルタリング**
- 推論エッジは異なるタイプを使用します(例:`CanAssumeRole` の代わりに `InferredCanAssumeRole`)
- 確認済みエッジのみをクエリ: `MATCH p=()-[:CanAssumeRole]->() RETURN p`
- 推論エッジをクエリ: `MATCH p=()-[:InferredCanAssumeRole]->() RETURN p`
---
## ライセンス
MITライセンス - 詳細は[LICENSE](https://github.com/h4wkst3r/dop2mop/blob/HEAD/LICENSE)をご覧ください。
| Option | Description |
|---|
-o, --output FILE | 出力ファイルパス (デフォルト: dop2mop_output.json) |
--zip | 出力をZIPファイルに圧縮 |
--config FILE | YAML/JSON設定ファイルへのパス |
--validate | 収集前に資格情報を検証 |
--collectors LIST | カンマ区切りのコレクターまたはエイリアスのリスト(例:github,sm) |
--max-items N | タイプごとに収集する最大アイテム数 |
--no-secrets | シークレット/認証情報の列挙をスキップ |
| Option | Description |
|---|
--azure-subscription-id ID | AzureサブスクリプションID |
--azure-tenant-id ID | Azure ADテナントID |
--azure-client-id ID | サービスプリンシパルのクライアントID(オプション) |
--azure-client-secret SECRET | サービスプリンシパルのクライアントシークレット(オプション) |
--azure-access-token TOKEN | Azure ML認証用のAzureアクセストークン(オプション) |
| AWSアクセスキーID |
--aws-secret-access-key SECRET | AWSシークレットアクセスキー |
--aws-region REGION | AWSリージョン(デフォルト:us-east-1) |
--aws-profile PROFILE | AWS CLIプロファイル名 |
| Collector Name | Platform | Required Credentials |
|---|
GitHubCollector | GitHub | --github-token, --github-org |
AzureDevOpsCollector | Azure DevOps | --azure-devops-token または --azure-devops-access-token, --azure-devops-org |
AzureMLCollector | Azure ML | --azure-subscription-id, --azure-tenant-id |
SageMakerCollector | AWS SageMaker | --aws-profile または --aws-access-key-id |
| 環境変数 | CLI オプション | 説明 |
|---|
GITHUB_TOKEN | --github-token | GitHub パーソナルアクセストークン |
GITHUB_ORG | --github-org | GitHub 組織名 |
GITHUB_ENTERPRISE_URL | --github-enterprise-url | GitHub Enterprise Server URL |
AZURE_DEVOPS_TOKEN | --azure-devops-token | Azure DevOps PAT |
AZURE_DEVOPS_ACCESS_TOKEN | --azure-devops-access-token | Azure DevOps アクセストークン (Bearer) |
AZURE_DEVOPS_ORG | --azure-devops-org | Azure DevOps 組織 |
AZURE_SUBSCRIPTION_ID | --azure-subscription-id | Azure サブスクリプション ID |
AZURE_TENANT_ID | --azure-tenant-id | Azure AD テナント ID |
AZURE_CLIENT_ID | --azure-client-id | Azure サービスプリンシパル クライアント ID |
AZURE_CLIENT_SECRET | --azure-client-secret | Azure サービスプリンシパル シークレット |
AZURE_ACCESS_TOKEN | --azure-access-token | Azure ML 用 Azure アクセストークン |
AWS_ACCESS_KEY_ID | --aws-access-key-id | AWS アクセスキー ID |
AWS_SECRET_ACCESS_KEY | --aws-secret-access-key | AWS シークレットアクセスキー |
AWS_REGION | --aws-region | AWS リージョン (デフォルト: us-east-1) |
AWS_PROFILE | --aws-profile | AWS CLI プロファイル名 |
| Kind | 説明 |
|---|
GHOrganization | GitHub 組織 |
GHRepository | GitHub リポジトリ |
GHWorkflow | GitHub Actions ワークフロー |
GHSecret | GitHub Actions シークレット |
ADOOrganization | Azure DevOps 組織 |
ADOProject | Azure DevOps プロジェクト |
ADOPipeline | Azure DevOps パイプライン |
ADOServiceConnection | Azure DevOps サービス接続 (NHI) とスコープの詳細 |
ADOAgent | Azure DevOps エージェントプール (ホステッドまたはセルフホステッド) |
ADOVariableGroup | Azure DevOps 変数グループ |
| Kind | 説明 |
|---|
AzMLWorkspace | Azure ML ワークスペース |
AzMLCompute | Azure ML コンピュートクラスター/インスタンス |
AzMLExperiment | Azure ML ジョブ/実験 |
AzMLDatastore | Azure ML データストア |
AzMLEnvironment | Azure ML 環境 (コンテナ定義) |
AzMLModel | Azure ML 登録済みモデル |
SMDomain | SageMaker Studio ドメイン |
SMTrainingJob | SageMaker トレーニングジョブ |
SMModel | SageMaker モデル |
SMEndpoint | SageMaker エンドポイント (Azure ML エンドポイントにも使用) |
SMNotebook | SageMaker ノートブックインスタンス |
ManagedIdentity | Azure マネージド ID |
Dataset | ML データセット |
| Kind | トラストバウンダリ | 説明 |
|---|
TriggersPipeline | TB1 | コードコミットが CI/CD をトリガー |
HasBranchProtection | TB1 | リポジトリにブランチ保護ルールがあります |
BypassesProtection | TB1 | 脆弱/欠如しているブランチ保護 (悪用可能) |
AuthenticatesAs | TB2 | パイプラインがサービスプリンシパルを使用 |
CanAssumeRole | TB2 | OIDC ID が IAM ロールを引き受け可能 |
OIDCTrust | TB2 | ワークフローが OIDC フェデレーションを使用 |
UsesServiceConnection | TB2 | パイプラインが ADO サービス接続を使用 |
PullsImage | TB3 | トレーニングジョブがコンテナイメージをプル |
CanPoisonImage | TB3 | パイプラインがコンテナイメージを変更可能 |
SubmitsJob | TB4 | サービスプリンシパルが ML ジョブを送信 |
CodeExecution | TB4 | ジョブがコンピュートでコードを実行 |
LoadsDataset | TB5 | トレーニングジョブがデータセットをロード |
CanPoisonDataset | TB5 | パイプラインがデータセットを変更可能 |
Deserializes | TB5 | 安全でないデシリアライゼーション |
| ワークフローが OIDC を介してトレーニングジョブを送信する可能性があります (推論) |
InferredPullsImage | トレーニングジョブが悪意のあるコンテナイメージをプルする可能性があります (推論) |
InferredLoadsDataset | トレーニングジョブが悪意のあるデータセットをロードする可能性があります (推論) |
| Kind | 説明 |
|---|
Contains | 親子関係 |
MemberOf | グループメンバーシップ |
HasAccessTo | リソースへのアクセス権限 |
HasExecutionRole | リソースが IAM/実行ロールを使用 |
Owns | 所有関係 |