dd-audit-key-compromise — скилл для Claude Code
Разбирает, что делал подозрительный API-ключ Datadog: когда, откуда, какие эндпоинты и что удалили. Пригодится, когда ключ мог утечь.
npx skills add datadog-labs/agent-skills --skill dd-audit-key-compromise -a claude-code
npx skills add datadog-labs/agent-skills --skill key-compromise -a claude-codeЧто делает dd-audit-key-compromise
Скилл восстанавливает картину по Audit Trail: строит хронологию событий ключа, группирует запросы по странам, ASN и IP, показывает, какие эндпоинты вызывали и какими методами. Отдельным шагом ищет удаления — мониторы, дашборды, пайплайны логов. Ещё один запрос отвечает, когда ключ создали и кто это сделал.
Внутри пять шагов с командами pup audit-logs search и разбором JSON через jq, плюс таблица признаков аномалий: страна вне обычной географии, ASN облачного или VPN-провайдера, всплеск активности за короткое окно, работа вне рабочих часов, одновременные запросы с разных IP. На выходе — готовый формат отчёта с периодами, топом эндпоинтов и списком удалённых ресурсов.
Перед запуском нужна авторизация: pup auth login по OAuth2 либо DD_API_KEY и DD_APP_KEY со scope audit_logs_read. Ещё нужен именно ID ключа, а не его значение — взять его можно в Organization Settings > API Keys. Отзыв ключа через pup api-keys delete KEY_ID требует scope manage_api_keys, так что без него придётся отзывать вручную в UI.
Какие задачи решает
- понять, что успел сделать утёкший ключ Datadog
- найти IP и страны, откуда шли запросы
- проверить, не удалили ли мониторы и дашборды
- выяснить, кто и когда создал подозрительный ключ
- собрать отчёт по инциденту для разбора
Примеры запросов агенту
- Разбери, что делал ключ Datadog с ID
abc123за последние 90 дней - Построй хронологию запросов этого ключа и покажи, откуда они шли
- Проверь, были ли удаления ресурсов по этому ключу, и предложи шаги
Как установить dd-audit-key-compromise
1Через Skills CLI (Vercel)
npx skills add datadog-labs/agent-skills --skill dd-audit-key-compromise -a claude-codenpx skills add datadog-labs/agent-skills --skill key-compromise -a claude-code2Вручную: положить файлы
~/.claude/skills/key-compromise/SKILL.mdПапка скилла целиком; для одного проекта — .claude/skills/key-compromise/
1Через Skills CLI (Vercel)
npx skills add datadog-labs/agent-skills --skill key-compromise -a codex2Вручную: положить файлы
.agents/skills/key-compromise/SKILL.mdДля всех проектов — ~/.agents/skills/
1Через Skills CLI (Vercel)
npx skills add datadog-labs/agent-skills --skill key-compromise -a cursor2Вручную: положить файлы
.cursor/skills/key-compromise/SKILL.mdCursor читает и .agents/skills/, и .claude/skills/
1GitHub CLI
gh skill install datadog-labs/agent-skills key-compromise2Вручную: положить файлы
.github/skills/key-compromise/SKILL.md1Через Skills CLI (Vercel)
npx skills add datadog-labs/agent-skills --skill key-compromise -a gemini-cli2Командой платформы
gemini skills install https://github.com/datadog-labs/agent-skills --path dd-audit/key-compromiseВручную: положить файлы
.devin/skills/key-compromise/SKILL.mdСтарый путь .windsurf/skills/ тоже читается
Через Skills CLI (Vercel)
npx skills add datadog-labs/agent-skills --skill key-compromise -a opencodeClaude.ai
Упакуйте папку в zip и загрузите в Settings → Capabilities → Skills
По шагам, с командами для каждой платформы: Как установить скилл в Claude Code: пять способов
Вопросы о dd-audit-key-compromise
Как установить dd-audit-key-compromise в Claude Code?
Выполните npx skills add datadog-labs/agent-skills --skill dd-audit-key-compromise -a claude-code. Скилл появится в ~/.claude/skills/key-compromise/SKILL.md.
Что делает dd-audit-key-compromise?
Собирает из Audit Trail хронологию действий ключа Datadog, разбивку по гео и IP, список вызванных эндпоинтов и удаления ресурсов, затем предлагает шаги по устранению.
Что нужно, чтобы скилл заработал?
Авторизация pup auth login или пара DD_API_KEY и DD_APP_KEY со scope audit_logs_read. Ещё понадобится ID подозрительного ключа из Organization Settings > API Keys.
Исходный текст
SKILL.md · MIT
---
name: dd-audit-key-compromise
description: Investigate a potentially compromised Datadog API key — timeline of actions, geo/IP breakdown, endpoints called, anomaly flags, and remediation steps.
metadata:
version: "0.1.0"
author: datadog-labs
repository: https://github.com/datadog-labs/agent-skills
tags: datadog,audit,security,api-key,compromise,dd-audit
alwaysApply: "false"
---
# Audit Trail: API Key Compromise Investigation
Reconstruct what a Datadog API key did, where requests originated, and which resources were affected.
## Prerequisites
```bash
pup auth login # OAuth2 (recommended)
# or set DD_API_KEY + DD_APP_KEY with audit_logs_read scope
```
You need the **key ID** of the suspect key (not the key value). Find it in Datadog UI under Organization Settings > API Keys, or from context showing `@metadata.api_key.id`.
## Investigation Workflow
### Step 1 — Establish timeline
```bash
pup audit-logs search --query "@metadata.api_key.id:KEY_ID" --from 90d --limit 200 -o json \
| jq '[.data[] | {
timestamp: .attributes.timestamp,
action: .attributes.attributes.action,
event: .attributes.attributes.evt.name,
resource_type: .attributes.attributes.asset.type,
resource_id: .attributes.attributes.asset.id,
endpoint: .attributes.attributes.http.url_details.path,
method: .attributes.attributes.http.method,
ip: .attributes.attributes.network.client.ip,
city: .attributes.attributes.network.client.geoip.city.name,
country: .attributes.attributes.network.client.geoip.country.name,
asn: .attributes.attributes.network.client.geoip.as.name
}]'
```
### Step 2 — Geo/IP breakdown
```bash
pup audit-logs search --query "@metadata.api_key.id:KEY_ID" --from 90d --limit 500 -o json \
| jq '[.data[] | {
country: .attributes.attributes.network.client.geoip.country.name,
asn: .attributes.attributes.network.client.geoip.as.name,
ip: .attributes.attributes.network.client.ip
}]
| group_by(.country)
| map({
country: .[0].country,
count: length,
asns: [.[].asn] | unique,
ips: [.[].ip] | unique
})
| sort_by(-.count)'
```
### Step 3 — Endpoint breakdown
```bash
pup audit-logs search --query "@metadata.api_key.id:KEY_ID" --from 90d --limit 500 -o json \
| jq '[.data[] | {
method: .attributes.attributes.http.method,
path: .attributes.attributes.http.url_details.path
}]
| group_by(.path)
| map({path: .[0].path, methods: [.[].method] | unique, count: length})
| sort_by(-.count)'
```
### Step 4 — Destructive action check
```bash
pup audit-logs search --query "@metadata.api_key.id:KEY_ID @action:deleted" --from 90d -o json \
| jq '[.data[] | {
timestamp: .attributes.timestamp,
resource_type: .attributes.attributes.asset.type,
resource_id: .attributes.attributes.asset.id,
ip: .attributes.attributes.network.client.ip,
country: .attributes.attributes.network.client.geoip.country.name
}]'
```
### Step 5 — When was the key created and by whom?
```bash
pup audit-logs search --query "@asset.type:api_key @asset.id:KEY_ID @action:created" --from 90d -o json \
| jq '[.data[] | {
created_at: .attributes.timestamp,
created_by: .attributes.attributes.usr.email,
creator_ip: .attributes.attributes.network.client.ip,
creator_country: .attributes.attributes.network.client.geoip.country.name
}]'
```
## Anomaly Flags
| Signal | Why it matters |
|--------|----------------|
| Country not in org's normal baseline | Possible exfiltration from unexpected region |
| ASN is a cloud/VPN provider (AWS, Cloudflare, NordVPN, etc.) | Proxied traffic; obscured origin |
| DELETE actions on monitors, dashboards, or log pipelines | Potential sabotage |
| Burst of activity in short window | Automated scraping or bulk exfiltration |
| Activity outside business hours | Off-hours access |
| Key used from multiple IPs simultaneously | Key shared or stolen |
## Investigation Output Format
```
Key ID: <key_id>
Created: <timestamp> by <user_email>
Active period: <first_seen> to <last_seen>
Total events: <N>
Origins:
- <Country> (<ASN>): <N> events — [NORMAL / FLAG: first-time origin]
Endpoints called (top 5):
- <METHOD> <path>: <N> calls
Destructive actions: <N> deletions — [resource types affected]
Recommended actions:
1. Revoke the key immediately if not already done
2. Review affected resources: [list]
3. Check if any deleted resources need restoration
4. Audit who else had access to this key
```
## Remediation
Revoke in Datadog UI: Organization Settings > API Keys > Revoke.
Or via API (requires `manage_api_keys` scope):
```bash
pup api-keys delete KEY_ID
```
## References
- [Audit Trail API](https://docs.datadoghq.com/api/latest/audit/)
- [API Keys management](https://docs.datadoghq.com/account_management/api-app-keys/)
© datadog-labs · MIT · datadog-labs/agent-skills