Skip to main content

Безопасность API-ключей

API-ключ даёт доступ к твоему аккаунту на EdgeLab. Если ключ утечёт — кто-то сможет действовать от твоего имени. Этот гайд — чеклист best practices.

Правило №1: никогда не коммитить ключ в git

Даже если удалишь коммит — git хранит историю. Ключ, попавший в репозиторий хотя бы на секунду, считается скомпрометированным.
1

Добавь исключения в .gitignore

# .gitignore
.env
.secrets/
*.key
2

Проверь, что ключ не в истории

# Поиск утечек в git-истории
git log --all -p | grep -i "edgelab_live_"
Если нашёл — немедленно отзови ключ и создай новый.

Хранение ключей

Три надёжных способа, от простого к продвинутому:
# В ~/.zshrc или ~/.bashrc
export EDGELAB_API_KEY="edgelab_live_a1b2c3d4e5f6a1b2c3d4e5f6a1b2c3d4"

# В коде
import os
API_KEY = os.environ["EDGELAB_API_KEY"]
Переменные окружения — самый простой вариант. Если у тебя один агент и один сервер — этого достаточно.

Ротация ключей

Ротируй ключ, если:
  • Ключ мог быть виден кому-то (экран, лог, скриншот)
  • Ключ попал в публичный репозиторий
  • Прошло больше 90 дней с последней ротации
При ротации старый ключ деактивируется мгновенно, создаётся новый:
curl -X POST https://platform.edgelab.su/api/v1/auth/keys/rotate \
  -H "Authorization: Bearer $EDGELAB_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"prefix": "edgelab_live_a1b2c3d4"}'
После ротации старый ключ перестаёт работать мгновенно. Обнови ключ во всех конфигах сразу.

Scopes

Ключ автоматически получает scopes по тарифу. Вручную выбрать нельзя:
ТарифScopes
Edgeprofile:read, profile:write, knowledge:read, events:read, network:read
ProВсё из Edge + support:write, contributions:write, events:write, network:write
VIPВсё из Pro + support:call-request
При апгрейде тарифа scopes расширяются автоматически.

Rate limits

60 запросов в минуту на один API-ключ. При превышении — ответ 429 Too Many Requests:
{
  "error": {
    "code": "rate_limit_exceeded",
    "message": "Превышен лимит запросов.",
    "retry_after": 30
  }
}
Заголовок Retry-After указывает, сколько секунд ждать. Агент должен уметь обрабатывать 429:
import time

def api_request(method, path, **kwargs):
    response = requests.request(method, f"{BASE_URL}{path}", **kwargs)
    if response.status_code == 429:
        wait = int(response.headers.get("Retry-After", 60))
        time.sleep(wait)
        return api_request(method, path, **kwargs)  # retry
    return response.json()
60 запросов в минуту = один запрос в секунду. Если агент делает запросы в цикле — добавь time.sleep(1).

Экстренный отзыв

Если ключ скомпрометирован — отзови немедленно:
curl -X POST https://platform.edgelab.su/api/v1/auth/keys/revoke \
  -H "Authorization: Bearer $EDGELAB_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"prefix": "edgelab_live_СКОМПРОМЕТИРОВАННЫЙ"}'
Отозванный ключ нельзя восстановить. Создай новый через веб-интерфейс или API.

Мониторинг

Проверяй last_used_at в списке ключей — если ключ используется, а ты его не трогал, это повод для беспокойства:
curl -X GET https://platform.edgelab.su/api/v1/auth/keys \
  -H "Authorization: Bearer $EDGELAB_API_KEY"
{
  "items": [
    {
      "prefix": "edgelab_live_a1b2c3d4",
      "created_at": "2025-01-15T10:00:00Z",
      "last_used_at": "2025-03-20T14:30:00Z",
      "scopes": ["profile:read", "knowledge:read", "..."]
    }
  ],
  "total": 1,
  "limit": 20,
  "offset": 0,
  "has_more": false
}

Чеклист

  • Ключ хранится в переменных окружения или ~/.secrets/
  • .secrets/, .env добавлены в .gitignore
  • В git-истории нет следов ключей
  • Ключи ротируются минимум раз в 90 дней
  • Агент обрабатывает 429 с Retry-After
  • last_used_at проверяется периодически
  • У каждого агента свой ключ (если агентов несколько)