Безопасность

Почему Telegram-бот для алертов — плохая идея.

Вы положили токен бота в CI, в .env, в переменные GitHub Actions. Теперь подумайте, что этот токен умеет.

Типичный сценарий

Команда деплоит приложение. Кто-то говорит: «Давайте алерты в Telegram». Создают бота через @BotFather, кладут токен в CI, пишут curl к Bot API. Работает.

Через полгода токен лежит в 4 местах: GitHub Secrets, .env на staging, ноутбук DevOps-а, скрипт на сервере. Никто не помнит, какой доступ у этого токена.

Что умеет утёкший токен Telegram-бота

Читать все сообщенияBot API getUpdates возвращает историю сообщений в чатах, где бот состоит. Включая ваши ops-обсуждения, пароли, ссылки на инфраструктуру.
Список участниковgetChatMember / getChatAdministrators — атакующий видит кто в вашей ops-группе.
Отправлять от имени ботаФишинг внутри вашего ops-чата. «Срочно зайдите по ссылке и подтвердите доступ».
Скачивать файлыgetFile — все файлы, отправленные в чат: скриншоты, конфиги, ключи.

Проблема глубже: Telegram видит ваши данные

Даже без утечки токена — все сообщения бота проходят через серверы Telegram в открытом виде. Секретные чаты не поддерживаются для ботов. Ваши CI/CD алерты содержат:

Это операционная разведка. Вы отдаёте её третьей стороне в plaintext.

«Но мы используем приватную группу»

Приватная группа ≠ шифрование. Приватность в Telegram означает, что группу нельзя найти через поиск. Но:

Другая модель: шифрование до отправки

Nerve CLI шифрует payload на вашей машине до того, как он попадает на relay. Relay маршрутизирует зашифрованные конверты. Телефон расшифровывает локально.

Relay видитШифротекст, метаданные доставки, timestamp. Не текст алерта.
Утёкший sender DSNМожет отправлять зашифрованные сигналы в один pipe. Не может читать историю, расшифровывать старые сообщения, подключаться как agent.
Sender vs AgentРазные credentials. CI pipeline нужен только sender DSN. Agent (для команд) — другой токен с другим уровнем доверия.

Сравнение утечки

Утёк токен Telegram-ботаЧитай историю чата, список участников, файлы. Пиши от имени бота. Полный доступ.
Утёк Nerve sender DSNМожно слать зашифрованный шум в один pipe (annoying). Нельзя расшифровать. Нельзя читать историю. Нельзя выполнять команды. Ротируешь DSN из приложения.

Что делать

Попробовать

go install github.com/nerve-ink/nerve-cli/cmd/nerve@latest
export NERVE_DSN="nerve://TOKEN:[email protected]"
echo "deploy failed: staging" | nerve send --severity critical

Relay никогда не увидит текст «deploy failed: staging». Ваш телефон — увидит.