Skip to content
KitploitKITPLOIT
ИнструментыБлог
Отправить
ИнструментыБлог
Отправить

Инструменты для хакинга, пентеста и кибербезопасности — ваш арсенал защиты!

Kitploit — это каталог инструментов для хакинга, кибербезопасности и пентестинга. Находите последние обновления проектов для поиска уязвимостей, анализа систем, автоматизации тестирования и усиления вашей безопасности.

··Ленты·Контакты·Конфиденциальность·© 2026 Kitploit

Каталог инструментов

Категории

Все категории
Loading categories
Dop2Mop — Коллектор OpenGraph для BloodHound, который отображает пути атак от инфраструктуры DevOps до инфраструктуры MLOps, собирая ресурсы CI/CD pipeline, service principal и ML platform для анализа латерального перемещения. | Kitploit
Инструменты/GitHubGitHub/h4wkst3r/dop2mop
Безопасность облачной инфраструктурыРазведкаБезопасность контейнеровАнализ уязвимостейСбор информацииТестирование на ПроникновениеБезопасность облачных средDevSecOpsУправление идентификацией и доступом (IAM)Безопасность Цепочки ПоставокRed Teaming
414 месяцев назадЕщё не проверено

Популярное

Смотреть все →

Откройте для себя самые используемые инструменты нашего сообщества.

Изучить все инструменты

Просмотрите нашу коллекцию инструментов

Смотреть все инструменты →
Поделиться
GitHub
h4wkst3r/dop2mop

Dop2Mop

Коллектор OpenGraph для BloodHound, который отображает пути атак от инфраструктуры DevOps до инфраструктуры MLOps, собирая ресурсы CI/CD pipeline, service principal и ML platform для анализа латерального перемещения.

Репозиторий

Dop2Mop

Прототип сборщика OpenGraph для BloodHound, отображающего пути атак от DevOps до инфраструктуры MLOps.

Основано на Pipelines of Privilege: Attack Paths from DevOps to MLOps Infrastructure авторства Brett Hawkins (@h4wkst3r).

Содержание

  • Благодарности
  • Обзор
    • Поддерживаемые платформы
    • Сопоставленные границы доверия
  • Установка
    • Необязательные зависимости
  • Быстрый старт
    • Создать демо-данные
    • Загрузить в BloodHound
  • Конфигурация
    • Файл конфигурации
    • Проверка учётных данных
  • Справочник CLI
    • Обзор команд
    • Глобальные опции
    • dop2mop collect
    • dop2mop demo
  • Примеры использования CLI
    • Базовая коллекция
    • Сбор с одной платформы
    • Сбор с нескольких платформ
    • Примеры сбора из GitHub
    • Примеры сбора из Azure DevOps
    • Примеры сбора из Azure ML
    • Примеры сбора из AWS SageMaker
    • Полный сбор окружения
  • Переменные окружения
  • Типы узлов
    • Узлы DevOps
    • Узлы MLOps
    • Узлы идентификации
    • Узлы артефактов
  • Типы рёбер
    • Рёбра путей атак
    • Структурные рёбра
  • Примеры запросов
  • Пользовательские иконки
    • Загрузка иконок в BloodHound
  • Python API
    • Использование отдельных сборщиков
    • Построение пользовательских графов
  • Устранение неполадок
    • Частые проблемы
  • Лицензия

Благодарности

  • SpecterOps за BloodHound и OpenGraph

Обзор

Dop2Mop собирает данные с платформ DevOps и MLOps для выявления путей атак, обеспечивающих боковое перемещение из конвейеров CI/CD в инфраструктуру обучения машинного обучения. Он выводит JSON OpenGraph, совместимый с BloodHound, для визуализации и анализа.

Поддерживаемые платформы

Платформы DevOpsПлатформы MLOpsПоставщики идентификации
GitHub (Actions, Repos, Secrets)Azure Machine LearningAzure AD Service Principals
Azure DevOps (Pipelines, Service Connections)Amazon SageMakerAWS IAM Roles
OIDC/Federated Identity

Сопоставленные границы доверия

