Búsqueda de sitios web

Cree una lista de permisos de acceso externo de Teams a partir de chats de usuarios


El acceso externo de Safe Teams significa limitar las comunicaciones a dominios conocidos

En septiembre de 2022, un investigador de seguridad demostró cómo un participante externo en un chat de Teams podía enviar un GIF modificado que contenía malware que infectaba la PC del destinatario. De forma predeterminada, Teams permite a los usuarios chatear con cualquier persona de cualquier otro inquilino de Microsoft 365. La solución a algo como el exploit GIFShell es restringir el acceso externo de Teams a una lista de permitidos (lista blanca) de inquilinos conocidos.

El problema entonces es cómo completar la lista de permitidos. En ese momento, sugerí que las organizaciones podrían comenzar creando una lista de los dominios de donde provenían las cuentas de invitados. No es difícil usar PowerShell para encontrar todas las cuentas de invitados, extraer sus dominios y usar esa información para crear una lista de permitidos, que es lo suficientemente grande como para albergar aproximadamente 4000 dominios.

Trabajo hecho, o eso creía. Sin embargo, otros creen que utilizar dominios invitados como base para una lista de permitidos no es suficiente. No hay garantía de que el conjunto de dominios derivados de las cuentas de invitados cubra todos los dominios posibles de los que pueda provenir un participante externo del chat. Por lo tanto, es necesario algún acuerdo para permitir que las personas soliciten la adición de un dominio a la lista de permitidos. Esto reduce la naturaleza espontánea de la colaboración basada en chat entre organizaciones, pero podría ser el precio necesario para lograr comunicaciones seguras.

Entonces alguien decidió que sería posible examinar todos los chats externos de una organización para descubrir el conjunto de dominios a los que pertenecen los participantes del chat externo. Suena bien, pero ¿cómo se puede encontrar y procesar la información de los chats de los usuarios? Eso es lo que explico en este artículo.

Acceder a los participantes del chat es la clave para el acceso externo de Teams

En otro artículo, explico los conceptos básicos del uso del SDK de Microsoft Graph PowerShell para buscar y procesar mensajes de chat y chat de Teams. El script de PowerShell analizado en ese artículo permite a los administradores eliminar mensajes de los chats grupales que puedan ser objetables o contener información confidencial. El script necesario aquí también tiene que encontrar chats, pero chats uno a uno en lugar de chats grupales. Después de encontrar una lista de cuentas de usuario con el cmdlet Get-MgUser, podemos usar un filtro diferente con el cmdlet Get-MgBetaUserChat para encontrar los chats uno a uno para cada usuario.

Cada chat tiene una lista de participantes que se pueden recuperar mediante el cmdlet Get-MgChatMember. Uno de los participantes es una cuenta de inquilino y el otro podría ser un participante externo. Para crear una lista de dominios externos, el script debe examinar a los participantes de cada chat y encontrar aquellos que involucran a participantes externos. Con esos datos, el script puede crear una lista de dominios. Al menos, esa es la teoría.

Definiendo la solución

El esquema de la solución es claro. Sin embargo, el detalle marca la diferencia y hay algunos detalles importantes a considerar aquí.

Primero, el script debe utilizar los permisos de la aplicación para acceder a los chats de los usuarios. Esto no fue un problema para el script anterior porque usé un runbook de Azure Automation con una identidad administrada para la autenticación. Los permisos Graph necesarios se asignan a la cuenta de Azure Automation.

En este escenario, quiero usar el cmdlet Get-CsTenantFederationConfiguration del módulo de Microsoft Teams para obtener detalles sobre la configuración de acceso externo del inquilino. Los cmdlets de administración de políticas que Teams heredó de Skype Empresarial Online no admiten identidades administradas (los otros cmdlets de Teams sí lo hacen porque están basados en Graph). Podría solucionar el problema y seguir usando Azure Automation aprovechando Azure Key Vault para almacenar las credenciales de la cuenta y usar esas credenciales para conectarme a Teams. Al final, decidí optar por un enfoque diferente y utilizar la autenticación basada en certificados porque todos los cmdlets admiten este enfoque.

Debido a que el script utiliza autenticación basada en certificados, necesita una aplicación Entra ID registrada para almacenar el certificado y mantener los permisos Graph necesarios para acceder a los datos que necesita el script:

  • CrossTenantInformation.ReadBasic.All: lee el identificador del inquilino y devuelve el nombre para mostrar del inquilino.
  • User.Read.All: lee la información de la cuenta del usuario.
  • Chat.Read.All: leer los chats de los usuarios.
  • Directory.Read.All: lee la información del inquilino de la casa del directorio.
  • Mail.Send: envía un correo electrónico con los resultados.

Además, debido a que el script ejecuta un cmdlet de administración de políticas de Teams, la aplicación debe tener la función de administrador de Teams. Esto no es difícil porque la asignación de funciones se realiza fácilmente utilizando el centro de administración de Entra ID, pero es un ejemplo del tipo de detalle necesario para que todo funcione.

Los pasos descritos en este artículo describen cómo crear un certificado autofirmado (suficiente para realizar pruebas) y cargarlo en una aplicación registrada (Figura 1).

