Microsoft tarda en agregar fechas de vencimiento para las cuentas de invitado, así que veamos qué es posible con PowerShell
Durante mucho tiempo he respaldado la idea de revisar las cuentas de invitados anualmente para eliminar las cuentas obsoletas y limpiar el directorio. La respuesta habitual de Microsoft es que las organizaciones deben usar las revisiones de cuentas de Azure AD, una característica que funciona pero requiere licencias de Azure AD Premium P2.
Muchos han señalado que sería bueno que Azure AD admitiera la caducidad de la cuenta de invitado (la capacidad de asignar fechas de caducidad a las cuentas de invitado), ya que es posible para las cuentas locales de Active Directory. El portal de sugerencias de la comunidad de Microsoft tiene una solicitud popular que data de hace seis años. La última respuesta de ingeniería (octubre de 2022) señaló que la sugerencia es «algo que estamos considerando, pero aún no hay un cronograma». El tema también se trata en la comunidad técnica de Microsoft sin resolución.
Donde hay voluntad hay un camino. Al menos, donde hay PowerShell, podemos hacer que suceda algo. El esquema de una solución podría ser así:
- La organización establece un período de vencimiento predeterminado para las cuentas de invitado.
- Un trabajo en segundo plano encuentra nuevas cuentas de invitado y las sella con una fecha de vencimiento calculada sumando el período de vencimiento a la fecha de creación de la cuenta.
- Un trabajo en segundo plano comprueba las cuentas de invitados semanalmente para encontrar cuentas que caducan en las próximas dos semanas.
- Si la cuenta de invitado está activa (existen registros de inicio de sesión de Azure AD), la fecha de vencimiento se extiende seis meses. Puede agregar otras comprobaciones de actividad aquí. Por ejemplo, el script podría verificar que la cuenta sea miembro de al menos un grupo (equipo) de Microsoft 365.
- Si la cuenta de invitado está inactiva, se marca para su eliminación y sus detalles se incluyen en un informe que se envía a los administradores. Si un administrador no realiza ninguna acción, una ejecución posterior del trabajo en segundo plano elimina la cuenta automáticamente después de que caduque.
Este es un marco simple para el vencimiento automático de cuentas de invitados. Puede agregar características adicionales a su gusto. Analicemos cómo implementar las diferentes piezas del rompecabezas.
Configuración del período de caducidad del invitado
Primero, debemos establecer el período de vencimiento del invitado. Decidí usar Azure Key Vault para este propósito porque no quería codificar el valor en scripts. En este artículo se explica cómo usar Azure Key Vault con PowerShell. Después de completar el valor en la bóveda, puedo recuperarlo en cualquier momento con un comando como:
$GuestExpirationPeriod = Get-AzKeyVaultSecret -VaultName "Office365ITPros" -Name "GuestExpirationPeriod" -AsPlainText
Sellado de nuevas cuentas de invitados con un período de vencimiento
Uno de los quince atributos de extensión disponibles para las cuentas de Azure AD parece un buen lugar para almacenar las fechas de vencimiento. En este ejemplo, uso el atributo personalizado 15.
El objetivo del primer trabajo es garantizar que cada cuenta de invitado tenga una fecha de vencimiento. Para hacer esto, el trabajo:
- Busca cuentas de invitados que no tengan fecha de caducidad.
- Actualiza las cuentas de invitados encontradas por la búsqueda con una fecha de vencimiento.
La búsqueda de objetos que tienen un valor nulo en una propiedad suele ser fácil con PowerShell porque existe la variable especial $Null para ese propósito. Sin embargo, los cmdlets del SDK de PowerShell de Microsoft Graph no controlan la variable $Null correctamente (una de varias debilidades que tiene el SDK). La solución es usar una consulta compleja para buscar objetos donde la propiedad sea mayor o igual a nulo (no $Nulo). Este comando funciona y encuentra cuentas de invitados sin un valor en el atributo personalizado 15:
[array]$Guests = Get-MgUser -Filter "onPremisesExtensionAttributes/extensionAttribute15 eq null and userType eq 'Guest'" -CountVariable CountVar -ConsistencyLevel eventual -All -Property id, createdDateTime, displayName
Escribir una fecha de vencimiento en las cuentas de invitados es sencillo. La primera vez que el trabajo se ejecuta dentro de un arrendatario, procesará todas las cuentas de invitado. Algunas de las cuentas pueden ser bastante antiguas, por lo que para asegurarse de que las cuentas reciban una fecha de vencimiento razonable, el script se asegura de que la fecha de vencimiento calculada sea al menos 30 días en el futuro.
[datetime]$Now = Get-Date ForEach ($Guest in $Guests) { Write-Host ("Updating guest account {0}" -f $Guest.displayName) [datetime]$CreatedDate = $Guest.createdDateTime [datetime]$ExpirationDate = $CreatedDate.AddDays($GuestExpirationPeriod) If ($ExpirationDate -le $Now) { $ExpirationDate = $Now.AddDays(30) } Update-MgUser -UserId $Guest.Id -OnPremisesExtensionAttributes @{'extensionAttribute15' = (Get-Date $ExpirationDate -format s)} }
Para verificar las fechas de vencimiento asignadas, este comando ordena las cuentas de invitados por orden de fecha para informar el nombre de usuario y la fecha de vencimiento.
[array]$Guests = Get-MgUser -Filter "userType eq 'Guest'" -All $Guests | Sort-Object {$_.OnPremisesExtensionAttributes.extensionattribute15 -as [datetime]} | ft displayname,@{e={Get-Date($_.OnPremisesExtensionAttributes.extensionattribute15) -format g}; n="Expiration Date"}
Búsqueda de invitados vencidos
El trabajo principal de caducidad del invitado tiene dos propósitos:
- Encuentre y elimine las cuentas de invitados marcadas como caducadas y elimine las que excedan su fecha de vencimiento por siete días o más.
- Encuentre el conjunto de cuentas de invitado que vencerá en los próximos 14 días.
Básicamente, la idea es eliminar las cuentas vencidas y luego buscar y marcar el conjunto de cuentas que son candidatas para eliminar la próxima vez que se ejecute el trabajo. Para marcar una cuenta como lista para su eliminación, la secuencia de comandos escribe «Caducada» en el atributo personalizado 14. Para garantizar que los administradores tengan tiempo de revisar posibles eliminaciones, la secuencia de comandos solo elimina las cuentas si están marcadas como caducadas y su fecha de caducidad ocurrió hace más de siete hace días. El script hace lo siguiente:
- Ejecute el cmdlet Get-MgUser para buscar todas las cuentas de invitado y luego recorra el conjunto de cuentas.
- Verifique si la cuenta ha «Caducado» en el atributo personalizado 14. Si es así, el script verifica la fecha de vencimiento de la cuenta para ver si la cuenta llegó a su fecha de vencimiento hace más de siete días. Si esto es cierto, el script elimina la cuenta. Las cuentas de invitados eliminadas permanecen en la papelera de reciclaje de Azure AD durante 30 días. Los administradores pueden restaurar cuentas según sea necesario utilizando el centro de administración de Entra o PowerShell.
- Verifique las cuentas restantes para encontrar el conjunto que ha llegado a su fecha de vencimiento.
- Verifique cada cuenta vencida para conocer su actividad de inicio de sesión más reciente. Si el último inicio de sesión fue hace menos de 30 días, suponga que la cuenta está activa y extienda su fecha de vencimiento por 183 días (seis meses). Si el último inicio de sesión tiene más de 30 días, actualice el atributo personalizado 14 con «Caducado» para que la cuenta sea candidata para su eliminación la próxima vez que se ejecute el trabajo.
- Envía por correo electrónico un informe de las acciones realizadas a los administradores de inquilinos.
Uso de la automatización de Azure
Azure Automation es una buena opción para este tipo de trabajos de procesamiento en segundo plano. En artículos anteriores, cubrimos los aspectos básicos del uso de una identidad administrada con Microsoft Graph PowerShell SDK (para operaciones de cuenta de Azure AD y para enviar correo electrónico). Los dos trabajos en segundo plano necesarios para que este esquema funcione pueden usar una programación de Azure Automation para asegurarse de que se ejecuten como se esperaba:
- Diariamente: trabajo en segundo plano 1 (buscar nuevas cuentas de invitados y ponerles una fecha de caducidad). El código para encontrar y sellar cuentas nuevas se describe arriba.
- Semanalmente: trabajo en segundo plano 2 (buscar y marcar cuentas de invitado caducadas y purgar cuentas caducadas más de siete días después de su fecha de caducidad). Mi runbook de ejemplo para demostrar los principios de estas operaciones está disponible en GitHub. Recuerde que este código no es calidad de producción. Funciona pero necesita mejoras para cumplir con los estándares de codificación de su inquilino.
La Figura 1 muestra un ejemplo del correo electrónico generado por el runbook de Azure Automation.
Figura 1: Informes de detalles de cuentas de invitados caducadas
Efecto de eliminar cuentas de invitados
Recuerde que cuando Azure AD elimina las cuentas de invitados, los propietarios de esas cuentas dejan de ser miembros de Microsoft 365 Groups and Teams dentro del inquilino. Esto significa que inmediatamente pierden el acceso a los recursos que pertenecen a esos grupos. Además, cualquier vínculo para compartir creado para las cuentas deja de ser válido.
Si decide reemplazar los contactos de correo con cuentas de invitado, como he comentado recientemente, es poco probable que estas cuentas tengan alguna actividad de inicio de sesión y, por lo tanto, caduquen rápidamente. En este escenario, podría usar otro atributo personalizado para excluir estas cuentas del procesamiento de vencimiento.
vamos microsoft
Este ejercicio demuestra que no hay ciencia espacial real involucrada en la introducción de fechas de vencimiento para las cuentas de invitado de Azure AD. Dada la lentitud de Microsoft para responder a las solicitudes de los clientes para la funcionalidad, es probable que la caducidad de los invitados esté al final de la lista de prioridades para la inversión en ingeniería. Es una pena, pero al menos se puede crear una versión de bricolaje si realmente desea caducar y eliminar las cuentas de invitado después de un período.