Cree una política de acceso condicional de Azure AD mediante PowerShell
En esta publicación, veremos la creación de políticas de acceso condicional en Azure AD usando PowerShell y el módulo Azure AD PowerShell.
La creación de políticas de acceso condicional mediante el Portal de administración de Azure es fácil; sin embargo, no es ideal utilizar el torpe portal web si desea hacerlo rápidamente, en un proceso automatizado o a través de varios inquilinos.
La versión GA del módulo AzureAD para PowerShell nos trajo los siguientes cmdlets:
- New-AzureADMSConditionalAccessPolicy: para crear una nueva política de acceso condicional.
- Get-AzureADMSConditionalAccessPolicy: para recuperar una lista de políticas de acceso condicional.
- Set-AzureADMSConditionalAccessPolicy: para modificar una política de acceso condicional existente.
- Remove-AzureADMSConditionalAccessPolicy: para eliminar una política de acceso condicional existente.
Instale el módulo AzureAD PowerShell
Para crear correctamente su política de acceso condicional, deberá asegurarse de que el módulo AzureAD esté instalado. Si aún no tiene instalado el módulo AzureAD PowerShell. Ejecute el siguiente comando:
Install-Module AzureADSi ya tiene instalado el módulo Azure AD pero desea actualizar a la última versión, use el modificador -Force:
Install-Module AzureAD -ForceCree una política de acceso condicional en Azure Active Directory con PowerShell
Antes de crear nuestra política de acceso condicional, hay cierta información que debemos conocer y decidir. Voy a utilizar los ejemplos a continuación como base para mi script.
- Las aplicaciones que deseas proteger (Ejemplo: OWA)
- Los usuarios que desea incluir o excluir (Ejemplo: Todos, excepto el usuario administrador global)
- El condicional en el que se aplicará la política (Ejemplo: Dispositivos Windows, excepto Win 11)
- El control de acceso (ejemplo: concesión que requiere solidez de autenticación)
- Cualquier control de sesión (Ejemplo: frecuencia de inicio de sesión cada 4 horas)
Aquí está el script completo para crear la política de acceso condicional anterior:
$conditions = New-Object -TypeName Microsoft.Open.MSGraph.Model.ConditionalAccessConditionSet
$conditions.Applications = New-Object -TypeName Microsoft.Open.MSGraph.Model.ConditionalAccessApplicationCondition
$conditions.Applications.IncludeApplications = "00000002-0000-0ff1-ce00-000000000000"
$conditions.Users = New-Object -TypeName Microsoft.Open.MSGraph.Model.ConditionalAccessUserCondition
$conditions.Users.IncludeUsers = "All"
$conditions.Users.ExcludeRoles = @("62e90394-69f5-4237-9190-012177145e10")
$conditions.Platforms = New-Object -TypeName Microsoft.Open.MSGraph.Model.ConditionalAccessPlatformCondition
$conditions.Platforms.IncludePlatforms = @('Windows')
$gcontrols = New-Object -TypeName Microsoft.Open.MSGraph.Model.ConditionalAccessGrantControls
$gcontrols._Operator = "OR"
$gcontrols.BuiltInControls = "MFA"
$session = New-Object -TypeName Microsoft.Open.MSGraph.Model.conditionalAccessSessionControls
$sessioncontrols = New-Object -TypeName Microsoft.Open.MSGraph.Model.ConditionalAccessSignInFrequency
$sessioncontrols.Type = "hours"
$sessioncontrols.Value = 4
$sessioncontrols.IsEnabled = $true
$session.SignInFrequency = $sessioncontrols
New-AzureADMSConditionalAccessPolicy -DisplayName "OWA MFA policy" -State "Disabled" -Conditions $conditions -GrantControls $gcontrols -SessionControls $session¡Desglosemos lo anterior!
Definir las aplicaciones que queremos proteger
$conditions = New-Object -TypeName Microsoft.Open.MSGraph.Model.ConditionalAccessConditionSet
$conditions.Applications = New-Object -TypeName Microsoft.Open.MSGraph.Model.ConditionalAccessApplicationCondition
$conditions.Applications.IncludeApplications = "00000002-0000-0ff1-ce00-000000000000"En la línea 1 estamos creando un nuevo objeto del tipo “conditionalAccessConditionSet” y pasando esta información a la variable $condiciones.
En la Línea 2 estamos creando otro nuevo objeto del tipo “ConditionalAccessApplicationCondition” y pasándolo a la propiedad Aplicaciones, dentro de la variable $condiciones. En este punto debes saber que no acabamos de adivinar el nombre de propiedad correcto para este objeto, puedes usar el siguiente comando para enumerar los "miembros" de la variable $condición.
$conditions | get-memberEn la línea 3 hemos especificado el ID de la aplicación y lo hemos pasado al parámetro IncludeApplications. Recopilamos esta información de dos áreas: en primer lugar, sabemos usar el parámetro IncludeApplications gracias a la página de referencia de la API Rest de Microsoft Graph aquí y, en segundo lugar, recopilamos el ID de la aplicación del portal de administración de Azure AD en "aplicaciones o acciones en la nube" desde una nueva política de acceso condicional.
También podemos ampliar el comando anterior para obtener una lista de parámetros disponibles:
$conditions.Applications | get-memberVerá que los siguientes parámetros están disponibles para usted:
- $condiciones.Aplicaciones.IncluirAplicaciones
- $condiciones.Aplicaciones.ExcluirAplicaciones
- $condiciones.Aplicaciones.IncludeUserActions
- $condiciones.Aplicaciones.Incluyennivelesdeprotección
Y aquí hay una lista de ID de aplicaciones comunes:
- Dinámica 365 Business Central: 996def3d-b36c-4153-8607-a6fd3c01b89f
- Seguridad de aplicaciones en la nube de Microsoft: 05a65629-4c1b-48c1-a78b-804c4abdd4af
- < span class="msportalfx-text-ellipsis ext-choose-applications-display-name-with-room" title="Microsoft Graph PowerShell" data-bind="texto: displayName, sanitizedAttr: { title: displayName }">Microsoft Graph PowerShell: 14d82eec-204b-4c2f-b7e8-296a70dab67e
- Servicio de sincronización de Microsoft Information Protection: 870c4f2e-85b6-4d43-bdda-6ed9a579b725
- Microsoft Intune: 0000000a-0000-0000-c000-000000000000
- Búsqueda de Microsoft en Bing: 9ea1ad79-fdb6-4f9a-8bc3-2b70f96e34c7
- Mis aplicaciones: 2793995e-0a7d-40d7-bd35-6968ba142197
- < span class="msportalfx-text-ellipsis ext-choose-applications-display-name-with-room" title="O365 LinkedIn Connection" data-bind="text: displayName, sanitizedAttr: { title: displayName }">O365 LinkedIn Conexión: f569b9c7-be15-4e87-86f7-87d30d02090b
- Office 365 Exchange en línea: 00000002-0000-0ff1-ce00-000000000000
- Office 365 SharePoint en línea: 00000003-0000-0ff1-ce00-000000000000
- Skype Empresarial en línea: 00000004-0000-0ff1-ce00-000000000000
API de servicio de tienda universal y aplicación web: 45a330b1-b1ec-4cc1-9161-9f03992aa49f
Especificar a qué usuarios se aplica nuestra política de acceso condicional
En las siguientes 3 líneas, definiremos a quién se aplica nuestra política. En nuestro caso hemos aplicado nuestra política a todos los miembros de nuestro inquilino, con excepción del rol de administrador global.
$conditions.Users = New-Object -TypeName Microsoft.Open.MSGraph.Model.ConditionalAccessUserCondition
$conditions.Users.IncludeUsers = "All"
$conditions.Users.ExcludeRoles = @("62e90394-69f5-4237-9190-012177145e10")Podemos ver esto en lo anterior ya que pasamos "Todos" al parámetro IncludeUsers y en ExcludeRoles hemos definido el ID de plantilla de la función de administradores globales. Encontramos el ID de plantilla yendo al Centro de administración de Azure Active Directoryr > Roles y administradores > Administrador global > Descripción.
También puede usar PowerShell para obtener el ID de objeto para el rol o usuario del directorio que desee con cualquiera de los siguientes comandos:
# List all directory roles and their objectID
Get-AzureADDirectoryRole
# List all directory users and their objectID
Get-AzureADUserOtros parámetros que puedes incluir son:
- $condiciones.Usuarios.IncluirUsuarios
- $condiciones.Usuarios.ExcluirUsuarios
- $condiciones.Usuarios.IncludeRoles
- $condiciones.Usuarios.ExcludeRoles
- $condiciones.Usuarios.IncludeGroups
- $condiciones.Usuarios.ExcluirGrupos
Especificación de la plataforma a la que se aplica nuestra política
En las siguientes líneas de código, especificamos que nuestra política solo se aplicará con la condición de que el dispositivo que se utilice sea un dispositivo Windows.
$conditions.Platforms = New-Object -TypeName Microsoft.Open.MSGraph.Model.ConditionalAccessPlatformCondition
$conditions.Platforms.IncludePlatforms = @('Windows')En la línea 1, nuevamente estamos creando un nuevo objeto de tiempo de "ConditionalAccessPlatformCondition", luego en la línea 2 pasamos la cadena 'Windows' al parámetro IncludePlatforms. Hay 5 plataformas diferentes entre las que puedes elegir, estas incluyen:
- Android
- iOS
- Teléfonos Windows
- ventanas
- Mac OS
- linux
Usando el comando “$condiciones.Plataformas | get-member” sabemos que podemos usar los siguientes parámetros aquí:
- $condiciones.Plataformas.IncludePlatforms
- $condiciones.Plataformas.ExcluirPlataformas
Especificación de los controles que otorgan permiso al recurso protegido
Ahora vamos a especificar bajo qué premisas vamos a permitir que nuestro usuario acceda al recurso. En nuestro ejemplo, vamos a otorgar acceso bajo la premisa de que la autenticación multifactor esté habilitada.
$gcontrols = New-Object -TypeName Microsoft.Open.MSGraph.Model.ConditionalAccessGrantControls
$gcontrols._Operator = "OR"
$gcontrols.BuiltInControls = "MFA"En la línea 2 hemos seleccionado el operador lógico 'OR', lo que significa que se debe cumplir uno u otro de los controles seleccionados. Por ejemplo, podría ser un dispositivo compatible O autenticación multifactor habilitada.
En la línea 3 tenemos que seleccionar el 'BuiltInControl' de MFA (o Autenticación multifactor). Otros valores posibles para este parámetro incluyen:
- Ministerio de Asuntos Exteriores
- Bloquear
- Dispositivo compatible
- dominioUnidoDispositivo
- Aplicaciones aprobadas
- compatibleAplicación
- Cambio de contraseña
- valorfuturo desconocido
Creando nuestro control de sesión de frecuencia de inicio de sesión
El último parámetro que vamos a definir es la configuración de sesión para nuestra política. En nuestro caso, especificamos la frecuencia de inicio de sesión para requerir un nuevo inicio de sesión cada 4 horas.
$session = New-Object -TypeName Microsoft.Open.MSGraph.Model.conditionalAccessSessionControls
$sessioncontrols = New-Object -TypeName Microsoft.Open.MSGraph.Model.ConditionalAccessSignInFrequency
$sessioncontrols.Type = "hours"
$sessioncontrols.Value = 4
$sessioncontrols.IsEnabled = $true
$session.SignInFrequency = $sessioncontrolsEn las líneas 1 y 2 estamos creando 2 nuevos objetos y almacenándolos en la variable $session y la variable $sessioncontrols.
En la línea 3 a la línea 5, especificamos la configuración para el objeto de frecuencia de inicio de sesión. En la línea 3 tenemos la opción de configurar "días" u "horas", luego, en la línea 4, especificamos un valor entero y luego especificamos el parámetro "IsEnabled" como "Verdadero" en la línea 5.
Por último, en la línea 3, estamos definiendo el parámetro 'SignInFrequency' con la configuración que acabamos de ingresar en la variable 'sessioncontrols'.
Creando la política de acceso condicional
En la última línea de código de nuestro script, estamos creando la política de acceso condicional con un nombre y estado específicos, explícitamente. También estamos utilizando las variables definidas anteriormente en nuestro script para implementar las condiciones y controles deseados en nuestra política.
New-AzureADMSConditionalAccessPolicy -DisplayName "OWA MFA policy" -State "Disabled" -Conditions $conditions -GrantControls $gcontrols -SessionControls $sessionUna vez que ejecutemos el script completo obtendremos un resultado como el siguiente:
Id: 87dec72e-4651-460c-8a9d-9a8d07405208
Nombre para mostrar: política de OWA MFA
Estado: deshabilitado
Condiciones: clase ConditionalAccessConditionSet {
Aplicaciones: clase ConditionalAccessApplicationCondition {
IncludeApplications : System.Collections.Generic.List`1[System.String]
Excluir aplicaciones: System.Collections.Generic.List`1[System.String]
IncludeUserActions: System.Collections.Generic.List`1 [System.String]
Incluir niveles de protección:
}
Usuarios: clase ConditionalAccessUserCondition {
IncludeUsers: System.Collections.Generic.List`1[System.String]
ExcludeUsers: System.Collections.Generic.List`1[System.String]
IncludeGroups : System.Collections.Generic.List`1[System.String]
ExcludeGroups: System.Collections.Generic.List`1[System.String]
IncludeRoles: System.Collections.Generic.List`1 [System.String]
ExcludeRoles: System.Collections.Generic.List`1[System.String]
}
Plataformas: clase ConditionalAccessPlatformCondition {
IncludePlatforms: System.Collections.Generic.List`1[Microsoft.Open.MSGraph.Model.ConditionalAccessDevicePlatforms]
ExcludePlatforms: System.Collections.Generic.List`1[Microsoft.Open .MSGraph.Model.ConditionalAccessDevicePlatforms]
}
Ubicaciones:
SignInRiskLevels: System.Collections.Generic.List`1[Microsoft.Open.MSGraph.Model.ConditionalAccessRiskLevel]
ClientAppTypes: System.Collections.Generic.List`1[Microsoft.Open.MSGraph. Modelo.ConditionalAccessClientApp]
}
GrantControls: clase ConditionalAccessGrantControls {
_Operator: O
BuiltInControls: System.Collections.Generic.List`1[Microsoft.Open.MSGraph.Model.ConditionalAccessGrantControl]
CustomAuthenticationFactors: System.Collections.Generic. Lista`1[System.String]
Términos de uso: System.Collections.Generic.List`1[System.String]
}
SessionControls: clase ConditionalAccessSessionControls {
ApplicationEnforcedRestrictions:
CloudAppSecurity:
SignInFrequency: clase ConditionalAccessSignInFrequency {
Valor: 4
Tipo: Horas
IsEnabled: True
}
Navegador persistente:
}
Ahora también verá su nueva política dentro del Portal de administración de Azure Active Directory.



