Búsqueda de sitios web

Auditoría de Teams: no más expansión del alcance ni expansión de Teams


style="letter-spacing: 0px; text-transform: unset; background-color: transparent;">¿Quieres obtener más información sobre cómo monitorear Microsoft Teams con PowerShell? Lea cómo verificar la configuración a lo largo del tiempo para verificar si hay cambios. Prevenir (o resolver) la desviación de la configuración.

Donde empezar

La expansión del alcance, la configuración y la expansión de Teams tienen un problema de raíz común: la falta de monitoreo o controles para evitar estos cambios. En este artículo, analizaremos cómo podemos usar PowerShell para monitorear Teams, sus configuraciones y determinar los cambios que se han producido. Debido al tamaño y la complejidad de Teams, no cubriremos todos y cada uno de los aspectos de configuración, pero prepararemos a los administradores para que tengan éxito al analizar algunos ejemplos de cómo usar PowerShell. Una inspiración para esto se encuentra en el centro de seguridad conocido como Analizador de configuración, que tiene una pestaña Historial y análisis de deriva.

Punto de partida

Al igual que con cualquier script de PowerShell o uso de herramientas, asegúrese de que su módulo de PowerShell de Microsoft Teams esté ejecutando la última versión:

Update-Module MicrosoftTeams

Luego cierre su sesión de PowerShell, ya que esto garantiza que la próxima vez que se cargue el módulo de PowerShell, será la última versión.

Valida que tu versión sea la más reciente:

Import-Module MicrosoftTeams
Get-Module MicrosoftTeams

Nuevamente, compare nuevamente el número de versión con el que está disponible (aquí).

Qué cmdlets usar

La creación de un script personalizado para auditar una configuración de Microsoft Teams se puede realizar únicamente con cmdlets Get-*, ya que son cmdlets de PowerShell de descubrimiento, que consultan configuraciones y objetos y proporcionan los detalles necesarios. Puede encontrar una lista rápida de estos con esta frase (una vez conectado al punto final de Microsoft Teams PowerShell):


Get-Command Get-* | 
Where Source -eq MicrosoftTeams | 
Sort Name | 
ft Name

No revisaremos todos y cada uno de los cmdlets disponibles, ya que hay más de 150, pero revisaremos algunos ejemplos seleccionados para ayudar a descubrir elementos importantes en Teams para una "auditoría" de la configuración.

Canales de Microsoft Teams y Teams

Lista de equipos

Realizar un seguimiento de la cantidad y los tipos de equipos es un aspecto importante de la auditoría de la configuración de Teams, ya que Teams puede extenderse más allá de lo que una organización pretendía crear o mantener. Al validar los recuentos del equipo, podemos ver el crecimiento y el uso antes de que los números se salgan de control. Primero, consultando el número de equipos:

(Get-Team).Count

Que debería mostrar un resultado similar:

Get-Team | ft DisplayName,Visibility,Archived,GroupId

Lista de canales del equipo

Cada equipo podría tener uno o más canales para realizar un seguimiento de:

Get-Team | 
ForEach-Object {Write-Host $_.DisplayName -ForegroundColor Yellow ;Get-TeamChannel -GroupID $_.GroupID | 
ft DisplayName,Membership*,Description}

Utilizando los cmdlets de PowerShell anteriores, pudimos recopilar una gran cantidad de datos y configuraciones sobre nuestro entorno de Teams. ¿Cómo utilizamos estos datos para auditar verdaderamente un entorno? Por un lado, podemos monitorear la expansión de Teams y Teams Channel. En el siguiente ejemplo, verificamos Teams y los canales de Teams todos los meses para ver qué ha cambiado:

Ejemplo

Cuando se verifica por primera vez la cantidad de equipos y canales, puede haber 35 equipos y 56 canales y luego, cuando los cmdlets se ejecutan nuevamente, tal vez un mes después, estos números pueden aumentar a 40 y 65. Podemos realizar los recuentos iniciales de esta manera:

# Team count
(Get-Team).Count

# Teams channel count
Get-Team | 
Foreach-Object {$Channels = (Get-TeamChannel -GroupID $_.GroupID).Count;$TeamsChannelCount=$TotalChannels+$Channels}

Más adelante, de forma programada, podemos volver a comprobar estos números mediante programación:

$TeamsCount = (Get-Team).Count
Get-Team | 
Foreach-Object {$Channels = (Get-TeamChannel -GroupID $_.GroupID).Count;$TeamsChannelCount=$TotalChannels+$Channels}

Informe - ejemplo del mundo real

Cuando queremos comenzar a auditar la cantidad de Teams y Teams Channels, necesitamos una forma de almacenar los recuentos y compararlos con los números actuales en Teams.

