Перейти к основному содержимому

Security

Tokens

Только env-переменные

Никогда BOT_TOKEN="bot_..." в коде. .env файлы — в .gitignore. Cloud secrets manager (Vault, AWS Secrets Manager) для prod.

Не логировать raw

Никогда не логируйте raw-токен. При логировании маскируйте сами — показывайте только префикс (bot_xxxx…).

Ротация

Регулярная ротация (3-6 мес). Через UI: Settings → Боты → Rotate. После ротации обновите BOT_TOKEN в окружении и перезапустите процесс бота — SDK не подхватывает новый токен автоматически.

Один token = один process

Не shared между несколькими instance'ами. Один static-токен на бота, скоупы выдаёт админ Space при invite.

Webhook signing

Всегда verify HMAC подпись. Без verify любой может slать fake events боту. SDK делает это автоматически — достаточно установить WEBHOOK_SECRET в env.

Storage

State бота, который хранится на стороне разработчика:

ХранитьНе хранить
user_id, channel_id, message_id (UUID идентификаторы)Полные content сообщений (E2E violation)
command / options (из command.invoked)IP-адреса пользователей
nickname (только при scope members.read; space-ник, не глобальный)Email, телефоны
role, muted_until (из members.read)Real names (если не явно даны)

TTL: хранение user_id с TTL ≤ 30 дней, если не нужно дольше. Для GDPR-очистки опирайтесь на TTL: событие member.left приходит боту только когда он сам кикнул участника (scope moderation.kick) — это не надёжный сигнал ухода (обычный выход, админ-кик и удаление аккаунта его боту не доставляют).

OAuth

OAuth2 для ботов не реализован — эндпоинтов /oauth/*, PKCE и refresh-token rotation в API нет. Аутентификация бота — только через static Bot-токен (Authorization: Bot <token>), скоупы выдаёт админ Space при invite. OAuth2 (1-click install из каталога) — в планах, см. OAuth2 (planned).

Webhook URL

HTTPS в production

http://localhost:8765 для local dev допустимо. Production — TLS обязательно.

Path хардкод

Не использовать dynamic-paths типа /webhook/{secret}. Secret в URL = leak via referrer / server logs.

Rate limit на стороне бота

Webhook receiver должен handle 10+ req/sec на случай burst. Обратный прокси или gunicorn --workers 4.

SSRF protect собственный backend

Если бот делает HTTP-вызовы к внешним URL — реализуйте SSRF guard (или используйте httpx + private IP check).

Logging

# ✅ OK
logger.info("handling /play", extra={
"user_id": event.author_user_id,
"channel_id": event.channel_id,
"query_length": len(query), # длина, не content
})

# ❌ Не делать
logger.info(f"got event: {event}") # event может содержать sensitive
logger.info(f"webhook body: {body}") # raw payload

Dependencies

  • Обновлять reasonspace-bot минимум раз в квартал (security fixes)
  • pip-audit / safety check в CI на bot project
  • Pinned versions в requirements.txt, перекомпиляция через pip-compile

Reporting issues

При обнаружении security-бага в Reason Space API или SDK — не публикуйте в issues. Email: security@reasonspace.ru.