Búsqueda de sitios web

Cómo utilizar la identidad administrada de Azure


Los recursos de Azure, como Azure Automation o Azure Virtual Machines, a menudo necesitan tener acceso a otros recursos. Por ejemplo, al acceder a Azure AD desde un Runbook. Para otorgar acceso, normalmente necesita cuentas, contraseñas o certificados. Pero no deseas almacenar esta información dentro de tu código. Aquí es donde entra en juego la identidad administrada de Azure.

Azure Managed Identity proporciona a Azure Resources una identidad administrada dentro de Azure AD. De esta manera, puede administrar fácilmente los permisos y autenticarse en Azure sin necesidad de almacenar credenciales.

En este artículo, veremos qué son las identidades administradas de Azure, cómo crearlas y usarlas, por supuesto. También creé un script de PowerShell que le permite configurar fácilmente los permisos de su identidad administrada.

¿Qué son las identidades administradas de Azure?

Las identidades administradas de Azure son una herramienta esencial para administrar de forma segura el acceso a los recursos de Azure. Estas identidades proporcionan una manera para que las aplicaciones y servicios de Azure se autentiquen y autoricen sin necesidad de almacenar ni administrar credenciales. Esto reduce el riesgo de robo o uso indebido de credenciales, ya que no hay credenciales que robar o administrar.

Funcionan creando una identidad (Aplicación empresarial) dentro de su Azure Active Directory (AAD). Luego, la identidad se asocia con un recurso de Azure específico, como una cuenta de Azure Automation. Puede otorgar permiso específico de identidad a las diferentes API en Azure, como MsGraph o Exchange Online, al igual que con las aplicaciones empresariales normales en Azure AD. Luego, el recurso utiliza la identidad para autenticar y autorizar el acceso, sin necesidad de credenciales.

Tipos de identidades administradas

Hay dos tipos de identidades administradas de Azure, con la principal diferencia en cómo se crean y administran:

CreatedLife cycleSharing
System-assignedPart of an Azure resourceDeleted when parent resource is deletedCan only be used for one Azure resource
User-assignedStandalone resourceIndependent life cycleCan be shared with more than one Azure Resource

Identidad administrada asignada por el sistema

Las identidades administradas asignadas por el sistema están vinculadas a un recurso específico. Puede habilitarlos para la mayoría de los servicios de Azure, como máquinas virtuales o cuentas de automatización. Crea una identidad única en su Azure AD, lo que le permite establecer permisos específicos para el recurso.

La ventaja de las identidades asignadas por el sistema es que se eliminan automáticamente cuando elimina el recurso.

Identidad administrada asignada por el usuario

Por otro lado, las identidades administradas asignadas por el usuario son recursos independientes de Azure. Se pueden asociar con uno o más servicios de Azure. Esto proporciona mayor flexibilidad y control sobre la gestión de identidades, permitiéndole crear y gestionar sus propias identidades y utilizarlas para múltiples recursos.

Esto también significa que las identidades asignadas por el usuario no se eliminan cuando elimina un recurso, lo que le permite reutilizar la identidad.

Crear una identidad administrada de Azure

El principio de creación de una identidad administrada y asignación de permisos es prácticamente el mismo para cada servicio de Azure. Para los ejemplos siguientes, crearemos una identidad administrada para una cuenta de Azure Automation. Luego podemos usar la identidad dentro de los runbooks para acceder a las diferentes API, como MsGraph o Exchange en línea.

Supongo que ya ha creado una cuenta de Automation; de lo contrario, lea este artículo primero para comenzar.

Paso 1: habilitar la identidad administrada asignada por el sistema

El primer paso es habilitar la identidad administrada asignada por el sistema. Si abre su servicio Azure, en este caso, la Cuenta de Automatización, encontrará en el menú de la izquierda el elemento Identidad (es posible que deba desplazarse un poco hacia abajo). Seleccione esto y habilite la identidad asignada por el sistema y haga clic en guardar.

Paso 2: Asignación de roles

Después de haber hecho clic en Guardar, aparecerá una ventana emergente de confirmación. Después de confirmar que desea crear una identidad asignada por el sistema, verá el ID del objeto y la opción para asignar roles de Azure. Lo importante aquí es que agregamos los mismos roles que nuestra cuenta Run-As actual (si está migrando su runbook).

  1. En su cuenta de Azure Automation, haga clic en Ejecutar como cuentas.
  2. Abra la cuenta Ejecutar como

  1. Tenga en cuenta las funciones que están asignadas actualmente a la cuenta.

  1. Volver a Identidad
  2. Haga clic en Asignaciones de roles de Azure.