Primer intento:


# Date column
$CurrentMonth = Get-Date -Format "MM.yyyy"

# File header
"Date,TeamsCount,TeamsChannelCount" | 
Out-File 'TeamsAndChannelCounts.csv'

# First month counts
$TeamsCount = (Get-Team).Count
Get-Team | 
Foreach-Object {$Channels = (Get-TeamChannel -GroupID $_.GroupID).Count;$TeamsChannelCount=$TotalChannels+$Channels}
$Output = "$CurrentMonth,$TeamsCount,$TeamsChannelCount" | 
Out-File 'TeamsAndChannelCounts.csv' -Append

Ejecuciones programadas donde tenemos líneas de datos que se pueden examinar en busca de diferencias:

# Import data
$TeamsData = Import-Csv .\TeamsAndChannelCounts.csv

# Last line
$CurrentMonth = $TeamsData[-1]

# Next to last line to compare
$LastMonth = $TeamsData[-2]

# Check each Teams data point for change
If ($CurrentMonth.TeamsCount -gt $LastMonth.TeamsCount) {Write-Host 'There are new Teams present.'}
If ($CurrentMonth.TeamsChannelCount -gt $LastMonth.TeamsChannelCount) {Write-Host 'There are new Teams Channels present.'}

Si necesitamos profundizar un poco en la maleza, también podemos verificar qué equipos son nuevos desde la última vez. Para hacer eso, podemos ejecutar esto la primera vez:

Get-Team | 
select DisplayName,Visibility,GroupId,Archived,Description | 
Export-Csv -Path HistoricalTeams.csv

Cada mes podemos comprobar si hay cambios:

Get-Team | 
select DisplayName,Visibility,GroupId,Archived,Description | 
Export-Csv -Path CurrentTeams.csv

Luego podemos comparar estos dos archivos con Compare-Object:

$Historical = Get-Content .\HistoricalTeams.csv
$Current = Get-Content .\CurrentTeams.csv
Compare-Object -ReferenceObject $Historical -DifferenceObject $Current

Vemos en este ejemplo que hay dos grupos diferentes, que son nuevos ya que el valor SideIndicator apunta a los datos del archivo en la variable $Current .

Un paso más que podemos realizar con PowerShell y es el de sustituir los archivos de Equipos Históricos por el actual para que tengamos los últimos recuentos para comparar en todo momento:

Remote-Item HistoricalTeams.csv
Rename-Item CurrentTeams.csv HistoricalTeams.csv

Acceso de invitados

Dentro de los equipos hay controles sobre a qué tiene acceso su invitado y podemos controlar estas configuraciones con PowerShell. Monitorear los aspectos de configuración de Teams para usuarios invitados es un aspecto importante de seguridad para la configuración de Teams en general. Como tal, podemos explorar esto con PowerShell para ver qué podemos descubrir y monitorear.

Primero los cmdlets de PowerShell:

Get-Command Get-*team*guest*

Que proporciona estos cmdlets:

Get-CsTeamsGuestCallingConfiguration
Get-CsTeamsGuestMeetingConfiguration
Get-CsTeamsGuestMessagingConfiguration

Cada uno de estos revelará un aspecto diferente de la configuración. Con PowerShell, podemos documentar y luego comparar la configuración de los cambios, tal como lo hicimos con Teams y Channels.

Configuración de llamadas de invitados

Primero, analicemos la configuración básica de llamadas de invitados:

$CurrentMonth = Get-Date -Format "MM.yyyy"
$GuestCallingCfg = (Get-CsTeamsGuestCallingConfiguration).AllowPrivateCalling
$FileHeader = "Date,AllowPrivateCalling" | 
Out-File 'GuestCallingConfiguration.csv'
$Output = "$CurrentMonth,$GuestCallingCfg" | 
Out-File 'GuestCallingConfiguration.csv' -append

Aquí sólo hay un valor importante. Podemos verificar que esto no tiene cambios a lo largo del tiempo y tendríamos que ejecutar esto mensualmente, trimestralmente o así sucesivamente:

$CurrentMonth = Get-Date -Format "MM.yyyy"
$GuestCallingCfg = (Get-CsTeamsGuestCallingConfiguration).AllowPrivateCalling
$FileHeader = "Date,AllowPrivateCalling" | 
Out-File 'GuestCallingConfiguration.csv'
$Output = "$CurrentMonth,$GuestCallingCfg" | 
Out-File 'GuestCallingConfiguration-current.csv' -append

Luego podemos comparar los dos archivos de salida así:

$Historical = Import-Csv GuestCallingConfiguration.csv
$Current = Import-Csv GuestCallingConfiguration-current.csv
$Historical.AllowPrivateCalling -eq $Current.AllowPrivateCalling

