Поиск по сайту:

Как использовать управляемую идентичность Azure


Ресурсы Azure, такие как Azure Automation или Azure Virtual Machines, часто нуждаются в доступе к другим ресурсам. Например, при доступе к Azure AD из Runbook. Для предоставления доступа обычно нужны учетные записи, пароли или сертификаты. Но вы не хотите хранить эту информацию внутри вашего кода. Здесь на помощь приходит Azure Managed Identity.

Управляемая идентичность Azure предоставляет ресурсам Azure управляемую идентичность внутри вашего Azure AD. Таким образом, вы можете легко управлять разрешениями и аутентифицироваться в Azure без необходимости хранения учетных данных.

В этой статье мы рассмотрим, что такое управляемые идентификаторы Azure, как их создать и, конечно же, использовать. Я также создал скрипт PowerShell, который позволяет вам легко настроить разрешения для вашего управляемого идентификатора.

Что такое управляемые учетные записи Azure

Управляемые идентификаторы Azure являются важным инструментом для безопасного управления доступом к ресурсам Azure. Эти идентификаторы предоставляют возможность приложениям и службам Azure аутентифицироваться и авторизовываться без необходимости хранения и управления учетными данными. Это снижает риск кражи или неправильного использования учетных данных, так как учетных данных, которые можно было бы украсть или управлять, нет.

Они работают, создавая идентичность (Корпоративное приложение) в вашем Azure Active Directory (AAD). Эта идентичность затем ассоциируется с конкретным ресурсом Azure, например, с учетной записью Azure Automation. Вы можете предоставить идентичности конкретные разрешения для различных API в Azure, таких как MsGraph или Exchange Online, так же, как и с обычными корпоративными приложениями в Azure AD. Идентичность затем используется ресурсом для аутентификации и авторизации доступа без необходимости в учетных данных.

Типы управляемых идентификаторов

Существуют два типа управляемых идентификаторов Azure, основной отличительной чертой которых является способ их создания и управления:

СозданоЖизненный циклДеление
Назначенная системойЧасть ресурса AzureУдаляется, когда родительский ресурс удаляетсяМожет использоваться только для одного ресурса Azure
Назначенный пользователемАвтономный ресурсНезависимый цикл жизниМожет быть разделено более чем с одним ресурсом Azure
Управляемая идентичность, назначенная системой, против управляемой идентичности, назначенной пользователем

Система-назначенная управляемая идентичность

Управляемые идентичности, назначенные системой, привязаны к одному конкретному ресурсу. Вы можете активировать их для большинства сервисов Azure, таких как виртуальные машины или учетные записи автоматизации. Это создает уникальную идентичность в вашем Azure AD, позволяя вам устанавливать специальные разрешения для ресурса.

Преимущества системно присвоенных идентификаторов заключаются в том, что они автоматически удаляются при удалении ресурса.

Управляемая идентичность, назначенная пользователем

С другой стороны, управляемые идентичности, назначенные пользователем, являются самостоятельными ресурсами Azure. Их можно связать с одним или несколькими службами Azure. Это обеспечивает большую гибкость и контроль над управлением идентичностями, позволяя вам создавать и управлять собственными идентичностями и использовать их для нескольких ресурсов.

Это также означает, что назначенные пользователем идентичности не удаляются, когда вы удаляете ресурс, что позволяет вам повторно использовать идентичность.

Создание управляемой идентичности Azure

Принцип создания управляемой идентичности и назначения разрешений для каждой службы Azure практически одинаков. В приведенных ниже примерах мы создадим управляемую идентичность для учетной записи Azure Automation. Затем мы сможем использовать эту идентичность внутри сценариев для доступа к различным API, таким как MsGraph или Exchange online.

Я предполагаю, что вы уже создали учетную запись Automation, если нет, то сначала прочитайте эту статью, чтобы начать.

Шаг 1 - Включение управляемой идентичности, назначенной системой

Первый шаг - включить управляемую идентичность, назначенную системе. Если вы откроете свой сервис Azure, в данном случае Учётную запись автоматизации, вы найдете в левом меню пункт Идентичность (возможно, потребуется прокрутить немного вниз). Выберите его и включите управляемую идентичность, назначенную системе, затем нажмите сохранить.

Включить назначенную системой учетную запись

Шаг 2 - Назначение ролей

После того, как вы нажмете Сохранить, вы получите всплывающее окно с подтверждением. После того, как вы подтвердите, что хотите создать назначенную системой идентичность, вы увидите Object ID и возможность назначить роли Azure. Важно отметить, что мы добавляем те же роли, что и у нашей текущей учетной записи Run-As (если вы мигрируете свой runbook).

  1. В вашей учетной записи Azure Automation нажмите на Служебные учетные записи
  2. Откройте запустить как учетную запись

  1. Обратите внимание на роли, которые в настоящее время назначены учетной записи

  1. Вернуться к Идентичности
  2. Нажмите на Назначения роли Azure

управляемая учетная запись с назначением системы Azure

Мы собираемся присвоить те же роли системе, которые имел наш аккаунт RunAs.

  1. Нажмите на Добавить назначение роли
  2. Установите объем
  3. Добавьте необходимую Роль
  4. Нажмите Сохранить

Теперь вы можете подключаться к ресурсам Azure непосредственно из Azure Runbook, например. Необходимые модули для этого уже загружены в новые аккаунты автоматизации. Однако для существующих аккаунтов автоматизации вам нужно будет загрузить как минимум следующие модули:

  • Az.УправляемаяСлужебнаяИдентификация
  • Az.УчетныеЗаписи
  • Аз.Автоматизация

