
Коллектор OpenGraph для BloodHound, который отображает пути атак от инфраструктуры DevOps до инфраструктуры MLOps, собирая ресурсы CI/CD pipeline, service principal и ML platform для анализа латерального перемещения.
Прототип сборщика OpenGraph для BloodHound, отображающего пути атак от DevOps до инфраструктуры MLOps.
Основано на Pipelines of Privilege: Attack Paths from DevOps to MLOps Infrastructure авторства Brett Hawkins (@h4wkst3r).
Dop2Mop собирает данные с платформ DevOps и MLOps для выявления путей атак, обеспечивающих боковое перемещение из конвейеров CI/CD в инфраструктуру обучения машинного обучения. Он выводит JSON OpenGraph, совместимый с BloodHound, для визуализации и анализа.
| Платформы DevOps | Платформы MLOps | Поставщики идентификации |
|---|---|---|
| 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 моделирует пять критических границ доверия, выявленных в исследовании:
git clone https://github.com/h4wkst3r/dop2mop.git cd dop2mop pip install -r requirements.txt pip install -e .
## What's Collected
Each collector gathers platform-specific resources and maps the trust boundaries between them:
| Collector | Resources Collected |
|-----------|-------------------|
| **GitHub** | Organizations, repositories, workflows, secrets, branch protection rules, OIDC configurations, container image references, S3 bucket references |
| **Azure DevOps** | Organizations, projects, pipelines (YAML), service connections (with scope details), variable groups, agent pools, repositories |
| **Azure ML** | Workspaces, compute clusters/instances, datastores, ML environments, registered models, jobs/experiments, online & batch endpoints |
| **SageMaker** | Training jobs, models, endpoints, domains, notebook instances, IAM execution roles (with policy analysis), ECR repositories/images, S3 buckets (filtered to ML-relevant) |
## Quick Start
### Generate Demo Data
The fastest way to see Dop2Mop in action is to generate demo data showing the attack scenarios from the research:```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 проверяет следующие местоположения по порядку:
--configdop2mop.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-вызов для каждой платформы, чтобы проверить действительность токенов перед началом сбора.
### Псевдонимы сборщиков
Вы можете использовать короткие имена вместо полных имён классов с помощью `--collectors`:
| Псевдоним | Сборщик |
|-----------|---------|
| `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]
| Параметр | Описание |
|---|---|
--github-token TOKEN | Персональный токен доступа GitHub |
--github-org ORG | Имя организации GitHub |
--github-enterprise-url URL | URL сервера GitHub Enterprise |
| Параметр | Описание |
|---|---|
--azure-devops-token TOKEN | Персональный токен доступа Azure DevOps (PAT) |
--azure-devops-access-token TOKEN | Токен доступа Azure DevOps (аутентификация Bearer, опционально) |
--azure-devops-org ORG | Имя организации Azure DevOps |
| Параметр | Описание |
|---|---|
dop2mop demoСгенерировать демонстрационные данные, показывающие четыре сценария атак из исследования.```bash dop2mop demo [OPTIONS]
| Option | Description |
|--------|-------------|
| `-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```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 > файл конфигурации > переменные окружения.
| Вид | Описание |
|---|---|
ServicePrincipal | Субъект-служба Azure AD |
IAMRole | Роль IAM AWS |
OIDCIdentity |
| Вид | Описание |
|---|---|
ContainerRegistry | Реестр контейнеров (ECR, ACR) |
ContainerImage | Образ контейнера |
S3Bucket |
Эти рёбра создаются эвристическим анализом, когда нет явных данных API (например, ARN ролей, хранящиеся в секретах). Они используют отдельные типы рёбер, чтобы вы могли фильтровать их в запросах BloodHound.
| Вид | Описание |
|---|---|
InferredCanAssumeRole |
См. файл queries/dop2mop_queries.cypher с полными примерами запросов.
Dop2Mop включает предварительно настроенный файл значков для пользовательских типов узлов BloodHound в data/custom_icons.json.
custom_icons.jsonСначала создайте токен API в BloodHound:
Затем используйте этот скрипт 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 (Quick Testing)
Получите JWT из вкладки Network в DevTools вашего браузера, будучи авторизованным в BloodHound:```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`
- Запустите `az login`, если используете DefaultAzureCredential
- В качестве альтернативы передайте `--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: 5 000 запросов в час для аутентифицированных пользователей
**Нет результатов в консоли Cypher BloodHound**
- Убедитесь, что запросы возвращают полные узлы (`RETURN a, b`), а не свойства (`RETURN a.name, b.name`)
- Консоль Cypher BloodHound предназначена для визуализации графов, а не табличных данных
- Используйте Neo4j Browser (localhost:7474) для запросов на основе свойств
**Фильтрация предполагаемых и собранных ребер**
- Предполагаемые ребра используют отдельные типы (например, `InferredCanAssumeRole` вместо `CanAssumeRole`)
- Запрос только подтвержденных ребер: `MATCH p=()-[:CanAssumeRole]->() RETURN p`
- Запрос предполагаемых ребер: `MATCH p=()-[:InferredCanAssumeRole]->() RETURN p`
---
## Лицензия
Лицензия MIT — Подробности см. в [LICENSE](https://github.com/h4wkst3r/dop2mop/blob/HEAD/LICENSE).
| Параметр | Описание |
|---|
-o, --output FILE | Путь к выходному файлу (по умолчанию: dop2mop_output.json) |
--zip | Сжать вывод в ZIP-файл |
--config FILE | Путь к конфигурационному файлу YAML/JSON |
--validate | Проверить учетные данные перед сбором |
--collectors LIST | Список сборщиков или псевдонимов через запятую (например, github,sm) |
--max-items N | Максимальное количество элементов для сбора на тип |
--no-secrets | Пропустить перечисление секретов/учетных данных |
| Параметр | Описание |
|---|
--azure-subscription-id ID | Идентификатор подписки Azure |
--azure-tenant-id ID | Идентификатор арендатора Azure AD |
--azure-client-id ID | Идентификатор клиента субъекта-службы (опционально) |
--azure-client-secret SECRET | Секрет клиента субъекта-службы (опционально) |
--azure-access-token TOKEN | Токен доступа Azure для аутентификации Azure ML (опционально) |
--aws-access-key-id KEY |
| Идентификатор ключа доступа AWS |
--aws-secret-access-key SECRET | Секретный ключ доступа AWS |
--aws-region REGION | Регион AWS (по умолчанию: us-east-1) |
--aws-profile PROFILE | Имя профиля AWS CLI |
| Имя сборщика | Платформа | Необходимые учетные данные |
|---|
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 | URL сервера GitHub Enterprise |
AZURE_DEVOPS_TOKEN | --azure-devops-token | PAT Azure DevOps |
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 |
AZURE_TENANT_ID | --azure-tenant-id | Идентификатор клиента Azure AD |
AZURE_CLIENT_ID | --azure-client-id | Идентификатор клиента субъекта-службы Azure |
AZURE_CLIENT_SECRET | --azure-client-secret | Секрет субъекта-службы Azure |
AZURE_ACCESS_TOKEN | --azure-access-token | Токен доступа Azure для Azure ML |
AWS_ACCESS_KEY_ID | --aws-access-key-id | Идентификатор ключа доступа AWS |
AWS_SECRET_ACCESS_KEY | --aws-secret-access-key | Секретный ключ доступа AWS |
AWS_REGION | --aws-region | Регион AWS (по умолчанию: us-east-1) |
AWS_PROFILE | --aws-profile | Имя профиля AWS CLI |
| Вид | Описание |
|---|
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 |
| Вид | Описание |
|---|
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 |
| Федеративная идентичность OIDC |
ManagedIdentity | Управляемое удостоверение Azure |
| Корзина S3 AWS |
Dataset | Набор данных ML |
| Вид | Граница доверия | Описание |
|---|
TriggersPipeline | TB1 | Коммит кода запускает CI/CD |
HasBranchProtection | TB1 | Репозиторий имеет правила защиты ветки |
BypassesProtection | TB1 | Слабая/отсутствующая защита ветки (эксплуатируемая) |
AuthenticatesAs | TB2 | Конвейер использует субъект-службу |
CanAssumeRole | TB2 | Идентичность OIDC может принять роль IAM |
OIDCTrust | TB2 | Рабочий процесс использует федерацию OIDC |
UsesServiceConnection | TB2 | Конвейер использует подключение к службе ADO |
PullsImage | TB3 | Обучающее задание извлекает образ контейнера |
CanPoisonImage | TB3 | Конвейер может изменить образ контейнера |
SubmitsJob | TB4 | Субъект-служба отправляет задание ML |
CodeExecution | TB4 | Задание выполняет код на вычислительном узле |
LoadsDataset | TB5 | Обучающее задание загружает набор данных |
CanPoisonDataset | TB5 | Конвейер может изменить набор данных |
Deserializes | TB5 | Небезопасная десериализация |
| Идентичность OIDC может иметь возможность принять роль (выведено) |
InferredSubmitsJob | Рабочий процесс может отправлять обучающее задание через OIDC (выведено) |
InferredPullsImage | Обучающее задание может извлечь отравленный образ контейнера (выведено) |
InferredLoadsDataset | Обучающее задание может загрузить отравленный набор данных (выведено) |
| Вид | Описание |
|---|
Contains | Отношение «родитель-потомок» |
MemberOf | Членство в группе |
HasAccessTo | Разрешение на доступ к ресурсу |
HasExecutionRole | Ресурс использует роль IAM/выполнения |
Owns | Отношение владения |