Защитите свой кошелек агента перед запуском.
Вывод на производство с платежами агента - это не тот же контрольный список, что и для обычной интеграции API. Добавьте: осознанный выбор типа кошелька, настроенную политику расходов (не по умолчанию), ротацию секретов API и вебхуков с установленной периодичностью, еженедельный обзор журнала аудита и план реагирования на инциденты, который был отработан хотя бы один раз. Без этого вы отправляете и учитесь на собственных ошибках.
Перед тем как начать.
- Рабочая интеграция агента от начала до конца на тесте - смотрите добавить-платежи-к-агенту и тестировать-без-настоящих-деньги.
- Контроль расходов настроен - смотрите контроль расходов (это руководство предполагает, что политика уже установлена).
- Менеджер секретов (AWS Secrets Manager, GCP Secret Manager, Vault, 1Password и т.д.) - секретов в .env файлах недостаточно.
- Четко определенный дежурный инженер с административным доступом к панели управления кошельком.
- 15 минут сосредоточенного времени. Чек-лист ниже не является амбициозным - работайте с ним строчка за строчкой.
Запустите контрольный список перед запуском.
Одиннадцать пунктов. Каждый из них - вопрос с ответом да/нет с единственным владельцем. Если какой-либо пункт не отмечен, не выходите в эфир - сначала завершите этот пункт. Стоимость пропущенного пункта в производстве всегда больше, чем стоимость его завершения сейчас.
# Pre-launch security checklist for agent wallets.
[ ] Wallet type chosen with reasoned trade-offs (smart wallet vs EOA).
[ ] Spend permission set in the dashboard: an allowance per period + a per-transaction cap.
[ ] API keys scoped to the minimum the agent needs (read_wallet_metadata / pay_bills / receive_money).
[ ] All API keys stored in a secret manager (not env files committed to git).
[ ] Test keys and live keys cannot be swapped (boot-time prefix check in place).
[ ] Webhook secret rotated within the last 90 days (webhooks.rotateSecret).
[ ] Webhook URL pointed at production, not a tunnel.
[ ] Audit review scheduled; alerting in place for unusual events.
[ ] A spike of rejected payments triggers an alert (>5/hour from one agent).
[ ] Incident runbook exists, has been read by someone other than the author.
[ ] One person other than you knows how to revoke an API key in < 5 minutes.Запланируйте ротацию ключа API и секрета вебхука.
Квартально - это стандартный ритм; немедленно меняйте на любое из: подозрение на утечку, уход ведущего инженера, инцидент безопасности в другой части компании. Шаблон с двумя ключами позволяет вам менять ключи без простоя: создайте новый ключ, разверните его повсюду, проверьте, затем отозовите старый.
// One-time key rotation script. Run quarterly, on lead departure, on suspected leak.
import { createClient } from "@blockchain0x/node";
const client = createClient({ apiKey: process.env.BLOCKCHAIN0X_API_KEY! });
async function rotate() {
// Scope the new key to only what the agent needs.
const fresh = await client.apiKeys.create({
name: `prod-${new Date().toISOString().slice(0, 10)}`,
scopes: ["read_wallet_metadata", "pay_bills", "receive_money"],
});
console.log("NEW KEY:", fresh.secret); // Store in secret manager NOW.
// Wait until the new key is deployed and verified working, THEN:
// await client.apiKeys.revoke(OLD_KEY_ID); // (or apiKeys.rotate in one call)
}# One-time key rotation script. Run quarterly, on lead departure, on suspected leak.
from blockchain0x import Client
import datetime, os
client = Client() # reads BLOCKCHAIN0X_API_KEY
def rotate():
fresh = client.api_keys.create(body={
"name": f"prod-{datetime.date.today().isoformat()}",
"scopes": ["read_wallet_metadata", "pay_bills", "receive_money"],
})
print("NEW KEY:", fresh["secret"]) # Store in secret manager NOW.
# Wait until new key is deployed and verified, THEN:
# client.api_keys.revoke(OLD_KEY_ID) # (or api_keys.rotate in one call)Секреты подписи вебхуков вращаются аналогично через панель управления - включите второй секрет, разверните обработчик для принятия любого из них, затем отключите старый. Оба с квартальной периодичностью с календарными напоминаниями.
Настройте еженедельный аудит.
Три вещи, на которые стоит обратить внимание каждую неделю: новые контрагенты (все, что не было видно ранее, заслуживает 30-секундной проверки), отклоненные платежи (разрешение на расходы сработало - застрял ли агент где-то?), и платежи вне рабочего времени (платеж в 3 часа ночи от агента, который номинально работает только в рабочие часы, является сигналом, который рано ловит атаки инъекций).
// Weekly audit query over the webhook events YOU persisted (payment.received /
// payment.sent). There is no transactions.list API - your own store is the log.
const since = Date.now() - 7 * 24 * 60 * 60 * 1000;
const events = await db.paymentEvents.findMany({ where: { receivedAt: { gte: since } } });
const newCounterparties = events.filter((e) => e.counterpartyFirstSeen);
const offHours = events.filter((e) => {
const h = new Date(e.receivedAt).getUTCHours();
return h < 5 || h > 22;
});
// Reconcile anything that looks off against the chain:
// const tx = await client.transactions.get(event.txHash);
console.log({ newCounterparties, offHours });from datetime import datetime, timedelta, timezone
# Query your own persisted webhook events - the SDK has transactions.get(id),
# not a list endpoint, so your event store is the audit log.
since = datetime.now(timezone.utc) - timedelta(days=7)
events = db.payment_events.where(received_at__gte=since)
new_counterparties = [e for e in events if e.counterparty_first_seen]
off_hours = [e for e in events if not (5 <= e.received_at.hour <= 22)]
# Reconcile against the chain when something looks off:
# tx = client.transactions.get(event.tx_hash)
print({"new_counterparties": new_counterparties, "off_hours": off_hours})Напишите (и отработайте) руководство по инцидентам.
Руководство по действиям полезно только в том случае, если оно было протестировано недавно. Ниже приведен шаблон - скопируйте его в вики вашей команды, отредактируйте под свои специфики и запланируйте 30-минутное учение в следующем квартале. Время; исправьте все, что учение выявит как недостающее.
# Incident response runbook - Agent wallet compromise (suspected or confirmed)
## Trigger
Any of:
- Unrecognised counterparty receiving > $10 USDC.
- > 50 rejected payment attempts from one agent in an hour.
- Engineer reports they cannot account for a recent payment.
- A leaked API key surfaces in a public scan.
## Step 1 - Stop the bleeding (< 5 minutes)
- Revoke the suspect API key: dashboard, or apiKeys.revoke / apiKeys.rotate.
- Revoke the agent's spend permission in the dashboard (allowance to zero).
- A revoked key cannot move funds and a revoked permission authorizes nothing.
## Step 2 - Preserve evidence (< 15 minutes)
- Pull the last 24h from the dashboard activity log and your stored events.
- Note the agent's spend permission as it was at the time of the incident.
- Note the timestamps of any unrecognised payments and their txHash on Base
(fetch with transactions.get).
## Step 3 - Communicate (< 30 minutes)
- Inform the on-call lead and finance.
- If customer funds are affected, draft a notification template (do not send
until investigation is far enough along to be accurate).
## Step 4 - Root cause and remediation (24-72 hours)
- Determine: leaked key, compromised webhook secret, prompt-injection
bypass, integration bug, or other.
- Rotate every secret that could have been exposed.
- Tighten the spend permission (lower the allowance or per-transaction cap).
- File a post-mortem with timeline, RCA, and follow-ups.Пять вещей, которые ловят команды в их первом инциденте на производстве.
Отношение к новому агенту как к 'такому же, как старый'
Каждый агент получает свой собственный профиль, свои собственные ключи, свою собственную политику расходов. Если вы повторно используете ключи между агентами 'потому что они похожи', компрометация одного ключа затрагивает всех агентов одновременно. Создание нового профиля агента занимает один вызов API; изоляция по агентам стоит той минуты, которую стоит потратить на правильное выполнение.
Разрешение на расходы, определяемое по догадке, а не по данным
Выберите лимит и лимит на транзакцию наугад, и произойдет одно из двух: слишком низкий, и агент достигает лимита в середине дня каждый день, пока вы отлаживаете 'платеж отклонен'; слишком высокий, и контроль становится театром. В течение первой недели посмотрите на фактические ежедневные расходы и установите лимит на 2-3x больше - не 1x (слишком жестко) и не 100x (фактически неограниченно). Это изменение в панели управления, поэтому перенастройка дешева.
Секрет подписи вебхука никогда не менялся
Инцидент, который раскрывает секрет вебхука, означает, что злоумышленник может подделать вебхуки, которые выглядят как законные события payment.received, что может обмануть ваш обработчик, заставив его выполнить работу, за которую никогда не платили. Периодически меняйте секрет (webhooks.rotateSecret) с той же частотой, что и API-ключи (ежеквартально) или каждый раз, когда вы подозреваете утечку, и всегда проверяйте доставки с помощью webhooks.verify по текущему секрету.
Журналы аудита, которые никто не читает
Журнал аудита фиксирует события только в том случае, если кто-то на него смотрит. Большинство команд включают журнал, никогда не смотрят на него и узнают о проблемах из жалоб клиентов. Запланируйте еженедельный 15-минутный обзор: новые контрагенты, отклоненные платежи, платежи вне рабочего времени. Стоимость незначительна; время обнаружения сокращается с недель до дней.
Нет учений по инцидентам
Руководство, которое никогда не использовалось, - это вымысел. Выберите квартальную дату, смоделируйте сценарий утечки ключа, замерьте, сколько времени потребуется на отзыв и локализацию. Первые учения всегда выявляют что-то недостающее (инженер, который знает, как проводить ротацию, в отпуске, руководство находится за истекшей ссылкой Notion). Лучше обнаружить это на учениях, чем в 3 часа ночи во время реального инцидента.
После пропуска безопасности.
Безопасность никогда не заканчивается, но остальная часть операционного стека выигрывает от чистой базы. Ужесточите контроль расходов по мере накопления фактических данных использования, укрепите обработку вебхуков против нагрузки и проверьте идентичность агента, чтобы контрагенты доверяли вашему публичному профилю.
Настройте контроль расходов агента, который переживет инъекцию подсказок
Шаблоны вебхуков, о которых разработчики спрашивают чаще всего
Заработайте значки проверки GitHub и домена
Полная справка на docs.blockchain0x.com. Связанный глоссарий: Coinbase Smart Wallet. Продуктовая поверхность: Кошельки агентов.