Security
Tokens
Никогда BOT_TOKEN="bot_..." в коде. .env файлы — в .gitignore.
Cloud secrets manager (Vault, AWS Secrets Manager) для prod.
Никогда не логируйте raw-токен. При логировании маскируйте сами —
показывайте только префикс (bot_xxxx…).
Регулярная ротация (3-6 мес). Через UI: Settings → Боты → Rotate.
После ротации обновите BOT_TOKEN в окружении и перезапустите процесс
бота — SDK не подхватывает новый токен автоматически.
Не 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
http://localhost:8765 для local dev допустимо. Production — TLS обязательно.
Не использовать dynamic-paths типа /webhook/{secret}. Secret в URL =
leak via referrer / server logs.
Webhook receiver должен handle 10+ req/sec на случай burst.
Обратный прокси или gunicorn --workers 4.
Если бот делает 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.