Vamos a asignar los mismos roles a la identidad asignada por el sistema que tenía nuestra cuenta RunAs.

  1. Haga clic en Agregar asignación de roles
  2. Establecer el alcance
  3. Agregue el rol requerido
  4. Haga clic en Guardar

Ahora ya puede conectarse a los recursos de Azure desde Azure Runbook, por ejemplo. Los módulos necesarios para esto ya están cargados en nuevas cuentas de automatización. Sin embargo, para las cuentas de automatización existentes, deberá cargar al menos los siguientes módulos:

  • Az.ManagedServiceIdentidad
  • Az.Cuentas
  • Az.Automatización

Paso 3: agregar permisos

Los roles de Azure solo manejan los permisos para otros recursos de Azure, pero no otorgarán a la identidad administrada acceso a MsGraph o Exchange Online, por ejemplo. Para ello necesitaremos otorgar permisos a cada uno de los servicios.

Puede ver los permisos asignados en el Portal de Azure, pero no podemos asignar permisos. Para esto, necesitaremos usar PowerShell y necesitaremos el ID de objeto de la identidad administrada.

Primero busquemos el ID del objeto:

  1. Abra las aplicaciones empresariales en el portal de Azure
  2. Seleccione Todas las aplicaciones
  3. Haga clic en el filtro Tipo de aplicación
  4. Elija Identidades administradas y haga clic en Aplicar

Ahora solo se enumeran las identidades administradas. Abra la identidad que creamos anteriormente y no el ID del objeto:

Abra PowerShell en su computadora, asegúrese de tener instalado el módulo Microsoft Graph y conéctese a Graph con los siguientes alcances:

# Connect to Microsoft Graph
Connect-MgGraph -Scopes "Application.Read.All","AppRoleAssignment.ReadWrite.All,RoleManagement.ReadWrite.Directory"

# Select beta profile
Select-MgProfile Beta

Primero vamos a almacenar el ID del objeto de identidad administrada en una variable porque lo usaremos un par de veces en los siguientes scripts:

$managedIdentityId = "3e4c2842-1778-407f-9b3f-2191f10874ec"

# We can also lookup the object id using the name of the managed identity:
$managedIdentityId = (Get-MgServicePrincipal -Filter "displayName eq 'LazyAutomationAccount'").id

Permisos de MSGraph

Primero obtendremos el director de servicio para Graph basado en el ID de la aplicación estándar:

$graphApp = Get-MgServicePrincipal -Filter "AppId eq '00000003-0000-0000-c000-000000000000'"

Para Graph, necesitamos definir los ámbitos para los que necesitamos permiso. Luego podemos otorgar permisos para cada uno de los ámbitos buscando el rol de la aplicación:

$graphScopes = @(
  'UserAuthenticationMethod.Read.All',
  'Group.ReadWrite.All',
  'Directory.Read.All',
  'User.ReadWrite.All'
)

ForEach($scope in $graphScopes){
  $appRole = $graphApp.AppRoles | Where-Object {$_.Value -eq $scope}
  New-MgServicePrincipalAppRoleAssignment -PrincipalId $managedIdentityId -ServicePrincipalId $managedIdentityId -ResourceId $graphApp.Id -AppRoleId $appRole.Id
}

Ahora podemos usar MgGraph en nuestro Azure Runbook, por ejemplo. Para los runbooks, asegúrese de haber agregado al menos los siguientes módulos a su cuenta de Azure Automation:

  • Autenticación.de.Microsoft.Graph
  • Usuarios.de.Microsoft.Graph

Para conectarnos a Graph, primero debemos conectarnos a Azure para poder obtener un token de acceso.

Nota

Asegúrese de tener los siguientes módulos cargados en su cuenta de Automation:
- Az.ManagedServiceIdentity
- Az.Accounts
- Az.Automation
De lo contrario, no podrá utilizar Connect- Cmdlet AzAccount
try {
    # Logging in to Azure.
    Connect-AzAccount -Identity

    # Get token and connect to MgGraph
    Connect-MgGraph -AccessToken ((Get-AzAccessToken -ResourceTypeName MSGraph).token)
} catch {
    Write-Error -Message $_.Exception
    throw $_.Exception
}

# Test if we can get users:
Get-MgUser

La conexión a Microsoft Graph será más fácil con el nuevo módulo V2 que está por lanzarse. Actualmente se encuentra en versión preliminar, pero una vez lanzado, simplemente puede conectarse a Microsoft Graph con una identidad administrada mediante el parámetro -identity.

# For System Assigned Managed Identies
Connect-MgGraph -Identity

