Pide tu presupuesto ya!
Las herramientas de inteligencia artificial aparecen de la misma manera que cualquier otra herramienta de TI en la sombra: un empleado útil prueba una aplicación, otro otorga su consentimiento para un complemento del navegador y, de repente, la seguridad está persiguiendo una docena de servicios de “simplemente probándolo”.
¿La buena noticia? Si su organización utiliza Microsoft Entra ID, Microsoft Graph y Microsoft Defender para aplicaciones en la nube, ya tiene pruebas útiles. Puede auditar aplicaciones empresariales, concesiones de consentimiento delegado, permisos de aplicaciones e inicios de sesión recientes con PowerShell antes de decidir qué aprobar, restringir o bloquear.
En este tutorial, creará una auditoría de PowerShell repetible que encuentre aplicaciones relacionadas con la IA en Microsoft Entra ID, califique las que son riesgosas y produzca un informe de gobierno sobre el cual su equipo de seguridad o de TI puede actuar.
Este tutorial es una demostración práctica. Para seguirlo, necesitará:
PowerShell 7 o Windows PowerShell 5.1.
El SDK de Microsoft Graph PowerShell instalado.
Una cuenta de Microsoft Entra con permisos para leer aplicaciones y registros de auditoría.
Consentimiento de Microsoft Graph para los ámbitos utilizados en este tutorial.
Opcional: Microsoft Defender para aplicaciones en la nube si desea detectar secuencias de comandos de bloqueo y descubrimiento de la nube a nivel de red.
Los ejemplos de este tutorial son de solo lectura. Exportan informes CSV y no eliminan aplicaciones, revocan el consentimiento ni publican reglas de firewall.
Comience con el modelo mental correcto. Microsoft Graph puede mostrarle herramientas de inteligencia artificial que interactúan con Microsoft Entra ID: aplicaciones empresariales, concesiones de consentimiento de OAuth, permisos de aplicaciones y actividad de inicio de sesión. El Lista de principios básicos del servicio API de Microsoft Graph devuelve objetos principales de servicio del inquilino mediante el uso GET /servicePrincipals.
Graph también puede enumerar los permisos delegados a través de GET /oauth2PermissionGrantsy permisos de aplicación otorgados a una entidad de servicio a través de GET /servicePrincipals/{id}/appRoleAssignments.
Pero Graph no ve mágicamente cada visita a cada sitio web de IA. Si alguien usa una cuenta personal en un sitio de IA y nunca se autentica a través de su inquilino, necesita telemetría de red, punto final o CASB. documentos de Microsoft que Defender para aplicaciones en la nube Descubrimiento de la nube proporciona un panel para el uso de aplicaciones en la nube, niveles de riesgo de aplicaciones, usuarios principales, IP de origen y aplicaciones descubiertas.
Piense en esto como dos carriles:
Carril de identidad: ¿Qué aplicaciones tienen objetos de identidad, consentimiento, permisos o inicios de sesión en Entra ID?
Carril de red: ¿A qué destinos de IA acceden los usuarios, incluso cuando Entra ID no está involucrado?
Primero construirás el carril de identidad.
Abra PowerShell como una cuenta que pueda instalar módulos e instale el SDK si es necesario.
Install-Module Microsoft.Graph -Scope CurrentUser
A continuación, conéctese a Microsoft Graph con los permisos de lectura mínimos necesarios para esta auditoría.
$Scopes = @(
'Application.Read.All',
'Directory.Read.All',
'AuditLog.Read.All'
)
Connect-MgGraph -Scopes $Scopes
Las listas de documentación de Graph Application.Read.All como un permiso con privilegios mínimos para enumerar entidades de servicio. enumera Directory.Read.All como un permiso con privilegios mínimos para enumerar concesiones de permisos delegados, y AuditLog.Read.All para enumerar los inicios de sesión. Es posible que necesite una función de Entra, como Lector global, Lectores de directorio, Lector de informes, Lector de seguridad u otra función compatible, según la API a la que llame y cómo esté configurado su inquilino.
Ejecute esta verificación rápida para confirmar el contexto de la conexión.
Get-MgContext | Select-Object Account, TenantId, Scopes
Si faltan los ámbitos, desconéctese y vuelva a conectarse con la lista de ámbitos anterior.
Ninguna API de Microsoft clasifica todas las entidades principales de servicio como “IA”. Necesitas una lista de seguimiento inicial. Mantenga la lista visible y editable para que su proceso de gobernanza pueda mejorar con el tiempo.
Cree una carpeta para el informe y defina palabras clave relacionadas con la IA.
$ReportPath = Join-Path $HOME 'AI-App-Audit'
New-Item -Path $ReportPath -ItemType Directory -Force | Out-Null
$AiKeywords = @(
'openai',
'chatgpt',
'copilot',
'claude',
'anthropic',
'gemini',
'bard',
'perplexity',
'midjourney',
'stability',
'jasper',
'notion ai',
'grammarly',
'otter',
'fireflies',
'descript',
'synthesia'
)
Esta lista incluye intencionalmente nombres amplios de productos y proveedores. Espere algunos falsos positivos. Un informe de gobernanza es mejor cuando un revisor puede aprobar o rechazar los hallazgos en lugar de confiar en una regla de coincidencia oculta.
Ahora consulte las entidades de servicio y fíltrelas localmente según la lista de palabras clave. Este enfoque evita adivinar filtros API no compatibles y funciona bien para un informe programado.
$ServicePrincipals = Get-MgServicePrincipal -All -Property @(
'id',
'appId',
'displayName',
'appOwnerOrganizationId',
'accountEnabled',
'createdDateTime',
'publisherName',
'servicePrincipalType',
'tags'
)
$AiServicePrincipals = foreach ($Sp in $ServicePrincipals) {
$SearchText = @(
$Sp.DisplayName
$Sp.PublisherName
$Sp.AppId
($Sp.Tags -join ' ')
) -join ' '
$Matches = $AiKeywords | Where-Object {
$SearchText -match [regex]::Escape($_)
}
if ($Matches) {
[pscustomobject]@{
DisplayName = $Sp.DisplayName
PublisherName = $Sp.PublisherName
AppId = $Sp.AppId
ObjectId = $Sp.Id
AccountEnabled = $Sp.AccountEnabled
CreatedDateTime = $Sp.CreatedDateTime
ServicePrincipalType = $Sp.ServicePrincipalType
MatchedKeywords = ($Matches -join ', ')
}
}
}
$AiServicePrincipals |
Sort-Object DisplayName |
Export-Csv -Path (Join-Path $ReportPath 'ai-service-principals.csv') -NoTypeInformation
$AiServicePrincipals | Format-Table DisplayName, PublisherName, AccountEnabled, MatchedKeywords -AutoSize
En este punto, tiene el primer informe práctico: aplicaciones con sabor a IA registradas o agregadas a su inquilino. Esta lista captura aplicaciones empresariales que se agregaron mediante SSO, consentimiento de OAuth o configuración de administrador.
La presencia de aplicaciones es sólo una parte de la historia. Una aplicación sin consentimiento ni inicios de sesión es menos urgente que una aplicación que puede leer datos del usuario.
Microsoft Graph expone las concesiones de permisos delegados como oAuth2PermissionGrant objetos. La documentación describe estas concesiones como permisos delegados otorgados para que las aplicaciones cliente accedan a las API en nombre de los usuarios que han iniciado sesión.
Ejecute el siguiente script para asignar subvenciones delegadas a las entidades principales de servicio de IA que encontró.
$OAuthGrants = Get-MgOauth2PermissionGrant -All -Property @(
'id',
'clientId',
'consentType',
'principalId',
'resourceId',
'scope'
)
$AiGrantReport = foreach ($App in $AiServicePrincipals) {
$AppGrants = $OAuthGrants | Where-Object { $_.ClientId -eq $App.ObjectId }
foreach ($Grant in $AppGrants) {
[pscustomobject]@{
DisplayName = $App.DisplayName
AppId = $App.AppId
ObjectId = $App.ObjectId
ConsentType = $Grant.ConsentType
PrincipalId = $Grant.PrincipalId
ResourceId = $Grant.ResourceId
Scope = $Grant.Scope
}
}
}
$AiGrantReport |
Export-Csv -Path (Join-Path $ReportPath 'ai-delegated-consent.csv') -NoTypeInformation
$AiGrantReport |
Sort-Object DisplayName, ConsentType |
Format-Table DisplayName, ConsentType, Scope -Wrap
Preste especial atención a ConsentType. AllPrincipals significa que el consentimiento se aplica a todo el inquilino. Principal significa que el consentimiento se aplica a un usuario. Ambos pueden importar, pero el consentimiento de todo el inquilino merece una revisión más rápida.
Los permisos delegados se ejecutan como un usuario que ha iniciado sesión. Los permisos de la aplicación se ejecutan como la propia aplicación y pueden ser más sensibles en entornos con mucha automatización.
Graph enumera las asignaciones de roles de aplicación otorgadas a una entidad de servicio a través del punto final de asignación de roles de aplicación. Los documentos también señalan que los roles de aplicación asignados a las entidades de servicio se conocen como permisos de aplicación.
Usar Invoke-MgGraphRequest para que pueda llamar directamente al punto final documentado.
$AiAppRoleReport = foreach ($App in $AiServicePrincipals) {
$Uri = "/servicePrincipals/$($App.ObjectId)/appRoleAssignments"
try {
$Assignments = Invoke-MgGraphRequest -Method GET -Uri $Uri
}
catch {
Write-Warning "Could not read app role assignments for $($App.DisplayName): $($_.Exception.Message)"
continue
}
foreach ($Assignment in $Assignments.value) {
[pscustomobject]@{
DisplayName = $App.DisplayName
AppId = $App.AppId
ObjectId = $App.ObjectId
ResourceId = $Assignment.resourceId
ResourceName = $Assignment.resourceDisplayName
AppRoleId = $Assignment.appRoleId
CreatedDate = $Assignment.createdDateTime
}
}
}
$AiAppRoleReport |
Export-Csv -Path (Join-Path $ReportPath 'ai-application-permissions.csv') -NoTypeInformation
$AiAppRoleReport | Format-Table DisplayName, ResourceName, AppRoleId -AutoSize
El AppRoleId El valor no es amigable por sí solo. Para obtener un informe más profundo, resuelva la entidad de servicio de recursos y el mapa. AppRoleId a su appRoles recopilación. Pero incluso este informe es útil porque muestra qué aplicaciones relacionadas con la IA tienen asignaciones de permisos de aplicación.
Una aplicación empresarial que existe pero que no tiene actividad reciente podría ser candidata a limpieza. Una aplicación no autorizada con nuevos inicios de sesión necesita una conversación sobre gobernanza.
El API de inicio de sesión de lista usos GET /auditLogs/signIns. Microsoft recomienda utilizar un $filter rango de tiempo para evitar tiempos de espera de solicitud.
Busque en los últimos 14 días de inicios de sesión los nombres para mostrar de su aplicación de IA.
$StartTime = (Get-Date).ToUniversalTime().AddDays(-14).ToString('yyyy-MM-ddTHH:mm:ssZ')
$EndTime = (Get-Date).ToUniversalTime().ToString('yyyy-MM-ddTHH:mm:ssZ')
$Filter = "createdDateTime ge $StartTime and createdDateTime le $EndTime"
$RecentSignIns = Get-MgAuditLogSignIn -All -Filter $Filter -Property @(
'createdDateTime',
'userDisplayName',
'userPrincipalName',
'appDisplayName',
'appId',
'ipAddress',
'clientAppUsed',
'conditionalAccessStatus',
'status'
)
$AiSignIns = foreach ($SignIn in $RecentSignIns) {
$Matches = $AiKeywords | Where-Object {
$SignIn.AppDisplayName -match [regex]::Escape($_)
}
if ($Matches) {
[pscustomobject]@{
CreatedDateTime = $SignIn.CreatedDateTime
UserPrincipalName = $SignIn.UserPrincipalName
UserDisplayName = $SignIn.UserDisplayName
AppDisplayName = $SignIn.AppDisplayName
AppId = $SignIn.AppId
IpAddress = $SignIn.IpAddress
ClientAppUsed = $SignIn.ClientAppUsed
ConditionalAccessStatus = $SignIn.ConditionalAccessStatus
ErrorCode = $SignIn.Status.ErrorCode
FailureReason = $SignIn.Status.FailureReason
MatchedKeywords = ($Matches -join ', ')
}
}
}
$AiSignIns |
Export-Csv -Path (Join-Path $ReportPath 'ai-signins-last-14-days.csv') -NoTypeInformation
$AiSignIns |
Group-Object AppDisplayName |
Sort-Object Count -Descending |
Select-Object Count, Name
Este resultado le ayuda a separar los registros inactivos del uso activo. Si una aplicación está activa y no autorizada, no empiece por eliminarla. Primero identifique al propietario de la empresa, la población de usuarios, los permisos y la exposición de los datos.
Los equipos de seguridad necesitan priorización, no tres archivos CSV desconectados. El siguiente script crea una puntuación simple basada en el consentimiento de todo el inquilino, los permisos de la aplicación, los inicios de sesión recientes y si la aplicación está habilitada.
$GovernanceReport = foreach ($App in $AiServicePrincipals) {
$Delegated = @($AiGrantReport | Where-Object { $_.ObjectId -eq $App.ObjectId })
$AppRoles = @($AiAppRoleReport | Where-Object { $_.ObjectId -eq $App.ObjectId })
$SignIns = @($AiSignIns | Where-Object { $_.AppId -eq $App.AppId -or $_.AppDisplayName -eq $App.DisplayName })
$Score = 0
$Reasons = New-Object System.Collections.Generic.List[string]
if ($App.AccountEnabled) {
$Score += 1
$Reasons.Add('Enterprise app is enabled')
}
if ($Delegated | Where-Object { $_.ConsentType -eq 'AllPrincipals' }) {
$Score += 3
$Reasons.Add('Tenant-wide delegated consent exists')
}
if ($AppRoles.Count -gt 0) {
$Score += 3
$Reasons.Add('Application permissions exist')
}
if ($SignIns.Count -gt 0) {
$Score += 2
$Reasons.Add("Recent sign-ins found: $($SignIns.Count)")
}
$Recommendation = switch ($Score) {
{ $_ -ge 6 } { 'Review immediately' ; break }
{ $_ -ge 3 } { 'Review in next governance cycle' ; break }
default { 'Inventory and monitor' }
}
[pscustomobject]@{
DisplayName = $App.DisplayName
PublisherName = $App.PublisherName
AppId = $App.AppId
AccountEnabled = $App.AccountEnabled
DelegatedGrants = $Delegated.Count
AppPermissions = $AppRoles.Count
RecentSignIns = $SignIns.Count
Score = $Score
Recommendation = $Recommendation
Reasons = ($Reasons -join '; ')
MatchedKeywords = $App.MatchedKeywords
}
}
$GovernanceReport |
Sort-Object Score -Descending, DisplayName |
Export-Csv -Path (Join-Path $ReportPath 'ai-governance-summary.csv') -NoTypeInformation
$GovernanceReport |
Sort-Object Score -Descending, DisplayName |
Format-Table DisplayName, Score, Recommendation, RecentSignIns, DelegatedGrants, AppPermissions -AutoSize
Ahora dispone de un único resumen de gobernanza que un administrador de TI, un ingeniero de seguridad o un revisor de cumplimiento puede leer sin necesidad de abrir cada exportación sin procesar.
Los datos de identidad son necesarios, pero no suficientes. Si sus usuarios visitan servicios de IA sin autenticación de Entra, utilice Defender para Cloud Apps Cloud Discovery.
Microsoft dice que las API de Cloud Discovery pueden automatizar la carga de registros, enumerar e interactuar con aplicaciones descubiertas y generar secuencias de comandos de bloqueo para el firewall o la aplicación de Secure Web Gateway. El flujo de carga utiliza tres llamadas API consecutivas: iniciar la carga de archivos, realizar la carga de archivos y finalizar la carga de archivos. Microsoft también documenta un Generar script de bloque punto final en GET /api/discovery_block_scripts/.
Utilice este patrón de PowerShell para llamar a la API de secuencia de comandos de bloque documentada. Reemplace los valores del token y del host del inquilino con los detalles de Defender for Cloud Apps.
$PortalHost="contoso.us.portal.cloudappsecurity.com"
$ApiToken = Read-Host 'Enter Defender for Cloud Apps API token' -AsSecureString
$TokenText = [Runtime.InteropServices.Marshal]::PtrToStringAuto(
[Runtime.InteropServices.Marshal]::SecureStringToBSTR($ApiToken)
)
$Headers = @{
Authorization = "Token $TokenText"
}
$Uri = "https://$PortalHost/api/discovery_block_scripts/?format=102&type=banned"
Invoke-RestMethod -Method GET -Uri $Uri -Headers $Headers -OutFile (Join-Path $ReportPath 'defender-cloud-apps-block-script.txt')
No importe a ciegas el script de bloque generado. Trátelo como un artefacto de cambio. Revise las aplicaciones marcadas como no autorizadas, pruebe en un grupo piloto y coordine con el equipo de la red antes de aplicarlas.
Un informe sólo es útil si cambia el comportamiento. Utilice los archivos CSV que generó para impulsar un flujo de trabajo de revisión liviano:
Aprobar herramientas conocidas. Agregue aplicaciones de IA aprobadas a un catálogo autorizado con propietario, clasificación de datos y casos de uso permitidos.
Cuestionar el consentimiento arriesgado. Revise el consentimiento delegado de todo el inquilino y los permisos de aplicación antes de centrarse en inicios de sesión de bajo riesgo.
Limite quién puede aprobar. Soportes de Microsoft Entra flujo de trabajo de consentimiento del administradorque permite a los usuarios solicitar una revisión del administrador cuando no pueden dar su consentimiento directamente.
Excepciones de documentos. Si un equipo necesita una herramienta de inteligencia artificial no estándar, solicite un propietario de negocio y una fecha de renovación.
Repita la auditoría. Programe el informe de PowerShell semanalmente y compare los nuevos hallazgos con su catálogo aprobado.
Si necesita otorgar el consentimiento de todo el inquilino después de la revisión, utilice el formulario documentado. Proceso de consentimiento del administrador de Microsoft Entra. Evite otorgar un consentimiento amplio directamente desde un mensaje del proveedor durante una llamada de soporte apresurada.
La proliferación de herramientas de IA no es un problema de un solo producto. Es un problema de visibilidad y gobernanza. PowerShell le ofrece una manera práctica de comenzar con evidencia: aplicaciones empresariales, consentimiento delegado, permisos de aplicaciones y actividad de inicio de sesión desde Microsoft Graph.
También aprendiste dónde termina Graph. Para uso solo del navegador o de cuenta personal, incorpora Defender for Cloud Apps Cloud Discovery y la telemetría de tu red. Combine ambos carriles y podrá reemplazar las conjeturas con un proceso repetible: descubrir, calificar, revisar, aprobar, restringir y monitorear.
Ejecute la auditoría según una programación, ajuste la lista de palabras clave y mantenga el resultado vinculado a decisiones reales. Así es como se controla la proliferación de herramientas de IA sin convertir cada nuevo experimento de productividad en un simulacro de incendio en materia de seguridad.
Leave a comment