Pourquoi un serveur Jellyfin exposé a besoin d'une surveillance
Si votre serveur Jellyfin répond sur une adresse publique, il est scanné chaque jour. Des bots sondent /.env, wp-login et des tentatives de path traversal, essaient des mots de passe par rafales, testent une liste de comptes depuis une même adresse et parviennent parfois à entrer après une longue série d'échecs. D'autres cherchent un point d'entrée via un nouvel administrateur, une clé d'API ou un paramètre modifié.
Lire les journaux après coup est lent. Security Notifications surveille les événements et le journal du serveur et transforme ces signaux en alertes sur le canal que vous consultez déjà : Telegram, e-mail, webhook (Discord, Slack, ntfy, Gotify ou JSON brut) ou journal d'activité Jellyfin. Ce tutoriel aborde la sécurité Jellyfin sous cet angle : recevoir la bonne alerte, avec assez de contexte pour agir, sans être submergé de bruit.
fail2ban reste utile et complémentaire : il bloque les récidivistes au niveau réseau. Security Notifications vous dit ce qui se passe et qui en est à l'origine, y compris ce que fail2ban ne peut pas voir, comme un nouvel administrateur ou une suppression massive.
Prérequis
- Jellyfin Server 12.2 ou version ultérieure, sous Linux, Windows ou Docker.
- Un compte MediaLab Works avec une licence couvrant le plugin : un abonnement actif, une licence à vie dans sa fenêtre de mises à jour, le bundle Jellyfin ou l'essai gratuit de 30 jours.
- Pour Telegram : un bot. Pour l'e-mail : un serveur SMTP (port 587 avec STARTTLS recommandé). Pour un webhook : l'adresse de votre point de terminaison Discord, Slack, ntfy ou Gotify, ou toute URL acceptant du JSON.
- Facultatif mais recommandé : fail2ban déjà en place devant le serveur.
Étape 1 — Installer le plugin
La méthode la plus propre passe par votre dépôt de plugins privé, pour que Jellyfin installe et mette à jour le plugin lui-même :
- Dans votre compte MediaLab Works, ouvrez Licenses → Jellyfin plugin repository, cliquez sur Create address et copiez l'adresse. Elle est privée (elle contient un jeton), ne la partagez pas ; vous pouvez la régénérer ou la révoquer à tout moment.
- Dans Jellyfin, ouvrez Dashboard → Plugins → Repositories, cliquez sur +, nommez-le (par exemple MediaLab Works), collez l'adresse et enregistrez.
- Dans Dashboard → Plugins → Catalog, trouvez Security Notifications by MediaLab, cliquez sur Install, puis redémarrez Jellyfin.
Vous pouvez aussi installer depuis le catalogue public (https://medialab.works/jellyfin/manifest.json) ou manuellement depuis un fichier zip dans le dossier des plugins (/var/lib/jellyfin/plugins/ pour une installation Linux par paquet, /config/plugins/ dans le volume de configuration Docker, %ProgramData%\Jellyfin\Server\plugins\ sous Windows). Le guide détaille chaque méthode.
Étape 2 — Activer la licence
Ouvrez Dashboard → Plugins → Security Notifications by MediaLab et cliquez sur Open License page. Collez votre clé de licence et cliquez sur Activate with key : le plugin lie la clé à ce serveur et affiche la licence comme Active. Pas encore de clé ? Saisissez votre e-mail sur la même page pour démarrer l'essai de 30 jours.
La licence est vérifiée une fois par jour et à chaque démarrage de Jellyfin ; sans accès Internet, le plugin continue de fonctionner pendant 7 jours après la dernière vérification réussie. Les tâches en arrière-plan ne s'exécutent qu'avec une licence valide et le plugin activé.
Étape 3 — Connecter un canal et envoyer un test
Ouvrez Security Notifications dans le menu du tableau de bord et allez à l'onglet Channels. Chaque canal est désactivé par défaut ; activez ceux que vous voulez et définissez une gravité minimale pour chacun.
- Telegram : saisissez le jeton du bot, envoyez
/startau bot (ou ajoutez-le à un groupe), puis cliquez sur Find pour renseigner la conversation. - E-mail : ajoutez les destinataires et votre serveur SMTP. Le port 587 avec STARTTLS est recommandé ; le port 465 avec TLS implicite n'est pas pris en charge. Si Registration by MediaLab est installé, vous pouvez réutiliser son serveur SMTP.
- Webhook : choisissez Discord, Slack, ntfy, Gotify ou JSON et collez l'adresse. L'adresse contient le jeton et est stockée séparément des paramètres. Pour Gotify, ajoutez
?token=…à l'adresse/message. - Journal d'activité Jellyfin : les alertes apparaissent aussi dans la liste d'activité du tableau de bord.
Cliquez sur Send a test pour chaque canal avant de vous y fier. Ensuite, ouvrez Settings et choisissez une source de Location : DB-IP Lite (gratuit, sans compte) ou MaxMind GeoLite2 (identifiant de compte et clé de licence). La géolocalisation se fait en local ; les adresses IP ne sont jamais transmises. Sans données de localisation, les règles de nouveau pays, de déplacement impossible et de nouveau réseau ne peuvent pas fonctionner.
Étape 4 — Indiquer votre réseau au plugin
Toujours dans Settings, ajoutez vos réseaux de confiance (CIDR), votre propre VPN par exemple. Les réseaux privés et ceux définis dans les paramètres réseau de Jellyfin sont inclus automatiquement. Si Jellyfin se trouve derrière nginx, Caddy, Traefik ou équivalent, activez The server is behind its own proxy pour que les en-têtes transmis soient attendus ; Cloudflare est reconnu automatiquement. Cela préserve la pertinence de la règle sur les en-têtes de proxy falsifiés.
Laissez les Bad IP lists activées : les nœuds de sortie Tor sont actualisés toutes les heures et Spamhaus DROP chaque jour. Ce ne sont que des téléchargements.
Étape 5 — Régler les 20 règles
Ouvrez l'onglet Rules. Chaque règle possède son propre interrupteur, une gravité et, le cas échéant, des seuils. Les règles couvrent quatre groupes :
- Attaques sur les comptes : rafales de mots de passe erronés depuis une même adresse, nombreux comptes testés depuis la même adresse (password spraying), connexion réussie après de nombreux échecs, compte verrouillé.
- Connexions inhabituelles : nouveau pays ou déplacement impossible ; connexion d'un administrateur depuis un nouvel appareil, un nouveau réseau, depuis l'extérieur du réseau local ou à une heure inhabituelle ; connexions depuis un nœud de sortie Tor ou un réseau malveillant connu.
- Changements sensibles et dommages : nouvel administrateur, changement de mot de passe, compte supprimé, clé d'API créée ou supprimée, plugin installé ou retiré, paramètres critiques modifiés (accès distant, HTTPS, proxys de confiance, ports, UPnP), suppression massive dans une bibliothèque, un compte utilisé depuis trop d'endroits à la fois.
- Signes de compromission : scans et sondes (
/.env,wp-login, path traversal), en-têtes de proxy falsifiés, recours à « Mot de passe oublié », fichiers de porte dérobée dans le dossier des plugins, version du serveur présentant des vulnérabilités publiées.
Commencez avec les valeurs par défaut, puis ajustez. Réglez le seuil de mots de passe erronés selon le nombre d'échecs en combien de minutes vous considérez comme normal pour vos utilisateurs, et définissez les heures habituelles de l'administrateur pour faire ressortir les connexions admin hors horaires. Augmentez la gravité des règles sur lesquelles vous agiriez toujours, comme un nouvel administrateur ou une connexion réussie après de nombreux échecs.
Étape 6 — Réduire le bruit
Dans l'onglet Channels, les réglages No spam déterminent la fréquence des messages du plugin : intervalle de répétition d'une même alerte, regroupement des rafales en un seul message, heures de silence (seules les alertes critiques partent immédiatement, les autres arrivent dans un résumé à la fin) et résumé quotidien facultatif pour les alertes de gravité moyenne et informative. Si Telegram devient trop chargé, augmentez la gravité minimale de ce canal et gardez le journal d'activité pour tout le reste.
Usage quotidien et dépannage
- Overview affiche les alertes récentes et l'état du plugin ; History liste toutes les alertes avec des filtres et un export CSV. L'historique conserve jusqu'à 5000 entrées (configurable).
- Aucun message de test reçu ? Vérifiez la gravité minimale de ce canal et relancez Send a test. Pour l'e-mail, passez au port 587 avec STARTTLS si vous aviez choisi 465.
- Aucune conversation Telegram trouvée ? Envoyez d'abord
/startau bot, puis cliquez sur Find. - Trop d'alertes de connexion ? Ajoutez vos réseaux de confiance et confirmez le réglage du proxy ; sans données de localisation, les règles de nouveau pays et de déplacement impossible restent silencieuses par conception.
- Les utilisateurs inconnus ne déclenchent pas d'échec ? Les connexions échouées sont détectées à partir des réponses 401/403, car Jellyfin n'émet aucun événement pour les utilisateurs inconnus.
- Quelque chose casse après une mise à jour ? Sur la page License, Roll back to x.y.z revient à la version précédente ; redémarrez Jellyfin ensuite. Notez que les mises à jour automatiques sont alors désactivées pour ce plugin jusqu'à ce que vous utilisiez Install update.
- Laissez fail2ban actif. Laissez-le bannir les scanners bruyants ; laissez Security Notifications vous dire ce qui s'est passé, d'où, et quoi vérifier.
Conclusion
Un serveur Jellyfin public sera sondé. Avec Security Notifications installé, les signaux qui comptent — password spraying, déplacement impossible, sondes /.env, nouvel admin — arrivent sous forme d'alertes avec le compte, l'adresse, le pays, l'appareil et une indication de ce qu'il faut vérifier. Configurez un canal, envoyez un test, ajustez les règles pendant une semaine, et vous aurez une surveillance discrète au lieu d'un journal que vous ne lisez jamais.
Plus de détails dans le guide utilisateur, le changelog et notre base de connaissances. Des questions ? Contactez-nous.
Page produit : /products/jf-securitynotifications