Шаг 3 - Добавление разрешений

Роли Azure только управляют разрешениями на другие ресурсы Azure, но не предоставят управляемой идентичности доступ к MsGraph или Exchange Online, например. Для этого нам необходимо будет предоставить разрешения для каждого из сервисов.

Вы можете просмотреть назначенные разрешения в портале Azure, но мы не можем назначить разрешения. Для этого нам потребуется использовать PowerShell и нам потребуется идентификатор объекта управляемой идентичности.

Сначала давайте посмотрим идентификатор объекта:

  1. Откройте приложение Enterprise в портале Azure
  2. Выбрать Все приложения
  3. Нажмите на фильтр Тип приложения
  4. Выберите Управляемые Идентичности и нажмите Применить

Теперь в списке только управляемые идентичности. Откройте идентичность, которую мы создали ранее, а не идентификатор объекта:

Откройте PowerShell на вашем компьютере, убедитесь, что у вас установлен модуль Microsoft Graph, и подключитесь к Graph с помощью следующих областей:

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

Select beta profile
Select-MgProfile Beta

Сначала мы собираемся сохранить идентификатор объекта управляемой идентичности в переменной, потому что мы будем использовать его несколько раз в приведенных ниже скриптах:

$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

Разрешения MsGraph

Сначала мы получим Service Principal для Graph на основе стандартного идентификатора приложения:

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

Для Graph нам нужно определить области, к которым нам необходим доступ. Затем мы можем предоставить разрешения для каждой из областей, используя информацию о роли приложения:

$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
}

Теперь мы можем использовать MgGraph в нашем Azure Runbook, например. Для runbook убедитесь, что вы добавили как минимум следующие модули в вашу учетную запись Azure Automation:

  • Microsoft.Graph.Authentication
  • Microsoft.Graph.Users

Чтобы подключиться к Graph, сначала нам нужно подключиться к Azure, чтобы получить токен доступа.

Заметка

Убедитесь, что в вашем учетной записи автоматизации загружены следующие модули:
– Az.ManagedServiceIdentity
– Az.Accounts
– Az.Automation
В противном случае вы не сможете использовать командлет Connect-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

Подключение к Microsoft Graph станет проще с новым модулем V2, который скоро выйдет. В данный момент он находится в предварительном просмотре, но после выхода вы сможете просто подключиться к Microsoft Graph с помощью управляемой учетной записи, используя параметр -identity.

For System Assigned Managed Identies
Connect-MgGraph -Identity

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

Права доступа SharePoint Online

Также для SharePoint сначала необходимо получить служебный идентификатор и определить области, к которым мы хотим предоставить разрешения. Используйте команды PowerShell ниже, чтобы добавить разрешение SharePoint к вашей управляемой идентичности:

$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
}

Чтобы подключиться к SharePoint Online внутри вашего рабочего процесса, вам нужно будет добавить модули PnP-Online в вашу учетную запись автоматизации. Подключение к PnPOnline осуществляется путем добавления параметра -ManagedIdentity:

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

Test connection
Get-PnPTeamsTeam

Обмен онлайн

Для Exchange нам часто нужна только роль ManageAsApp. Поэтому мы можем просто предоставить разрешение с помощью следующих команд:

$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

Кроме разрешения, нам также потребуется предоставить нашей управляемой учетной записи роль администратора Exchange. В противном случае вы получите следующую ошибку:

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.

Мы можем добавить роль с помощью MgGraph или через Azure Portal. Для последнего перейдите в Azure Active Directory > Роли и администраторы. Найдите роль администратора Exchange и добавьте вашу управляемую учетную запись в качестве члена. Но мы также можем использовать PowerShell, конечно:

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 "/""

Чтобы использовать подключение Exchange Online в вашем Azure Runbook, вам нужно убедиться, что в вашем учетной записи автоматизации загружен последний модуль Exchange Online (EXO V3). Это упростит подключение к Exchange Online с управляемыми идентификацией:

Connect-ExchangeOnline -ManagedIdentity -Organization a-d.onmicrosoft.com

Проверьте разрешения

После того как вы добавили все разрешения, всегда полезно проверить, что они все добавлены к вашей управляемой идентичности так, как вы ожидали. Мы можем просмотреть разрешения в Azure Active Directory:

  1. Откройте portal.azure.com и перейдите к Корпоративным приложениям в Azure AD
  2. Нажмите на Все приложения
  3. Измените фильтр Тип приложения на Управляемые идентификаторы

  1. Выберите управляемую идентичность
  2. Нажмите на разрешения, чтобы их просмотреть.

Скрипт разрешений управляемой идентичности

Я также создал полный скрипт, который установит все разрешения для вашей управляемой идентичности. Вам нужно только задать имя вашей управляемой идентичности или использовать объектный идентификатор идентичности. Скрипт установит все необходимые разрешения. Вы можете найти последнюю версию скрипта здесь в моем репозитории 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 "/"

Заключение

Управляемые идентификаторы также отлично справляются с безопасным управлением доступом к ресурсам Azure. Они предлагают защищенный и простой способ управления доступом к ресурсам без необходимости использования учетных данных или сложных политик безопасности, что снижает риск кражи учетных данных или их неправильного использования.

При обновлении ваших скриптов убедитесь, что вы также переключились на последнюю версию модуля Exchange Online и заменили модуль Azure AD на новый модуль Microsoft Graph.

Надеюсь, вам понравилась эта статья. Если у вас есть какие-либо вопросы, просто оставьте комментарий ниже.