Seguridad en Jellyfin: alertas por Telegram ante ataques, accesos inusuales y cambios de admin

Guía práctica para autohospedadores: instala Security Notifications en Jellyfin, conecta Telegram o un webhook y ajusta sus 20 reglas para recibir escaneos, ataques a contraseñas y cambios de admin como alertas útiles.

Por qué un servidor Jellyfin expuesto necesita un vigilante

Si tu servidor Jellyfin responde en una dirección pública, lo están escaneando todos los días. Los bots buscan /.env, wp-login y trucos de path traversal, prueban contraseñas en ráfagas, lanzan una lista de cuentas desde una misma dirección y a veces aciertan tras una larga ristra de fallos. Otros buscan una vía de entrada a través de un nuevo administrador, una clave de API o un ajuste modificado.

Leer los registros a posteriori es lento. Security Notifications vigila los eventos y el registro del servidor y convierte esas señales en alertas en el canal que ya miras: Telegram, correo, un webhook (Discord, Slack, ntfy, Gotify o JSON plano) o el registro de actividad de Jellyfin. Este tutorial lo configura para el trabajo de jellyfin seguridad: recibir la alerta adecuada, con contexto suficiente para actuar y sin una avalancha de ruido.

fail2ban sigue siendo útil y complementario: bloquea a los reincidentes a nivel de red. Security Notifications te dice qué está pasando y quién lo hace, incluido lo que fail2ban no puede ver, como un nuevo administrador o una eliminación masiva.

Requisitos previos

  • Jellyfin Server 12.2 o superior, en Linux, Windows o Docker.
  • Una cuenta de MediaLab Works con una licencia que cubra el plugin: una suscripción activa, una licencia de por vida dentro de su ventana de actualizaciones, el bundle de Jellyfin o la prueba gratuita de 30 días.
  • Para Telegram: un bot. Para correo: un servidor SMTP (se recomienda el puerto 587 con STARTTLS). Para un webhook: la dirección de tu endpoint de Discord, Slack, ntfy o Gotify, o cualquier URL que acepte JSON.
  • Opcional pero recomendado: fail2ban ya en funcionamiento delante del servidor.

Paso 1 — Instalar el plugin

La vía más limpia es tu repositorio privado de plugins, para que Jellyfin instale y actualice el plugin por su cuenta:

  1. En tu cuenta de MediaLab Works abre Licenses → Jellyfin plugin repository, haz clic en Create address y cópiala. Es privada (contiene un token), así que no la compartas; puedes regenerarla o revocarla en cualquier momento.
  2. En Jellyfin abre Dashboard → Plugins → Repositories, haz clic en +, ponle un nombre (por ejemplo MediaLab Works), pega la dirección y guarda.
  3. En Dashboard → Plugins → Catalog busca Security Notifications by MediaLab, haz clic en Install y reinicia Jellyfin.

