Búsqueda de sitios web

Webhooks de Teams a través de PowerShell: alertas modernas


Seguramente estás familiarizado con el siguiente escenario: La monitorización y las alertas resultantes han "evolucionado históricamente" en el pasado: se utilizan diferentes herramientas de monitorización para las distintas áreas.
Pero tienen una cosa en común: todas las alertas se envían por correo .

Esto acaba acumulando montones de mensajes de alerta de los distintos sistemas y scripts de seguimiento, además de invitaciones a citas, conciliaciones y las fotos del último evento del equipo.< br>

Sin embargo, dado que la infraestructura está en constante cambio y el esfuerzo de mantenimiento manual de estas alertas en los sistemas de monitoreo crece al mismo tiempo, siempre hay uno o dos colegas que se olvidan de ajustar la configuración de alertas a los nuevos requisitos.

A menudo se escuchan declaraciones como: "Oh, esta alerta no es tan importante, llega cada dos domingos, simplemente ignórala". La solución obvia es crear una carpeta separada en su buzón de correo, a la que las reglas de Outlook mueven automáticamente todas las alertas y, por lo tanto, desaparecen en el nirvana.

Por supuesto: el escenario descrito aquí se acerca bastante al peor de los casos de implementación de alertas. Sin embargo, en muchas empresas se lleva a cabo de esta manera o similar.

Este tipo de alerta ya no es apropiado dadas las crecientes demandas sobre el tiempo de respuesta de un departamento de operaciones y la rápida dinámica de la infraestructura de TI. El solo hecho de que la comunicación sobre la alerta entre administradores generalmente no se realiza por correo, sino ahora principalmente a través de Teams (u otro mensajero), arroja dudas sobre si los correos son el medio adecuado para la notificación.

¿Qué son los webhooks?

Los llamados webhooks ofrecen la posibilidad de enviar alertas u otras notificaciones a un canal de Microsoft Teams. Aquí puede crear un canal de Teams separado para monitorear cada departamento. El jefe de departamento tiene una visión general de todas las notificaciones sin que se llene su bandeja de entrada.

Puedes decidir qué áreas son relevantes para ti y configurarlas para recibir una notificación cuando ocurra un incidente. Las alertas y notificaciones se pueden comentar directamente, por lo que ya no hay necesidad de una interrupción mediática en la colaboración entre administradores. En este artículo, aprenderá cómo crear alertas de equipos como esta con solo un pequeño código de PowerShell:

Ejemplo de un mensaje de alerta publicado a través de un webhook en MS Teams

Nota: Los webhooks obviamente también se usan fuera de los equipos. Todos los mensajeros ahora admiten webhooks y se pueden manejar de manera similar (posiblemente con pequeñas desviaciones en la configuración).

Antes de entrar en la configuración de dicho webhook, unas pocas palabras sobre los webhooks en general: Una aplicación puede ofrecer los llamados webhooks entrantes (o salientes). Para ello, proporciona una URL única que espera recibir solicitudes web en un formato definido, comparable a una API. De este modo, las aplicaciones y los servidores pueden intercambiar mensajes con muy poco esfuerzo de configuración, lo que inicialmente ofrece enormes posibilidades. En este artículo nos centramos en la posibilidad de monitorear alertas.

Creación de webhooks de Teams con PowerShell

Ahora echemos un vistazo a un ejemplo específico de WebHooks iniciados por PowerShell. Hay una amplia gama para elegir:

  • Cuando a un disco duro de un servidor solo le queda un 10% de capacidad
  • Cuando un servidor ya no responde
  • Cuando la capacidad de una cuenta OneDrive está casi llena y es necesario actualizarla
  • Cuándo se maximizarán las licencias de M365 en la organización en un futuro próximo
  • y muchos más

Veamos cómo usar los webhooks de Teams para enviar notificaciones cuando una cuenta de usuario está bloqueada en Active Directory. De esta manera puede reaccionar a tiempo y notar el bloqueo del usuario incluso antes de que los programas del usuario soliciten un nuevo inicio de sesión.

El enfoque se divide en dos partes: la configuración en Teams y en el script de PowerShell. PowerShell sirve en la mayoría de los escenarios como un "pegamento" que vincula las diferentes aplicaciones.

Para explicarlo: Active Directory no proporciona por sí solo la posibilidad de enviar webhooks tan pronto como un usuario está bloqueado; este trabajo lo realizará PowerShell.

Configurar equipos de Microsoft

Para habilitar webhooks, es necesario definir un canal de un equipo al que deben enviarse. Luego puedes abrir los conectores del canal haciendo clic derecho sobre él:

La configuración de Conectores de un canal de equipo se puede encontrar en su menú contextual

La configuración de la interfaz se puede iniciar haciendo clic en "Configurar" en el panel "Webhook entrante":

Descripción general de los conectores disponibles en el equipo "Aprendizaje de TI"

Después de asignar un nombre adecuado y, opcionalmente, cargar un ícono, haga clic en "Crear" y recibirá la URL a través de la cual podemos enviar las solicitudes web en el script de PowerShell:

Configurar las propiedades del conector para el nuevo webhook