Dop2Mop моделирует пять критических границ доверия, выявленных в исследовании:

  1. TB1: Репозиторий кода в конвейер CI/CD - Автоматический запуск конвейеров из коммитов кода
  2. TB2: Аутентификация сервисного принципала - Учётные данные NHI, используемые конвейерами для доступа к платформам ML
  3. TB3: Доверие к контейнерным артефактам - Неявное доверие к образам контейнеров из внутренних реестров
  4. TB4: Выполнение определения задания - Платформы ML выполняют определения заданий без проверки
  5. TB5: Десериализация кода - Небезопасная десериализация наборов данных (pickle, joblib)

Установка```bash

git clone https://github.com/h4wkst3r/dop2mop.git cd dop2mop pip install -r requirements.txt pip install -e .

root@kitploit:~
## 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

Импорт в BloodHound

  1. Откройте BloodHound CE (v8.0+)
  2. Перейдите в Administration → File Ingest
  3. Загрузите сгенерированный JSON-файл
  4. Выполните запрос с помощью Cypher:```cypher // Azure DevOps to Azure ML Lateral Movement MATCH p=(repo)-[:TriggersPipeline]->(pipeline)-[:UsesServiceConnection]->(svcconn)-[:AuthenticatesAs]->(workspace)-[:CodeExecution]->(compute) RETURN p

// 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

root@kitploit:~
## Конфигурация

### Файл конфигурации

Вместо того чтобы передавать учетные данные при каждом запуске, вы можете сохранить их в конфигурационном файле. Скопируйте прилагаемый пример и заполните свои значения:```bash
cp dop2mop.yaml.example dop2mop.yaml
# Edit dop2mop.yaml with your credentials

Dop2Mop проверяет следующие местоположения по порядку:

  1. Путь, указанный в --config
  2. dop2mop.yaml / dop2mop.yml / .dop2mop.yaml в текущей директории
  3. ~/.dop2mop.yaml

Примечание: dop2mop.yaml находится в .gitignore, чтобы предотвратить случайную фиксацию учетных данных. Файл примера (dop2mop.yaml.example) безопасен для фиксации.

Смотрите dop2mop.yaml.example для всех доступных опций с комментариями.

Приоритет: аргументы CLI > файл конфигурации > переменные окружения.

Проверка учетных данных

Протестируйте учетные данные перед запуском полного сбора:```bash

Validate all configured collectors

dop2mop collect --validate -v

Validate specific collectors

dop2mop collect --validate --collectors github,sagemaker -v

root@kitploit:~
Это позволяет выполнять облегчённый 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

Справочник по CLI

Обзор команд```

dop2mop [options]

Commands: collect Collect data from DevOps/MLOps platforms demo Generate demo data with attack scenarios

root@kitploit:~
### Глобальные опции

| Опция | Описание |
|--------|-------------|
| `-v, --verbose` | Включить подробный вывод (логирование уровня INFO) |
| `--debug` | Включить отладочный вывод (логирование уровня DEBUG) |

---

### `dop2mop collect`

Сбор данных из настроенных платформ DevOps и MLOps.```bash
dop2mop collect [OPTIONS]

Основные параметры

Параметры GitHub

ПараметрОписание
--github-token TOKENПерсональный токен доступа GitHub
--github-org ORGИмя организации GitHub
--github-enterprise-url URLURL сервера GitHub Enterprise

Параметры Azure DevOps

ПараметрОписание
--azure-devops-token TOKENПерсональный токен доступа Azure DevOps (PAT)
--azure-devops-access-token TOKENТокен доступа Azure DevOps (аутентификация Bearer, опционально)
--azure-devops-org ORGИмя организации Azure DevOps

Параметры Azure ML

Параметры AWS SageMaker

ПараметрОписание

Доступные сборщики


dop2mop demo

