Настройка разрешений Конструктора образов виртуальных машин Azure с использованием PowerShell

Область применения: ✔️ Виртуальные машины Linux ✔️ Гибкие масштабируемые наборы

При регистрации в Конструкторе образов виртуальных машин Azure предоставляется разрешение на создание, администрирование и удаление промежуточной группы ресурсов. Служба также имеет права на добавление ресурсов, необходимых для сборки образов, в группу ресурсов. Во время успешной регистрации подписка получает доступ к имени субъекта-службы Конструктора образов виртуальных машин Azure.

Если вы хотите, чтобы Конструктор образов виртуальных машин Azure распространял образы, необходимо создать удостоверение, назначаемое пользователем, в Azure с разрешениями на чтение и запись образов. Например, может потребоваться распространить образы в управляемые образы или в коллекцию вычислений Azure. Если вы обращаетесь к Службе хранилища Azure, то создаваемому пользователем удостоверению требуются разрешения на чтение частных или общедоступных контейнеров.

Перед созданием образа необходимо настроить разрешения и привилегии. В следующих разделах подробно описано, как настроить возможные сценарии с помощью PowerShell.

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

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

Примечание

Назначаемое пользователем управляемое удостоверение — это правильный способ предоставления разрешений группам ресурсов образа. Не рекомендуется использовать имя субъекта-службы для этой цели.

В следующем примере показано, как создать управляемое удостоверение, назначаемое пользователем Azure. Замените местозаполнители собственными переменными.

Параметр Описание
<Группа ресурсов> Группа ресурсов, в которой вы хотите создать управляемое удостоверение, назначаемое пользователем.
## Add AZ PS module to support AzUserAssignedIdentity
Install-Module -Name Az.ManagedServiceIdentity

$parameters = @{
    Name = 'aibIdentity'
    ResourceGroupName = '<Resource group>'
}
# create identity
New-AzUserAssignedIdentity @parameters

Дополнительные сведения см. в статье Управляемое удостоверение, назначаемое пользователем Azure.

Разрешение Конструктору образов виртуальных машин распространять образы

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

Для распространения образов не нужно предоставлять права участника назначаемому пользователем управляемому удостоверению в группе ресурсов. Однако управляемому удостоверению, назначаемому пользователем, требуются следующие разрешения Actions Azure в группе ресурсов распространения:

Microsoft.Compute/images/write
Microsoft.Compute/images/read
Microsoft.Compute/images/delete

Если вы хотите распространить данные в коллекцию вычислений Azure, вам также потребуется:

Microsoft.Compute/galleries/read
Microsoft.Compute/galleries/images/read
Microsoft.Compute/galleries/images/versions/read
Microsoft.Compute/galleries/images/versions/write

Разрешение на настройку существующих образов

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

Ниже показано, как выполнить сборку на основе существующего пользовательского образа:

Microsoft.Compute/images/read

Ниже описывается процесс сборки из существующей версии Коллекции вычислений Azure:

Microsoft.Compute/galleries/read
Microsoft.Compute/galleries/images/read
Microsoft.Compute/galleries/images/versions/read

Разрешение на настройку образов в виртуальных сетях

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

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

Microsoft.Network/virtualNetworks/read
Microsoft.Network/virtualNetworks/subnets/join/action

Создание определения роли Azure

В следующих примерах создается определение роли Azure на основе действий, описанных в предыдущих разделах. Примеры применяются на уровне группы ресурсов. Оцените и протестируйте, достаточно ли детализированы примеры для ваших требований.

Действия с образом позволяют выполнять чтение и запись. Определите, что подходящие параметры для существующей среды. Например, создайте роль, позволяющую Конструктору образов виртуальных машин Azure читать образы из группы ресурсов example-RG-1 и записывать образы в группу ресурсов example-RG-2.

Пример роли Azure для пользовательского образа

В следующем примере создается роль Azure для использования и распространения исходного пользовательского образа. Затем вы предоставляете пользовательскую роль управляемому удостоверению, назначаемому пользователем, для конструктора образов виртуальных машин Azure.

Чтобы упростить замену значений в примере, сначала задайте следующие переменные. Замените местозаполнители собственными переменными.

