Gráfico práctico: acceso interactivo seguro al SDK de Microsoft Graph PowerShell
Asegúrese de que las personas adecuadas puedan utilizar Graph SDK
En septiembre de 2021, comencé a escribir sobre el uso del SDK de Microsoft Graph PowerShell. En ese primer artículo, noté el problema potencial causado por la forma en que la entidad de servicio creada para mantener los permisos asignados al SDK se acumuló con el tiempo. Al final, cualquiera que iniciara sesión en el SDK de forma interactiva utilizando el cmdlet Connect-MgGraph terminaría con acceso a una amplia gama de permisos. El mismo comportamiento persiste en la versión 2 del SDK. Dada la importancia de utilizar el modelo de permisos mínimos para las operaciones administrativas, la acumulación de permisos no es algo bueno.
El SDK de Microsoft Graph PowerShell no es como otros módulos de Microsoft 365 PowerShell, como los módulos de administración de Exchange Online o SharePoint Online. Estos módulos asumen el uso por parte de administradores y sus cmdlets funcionan sobre esa base. Por supuesto, si alguien sin función de administrador inicia sesión para utilizar estos módulos, los permisos le limitan a acceder a sus propios datos.
En términos de cómo los inquilinos usan Graph SDK, creo que podemos dividir el uso de la siguiente manera:
- Uso interactivo: prueba de cmdlets del SDK y desarrollo de scripts. Esto incluye el uso de código de PowerShell ISE o Visual Studio al escribir scripts. El uso interactivo se limita a delegar permisos.
- Scripts de producción: scripts de producción con cmdlets de SDK que utilizan aplicaciones registradas con certificados X.509 para la autenticación. Estos scripts pueden usar permisos de aplicaciones, por lo que tienen acceso a los datos en todo el inquilino.
- Scripts programados: runbooks programados de Azure Automation con identidades administradas para la autenticación.
Algunos argumentan que debería limitar el acceso interactivo al SDK de Microsoft Graph PowerShell. No estoy seguro de que esa postura sea razonable. Los desarrolladores necesitan acceso interactivo para probar scripts, comparar cmdlets V1.0 con cmdlets beta, etc. Es poco probable que un script que no se puede ejecutar correctamente de forma interactiva solucione automáticamente sus problemas para ejecutarse en Azure Automation. También creo que el acceso interactivo es útil para ejecutar scripts de comandos únicos según demanda.
En resumen, el acceso interactivo al SDK es un mal necesario. Esto plantea la cuestión de cuál es la mejor manera de asegurar el acceso interactivo para que sólo las personas adecuadas puedan ejecutar los cmdlets del SDK de forma interactiva. Aquí hay algunos enfoques a considerar.
Restringir el acceso a la aplicación SDK
La instalación del SDK de Microsoft Graph PowerShell en un inquilino crea una aplicación empresarial en la instancia de Entra ID (Azure Active Directory) del inquilino. La entidad de servicio de la aplicación posee los permisos asignados al SDK. La aplicación SDK siempre tiene un identificador de aplicación de 14d82eec-204b-4c2f-b7e8-296a70dab67e (Figura 1).
Para restringir el acceso al SDK a usuarios seleccionados, edite las propiedades de la aplicación y:
- Acceda a la pestaña Usuarios y grupos para agregar asignaciones de acceso para las personas que desea que puedan iniciar sesión interactivamente en la aplicación SDK. Si tiene licencias Entra ID P1, puede crear un grupo de seguridad para administrar asignaciones e incluir administradores globales y otros usuarios seleccionados en la membresía del grupo. Agregue una asignación para el nuevo grupo de seguridad.
- Mueva el control deslizante Asignación requerida de No (el valor predeterminado) a Sí. Esta acción le indica a Entra ID que solo las cuentas con asignaciones directas para la aplicación pueden usarla.
- Guarde sus cambios.
Las cuentas con asignaciones pueden continuar iniciando sesión normalmente. Entra ID bloquea cuentas sin asignaciones y muestra un error (Figura 2).
El uso de asignaciones directas para controlar el acceso a la aplicación Microsoft Graph PowerShell SDK es el método más sencillo y rápido para restringir el acceso a cuentas seleccionadas. Todos los inquilinos deberían considerar implementar este control.
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.
Comprobando inicios de sesión
Para validar que solo la lista aprobada de cuentas esté utilizando el SDK de forma interactiva, puede consultar el registro de inicio de sesión de Entra ID para buscar eventos asociados con el SDK. A continuación se explica cómo verificar eventos de inicio de sesión utilizando el cmdlet Get-MgBetaAuditLogSignIn y un filtro para extraer inicios de sesión de usuarios interactivos para el identificador de aplicación del SDK:
[array]$SDKRecords = Get-MgBetaAuditLogSignIn -Filter "(signInEventTypes/any(t:t eq 'interactiveuser')) and AppId eq '14d82eec-204b-4c2f-b7e8-296a70dab67e'" -Top 2000 -Sort "createdDateTime DESC"
$SDKRecords | format-Table UserDisplayName, CreatedDateTime, IpAddress
UserDisplayName CreatedDateTime IPAddress
--------------- --------------- ---------
Tony Redmond 27/07/2023 15:20:55 78.19.137.37
Hans Flick 27/07/2023 15:20:13 45.11.131.38
Hans Flick 27/07/2023 15:19:28 45.11.131.38
James Ryan 27/07/2023 15:18:38 13.22.127.27
Utilice una aplicación registrada en lugar de la aplicación empresarial de Microsoft
No hay ninguna razón por la que se deba acceder al SDK de Graph a través de la aplicación empresarial predeterminada de Microsoft. Puede crear una aplicación registrada específica del inquilino y usar esa aplicación en su lugar. Una aplicación empresarial es aquella que está bajo el control de un editor como Microsoft y puede existir en varios inquilinos. La entidad de servicio para la aplicación empresarial es su creación de instancias dentro del inquilino. Una aplicación registrada está bajo el control del inquilino.
La idea aquí es que una organización pueda:
- Cree un conjunto de aplicaciones registradas para que las utilicen diferentes conjuntos de cuentas. Por ejemplo, cree una aplicación para que la utilicen los miembros de la mesa de ayuda.
- Asigne solo los permisos que necesita el conjunto objetivo de usuarios a su aplicación. Por ejemplo, a la aplicación de soporte técnico se le puede asignar el permiso Directory.Read.All para permitir que esos usuarios lean todos los detalles de los objetos del directorio. Si el servicio de asistencia se ocupa de los dispositivos, los administradores de inquilinos pueden dar su consentimiento al permiso Devices.ReadWrite.All, etc.
Básicamente, la creación de aplicaciones registradas para el acceso interactivo al SDK de Graph permite a las organizaciones administrar los permisos a un nivel más granular.
Para crear una aplicación registrada para usar con el SDK:
- Abra el centro de administración de Entra ID y abra la pestaña Aplicaciones. Cree una nueva aplicación, asígnele un nombre adecuado y guárdela (regístrela).
- Accede a la aplicación y abre la pestaña Autenticación. Seleccione Agregar una plataforma y elija Aplicaciones móviles y de escritorio. Agregue el URI de redireccionamiento https://login.microsoftonline.com/common/oauth2/nativeclient de la lista sugerida.
- Seleccione Agregar URI e ingrese http://localhost. Originalmente omití este URI, pero luego encontré problemas con una discrepancia de URI al intentar iniciar sesión con el cmdlet Connect-MgGraph. El mensaje de error me indicó que agregara el URI para localhost y el problema desapareció.
- Guarde los cambios.
La Figura 3 muestra los URI de redireccionamiento agregados a una aplicación registrada para usar con el SDK de Microsoft Graph PowerShell.
Con la aplicación implementada, las cuentas designadas pueden usarla para iniciar sesión en Graph SDK. Para indicarle al SDK que no use la aplicación empresarial predeterminada, incluya el identificador del inquilino y el identificador de la aplicación en la conexión. Por ejemplo:
Connect-MgGraph -TenantId a662313f-14fc-43a2-9a7a-d2e27f4f3478 -AppId a69635f3-3ac8-4949-a82b-f31b396de57bLos usuarios que están bloqueados en la aplicación empresarial predeterminada pueden iniciar sesión utilizando la aplicación registrada. Cuando lo hagan, encontrarán que la aplicación tiene un conjunto básico de permisos (ámbitos), como lo revela el cmdlet Get-MgContext:
Get-MgContext
ClientId : a69635f3-3ac8-4949-a82b-f31b396de57b
TenantId : a662313f-14fc-43a2-9a7a-d2e27f4f3478
Scopes : {openid, profile, User.Read, email}
AuthType : Delegated
TokenCredentialType : InteractiveBrowser
CertificateThumbprint :
CertificateSubjectName :
Account : Tony.Redmond@office365itpros.com
AppName : Microsoft Graph SDK Tenant Access
ContextScope : CurrentUser
Certificate :
PSHostVersion : 5.1.22621.1778
ManagedIdentityId :
ClientSecret :
Get-MgUser -all
Get-MgUser : Insufficient privileges to complete the operation.
Status: 403 (Forbidden)
Para permitir que los usuarios designados realicen un trabajo real con el SDK, un administrador de inquilinos debe actualizar la aplicación para agregar y otorgar consentimiento para los permisos Graph necesarios. Es aconsejable estar atento a los permisos que se acumulan para la aplicación. Al igual que la aplicación empresarial predeterminada, los permisos tienden a acumularse sin eliminarse nunca.
Registros de inicio de sesión para la aplicación registrada utilizando el cmdlet Get-MgBetaAuditLogSignIn de manera similar a la descrita anteriormente.
Acceso seguro al SDK de Microsoft Graph PowerShell
Me pregunto cuántos inquilinos nunca han pensado en acceder al Graph SDK. En inquilinos pequeños, donde solo hay un par de administradores, no hay nada de malo en persistir con la aplicación empresarial predeterminada si se toma el tiempo para restringir el acceso a la aplicación. En inquilinos más grandes, considere cuántos tipos diferentes de personas ejecutan cmdlets SDK y las tareas que realizan, y luego determine si algunas aplicaciones registradas con conjuntos de permisos personalizados son una mejor respuesta.


