Meilleures pratiques de sécurité pour les bots Telegram
Le jeton d'un bot est un mot de passe que n'importe qui peut utiliser depuis n'importe où, sans second facteur et sans alerte de connexion. La plupart des incidents sur les bots Telegram commencent là. Voici ce qu'il faut verrouiller, dans l'ordre où les choses tournent généralement mal.
1. Traitez le jeton comme un identifiant actif
Celui qui détient le jeton de votre bot le contrôle entièrement. Il peut lire les messages entrants, envoyer des messages en votre nom et modifier votre webhook pour que votre propre serveur cesse de recevoir les mises à jour. Il n'y a aucune demande de mot de passe ni approbation d'appareil qui s'interpose.
Où fuitent les jetons
- Commité dans un dépôt. De loin la voie la plus courante, et les dépôts publics sont scannés en continu par des bots qui ne sont pas les vôtres.
- Collé dans un chat de support ou un gestionnaire de tickets. Une fois dans un ticket, il finit dans un index de recherche quelque part.
- Codé en dur dans une build mobile ou frontend. Tout ce qui est livré à un appareil client est public.
- Laissé dans les logs. Si vous journalisez l'URL complète de l'API, le jeton se trouve dans l'URL.
Que faire à la place
- Gardez le jeton dans une variable d'environnement ou un gestionnaire de secrets, jamais dans le code source.
- Ajoutez
.envà.gitignoreavant le premier commit, pas après. - Masquez le jeton dans les sorties de logs.
- Utilisez des jetons distincts pour le développement et la production, pour qu'un jeton de test qui fuite ne puisse pas toucher de vrais utilisateurs.
Si un jeton fuite, révoquez-le
Ouvrez BotFather, lancez /revoke et choisissez le bot. L'ancien jeton cesse immédiatement de fonctionner et vous en recevez un nouveau. Le faire tourner coûte quelques minutes d'interruption. Le laisser en place coûte le bot. Réécrire l'historique git ne sert à rien, car le jeton a déjà été récupéré.
2. Verrouillez le webhook
Si votre bot utilise un webhook, cette URL est un point d'accès ouvert sur internet. Quiconque la trouve peut publier de fausses mises à jour qui ressemblent exactement à du vrai trafic Telegram.
- Définissez un jeton secret. La méthode
setWebhookaccepte un paramètresecret_token. Telegram le renvoie ensuite dans l'en-têteX-Telegram-Bot-Api-Secret-Tokenà chaque requête. Rejetez tout ce qui ne correspond pas. - Utilisez HTTPS avec un certificat valide. Telegram l'exige, et cela empêche le contenu d'être lisible en transit.
- Utilisez un chemin impossible à deviner. Un segment aléatoire dans l'URL n'est pas une vraie sécurité à lui seul, mais il vous sort des scans opportunistes.
- Limitez ce que vous recevez. Le paramètre
allowed_updatesvous permet de ne vous abonner qu'aux types de mises à jour que vous traitez. Moins de surface, moins de parsing. - Répondez rapidement. Accusez réception de la requête, puis effectuez le travail de façon asynchrone. Des gestionnaires de webhook lents sont un déni de service qui n'attend qu'à se produire.
3. Ne faites jamais confiance au contenu d'une mise à jour
Tout ce qui se trouve dans une mise à jour a été saisi par un utilisateur. Le nom affiché, le texte du message, les données de callback lors d'un appui sur un bouton. Tout cela est une entrée contrôlée par un attaquant.
- Validez les données de callback côté serveur. Un bouton qui porte
order_id=123peut être rejoué avecorder_id=124. Vérifiez que l'utilisateur qui appuie possède bien l'enregistrement. - Échappez le texte utilisateur avant de le renvoyer. Si vous envoyez des messages en mode HTML ou Markdown et collez un nom affiché tel quel, un nom conçu à cet effet peut casser votre mise en forme ou injecter un lien.
- Paramétrez les requêtes de base de données. Une saisie de chat qui atteint une chaîne de requête présente le même risque d'injection qu'un formulaire web.
- Plafonnez les tailles que vous acceptez. Fixez des limites sur la longueur du texte et la taille des fichiers avant de traiter quoi que ce soit.
4. Verrouillez les commandes admin
Presque tous les bots finissent par avoir une commande admin. Diffusion, remboursement, export des utilisateurs. C'est là qu'un bot qui fonctionne devient un incident.
- Vérifiez une liste blanche d'identifiants utilisateur côté serveur, conservée dans la configuration. Ne déduisez jamais le statut admin d'un nom d'utilisateur, qui peut être changé et réutilisé.
- Ne cachez pas, vérifiez. Une commande non documentée est découverte dès que quelqu'un l'essaie. L'obscurité n'est pas un contrôle.
- Confirmez les actions destructrices avec une seconde étape, et indiquez ce qui va se passer dans le texte de confirmation.
- Journalisez les actions admin avec l'identifiant utilisateur et l'horodatage, pour pouvoir répondre plus tard à "qui a envoyé cette diffusion".
5. Activez le mode confidentialité dans les groupes
Par défaut, un bot ajouté à un groupe ne reçoit que les messages qui sont des commandes, des réponses à ses propres messages, ou des mentions de lui. Ce comportement par défaut s'appelle le mode confidentialité et il existe pour une bonne raison.
Vous pouvez le désactiver avec /setprivacy dans BotFather pour que le bot voie chaque message du groupe. Ne faites cela que si une fonctionnalité en a vraiment besoin. Une fois désactivé, votre serveur stocke les conversations des autres personnes, et cette responsabilité vous incombe désormais.
6. Limitez votre débit et celui de vos utilisateurs
Telegram applique ses propres limites, et les atteindre vous fait ralentir ou bloquer temporairement. L'indication générale de Telegram est d'environ 30 messages par seconde sur des chats différents, et environ 20 messages par minute dans le même groupe. Considérez-les comme des plafonds à rester largement en dessous, pas comme des objectifs.
- Mettez les messages sortants en file d'attente plutôt que de les envoyer dans une boucle serrée.
- Respectez la valeur retry-after quand l'API renvoie un 429, plutôt que de réessayer immédiatement.
- Limitez aussi par utilisateur. Une seule personne qui spamme une commande ne devrait pas pouvoir faire grimper vos coûts ni épuiser votre quota.
- Mettez un temps de pause sur tout ce qui coûte cher, comme les appels à un modèle d'IA payant ou une étape de génération d'images.
7. Collectez moins de données utilisateur
L'enregistrement le plus sûr est celui que vous n'avez jamais stocké. Les bots accumulent par défaut des identifiants de chat, des noms, des numéros de téléphone et le contenu des messages, et la plupart ne sont jamais utilisés.
- Stockez l'identifiant du chat et ce dont vous avez réellement besoin. Passez le reste.
- Ne journalisez pas le corps complet des messages sauf si vous avez une raison concrète et une limite de conservation.
- Définissez une durée de conservation et supprimez selon un calendrier.
- Chiffrez les champs sensibles au repos et restreignez qui peut interroger la base de données.
- Prenez en charge les demandes de suppression. Sous le RGPD et des lois similaires, un utilisateur peut vous demander de supprimer ses données, et vous avez besoin d'un moyen de le faire.
- Indiquez ce que vous collectez dans une politique de confidentialité vers laquelle le bot peut renvoyer.
Notez que les numéros de téléphone ne vous parviennent que si l'utilisateur appuie sur un bouton de demande de contact. En demander un dont vous n'avez pas besoin représente à la fois un coût de conversion et une responsabilité.
8. Vérifiez les données Web App et Login Widget
Si votre bot ouvre une Telegram Web App ou que vous utilisez le Login Widget sur un site web, les données utilisateur arrivent avec un hash. Vérifiez ce hash sur votre serveur à l'aide du jeton de votre bot avant de faire confiance au moindre champ. Sauter cette vérification signifie que n'importe qui peut prétendre être n'importe quel utilisateur en modifiant la requête.
9. Gardez un œil sur les choses banales
- Mettez à jour les dépendances. La plupart des compromissions réelles passent par une bibliothèque, pas par Telegram.
- Restreignez qui peut déployer et qui peut lire les secrets de production.
- Surveillez les schémas inhabituels : un pic sur une seule commande, des messages d'un seul utilisateur dans une boucle serrée, des requêtes qui échouent au contrôle du jeton secret.
- Ayez un plan pour le mauvais jour. Révoquer le jeton, arrêter le webhook, restaurer depuis une sauvegarde. Écrivez-le avant d'en avoir besoin.
La checklist
- Le jeton vit dans des variables d'environnement, pas dans git, et est masqué dans les logs.
- Vous savez comment lancer
/revokedans BotFather. - Le webhook utilise HTTPS et un jeton secret que vous vérifiez à chaque requête.
allowed_updatesn'est réglé que sur ce que vous traitez.- Les données de callback sont autorisées côté serveur, sans confiance a priori dans ce qui a été envoyé.
- Le texte utilisateur est échappé avant d'être renvoyé dans un message mis en forme.
- Les commandes admin vérifient une liste blanche d'identifiants et sont journalisées.
- Le mode confidentialité est activé, sauf si une fonctionnalité en a vraiment besoin désactivé.
- Les messages sortants sont mis en file d'attente et les réponses 429 sont respectées.
- Vous stockez le minimum, supprimez selon un calendrier, et pouvez honorer une demande de suppression.
- Les payloads Web App et Login Widget sont vérifiés par hash.
Évitez les parties qui tournent mal
Avec TeleMinute, votre jeton est stocké côté serveur, le webhook est géré pour vous, et vous n'avez pas de serveur à vous qui reste exposé. Vous écrivez la conversation, nous gérons l'infrastructure.
Commencez à construire aujourd'huiPoursuivre la lecture
- Guide BotFather, y compris comment révoquer et faire tourner un jeton
- Meilleures pratiques pour les bots Telegram, la checklist plus large
- Meilleures pratiques UX pour les bots Telegram, pour le volet design
Questions fréquentes
Que se passe-t-il si le jeton de mon bot Telegram fuite ?
Celui qui le détient contrôle entièrement le bot. Il peut lire les messages entrants, envoyer des messages en votre nom et modifier votre webhook pour que votre propre serveur cesse de recevoir les mises à jour. Il n'y a aucune demande de mot de passe qui s'interpose.
Comment révoquer un jeton de bot Telegram ?
Ouvrez BotFather, envoyez la commande de révocation et choisissez le bot. L'ancien jeton cesse immédiatement de fonctionner et vous en recevez un nouveau. Réécrire l'historique git ne sert à rien, car un jeton qui a fuité est récupéré en quelques minutes.
Mon bot voit-il tous les messages d'un groupe ?
Uniquement si vous désactivez le mode confidentialité. Par défaut, un bot dans un groupe reçoit les commandes, les réponses à ses propres messages et les mentions directes. Désactiver le mode confidentialité fait que votre serveur stocke les conversations des autres personnes.
Ai-je besoin d'un jeton secret sur mon webhook ?
Oui. Sans cela, quiconque trouve l'URL de votre webhook peut publier de fausses mises à jour qui ressemblent exactement à du vrai trafic Telegram. Définissez le secret lors de l'enregistrement du webhook et rejetez les requêtes dont l'en-tête ne correspond pas.