Recherche de site Web

Créer une liste d'autorisations d'accès externe pour les équipes à partir des discussions d'utilisateurs


L’accès externe des équipes sécurisées signifie limiter les communications aux domaines connus

En septembre 2022, un chercheur en sécurité a démontré comment un participant externe à une discussion Teams pouvait envoyer un GIF modifié contenant un malware qui infectait le PC du destinataire. Par défaut, Teams permet aux utilisateurs de discuter avec n'importe qui de n'importe quel autre locataire Microsoft 365. La solution à quelque chose comme l’exploit GIFShell consiste à restreindre l’accès externe de Teams à une liste autorisée (liste blanche) de locataires connus.

Le problème devient alors de savoir comment remplir la liste verte. À l’époque, j’avais suggéré aux organisations de commencer par dresser une liste des domaines d’où provenaient les comptes invités. Il n’est pas difficile d’utiliser PowerShell pour rechercher tous les comptes invités, extraire leurs domaines et utiliser ces informations pour créer une liste verte suffisamment grande pour accueillir environ 4 000 domaines.

Travail terminé, du moins c'est ce que je pensais. Cependant, d’autres estiment que l’utilisation de domaines invités comme base d’une liste verte n’est pas suffisante. Il n'y a aucune garantie que l'ensemble des domaines dérivés des comptes invités couvrira tous les domaines possibles d'où pourrait provenir un participant externe au chat. Un arrangement est donc nécessaire pour permettre aux personnes de demander l'ajout d'un domaine à la liste verte. Cela réduit la nature spontanée de la collaboration basée sur le chat entre les organisations, mais cela pourrait être le prix à payer pour des communications sécurisées.

Puis quelqu’un a décidé qu’il serait peut-être possible d’examiner toutes les discussions externes d’une organisation pour découvrir l’ensemble des domaines auxquels appartiennent les participants externes aux discussions. Cela semble bien, mais comment pouvez-vous trouver et traiter les informations des discussions des utilisateurs ? C’est ce que j’explique dans cet article.

L'accès aux participants au chat est la clé de l'accès externe des équipes

Dans un autre article, j'explique les bases de l'utilisation du SDK Microsoft Graph PowerShell pour rechercher et traiter les discussions et les messages de discussion Teams. Le script PowerShell décrit dans cet article permet aux administrateurs de supprimer les messages des discussions de groupe qui pourraient être répréhensibles ou contenir des informations sensibles. Le script nécessaire ici doit également trouver des discussions, mais des discussions en tête-à-tête plutôt que des discussions de groupe. Après avoir trouvé une liste de comptes d'utilisateurs avec la cmdlet Get-MgUser, nous pouvons utiliser un filtre différent avec la cmdlet Get-MgBetaUserChat pour rechercher les discussions en tête-à-tête pour chaque utilisateur.

Chaque discussion comporte une liste de participants qui peuvent être récupérés à l'aide de l'applet de commande Get-MgChatMember. L'un des participants est un compte locataire, l'autre peut être un participant externe. Pour créer une liste de domaines externes, le script doit examiner les participants à chaque conversation et trouver ceux impliquant des participants externes. Avec ces données, le script peut créer une liste de domaines. Du moins, c'est la théorie.

Définir la solution

Les grandes lignes de la solution sont claires. Cependant, les détails font la différence et il y a quelques détails importants à considérer ici.

Tout d’abord, le script doit utiliser les autorisations de l’application pour accéder aux discussions des utilisateurs. Ce n'était pas un problème pour le script précédent car j'ai utilisé un runbook Azure Automation avec une identité managée pour l'authentification. Les autorisations Graph nécessaires sont attribuées au compte Azure Automation.

Dans ce scénario, je souhaite utiliser l'applet de commande Get-CsTenantFederationConfiguration du module Microsoft Teams pour récupérer des détails sur la configuration de l'accès externe du locataire. Les applets de commande de gestion des stratégies dont Teams a hérité de Skype Entreprise Online ne prennent pas en charge les identités managées (les autres applets de commande Teams le font car elles sont basées sur Graph). Je pourrais contourner le problème tout en utilisant Azure Automation en tirant parti d'Azure Key Vault pour stocker les informations d'identification du compte et en utilisant ces informations d'identification pour me connecter à Teams. En fin de compte, j'ai décidé d'adopter une approche différente et d'utiliser l'authentification basée sur les certificats, car toutes les applets de commande prennent en charge cette approche.

Étant donné que le script utilise une authentification basée sur un certificat, il a besoin d'une application Entra ID enregistrée pour stocker le certificat et détenir les autorisations Graph nécessaires pour accéder aux données nécessaires au script :

  • CrossTenantInformation.ReadBasic.All : lit l'identifiant du locataire et renvoie le nom d'affichage du locataire.
  • User.Read.All : lit les informations du compte utilisateur.
  • Chat.Read.All : lit les discussions des utilisateurs.
  • Directory.Read.All : lit les informations sur les locataires de la maison à partir du répertoire.
  • Mail.Send : envoyez un e-mail avec les résultats.

De plus, étant donné que le script exécute une applet de commande de gestion des stratégies Teams, l’application doit détenir le rôle d’administrateur Teams. Ce n'est pas difficile car l'attribution des rôles se fait facilement à l'aide du centre d'administration Entra ID, mais c'est un exemple du type de détail requis pour que tout fonctionne.

