Проект включает встроенные механизмы защиты и следует best practices для безопасной разработки Telegram-ботов.
Используется aiosqlite с параметризованными запросами:
# Правильно (защищено)
await db.execute(
"SELECT * FROM users WHERE user_id = ?",
(user_id,)
)
# Неправильно (уязвимо)
await db.execute(
f"SELECT * FROM users WHERE user_id = {user_id}"
)Все запросы к БД в проекте используют параметризацию.
Все чувствительные данные хранятся в .env файле, который:
- Не коммитится в Git (указан в
.gitignore) - Загружается через
python-dotenv - Доступен только процессу приложения
# core/config.py
from dotenv import load_dotenv
import os
load_dotenv()
TG_TOKEN = os.getenv("TG_TOKEN") # Никогда не хардкодим
LLM_TOKEN = os.getenv("LLM_TOKEN")Логи не содержат:
- Токены API
# core/config.py
logging.basicConfig(
level=logging.INFO,
format='%(asctime)s - %(name)s - %(levelname)s - %(message)s',
handlers=[
RotatingFileHandler(
'logs/bot.log',
maxBytes=10485760, # 10MB
backupCount=5
)
]
)Telegram автоматически применяет rate limiting:
- 30 сообщений в секунду для всех чатов
- 1 сообщение в секунду на приватный чат
Бот учитывает эти ограничения и обрабатывает соответствующие ошибки.
- ✅
.envфайл добавлен в.gitignore - ✅ Используются разные токены для dev/prod окружений
- ✅ Пароли и токены никогда не хардкодятся в коде
-
⚠️ Регулярно обновляются зависимости (pip list --outdated) - ✅ Ограничен доступ к admin командам (проверка ADMIN_CHAT)
- ✅ Все SQL запросы параметризованы
-
⚠️ Логи не содержат чувствительные данные (текущая версия логирует полные тексты)
- Настроен firewall на сервере (UFW, iptables)
- Используется HTTPS для webhook (если применимо)
- SSH доступ только по ключам (без паролей)
- Регулярные бэкапы базы данных
- Мониторинг подозрительной активности
- Автоматические обновления безопасности ОС
- Собственный rate limiting на уровне приложения
- Уведомление пользователей о privacy policy
Все admin команды защищены проверкой:
# handlers/admin_handlers.py
from core.config import ADMIN_CHAT
@router.message(Command("dispatch"))
async def dispatch_command(message: Message):
# Проверка прав
if message.from_user.id != ADMIN_CHAT:
await message.answer("У вас нет доступа к этой команде.")
return
# Основная логика
...В .env:
ADMIN_CHAT=123456789 # Ваш Telegram User IDДля получения ID чата:
- Откройте чат в веб-версии Telegram (web.telegram.org)
- ID чата будет в URL:
https://web.telegram.org/k/#-123456789(число после#) - Для приватных чатов ID всегда положительный, для групп — отрицательный
Проект соответствует базовым требованиям GDPR:
- Минимизация данных — сохраняются только необходимые данные
- Право на удаление — команда
/forgetудаляет историю
Данные пользователей:
- Хранятся локально в SQLite
- Не передаются третьим сторонам (кроме LLM API)
- Автоматически очищаются при удалении бота из чата
Автоматическая очистка:
# При удалении из группы
@router.my_chat_member(...)
async def on_bot_removed(event: ChatMemberUpdated):
if event.new_chat_member.status == "left":
await db.delete_chat(event.chat.id)Ручная очистка через /forget:
@router.message(Command("forget"))
async def forget_command(message: Message):
await db.clear_context(message.from_user.id)# Установка safety
pip install safety
# Проверка зависимостей
safety check# Просмотр устаревших пакетов
pip list --outdated
# Обновление конкретного пакета
pip install --upgrade aiogram
# Обновление всех (осторожно!)
pip install --upgrade -r requirements/requirements.txtВ requirements.txt указаны точные версии:
aiogram==3.20.0 # Точная версия
aiosqlite>=0.19.0 # Минимальная версияЭто предотвращает неожиданные breaking changes.
В Dockerfile бот запускается не от root:
# Создаем пользователя
RUN adduser --disabled-password --gecos '' botuser
# Переключаемся на него
USER botuser
# Запускаем приложение
CMD ["python", "main.py"]Используется python:3.14-slim вместо полного образа для уменьшения поверхности атаки.
# Обновление базового образа
docker-compose pull
docker-compose up -d --buildTelegram автоматически блокирует ботов, которые:
- Отправляют слишком много сообщений
- Совершают подозрительные действия
- Получают много жалоб
Бот учитывает эти ограничения:
- 30 сообщений в секунду для всех чатов
- 1 сообщение в секунду на приватный чат
Все критические события логируются с различными уровнями важности:
# Ошибки в обработке запросов
logger.error(f"LLM{chat_id} - Критическая ошибка: {e}", exc_info=True)
# Предупреждения о проблемах
logger.warning(f"USER{user_id} заблокировал бота, удален из БД")
# Информация о действиях пользователей
logger.info(f"USER{chat_id}TOLLM:{message.text}")Уведомления администратору настроены и работают:
# core/utils.py
async def forward_to_debug(message_chat_id: int, message_id: int):
"""Пересылает сообщение в DEBUG чат для мониторинга."""
# Реализовано в проекте
# handlers/admin_handlers.py
await bot.send_message(ADMIN_CHAT, error_msg)Бот автоматически отправляет в ADMIN_CHAT:
- Критические ошибки при выполнении команд
- Сообщения пользователей (через
forward_to_debug) - Результаты административных операций
Все секреты хранятся в GitHub Secrets:
SSH_HOSTSSH_USERSSH_KEYENV_FILE
Важно: Никогда не логируйте secrets в GitHub Actions.
Настройте branch protection для main:
- Require pull request reviews
- Require status checks to pass
- No force pushes
- Немедленно отзовите старый токен через @BotFather
- Сгенерируйте новый токен
- Обновите
.envи GitHub Secrets - Перезапустите бота
- Проверьте логи на подозрительную активность
- Измените все связанные пароли
Если обнаружили уязвимость:
- Создайте приватный Security Advisory на GitHub
- Или напишите автору: t.me/nikpeg
Не публикуйте детали уязвимости в Issues до её исправления.
Бот должен иметь только необходимые разрешения:
# В BotFather отключите неиспользуемые функции
# /setprivacy - Enable для групп (если не нужно видеть все сообщения)
# /setjoingroups - Disable (если не должен быть в группах)# Проверка безопасности кода
bandit -r .
# Проверка зависимостей
safety check
# Анализ Docker образа
docker scan mybot:latest# .env.dev
TG_TOKEN=dev_token
LLM_TOKEN=dev_token
DEBUG=True
# .env.prod
TG_TOKEN=prod_token
LLM_TOKEN=prod_token
DEBUG=False# Регулярный бэкап БД
sqlite3 data/users.db ".backup 'backup/users_$(date +%Y%m%d).db'"
# Автоматизация через cron
0 3 * * * /path/to/backup_script.shСписок улучшений безопасности для реализации:
-
Ограничение логирования сообщений
- Убрать логирование полных текстов сообщений пользователей
- Логировать только метаданные (длина, тип, user_id)
- Добавить флаг для debug-режима с полным логированием
-
Уведомление о privacy policy
- Добавить сообщение при первом запуске
/startо том, что данные сохраняются - Добавить ссылку на политику конфиденциальности
- Получать согласие пользователя на хранение истории
- Добавить сообщение при первом запуске
-
Rate limiting на уровне приложения
- Добавить ограничение количества запросов в минуту на пользователя
- Защита от флуда и злоупотреблений
- Уведомления пользователей о превышении лимитов
-
Расширенное логирование безопасности
- Добавить отдельный файл логов для security events
- Логировать попытки несанкционированного доступа к admin командам
- Статистика использования по пользователям для детекции аномалий
-
Улучшение хранения секретов
- Текущая реализация: GitHub Secrets для CI/CD
- Рассмотреть использование secrets manager (HashiCorp Vault, AWS Secrets Manager)
- Ротация токенов API
- Разделение прав доступа для разных компонентов
-
Audit logging
- Детальное логирование всех административных действий
- Immutable audit logs (только добавление, без удаления)
- Периодический анализ логов на аномалии
-
Дополнительная защита Docker
- Security scanning образов перед деплоем
- Использование distroless образов
- Network policies для ограничения сетевого доступа