Параметр Описание
<Идентификатор подписки> Идентификатор вашей подписки Azure.
<Группа ресурсов> Группа ресурсов для пользовательского образа.
$sub_id = "<Subscription ID>"
# Resource group - image builder will only support creating custom images in the same Resource Group as the source managed image.
$imageResourceGroup = "<Resource group>"
$identityName = "aibIdentity"

# Use a web request to download the sample JSON description
$sample_uri="https://raw.githubusercontent.com/azure/azvmimagebuilder/master/solutions/12_Creating_AIB_Security_Roles/aibRoleImageCreation.json"
$role_definition="aibRoleImageCreation.json"

Invoke-WebRequest -Uri $sample_uri -Outfile $role_definition -UseBasicParsing

# Create a unique role name to avoid clashes in the same Azure Active Directory domain
$timeInt=$(get-date -UFormat "%s")
$imageRoleDefName="Azure Image Builder Image Def"+$timeInt

# Update the JSON definition placeholders with variable values
((Get-Content -path $role_definition -Raw) -replace '<subscriptionID>',$sub_id) | Set-Content -Path $role_definition
((Get-Content -path $role_definition -Raw) -replace '<rgName>', $imageResourceGroup) | Set-Content -Path $role_definition
((Get-Content -path $role_definition -Raw) -replace 'Azure Image Builder Service Image Creation Role', $imageRoleDefName) | Set-Content -Path $role_definition

# Create a custom role from the aibRoleImageCreation.json description file. 
New-AzRoleDefinition -InputFile $role_definition

# Get the user-identity properties
$identityNameResourceId=$(Get-AzUserAssignedIdentity -ResourceGroupName $imageResourceGroup -Name $identityName).Id
$identityNamePrincipalId=$(Get-AzUserAssignedIdentity -ResourceGroupName $imageResourceGroup -Name $identityName).PrincipalId

# Grant the custom role to the user-assigned managed identity for Azure Image Builder.
$parameters = @{
    ObjectId = $identityNamePrincipalId
    RoleDefinitionName = $imageRoleDefName
    Scope = '/subscriptions/' + $sub_id + '/resourceGroups/' + $imageResourceGroup
}

New-AzRoleAssignment @parameters

Пример роли Azure существующей виртуальной сети

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

Чтобы упростить замену значений в примере, сначала задайте следующие переменные. Замените местозаполнители собственными переменными.

Параметр Описание
<Идентификатор подписки> Идентификатор вашей подписки Azure.
<Группа ресурсов> Группа ресурсов виртуальной сети.
$sub_id = "<Subscription ID>"
$res_group = "<Resource group>"
$identityName = "aibIdentity"

# Use a web request to download the sample JSON description
$sample_uri="https://raw.githubusercontent.com/azure/azvmimagebuilder/master/solutions/12_Creating_AIB_Security_Roles/aibRoleNetworking.json"
$role_definition="aibRoleNetworking.json"

Invoke-WebRequest -Uri $sample_uri -Outfile $role_definition -UseBasicParsing

# Create a unique role name to avoid clashes in the same AAD domain
$timeInt=$(get-date -UFormat "%s")
$networkRoleDefName="Azure Image Builder Network Def"+$timeInt

# Update the JSON definition placeholders with variable values
((Get-Content -path $role_definition -Raw) -replace '<subscriptionID>',$sub_id) | Set-Content -Path $role_definition
((Get-Content -path $role_definition -Raw) -replace '<vnetRgName>', $res_group) | Set-Content -Path $role_definition
((Get-Content -path $role_definition -Raw) -replace 'Azure Image Builder Service Networking Role',$networkRoleDefName) | Set-Content -Path $role_definition

# Create a custom role from the aibRoleNetworking.json description file
New-AzRoleDefinition -InputFile $role_definition

# Get the user-identity properties
$identityNameResourceId=$(Get-AzUserAssignedIdentity -ResourceGroupName $imageResourceGroup -Name $identityName).Id
$identityNamePrincipalId=$(Get-AzUserAssignedIdentity -ResourceGroupName $imageResourceGroup -Name $identityName).PrincipalId

# Assign the custom role to the user-assigned managed identity for Azure Image Builder
$parameters = @{
    ObjectId = $identityNamePrincipalId
    RoleDefinitionName = $networkRoleDefName
    Scope = '/subscriptions/' + $sub_id + '/resourceGroups/' + $res_group
}

New-AzRoleAssignment @parameters

Следующие шаги

Общие сведения о Конструкторе образов виртуальных машин Azure