Les étapes décrites dans cet article décrivent comment créer un certificat auto-signé (assez pour le test) et le télécharger sur une application enregistrée (Figure 1).

L'article décrit également comment utiliser PowerShell pour attribuer un rôle administratif Entra ID à une application à l'aide d'un code comme celui-ci :

$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

Avec l’application dotée des autorisations et du rôle nécessaires et d’un certificat en place, nous pouvons écrire du code.

Scripter la solution

Les étapes du script sont :

  • Connectez-vous au point de terminaison Microsoft Graph à l’aide de l’authentification basée sur un certificat. Vous avez besoin de l'identifiant client de l'application enregistrée, de l'identifiant du locataire et de l'empreinte numérique du certificat pour vous connecter.
  • Connectez-vous au point de terminaison Teams à l’aide de l’authentification basée sur un certificat. Get-CsTenantFederationConfiguration est la seule applet de commande utilisée à partir du module Teams. Toutes les autres applets de commande proviennent du SDK Microsoft Graph PowerShell.
  • Recherchez l'ensemble des domaines enregistrés pour le locataire. Ces informations sont utilisées pour déterminer si une conversation en tête-à-tête a lieu avec une personne interne ou externe au locataire.
  • Récupérez l’ensemble des comptes d’utilisateurs sous licence dans le locataire. Cela peut inclure des boîtes aux lettres partagées avec des licences, mais c'est le moyen le plus simple et le plus rapide de trouver l'ensemble des comptes qui utilisent Teams.
  • Pour chaque utilisateur, retrouvez l'ensemble de ses discussions en tête-à-tête. Un petit délai est imposé entre chaque utilisateur pour éviter la limitation de Microsoft 365.
  • Pour chaque chat, récupérez la liste des participants et supprimez l'utilisateur en cours de traitement de la liste. Comme il s’agit de discussions en tête-à-tête, un seul autre participant doit rester.
  • Recherchez le nom de domaine de l'autre participant pour déterminer si le chat est interne ou externe.
  • S'il est externe, résolvez le domaine du locataire à l'aide de l'identifiant du locataire.
  • Si le chat est hébergé par le locataire du domicile, récupérez le nombre de messages dans le chat. Vous ne pouvez pas récupérer ces informations pour les discussions hébergées par des locataires externes.
  • Enregistrez ce qui a été trouvé et revenez pour traiter la prochaine conversation.
  • Après avoir traité les discussions pour tous les utilisateurs, vérifiez la configuration de l'accès externe de Teams et comparez les domaines de sa liste verte avec les domaines utilisés pour les discussions externes. Signalez tous les domaines utilisés pour les discussions externes qui ne figurent pas dans la liste verte.
  • Envoyez les résultats par courrier électronique à un destinataire prédéterminé. Les résultats sont des détails sur les discussions externes et des informations sur les domaines externes.
  • Déclarez le succès.

La figure 2 montre un exemple d'e-mail envoyé par le script. L'ensemble des propriétés de chaque enregistrement est défini dans le script et n'inclut pas toutes celles capturées dans le rapport. Aucun filtrage des données n'est effectué. Par exemple, vous pourriez décider de vous concentrer sur les discussions avec des participants externes initiées au cours des deux dernières années et d'ignorer les discussions antérieures.

Exécuter le script

Vous pouvez télécharger le script depuis GitHub. N'oubliez pas que ce script fonctionne, mais il est uniquement destiné à démontrer les principes d'utilisation du SDK Graph pour récupérer et traiter des informations sur les discussions Teams et leurs participants. Il n’est pas conçu pour être une solution standard et je ne l’ai pas exécuté à grande échelle. Étant donné la nécessité de récupérer toutes les discussions individuelles pour chaque utilisateur traité, le script n'est pas ultra-rapide. Vous souhaiterez peut-être d’abord l’exécuter pour un ensemble limité d’utilisateurs. Si tel est le cas, appliquez un filtre à l’ensemble d’utilisateurs récupérés à partir d’Entra ID. Par exemple, pour limiter l'ensemble aux utilisateurs d'un service spécifique, vous pouvez modifier l'appel Get-MgUser comme suit :

[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

Avant d'essayer d'exécuter le script, assurez-vous que toutes les conditions préalables sont remplies et que vous utilisez une application enregistrée dotée du rôle d'administrateur Teams et des autorisations Graph nécessaires.

Prendre des décisions basées sur des données

Cet exercice est un bon exemple de l’utilité du SDK Microsoft Graph PowerShell lorsqu’il est nécessaire d’extraire des informations de Microsoft 365. Sans accès aux discussions des utilisateurs, il est impossible de savoir avec qui les gens en dehors du locataire conversent. Le SDK Graph expose leurs secrets et aide les administrateurs à prendre de meilleures décisions basées sur les données plutôt que sur l'intuition, et c'est toujours une bonne chose.

Planification et consolidation de la migration de la plateforme Microsoft

Simplifiez la planification de la migration, surmontez les défis de migration et terminez les projets plus rapidement tout en minimisant les coûts, les risques et les interruptions pour les utilisateurs.

Articles connexes