Si se produce un cambio, el resultado sería el siguiente:

Configuración de reunión de invitados

A continuación, tenemos la Configuración de reunión de invitados que contiene algunas configuraciones más para administrar. Primero, necesitamos crear una línea base o descubrimiento de lo que hemos configurado hoy:

Primer intento:

# Discover current configuration 
$GuestMeeting = Get-CsTeamsGuestMeetingConfiguration | 
Select AllowIPVideo,ScreenSharingMode,AllowMeetNow,LiveCaptionsEnabledType,AllowTranscription

# Create a Hash table output to be exported 
$Hashtable = New-Object System.Collections.Hashtable
$Hashtable['AllowIPVideo'] = $GuestMeeting.AllowIPVideo
$Hashtable['ScreenSharingMode'] = $GuestMeeting.ScreenSharingMode
$Hashtable['AllowMeetNow'] = $GuestMeeting.AllowMeetNow
$Hashtable['LiveCaptionsEnabledType'] = $GuestMeeting.LiveCaptionsEnabledType
$Hashtable['AllowTranscription'] = $GuestMeeting.AllowTranscription

# Export $Hashtable variable to a CSV for comparison 
$HashTable.GetEnumerator() |  
Select-Object -Property Key,Value |  
Export-Csv -NoTypeInformation -Path GuestMeeting.csv

Luego, con el tiempo, podemos realizar ejecuciones posteriores [mensual, trimestral, anual] que utilizarán el mismo código anterior, pero cambiarán el archivo de salida a 'GuestMeeting-Current.csv':

$HashTable.GetEnumerator() |  
Select-Object -Property Key,Value |  
Export-Csv -NoTypeInformation -Path GuestMeeting-Current.csv

Comparando las dos configuraciones:

# Compare the original and current CSV files
$CSV1 = Get-Content .\GuestMeeting.csv
$CSV2 = Get-Content .\GuestMeeting-Current.csv
Compare-Object $CSV1 $CSV2

Si se detecta una diferencia, deberíamos ver algo como esto:

Configuración de mensajería para invitados

El mismo proceso también se puede realizar con la Configuración de mensajería para invitados. Para nuestra primera ejecución, podemos usar este código:

# Discover current configuration 
$GuestMessaging = Get-CsTeamsGuestMessagingConfiguration | 
Select AllowUserEditMessage,AllowUserDeleteMessage,AllowUserDeleteChat,AllowUserChat,AllowGiphy,GiphyRatingType,AllowMemes,AllowImmersiveReader,AllowStickers

# Create a Hash table output to be exported
$Hashtable = New-Object System.Collections.Hashtable
$Hashtable['AllowUserEditMessage'] = $GuestMessaging.AllowUserEditMessage
$Hashtable['AllowUserDeleteMessage'] = $GuestMessaging.AllowUserDeleteMessage
$Hashtable['AllowUserDeleteChat'] = $GuestMessaging.AllowUserDeleteChat
$Hashtable['AllowUserChat'] = $GuestMessaging.AllowUserChat
$Hashtable['AllowGiphy'] = $GuestMessaging.AllowGiphy
$Hashtable['GiphyRatingType'] = $GuestMessaging.GiphyRatingType
$Hashtable['AllowMemes'] = $GuestMessaging.AllowMemes
$Hashtable['AllowImmersiveReader'] = $GuestMessaging.AllowImmersiveReader
$Hashtable['AllowStickers'] = $GuestMessaging.AllowStickers

# Export $Hashtable variable to a CSV for comparison 
$HashTable.GetEnumerator() |  
Select-Object -Property Key,Value |  
Export-Csv -NoTypeInformation -Path GuestMessaging.csv

Ejecuciones posteriores: [mensual, trimestral, anual]

Utilice el mismo código anterior, pero cambie el archivo de salida a 'GuestMessaging-Current.csv':

$HashTable.GetEnumerator() |  
Select-Object -Property Key,Value |  
Export-Csv -NoTypeInformation -Path GuestMessaging-Current.csv

Comparación:

# Compare the original and current CSV files 
$CSV1 = Get-Content .\GuestMessaging.csv$CSV2 = Get-Content .\GuestMessaging-Current.csv
Compare-Object $CSV1 $CSV2

Si se detecta una diferencia, deberíamos ver algo como esto:

Tenga en cuenta que en la comparación anterior, dos valores han cambiado: AllowMemes y AllowStickers, y según los indicadores (==>), la nueva configuración ahora es 'True' para ambas configuraciones, mientras que la configuración original (<==) se había establecido en 'False'.

Comentarios hasta ahora