# For User Assigned Managed Identies
Connect-MgGraph -Identity -ClientId "User_Assigned_Managed_identity_Client_Id"

Permisos en línea de SharePoint

También para SharePoint, primero debemos obtener la entidad de servicio y definir los ámbitos a los que queremos otorgar permiso. Utilice los siguientes comandos de PowerShell para agregar el permiso de SharePoint a su identidad administrada:

$spoApp = Get-MgServicePrincipal -Filter "AppId eq '00000003-0000-0ff1-ce00-000000000000'"

$spoScopes = @(
  'Sites.FullControl.All',
  'TermStore.ReadWrite.All',
  'User.ReadWrite.All'
)

ForEach($scope in $spoScopes){
  $appRole = $spoApp.AppRoles | Where-Object {$_.Value -eq $scope}
  New-MgServicePrincipalAppRoleAssignment -PrincipalId $managedIdentityId -ServicePrincipalId $managedIdentityId -ResourceId $spoApp.Id -AppRoleId $appRole.Id
}

Para conectarse a SharePoint Online dentro de su runbook, deberá agregar módulos PnP-Online a su cuenta de automatización. La conexión a PnPOnline se realiza agregando el parámetro -ManagedIdentity:

Connect-PnPOnline -Url  lazydev-admin.sharepoint.com -ManagedIdentity

# Test connection
Get-PnPTeamsTeam

Intercambio en línea

Para Exchange, a menudo solo necesitamos el rol ManageAsApp. Entonces simplemente podemos agregar el permiso con los siguientes comandos:

$exoApp = Get-MgServicePrincipal -Filter "AppId eq '00000002-0000-0ff1-ce00-000000000000'"

$appRole = $exoApp.AppRoles | Where-Object {$_.DisplayName -eq "Manage Exchange As Application"}

$AppRoleAssignment = @{
  "PrincipalId" = $managedIdentityId
  "ServicePrincipalId" = $managedIdentityId
  "ResourceId" = $exoApp.Id
  "AppRoleId" = $appRole.Id
}
New-MgServicePrincipalAppRoleAssignment @AppRoleAssignment

Además del permiso, también necesitaremos otorgarle a nuestra identidad administrada la función de administrador de Exchange. De lo contrario, obtendrá el siguiente error:

The role assigned to application <id> isn't supported in this scenario. Please check online documentation for assigning correct Directory Roles to Azure AD Application for EXO App-Only Authentication.

Podemos agregar el rol usando MgGraph o usando el Portal de Azure. Para esto último, vaya a Azure Active Directory > Roles y administrador. Busque la función de administrador de Exchange y agregue su identidad administrada como miembro. Pero también podemos usar PowerShell por supuesto:

# Make sure that you connected to Graph with the scope RoleManagement.ReadWrite.Directory
$roleId = (Get-MgRoleManagementDirectoryRoleDefinition -Filter "DisplayName eq 'Exchange Administrator'").id

New-MgRoleManagementDirectoryRoleAssignment -PrincipalId $managedIdentityId -RoleDefinitionId $roleId -DirectoryScopeId "/""

Para usar la conexión de Exchange Online en su Azure Runbook, deberá asegurarse de tener cargado el último módulo de Exchange Online (EXO V3) en su cuenta de automatización. Porque esto hará que la conexión a Exchange Online sea mucho más sencilla con identidades administradas:

Connect-ExchangeOnline -ManagedIdentity -Organization lazyadmin.onmicrosoft.com

Verificar permisos

Después de agregar todos los permisos, siempre es una buena idea verificar si todos se agregaron a su identidad administrada como esperaba. Podemos ver los permisos en Azure Active Directory:

  1. Abra portal.azure.com y navegue hasta Aplicaciones empresariales en Azure AD.
  2. Haga clic en Todas las aplicaciones
  3. Cambie el filtro Tipo de aplicación a Identidades administradas.

  1. Seleccione la identidad administrada
  2. Haga clic en permisos para revisarlos

Script de permisos de identidad administrados

También creé un script completo que establecerá todos los permisos para su identidad administrada. Solo necesita establecer el nombre de su identidad administrada o puede usar la identificación del objeto de la identidad. El script establecerá todos los permisos necesarios. Puedes encontrar la última versión del script aquí en mi repositorio de GitHub.

# Change this to your Managed Identity app name:
$managedIdentityName = "LazyAutomationAccount"

# Connect to Microsoft Graph
Connect-MgGraph -Scopes "Application.Read.All","AppRoleAssignment.ReadWrite.All,RoleManagement.ReadWrite.Directory"
Select-MgProfile Beta

