Configurar permissões do Construtor de Imagens de VM do Azure usando o PowerShell

Aplica-se a: ✔️ VMs do Linux ✔️ Conjuntos de dimensionamento flexíveis

Ao se registra no Construtor de Imagens de VM do Azure, isso concede a permissão de serviço para criar, gerenciar e excluir um grupo de recursos de preparo. O serviço também tem direito de adicionar recursos a um grupo de recursos, necessários para a compilação da imagem. Durante um registro bem-sucedido, sua assinatura obtém acesso a um SPN (nome da entidade de serviço) do Construtor de Imagens de VM.

Se você quiser que o Construtor de Imagens de VM distribua imagens, crie uma identidade atribuída pelo usuário no Azure, com permissões para ler e gravar imagens. Por exemplo, talvez você queira distribuir imagens para imagens gerenciadas ou para a Galeria de Computação do Azure. Se você estiver acessando o Armazenamento do Microsoft Azure, a identidade atribuída pelo usuário que você criar precisará de permissões para ler contêineres públicos ou privados.

Você deve configurar as permissões e privilégios antes de criar uma imagem. As seções a seguir detalham como configurar cenários possíveis usando o PowerShell.

Criar uma identidade gerenciada atribuída ao usuário

O Construtor de Imagens de VM exige que você crie uma identidade Azure gerenciada atribuída pelo usuário. O Construtor de Imagens de VM usa essa identidade gerenciada para ler imagens, gravar imagens e acessar contas de Armazenamento do Microsoft Azure. Você concede a permissão de identidade para realizar ações específicas em sua assinatura.

Observação

A identidade gerenciada atribuída pelo usuário é a maneira correta de conceder permissões aos grupos de recursos de imagem. O SPN foi preterido para essa finalidade.

O exemplo a seguir mostra como criar uma identidade Azure gerenciada atribuída pelo usuário. Substitua as configurações de espaço reservado para definir suas variáveis.

Configuração Descrição
<Grupo de recursos> O grupo de recursos onde deseja criar a identidade gerenciada atribuída pelo usuário.
## Add AZ PS module to support AzUserAssignedIdentity
Install-Module -Name Az.ManagedServiceIdentity

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

Para obter mais informações, consulte Identidade gerenciada atribuídas pelo usuário do Azure.

Permitir que o Construtor de Imagens de VM distribua imagens

Para que o Construtor de Imagens de VM distribua imagens, o serviço deve ter permissão para injetar as imagens em grupos de recursos. Para conceder as permissões necessárias, crie uma identidade gerenciada atribuída pelo usuário e conceda à ela direitos no grupo de recursos em que a imagem é compilada. O Construtor de Imagens de VM não tem permissão para acessar os recursos em outros grupos de recursos na assinatura. Você precisa tomar ações explícitas para permitir o acesso, a fim de evitar falhas em suas compilações.

Você não precisa conceder direitos de colaborador à identidade gerenciada atribuída pelo usuário no grupo de recursos para distribuir imagens. No entanto, a identidade gerenciada atribuída pelo usuário precisa das seguintes permissões do Azure Actions no grupo de recursos de distribuição:

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

Se você quiser distribuir para a Galeria de Computação do Azure, também precisará:

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

Permissão para personalizar as imagens existentes

Para o Construtor de Imagens de VM compilar imagens a partir de imagens personalizadas de origem, o serviço deve ter permissão para ler as imagens nesses grupos de recursos. Para conceder as permissões necessárias, crie uma identidade gerenciada atribuída pelo usuário e conceda à ela direitos no grupo de recursos em que a imagem está localizada.

Veja como você compilar a partir de uma imagem personalizada existente:

Microsoft.Compute/images/read

Veja como você cria de uma versão existente da Galeria de Computação do Azure:

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

Permissão para personalizar imagens em suas redes virtuais

O Construtor de Imagens de VM tem a capacidade de implantar e usar uma rede virtual existente em sua assinatura, permitindo assim que as personalizações acessem recursos conectados.

Você não precisa conceder direitos de colaborador à identidade gerenciada atribuída pelo usuário no grupo de recursos para implantar uma VM em uma rede virtual existente. No entanto, a identidade gerenciada atribuída pelo usuário precisa das seguintes permissões do Azure Actions no grupo de recursos de rede virtual:

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

Criar uma definição de função do Azure

Os exemplos a seguir criam uma definição de função do Azure das ações descritas nas seções anteriores. Os exemplos são aplicados no nível do grupo de recursos. Avalie e teste se os exemplos são granulares o suficiente para suas necessidades.

As ações de imagem permitem leitura e gravação. Decida o que é apropriado para o seu ambiente. Por exemplo, crie uma função para permitir que o Construtor de Imagens de VM leia imagens do grupo de recursos example-RG-1 e grave imagens no grupo de recursos example-RG-2.

Exemplo de função de imagem personalizada do Azure

O exemplo a seguir cria uma função do Azure para usar e distribuir uma imagem personalizada de origem. Em seguida, conceda a função personalizada à identidade gerenciada atribuída pelo usuário para o Construtor de Imagens de VM.

Para simplificar a substituição de valores no exemplo, primeiro defina as seguintes variáveis. Substitua as configurações de espaço reservado para definir suas variáveis.

Configuração Descrição
<ID da assinatura> Sua ID da assinatura do Azure.
<Grupo de recursos> Grupo de recursos para a imagem personalizada.
$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

Exemplo de função do Azure de rede virtual existente

O exemplo a seguir cria uma função do Azure para usar e distribuir uma imagem de rede virtual existente. Em seguida, conceda a função personalizada à identidade gerenciada atribuída pelo usuário para o Construtor de Imagens de VM.

Para simplificar a substituição de valores no exemplo, primeiro defina as seguintes variáveis. Substitua as configurações de espaço reservado para definir suas variáveis.

Configuração Descrição
<ID da assinatura> Sua ID da assinatura do Azure.
<Grupo de recursos> O grupo de recursos da rede virtual.
$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

Próximas etapas

Visão geral do Construtor de Imagens de VM do Azure