Сгенерировать демонстрационные данные, показывающие четыре сценария атак из исследования.```bash dop2mop demo [OPTIONS]

root@kitploit:~
| Option | Description |
|--------|-------------|
| `-o, --output FILE` | Путь к выходному файлу (по умолчанию: `dop2mop_demo.json`) |

---

### `dop2mop icons`

Сгенерировать пользовательскую конфигурацию иконок для типов узлов BloodHound.```bash
dop2mop icons [OPTIONS]
ОпцияОписание
-o, --output FILEПуть к выходному файлу (по умолчанию: dop2mop_icons.json)

Примеры использования CLI

Базовая коллекция```bash

Collect from all configured platforms (uses environment variables)

dop2mop collect -o output.json

Use a config file

dop2mop collect --config dop2mop.yaml -o output.json -v

Validate credentials first, then collect

dop2mop collect --validate -o output.json -v

Collect with verbose logging

dop2mop collect -o output.json -v

Collect with debug logging

dop2mop collect -o output.json --debug

Collect and compress to ZIP

dop2mop collect -o output.json --zip

Limit collection size

dop2mop collect --max-items 100 -o output.json

Skip secret enumeration

dop2mop collect --no-secrets -o output.json

root@kitploit:~
### Коллекция одной платформы```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

Многоплатформенная коллекция```bash

GitHub + SageMaker

dop2mop collect --collectors github,sagemaker -o output.json -v

GitHub + Azure DevOps

dop2mop collect --collectors github,ado -o output.json -v

Azure DevOps + Azure ML (full Azure stack)

dop2mop collect --collectors ado,azureml -o azure.json -v

All collectors explicitly

dop2mop collect --collectors github,ado,azureml,sagemaker -o full.json -v

root@kitploit:~
### Примеры коллекций 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

Примеры коллекций Azure DevOps```bash

Using environment variables

export AZURE_DEVOPS_TOKEN="your-pat" export AZURE_DEVOPS_ORG="your-org" dop2mop collect --collectors AzureDevOpsCollector -o ado.json -v

Using command-line arguments (PAT)

dop2mop collect --collectors AzureDevOpsCollector
--azure-devops-token your-pat
--azure-devops-org your-org
-o ado.json -v

Using access token (Bearer auth)

dop2mop collect --collectors AzureDevOpsCollector
--azure-devops-access-token eyJ0...
--azure-devops-org your-org
-o ado.json -v

root@kitploit:~
> **Примечание:** Приоритет аутентификации 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/.

Примеры коллекции AWS SageMaker```bash

Using AWS profile (environment variable)

export AWS_PROFILE="your-profile" dop2mop collect --collectors SageMakerCollector -o sagemaker.json -v

Using AWS profile (command-line)

dop2mop collect --collectors SageMakerCollector
--aws-profile your-profile
-o sagemaker.json -v

Using access keys

dop2mop collect --collectors SageMakerCollector
--aws-access-key-id AKIAXXXXXXXXXXXXXXXX
--aws-secret-access-key xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
--aws-region us-east-1
-o sagemaker.json -v

Different AWS region

dop2mop collect --collectors SageMakerCollector
--aws-profile your-profile
--aws-region us-west-2
-o sagemaker.json -v

root@kitploit:~
### Полный сбор окружения```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 > файл конфигурации > переменные окружения.


Типы узлов

Узлы DevOps

Узлы MLOps

Узлы идентификации

ВидОписание
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.

Загрузка значков в BloodHound

Вариант 1: API Explorer (самый простой)

  1. Откройте BloodHound CE и перейдите в Settings → API Explorer
  2. Найдите POST /api/v2/custom-nodes
  3. Нажмите «Try it out»
  4. Вставьте содержимое custom_icons.json
  5. Нажмите «Execute»

Вариант 2: HMAC-аутентификация (рекомендуется для автоматизации)

Сначала создайте токен API в BloodHound:

  1. Перейдите в Settings → Administration → Manage Users
  2. Нажмите на своего пользователя → Create Token
  3. Сохраните Token ID и Token Key

Затем используйте этот скрипт 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

Configuration

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 )

root@kitploit:~
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}"

root@kitploit:~
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()

root@kitploit:~
#### Вариант 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