Con cualquier proceso de auditoría, las organizaciones deben decidir qué es importante vigilar y esto se aplica a las configuraciones de Teams. Si bien podríamos cubrir todas las configuraciones en este artículo de blog, esa no es la intención y, en cambio, le proporcionamos las herramientas que necesita para crear su propio proceso de auditoría. Una cobertura completa de todas las configuraciones haría que este artículo fuera demasiado largo y sería en su mayoría un proceso repetitivo de cubrir las configuraciones, un proceso completamente innecesario.

Tareas adicionales - datos históricos

Si es necesario realizar un seguimiento de la configuración a lo largo del tiempo, también podríamos crear gráficos históricos para su revisión. La forma de hacerlo es exportar la configuración actual y registrar una fecha/marca de tiempo de cuando este conjunto de datos era verdadero. Un archivo de muestra podría verse así:

Month,AllowIPVideo,ScreenSharingMode,AllowMeetNow,LiveCaptionsEnabledType,AllowTranscription
07.2023,True,SingleApplication,True,DisabledUserOverride,False
08.2023,True,SingleApplication,False,DisabledUserOverride,False
09.2023,True,SingleApplication,False,DisabledUserOverride,False
10.2023,True,SingleApplication,True,DisabledUserOverride,False
11.2023,True,SingleApplication,True,DisabledUserOverride,False
12.2023,True,SingleApplication,False,DisabledUserOverride,False
01.2024,True,SingleApplication,True,DisabledUserOverride,False

Dependiendo del proceso interno de la organización, esto podría colocarse en un recurso compartido de TI central, SharePoint o quizás enviarse por correo electrónico a una lista de distribución para su conocimiento.

Auditoría de acciones de equipos

Una tarea común que realizan los administradores es la auditoría de tareas, que implica examinar registros y otros datos para determinar la causa raíz de un problema y solucionarlo. Además, la auditoría también se puede utilizar para consultar una actividad que realiza Microsoft Teams. Esto puede ayudar a determinar los niveles generales de actividad o posiblemente cuándo se utilizó un servicio en particular. En segundo plano, Microsoft utiliza un Registro unificado que almacena información sobre las acciones realizadas en la plataforma Teams y hay dos formas de recuperar esta información: PowerShell y la interfaz de Microsoft Defender.

¿Por qué hacer esto en PowerShell? PowerShell proporciona una flexibilidad que quizás no obtenga en la GUI. Podemos programar esto dentro de un Jumpbox que ejecuta scripts de PowerShell localmente o podemos hacerlo en un Runbook de Azure para minimizar los recursos locales. O podemos hacer esto dentro de ScriptRunner como parte de un conjunto de tareas de administración.

# First, connect to Exchange Online PowerShell (v3)
Connect-ExchangeOnline

# Retrieve Teams Events - stored in the Unified Audit Log
# Timeframe: Past 48 hours
$EndDate = Get-Date
$StartDate = $EndDate.AddDays(-2)

# All Teams events
Search-UnifiedAuditLog -StartDate $StartDate -EndDate $EndDate -RecordType MicrosoftTeams

# Teams channels added
Search-UnifiedAuditLog -StartDate $StartDate -EndDate $EndDate -RecordType MicrosoftTeams -Operations ChannelAdded

# Sensitivity Label changes
Search-UnifiedAuditLog -StartDate $StartDate -EndDate $EndDate -RecordType MicrosoftTeams -Operations SensitivityLabelChanged

# Teams deleted
Search-UnifiedAuditLog -StartDate $StartDate -EndDate $EndDate -RecordType MicrosoftTeams -Operations TeamDeleted

Como referencia (páginas de Microsoft Learn): actividades de Teams

Cuando ejecutamos estos cmdlets, deberíamos ver un resultado como este:

Tenga en cuenta que esta es solo una de muchas entradas y resulta ser un inicio registrado de una sesión de Teams.

Más allá de estas operaciones, también tenemos operaciones de Teams adicionales para las que llamamos extracción de datos:

TeamsSessionStarted
MeetingParticipantDetail
MessageReadReceiptReceived
ReactedToMessage
MeetingDetail

Conclusión

PowerShell proporciona a los administradores la capacidad de monitorear sus propios entornos cuando no existen otras herramientas. En este caso, pudimos usar PowerShell para verificar la configuración a lo largo del tiempo y verificar si hay cambios, asegurándonos de que no haya cambios en la configuración o, si los hay, poder tomar una fecha aproximada para ver cuándo se realizó el cambio. Con la codificación adecuada, todos los aspectos de configuración de Microsoft Teams se pueden monitorear a lo largo del tiempo con PowerShell, lo que permite a los administradores concentrarse en otras tareas.

Artículos relacionados