El artículo también describe cómo usar PowerShell para asignar una función administrativa de Entra ID a una aplicación usando un código como este:

$TeamsAppSp = (Get-MgServicePrincipal -Filter "DisplayName eq ‘PowerShellGraph'").Id
$TeamsRoleId = (Get-MgDirectoryRole | Where-Object {$_.DisplayName -eq "Teams Administrator"}).Id
$NewAssignee = @{
  "@odata.id" = ("https://graph.microsoft.com/v1.0/directoryObjects/{0}" -f $TeamsAppSp)
  }
New-MgDirectoryRoleMemberByRef -DirectoryRoleId $TeamsRoleId -BodyParameter $NewAssignee

Con la aplicación asignada los permisos y roles necesarios y un certificado implementado, podemos escribir código.

Scripting de la solución

Los pasos del guión son:

  • Conéctese al punto final de Microsoft Graph mediante autenticación basada en certificados. Necesita el identificador de cliente de la aplicación registrada, el identificador de inquilino y la huella digital del certificado para conectarse.
  • Conéctese al punto final de Teams mediante autenticación basada en certificados. Get-CsTenantFederationConfiguration es el único cmdlet utilizado desde el módulo Teams. Todos los demás cmdlets provienen del SDK de Microsoft Graph PowerShell.
  • Encuentre el conjunto de dominios registrados para el inquilino. Esta información se utiliza para determinar si un chat individual es con alguien dentro o fuera del inquilino.
  • Obtenga el conjunto de cuentas de usuarios con licencia en el inquilino. Esto puede incluir buzones de correo compartidos con licencias, pero es la forma más fácil y rápida de encontrar el conjunto de cuentas que usan Teams.
  • Para cada usuario, encuentre el conjunto de sus chats uno a uno. Se impone un pequeño retraso entre cada usuario para evitar la limitación de Microsoft 365.
  • Para cada chat, recupere la lista de participantes y elimine de la lista al usuario que se está procesando. Debido a que estos son chats uno a uno, sólo debe permanecer otro participante.
  • Busque el nombre de dominio del otro participante para saber si el chat es interno o externo.
  • Si es externo, resuelva el dominio del inquilino utilizando el identificador del inquilino.
  • Si el chat está alojado por el inquilino de la casa, recupere la cantidad de mensajes en el chat. No puede recuperar esta información para chats alojados por inquilinos externos.
  • Registre lo que se encontró y regrese para procesar el siguiente chat.
  • Después de procesar los chats para todos los usuarios, verifique la configuración de acceso externo de Teams y compare los dominios en su lista permitida con los dominios utilizados para los chats externos. Informe cualquier dominio utilizado para chats externos que no esté en la lista de permitidos.
  • Envíe los resultados por correo electrónico a un destinatario predeterminado. Los resultados son detalles de chats externos y la información sobre dominios externos.
  • Declarar el éxito.

La Figura 2 muestra un ejemplo del correo electrónico enviado por el script. El conjunto de propiedades para cada registro se define en el script y no incluye todas las capturadas en el informe. No se realiza ningún filtrado de los datos. Por ejemplo, podría decidir concentrarse en los chats con participantes externos iniciados en los últimos dos años e ignorar los chats anteriores.

Ejecutando el guión

Puede descargar el script desde GitHub. Recuerde, este script funciona, pero solo pretende demostrar los principios del uso de Graph SDK para recuperar y procesar información sobre los chats de Teams y sus participantes. No está diseñado para ser una solución estándar y no lo he ejecutado a escala real. Dada la necesidad de recuperar todos los chats individuales de cada usuario procesado, el script no es ultrarrápido. Es posible que desee ejecutarlo primero para un conjunto limitado de usuarios. Si es así, aplique un filtro al conjunto de usuarios obtenidos de Entra ID. Por ejemplo, para limitar el conjunto a usuarios de un departamento específico, puede modificar la llamada Get-MgUser a algo como esto:

[array]$Users = Get-MgUser -Filter "assignedLicenses/`$count ne 0 and userType eq 'Member' and department eq 'IT'" -ConsistencyLevel eventual -CountVariable Records -All | Sort-Object displayName

Antes de intentar ejecutar el script, asegúrese de que se cumplan todos los requisitos previos y de que utilice una aplicación registrada a la que se le haya asignado la función de administrador de Teams y los permisos Graph necesarios.

Tomar decisiones basadas en datos

Este ejercicio es un buen ejemplo de lo útil que es el SDK de Microsoft Graph PowerShell cuando surge la necesidad de extraer información de Microsoft 365. Sin acceso a los chats de los usuarios, es imposible saber con quién están conversando personas ajenas al inquilino. Graph SDK expone sus secretos y ayuda a los administradores a tomar mejores decisiones basadas en datos en lugar de en la intuición, y eso siempre es bueno.

Planificación y consolidación de la migración de la plataforma Microsoft

Simplifique la planificación de la migración, supere los desafíos de la migración y finalice los proyectos más rápido mientras minimiza los costos, los riesgos y las interrupciones para los usuarios.

Artículos relacionados