# Get the Managed Identity Object id
# You can find the name or object id in Azure > Automation Account > Identity
# $managedIdentityId = "<id-number-goes-here>"
$managedIdentityId = (Get-MgServicePrincipal -Filter "displayName eq $managedIdentityName").id

#
# Adding Microsoft Graph permissions
#
Write-host "Adding Microsoft Graph Permissions" -ForegroundColor Cyan

$graphApp = Get-MgServicePrincipal -Filter "AppId eq '00000003-0000-0000-c000-000000000000'"

# Add the required Graph scopes
$graphScopes = @(
  'UserAuthenticationMethod.Read.All',
  'Group.ReadWrite.All',
  'Directory.Read.All',
  'User.ReadWrite.All'
)
ForEach($scope in $graphScopes){
  $appRole = $graphApp.AppRoles | Where-Object {$_.Value -eq $scope}

  if ($null -eq $appRole) { Write-Warning "Unable to find App Role for scope $scope"; continue; }

  # Check if permissions isn't already assigned
  $assignedAppRole = Get-MgServicePrincipalAppRoleAssignment -ServicePrincipalId $managedIdentityId | Where-Object { $_.AppRoleId -eq $appRole.Id -and $_.ResourceDisplayName -eq "Microsoft Graph" }

  if ($null -eq $assignedAppRole) {
    New-MgServicePrincipalAppRoleAssignment -PrincipalId $managedIdentityId -ServicePrincipalId $managedIdentityId -ResourceId $graphApp.Id -AppRoleId $appRole.Id
  }else{
    write-host "Scope $scope already assigned"
  }
}

#
# SharePoint Online Permissions
#
Write-host "Adding SharePoint Online Permissions" -ForegroundColor Cyan

$spoApp = Get-MgServicePrincipal -Filter "AppId eq '00000003-0000-0ff1-ce00-000000000000'"

# Add the required SPO scopes
$spoScopes = @(
  'Sites.FullControl.All',
  'TermStore.ReadWrite.All',
  'User.ReadWrite.All'
)
ForEach($scope in $spoScopes){
  $appRole = $spoApp.AppRoles | Where-Object {$_.Value -eq $scope}

  if ($null -eq $appRole) { Write-Warning "Unable to find App Role for scope $scope"; continue; }

  # Check if permissions isn't already assigned
  $assignedAppRole = Get-MgServicePrincipalAppRoleAssignment -ServicePrincipalId $managedIdentityId | Where-Object { $_.AppRoleId -eq $appRole.Id -and $_.ResourceDisplayName -eq "Office 365 SharePoint Online"}

  if ($null -eq $assignedAppRole) {
    New-MgServicePrincipalAppRoleAssignment -PrincipalId $managedIdentityId -ServicePrincipalId $managedIdentityId -ResourceId $spoApp.Id -AppRoleId $appRole.Id
  }else{
    write-host "Scope $scope already assigned"
  }
}


#
# Adding Exchange Online permissions
#
Write-host "Adding Exchange Online Permissions" -ForegroundColor Cyan

$exoApp = Get-MgServicePrincipal -Filter "AppId eq '00000002-0000-0ff1-ce00-000000000000'"
$appRole = $exoApp.AppRoles | Where-Object {$_.DisplayName -eq "Manage Exchange As Application"}

$AppRoleAssignment = @{
  "PrincipalId" = $managedIdentityId
  "ServicePrincipalId" = $managedIdentityId
  "ResourceId" = $exoApp.Id
  "AppRoleId" = $appRole.Id
}
New-MgServicePrincipalAppRoleAssignment @AppRoleAssignment

# Add Exchange Administrator Role
$roleId = (Get-MgRoleManagementDirectoryRoleDefinition -Filter "DisplayName eq 'Exchange Administrator'").id
New-MgRoleManagementDirectoryRoleAssignment -PrincipalId $managedIdentityId -RoleDefinitionId $roleId -DirectoryScopeId "/"

Concluyendo

Las identidades administradas también son excelentes para administrar de forma segura el acceso a los recursos de Azure. Proporciona una forma segura y sencilla de gestionar el acceso a los recursos sin necesidad de credenciales ni políticas de seguridad complejas, lo que reduce el riesgo de robo o uso indebido de credenciales.

Mientras actualiza sus scripts, asegúrese de cambiar también a la última versión del módulo Exchange Online y reemplazar el módulo Azure AD con el nuevo módulo Microsoft Graph.

Espero que te haya gustado este artículo, si tienes alguna pregunta, deja un comentario a continuación.

Artículos relacionados