Esta URL debe mantenerse segura, ya que por supuesto es pública. Un atacante podría usar esta URL para enviar mensajes a su canal de Teams y, lógicamente, debería evitarlo.

Después de haber copiado la URL, ahora podemos comenzar con el script de PowerShell.

Secuencia de comandos de PowerShell

Para enviar webhooks a los equipos, se utiliza el llamado formato JSON. Si no trabaja con JSON de forma regular, probablemente le resulte un poco complicado crear un archivo JSON.

La plataforma de software ScriptRunner proporciona una función para enviar webhooks a equipos, lo que le evita tener que crear JSON. Analizaremos más de cerca esta característica en el próximo artículo de esta serie. En esta introducción quiero mostrarte lo básico a pesar de las posibles alternativas. Puede utilizar el siguiente esquema para su JSON:

[String]$var = "Text, welcher im Nachrichteninhalt erscheint"
$JSONBody = [PSCustomObject][Ordered]@{
    "@type" = "MessageCard"
    "@context" = "<http://schema.org/extensions>"
    "summary" = "Meine erste Alert-Summary!"
    "themeColor" = '0078D7'
    "title" = "Mein erster Alert."
    "text" = "Hier steht die genaue Alertbeschreibung! Variablen kann man natuerlich auch anfuegen: $var"
}

$TeamMessageBody = ConvertTo-Json $JSONBody

$parameters = @{
    "URI" = ''
    "Method" = 'POST'
    "Body" = $TeamMessageBody
    "ContentType" = 'application/json'
}

Invoke-RestMethod @parameters

Usamos una tabla hash, que llenamos con el contenido del mensaje y luego la convertimos a JSON. PowerShell nos facilita bastante esta tarea.

Luego, usando el método splatting, se crea una lista de parámetros, a la que debes agregar la URL correspondiente de tu configuración de webhook. Luego podemos probar directamente si la comunicación básica funciona. Si la comunicación es exitosa, PowerShell devuelve un "1" y aparece el mensaje en nuestro Canal de Teams:

Mensaje de prueba

¡Excelente! Ya ha enviado su primer webhook a Teams. Pero ahora le prometí proporcionarle un script que le notificará a través de Teams cuando un usuario esté bloqueado en AD. Para hacer esto, por supuesto, necesitamos un procedimiento que detecte cuando un usuario ha sido bloqueado.

Afortunadamente, Windows EventLog crea una entrada con EventID 4740 tan pronto como se crea un usuario. Podemos utilizar dicho evento como disparador para iniciar nuestro script. Esto funciona a través del Programador de tareas de Windows, pero es mucho más conveniente a través de la interfaz ScriptRunner.

Ahora hemos logrado que el mensaje "Mi primera alerta" se envíe tan pronto como se bloquee a un usuario; esto aún no es muy útil. Por supuesto, todavía tenemos que adaptar nuestro guión. Para esto necesitamos una funcionalidad para leer el usuario bloqueado y agregar esta información al mensaje:

# Gets locked AD user, that was locked latest
$LockedUser = Search-ADAccount -LockedOut | 
    Get-ADUser -Properties badpwdcount, lockoutTime, lockedout, emailaddress | 
    Select-Object badpwdcount, lockedout, Name, EmailAddress, SamAccountName, @{ Name = "LockoutTime"; Expression = { ([datetime]::FromFileTime($_.lockoutTime).ToLocalTime()) } } | 
    Sort-Object LockoutTime -Descending | 
    Select-Object -first 1

$JSONBody = [PSCustomObject][Ordered]@{
    "@type" = "MessageCard"
    "@context" = "<http://schema.org/extensions>"
    "summary" = "Locked: $($LockedUser.SamAccountName)"
    "themeColor" = '0078D7'
    "title" = "User locked"
    "text" = "`nSamAccountName: $($LockedUser.SamAccountName)" +
        "`nName: $($LockedUser.Name)" +
        "`nMail: $($LockedUser.EmailAddress)" +
        "`nBad Password Count: $($LockedUser.badpwdcount)" +
        "`nTimestamp: $($LockedUser.LockoutTime.ToString())" 

}

$TeamMessageBody = ConvertTo-Json $JSONBody

$parameters = @{
    "URI" = ""
    "Method" = 'POST'
    "Body" = $TeamMessageBody
    "ContentType" = 'application/json'
}

Invoke-RestMethod @parameters

Ahora recibimos el siguiente mensaje en equipos con esto:

El script de PowerShell ha publicado correctamente la información solicitada en el canal de Teams a través del webhook.

Conclusión

Los webhooks son un enfoque de última generación para la gestión de alertas. Las ventajas eclipsan claramente las alertas por correo, aunque, por supuesto, pueden tener sus ventajas.

PowerShell asume el papel de mediador para aplicaciones que no tienen una opción directa para enviar webhooks. ¡Solo puedo recomendar el uso de webhooks y desearles mucha diversión con la implementación!

En la siguiente parte (parte 2, parte 3) de esta serie, aprenderá cómo escribir scripts de webhooks aún más fácilmente usando una función que ScriptRunner proporciona de forma gratuita en GitHub.

Artículos relacionados