Боты · токен

Как безопасно хранить токен бота

Что даёт чужому человеку токен вашего бота, почему его нельзя держать в коде и в публичном репозитории и как отозвать и заменить его, если он уже утёк.

Здесь про одну строку, которая целиком отвечает за доступ к вашему боту, и про то, как не потерять её по неосторожности. ⏱️ Чтение — минуты три, а сделать по нему нужно один раз.

Что даёт токен тому, кто его получил

С точки зрения платформы токен — это и есть ваш бот. Пароля рядом с ним нет, второго шага подтверждения нет, привязки к вашему компьютеру нет. Любой, у кого есть эта строка, разговаривает с платформой от имени бота ровно с теми же правами, что и вы.

  • Читать всё, что боту пишут: и в личных сообщениях, и в группах, куда его добавили.
  • Писать от его имени — всем, кто с ботом когда-либо заговаривал.
  • Перехватить обновления. Опрашивать платформу может только один процесс, и второй просто отберёт сообщения у вашего.
  • Менять самого бота: имя, описание, картинку, список команд.

Как токен хранит панель

В панели токен — не обычная настройка, а запечатанная. У неё другой путь и другие правила, и каждое из них закрывает свой способ потерять секрет.

  • В форму настроек он не возвращается. Панель показывает пустое поле и строку под ним: «Сохранён. Введите новый, чтобы заменить». Пустота здесь означает не «не задано», а «задано, и показать нельзя».
  • В стартовую команду он не подставляется. Это не мелочь: контейнерный образ печатает команду запуска в консоль перед запуском, и токен из неё оказался бы в журнале консоли — том самом, который потом присылают в поддержку.
  • В контейнер он попадает переменной окружения BOT_TOKEN. Это единственный путь, на котором его видит только сам бот.
  • Обычная переменная так не умеет: она лежит открытым текстом, возвращается в форму настроек и уезжает в резервную копию базы. Ровно поэтому у токена стоит другой признак, а не тот же, что у «Файла запуска».

В коде поэтому обращаются к переменной окружения, а не к файлу с секретом: у Python это os.environ и имя BOT_TOKEN в нём, у Node.js — process.env.BOT_TOKEN. Заготовка, которую панель оставляет в каталоге при установке, говорит об этом прямым текстом в первых же своих строках.

Тёмная иллюстрация: копии файлов проекта лежат отдельно слева, а секрет хранится отдельно справа в закрытом месте с зелёной отметкой
Переменная окружения нужна не для удобства: секрет остаётся в одном месте, а заменить его можно без правки кода и без нового архива.

Отладочная печать — это утечка

Панель токен в консоль не пишет. Но написать его может сам бот, и делает это чаще, чем кажется:

  • Отладочная печать самого токена. Одна строка, оставленная в коде на минуту и уехавшая на сервер вместе с ним.
  • Многословный HTTP-клиент. Адрес запроса к Telegram содержит токен целиком, и клиент, который печатает свои запросы, печатает и его.
  • Трассировка библиотеки. Упавший запрос часто печатается вместе с полным адресом.

С этого момента токен лежит в журнале консоли. А журнал читает не только владелец: его копируют в переписку с поддержкой, вставляют в чужие чаты и выкладывают на форумы вместе с вопросом. Считайте это утечкой и отзывайте токен — даже если уверены, что лог никуда не уходил.

Как отозвать и заменить

  1. Telegram

    Отзовите старый токен

    Напишите @BotFather команду /mybots, выберите своего бота — в его меню есть пункт про токен, и там же токен отзывают. Старая строка перестаёт работать сразу, новую BotFather присылает тут же. Больше нигде это сделать нельзя: токены выдаёт платформа, а не хостинг, и у нас вашего токена не появится ни в каком виде, кроме того, который вы сами вписали в поле.

  2. Настройки игры

    Впишите новый

    Найдите поле «Токен бота» и вставьте новую строку. Пробел, кавычку или перевод строки форма не примет: в значении разрешены только буквы, цифры, точка, двоеточие, дефис и подчёркивание. Внизу страницы — «Сохранить настройки».

  3. Шапка сервера

    Перезапустите сервер

    Токен уходит в окружение в момент запуска, поэтому работающий бот продолжает жить со старой строкой — то есть уже ни с чем. Панель говорит это сама: «Сервер работает: записанные значения он прочитает при следующем запуске — понадобится перезапуск», и рядом ставит кнопку «Перезапустить сейчас».

  4. Файлы

    Уберите причину утечки

    Отозванный токен — половина дела. Утёк через отладочную печать — уберите строку и загрузите файл заново. Был вписан в код — вынесите его в переменную окружения, иначе следующая утечка будет ровно такой же, только с новым токеном.

Если токен уже утёк

  • Отзовите токен первым делом. Пока он жив, всё остальное бессмысленно.
  • Посмотрите, что бот успел сделать. Переписки видны в самих чатах, а чужие рассылки от его имени — обычно по жалобам пользователей.
  • Проверьте, куда ещё вы его вписывали: черновик на компьютере, переписка с другом, старый архив в каталоге сервера, файл настроек внутри бэкапа.
  • Не полагайтесь на удаление из истории репозитория. Публичный коммит считается прочитанным, и отзыв токена он не заменяет.

Где проходит граница

Боту токен нужен в открытом виде: платформа принимает именно эту строку, и подставить вместо неё что-то другое нельзя. Поэтому честная граница выглядит так. Панель не показывает токен обратно, не пишет его в консоль и не подставляет в команду запуска — это то, за что отвечаем мы. Всё, что происходит с токеном после того, как он попал в ваш код, зависит от вашего кода — и это то, за что отвечаете вы.