Uso de la autenticación basada en certificados con el SDK de Microsoft Graph PowerShell
Alejarse de las sesiones interactivas
En artículos como actualización de licencias para cuentas de Azure AD que usan el SDK de Microsoft Graph PowerShell para acceder a datos de Microsoft 365, utilizamos comandos emitidos en sesiones interactivas. Como señalo en este artículo, este enfoque es excelente para explorar cómo funcionan los cmdlets de Graph SDK, y al mismo tiempo tiene algunos puntos importantes que los programadores y administradores deben comprender. El problema más grave es la acumulación de permisos, donde los consentimientos recopilados a lo largo del tiempo significan que la entidad principal de servicio utilizada para el SDK puede tener un exceso de permisos. La solución es utilizar aplicaciones independientes registradas en Azure AD con el consentimiento de los permisos suficientes para realizar un trabajo; Esto crea un desafío de gestión pero es mucho más seguro.
Si sigue el camino del uso de aplicaciones registradas, puede usar la autenticación solo de aplicaciones en lugar del acceso delegado. La autenticación solo de aplicación significa que la aplicación utiliza un certificado X.509 como credencial. El certificado puede estar autofirmado (con fines de prueba) o emitido por una autoridad certificadora. La documentación de Microsoft para usar la autenticación de solo aplicaciones para el SDK de Microsoft Graph PowerShell contiene los pasos para configurar una aplicación registrada en Azure AD para la autenticación de solo aplicaciones. Este artículo cubre mi experiencia al utilizar los pasos.
Obtener un certificado
Probablemente no tenga un certificado X.509 esperando a ser utilizado, pero son fáciles de crear con PowerShell. Este ejemplo de código ejecuta el cmdlet New-SelfSignedCertificate para crear un nuevo certificado almacenado en el almacén de certificados local del usuario actual en la estación de trabajo donde se ejecuta el comando:
$Cert = New-SelfSignedCertificate -DnsName office365itpros.onmicrosoft,com -CertStoreLocation "Cert:\CurrentUser\My" -FriendlyName "MicrosoftGraphSDK" -Subject "Test Cert for Microsoft Graph SDK"
Get-ChildItem "Cert:\CurrentUser\My\$($Cert.thumbprint)"
PSParentPath: Microsoft.PowerShell.Security\Certificate::CurrentUser\My
Thumbprint Subject
---------- -------
FC92991B21219F178AFB37C12DF231B6AFC3D790 CN=office365itpros.onmicrosoft
Si desea crear el certificado en el almacén de certificados para la máquina local, especifique Cert:\LocalMachine\My como ubicación del almacén. Solo puede crear nuevos certificados en el almacén de la máquina local si ejecuta PowerShell como administrador. Para fines de prueba, está bien almacenar los certificados que utiliza en su tienda. Cuando llegue el momento de poner algo en producción, necesitarás diferentes certificados instalados en las máquinas donde se ejecutará el código.
Después de crear el certificado, lo exportamos a un archivo .cer. Esto es lo que hice:
Get-ChildItem "Cert:\CurrentUser\My\$($Cert.thumbprint)" | Export-Certificate -FilePath C:\temp\MicrosoftGraphSDK.cer
Directory: C:\temp
Mode LastWriteTime Length Name
---- ------------- ------ ----
-a---- 06/10/2021 17:01 861 MicrosoftGraphSDK.cer
Conexión del certificado a una aplicación
Las aplicaciones registradas en Azure AD actúan como contenedores para retener el consentimiento de un conjunto de permisos de Graph. Los permisos permiten que la aplicación acceda a los datos mediante consultas de Graph. Cuando un script se conecta mediante autenticación solo de aplicación, se autentica pasando la huella digital de un certificado conocido por la aplicación en lugar de otro mecanismo como una contraseña interactiva o un secreto de aplicación.
Para que esto sea posible, debemos cargar el archivo de certificado creado con el cmdlet Export-Certificate en la aplicación. Esto se hace yendo a la sección de certificados y secretos de las propiedades de la aplicación y eligiendo la opción cargar certificado (Figura 1).
Recordando que la aplicación tiene los permisos que queremos usar con las consultas de Graph, debemos agregar los permisos de Graph necesarios a la aplicación. Los permisos exactos varían según los datos a los que desea acceder la aplicación. Puede experimentar ejecutando código en una sesión interactiva para determinar el conjunto correcto de permisos y luego agregarlos a la aplicación. En la Figura 2, agregué cinco permisos de aplicación que van desde Auditlog.Read.All (necesario para leer los datos de inicio de sesión del usuario) hasta User.Read.All (necesario para leer información sobre cuentas de usuario).
Tenga en cuenta que se elimina el permiso User.Read delegado. Este es un permiso predeterminado que no necesitamos.
Conexión a Microsoft Graph
Necesitamos tres datos para conectarnos a Graph usando el cmdlet Connect-MgGraph:
- El identificador del inquilino. Puede copiar esto desde las propiedades de la aplicación.
- El identificador de la aplicación. Nuevamente, esto está disponible en las propiedades de la aplicación.
- La huella digital del certificado. Esto está disponible como propiedad del certificado (consulte el ejemplo anterior).
Con esta información, podemos ejecutar un comando como (recuerde reemplazar los valores de identificador de inquilino, identificador de aplicación y huella digital del certificado según corresponda para su inquilino):
Connect-MgGraph -TenantId "a562313f-14fc-43a2-9a7a-d2e27f4f3478" -AppId "d86b1929-b818-411b-834a-206385bf5347" -CertificateThumbprint "FC92991B21219F178AFB37C12DF231B6AFC3D790"
Welcome To Microsoft Graph!
Para comprobar que se ha conectado con la configuración correcta, ejecute el cmdlet Get-MgContext. Lo importante que debe verificar aquí es la configuración de entrada para el identificador de cliente, el identificador de inquilino y la huella digital, además de los permisos (ámbitos) disponibles. El alcance del contexto debe informar Proceso en lugar de CurrentUser (un inicio de sesión interactivo) y no debe mostrarse ningún nombre de cuenta.
Get-MgContext
ClientId : d86b1929-b818-411b-834a-206385bf5347
TenantId : a562313f-14fc-43a2-9a7a-d2e27f4f3478
CertificateThumbprint : FC92991B21219F178AFB37C12DF231B6AFC3D790
Scopes : {Group.Read.All, MailboxSettings.Read, User.Read.All, Organization.ReadWrite.All...}
AuthType : AppOnly
AuthProviderType : ClientCredentialProvider
CertificateName :
Account :
AppName : Microsoft Graph PowerShell SDK Cert
ContextScope : Process
Certificate :
Si algo no se ve bien, ejecute el cmdlet Disconnect-MgGraph para finalizar la sesión, regrese y verifique la configuración de la aplicación (en particular, asegúrese de otorgar el consentimiento para todos los permisos requeridos). e inténtalo de nuevo.
Código en ejecución
Una vez que se haya conectado correctamente con los permisos adecuados, puede ejecutar su código. Como es habitual, las indicaciones interactivas no funcionan, por lo que es posible que sean necesarios algunos ajustes para tomar el código creado para una sesión interactiva y hacerlo funcionar en un trabajo en segundo plano. Después de eso, es cuestión de averiguar detalles operativos como:
- Los certificados X.509 a utilizar para la autenticación y cómo instalarlos en el lugar correcto
- Cómo enviar el guión como fondo del trabajo.
- Ocuparse del resultado (por ejemplo, enviar por correo electrónico un archivo con los resultados del script).
Todo lo cual es trabajo de otro día.