Python API```python

from dop2mop import Dop2MopCollector, CollectorConfig

Configure collection

config = CollectorConfig( github_token="ghp_xxx", github_org="myorg", aws_profile="default", )

Validate credentials first

collector = Dop2MopCollector(config) results = collector.validate_all() print(results) # {'GitHubCollector': True, 'SageMakerCollector': True, ...}

Run collection (supports aliases)

collector.run(collectors=["github", "sm"])

Save output

collector.save("output.json")

Get statistics

print(collector.get_stats())

Get per-collector failure/skip details

print(collector.get_collection_summary())

root@kitploit:~
### Использование отдельных сборщиков```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")

Создание пользовательских графов```python

from dop2mop.graph import OpenGraphBuilder from dop2mop.models import NodeKind, EdgeType

builder = OpenGraphBuilder(source_kind="CustomSource")

Add nodes

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", )

Add edge

builder.create_edge( start_id="my-pipeline", end_id="my-ml-workspace", kind=EdgeType.SUBMITS_JOB, properties={"trust_boundary": "TB4"} )

Export

builder.save("custom_graph.json")

root@kitploit:~
---

## Устранение неполадок

### Сначала проверка

Всегда начинайте с проверки учетных данных, чтобы на раннем этапе выявить проблемы с аутентификацией:```bash
dop2mop collect --validate --collectors github,sm -v

Вывод покажет OK/FAILED для каждого сборщика до начала любой сборки.

Сводка сбора

После каждого запуска Dop2Mop выводит сводку, показывающую, что было собрано и что завершилось с ошибкой:```

Dop2Mop Collection Summary

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

Output: output.json

root@kitploit:~
### Часто возникающие проблемы

**"Коллектор 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
Имя сборщикаПлатформаНеобходимые учетные данные
GitHubCollectorGitHub--github-token, --github-org
AzureDevOpsCollectorAzure DevOps--azure-devops-token или --azure-devops-access-token, --azure-devops-org
AzureMLCollectorAzure ML--azure-subscription-id, --azure-tenant-id
SageMakerCollectorAWS SageMaker--aws-profile или --aws-access-key-id
Переменная окруженияЭквивалент CLIОписание
GITHUB_TOKEN--github-tokenПерсональный токен доступа GitHub
GITHUB_ORG--github-orgИмя организации GitHub
GITHUB_ENTERPRISE_URL--github-enterprise-urlURL сервера GitHub Enterprise
AZURE_DEVOPS_TOKEN--azure-devops-tokenPAT 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
ВидГраница доверияОписание
TriggersPipelineTB1Коммит кода запускает CI/CD
HasBranchProtectionTB1Репозиторий имеет правила защиты ветки
BypassesProtectionTB1Слабая/отсутствующая защита ветки (эксплуатируемая)
AuthenticatesAsTB2Конвейер использует субъект-службу
CanAssumeRoleTB2Идентичность OIDC может принять роль IAM
OIDCTrustTB2Рабочий процесс использует федерацию OIDC
UsesServiceConnectionTB2Конвейер использует подключение к службе ADO
PullsImageTB3Обучающее задание извлекает образ контейнера
CanPoisonImageTB3Конвейер может изменить образ контейнера
SubmitsJobTB4Субъект-служба отправляет задание ML
CodeExecutionTB4Задание выполняет код на вычислительном узле
LoadsDatasetTB5Обучающее задание загружает набор данных
CanPoisonDatasetTB5Конвейер может изменить набор данных
DeserializesTB5Небезопасная десериализация
Идентичность OIDC может иметь возможность принять роль (выведено)
InferredSubmitsJobРабочий процесс может отправлять обучающее задание через OIDC (выведено)
InferredPullsImageОбучающее задание может извлечь отравленный образ контейнера (выведено)
InferredLoadsDatasetОбучающее задание может загрузить отравленный набор данных (выведено)
ВидОписание
ContainsОтношение «родитель-потомок»
MemberOfЧленство в группе
HasAccessToРазрешение на доступ к ресурсу
HasExecutionRoleРесурс использует роль IAM/выполнения
OwnsОтношение владения