También puedes instalar desde el catálogo público (https://medialab.works/jellyfin/manifest.json) o manualmente desde un archivo zip en la carpeta de plugins (/var/lib/jellyfin/plugins/ en una instalación con paquete de Linux, /config/plugins/ en el volumen de configuración de Docker, %ProgramData%\Jellyfin\Server\plugins\ en Windows). La guía tiene los pasos exactos para cada caso.

Paso 2 — Activar la licencia

Abre Dashboard → Plugins → Security Notifications by MediaLab y haz clic en Open License page. Pega tu clave de licencia y haz clic en Activate with key: el plugin vincula la clave a este servidor y muestra la licencia como Active. ¿Aún no tienes clave? Introduce tu correo en la misma página para empezar la prueba de 30 días.

La licencia se comprueba una vez al día y en cada arranque de Jellyfin; sin internet el plugin sigue funcionando 7 días después de la última comprobación correcta. Las tareas en segundo plano solo se ejecutan con una licencia válida y el plugin activado.

Paso 3 — Conectar un canal y enviar una prueba

Abre Security Notifications en el menú del dashboard y ve a la pestaña Channels. Todos los canales están desactivados por defecto; activa los que quieras y fija una gravedad mínima para cada uno.

  • Telegram: introduce el token del bot, envía /start al bot (o añádelo a un grupo) y haz clic en Find para rellenar el chat.
  • Correo: añade destinatarios y tu servidor SMTP. Se recomienda el puerto 587 con STARTTLS; el puerto 465 con TLS implícito no es compatible. Si tienes instalado Registration by MediaLab, puedes reutilizar su servidor SMTP.
  • Webhook: elige Discord, Slack, ntfy, Gotify o JSON y pega la dirección. La dirección contiene el token y se guarda aparte de los ajustes. Para Gotify, añade ?token=… a la dirección /message.
  • Registro de actividad de Jellyfin: las alertas también aparecen en la lista de actividad del dashboard.

Haz clic en Send a test en cada canal antes de confiar en él. Después abre Settings y elige una fuente de Location: DB-IP Lite (gratis, sin cuenta) o MaxMind GeoLite2 (tu id de cuenta y clave de licencia). La geolocalización ocurre en local; las direcciones IP no se envían a ningún sitio. Sin ubicación, las reglas de país nuevo, viaje imposible y red nueva no pueden funcionar.

Paso 4 — Indica al plugin cuál es tu red

Sigue en Settings y añade tus redes de confianza (CIDR), por ejemplo tu propia VPN. Las redes privadas y las de los ajustes de red de Jellyfin se incluyen automáticamente. Si Jellyfin está detrás de nginx, Caddy, Traefik o similar, activa The server is behind its own proxy para que se esperen las cabeceras reenviadas; Cloudflare se reconoce por sí mismo. Así la regla de cabeceras de proxy falsificadas sigue teniendo sentido.

Deja activadas las Bad IP lists: los nodos de salida de Tor se actualizan cada hora y Spamhaus DROP a diario. Ambas son solo descargas.

Paso 5 — Ajustar las 20 reglas

Abre la pestaña Rules. Cada regla tiene su propio interruptor, una gravedad y, cuando corresponde, umbrales. Las reglas cubren cuatro grupos:

  • Ataques a cuentas: ráfagas de contraseñas incorrectas desde una dirección, muchas cuentas probadas desde la misma dirección (password spraying), un inicio de sesión correcto tras muchos fallos, una cuenta bloqueada.
  • Inicios de sesión inusuales: un país nuevo o un viaje imposible; un administrador que inicia sesión desde un dispositivo nuevo, una red nueva, desde fuera de la red local o a una hora inusual; inicios de sesión desde una salida de Tor o una red maliciosa conocida.
  • Cambios sensibles y daños: un nuevo administrador, un cambio de contraseña, una cuenta eliminada, una clave de API creada o eliminada, un plugin instalado o desinstalado, ajustes críticos modificados (acceso remoto, HTTPS, proxies de confianza, puertos, UPnP), eliminación masiva de una biblioteca, una cuenta usada desde demasiados sitios a la vez.
  • Indicios de compromiso: escaneos y sondeos (/.env, wp-login, path traversal), cabeceras de proxy falsificadas, uso de «Forgot password», archivos backdoor en la carpeta de plugins, una versión del servidor con vulnerabilidades publicadas.

Empieza con los valores por defecto y luego ajusta. Fija el umbral de contraseñas incorrectas según cuántos fallos en cuántos minutos consideras normal para tus usuarios, y define el horario habitual del administrador para que los inicios de sesión de admin fuera de horario destaquen. Sube la gravedad de las reglas sobre las que siempre actuarías, como un nuevo administrador o un inicio de sesión correcto tras muchos fallos.

Paso 6 — Reducir el ruido

En la pestaña Channels, los ajustes de No spam deciden con qué frecuencia te habla el plugin: cada cuánto puede repetirse la misma alerta, ráfagas agrupadas en un solo mensaje, horas de silencio (solo las alertas críticas salen al momento; el resto llega en un resumen cuando terminan) y un resumen diario opcional para alertas de gravedad media e informativa. Si Telegram se satura, sube la gravedad mínima de ese canal y deja el registro de actividad para todo lo demás.

Uso diario y resolución de problemas

  • Overview muestra las alertas recientes y el estado del plugin; History lista todas las alertas con filtros y exportación a CSV. El historial de alertas guarda hasta 5000 entradas (configurable).
  • ¿No llega el mensaje de prueba? Revisa la gravedad mínima de ese canal y vuelve a usar Send a test. Para correo, cambia al puerto 587 con STARTTLS si usaste el 465.
  • ¿No se encuentra el chat de Telegram? Envía primero /start al bot y luego haz clic en Find.
  • ¿Demasiadas alertas de inicio de sesión? Añade tus redes de confianza y confirma el ajuste del proxy; sin datos de ubicación, las reglas de país nuevo y viaje imposible permanecen en silencio por diseño.
  • ¿Los usuarios desconocidos no generan fallos? Los inicios de sesión fallidos se detectan a partir de respuestas 401/403, porque Jellyfin no emite ningún evento para usuarios desconocidos.
  • ¿Algo se rompe tras una actualización? En la página de licencia, Roll back to x.y.z vuelve a la versión anterior; reinicia Jellyfin después. Ten en cuenta que las actualizaciones automáticas quedan desactivadas para este plugin hasta que uses Install update.
  • Mantén fail2ban en marcha. Deja que bloquee a los escáneres ruidosos; deja que Security Notifications te cuente qué pasó, desde dónde y qué revisar.

Conclusión

Un servidor Jellyfin público recibirá sondeos. Con Security Notifications instalado, las señales que importan —password spraying, viaje imposible, sondeos a /.env, un nuevo admin— llegan como alertas con la cuenta, la dirección, el país, el dispositivo y una pista de qué revisar. Configura un canal, envía una prueba, ajusta las reglas durante una semana y tendrás un vigilante silencioso en lugar de un registro que nunca lees.

Tienes más detalles en la guía de usuario, el changelog y nuestra base de conocimiento. ¿Dudas? Contacta con nosotros.

Página del producto: /products/jf-securitynotifications

Esta publicación se redactó con ayuda de IA a partir de la documentación de nuestros productos o de las fuentes indicadas y se revisó automáticamente antes de publicarse.

Sigue leyendo

¿Usas Emby, Jellyfin o Nextcloud?

Nuestros plugins y apps añaden TV en directo, subtítulos, registro de usuarios y seguridad a tu propio servidor, con prueba gratuita.