Início rápido: criar uma topologia de rede em malha com o Gerenciador de Rede Virtual do Azure usando o Bicep

Introdução ao Gerenciador de Rede Virtual do Azure usando o Bicep para gerenciar a conectividade de todas as suas redes virtuais.

Neste início rápido, você implanta três redes virtuais e usa o Gerenciador de Rede Virtual do Azure para criar uma topologia de rede em malha. Em seguida, verifique se a configuração de conectividade foi aplicada.

Diagrama dos recursos implantados para uma topologia de rede virtual de malha com o gerenciador de rede virtual do Azure.

A solução Bicep para esse exemplo é dividida em módulos para habilitar implantações em um grupo de recursos e no escopo da assinatura. As seções a seguir descrevem os componentes que são exclusivos do Gerenciador de Rede Virtual do Azure. Além desses componentes, a solução implanta redes virtuais, uma identidade atribuída pelo usuário e uma atribuição de funções.

Defina o recurso do gerenciador de rede virtual

Esse recurso cria a instância Microsoft.Network/networkManagers, na versão 2022-09-01 da API, que implementa o grupo de conectividade para conectividade entre redes virtuais. Defina networkManagerScopes para as assinaturas ou grupos de gerenciamento que a instância gerencia, e mantenha-o Connectivity para networkManagerScopeAccesses que a instância possa implantar configurações de conectividade.

@description('This is the Azure Virtual Network Manager which will be used to implement the connected group for inter-vnet connectivity.')
resource networkManager 'Microsoft.Network/networkManagers@2022-09-01' = {
  name: 'vnm-learn-prod-${location}-001'
  location: location
  properties: {
    networkManagerScopeAccesses: [
      'Connectivity'
    ]
    networkManagerScopes: {
      subscriptions: [
        '/subscriptions/${subscription().subscriptionId}'
      ]
      managementGroups: []
    }
  }
}

Defina grupos de redes estáticas e dinâmicas

A solução suporta um grupo de rede de membros estático ou um grupo de rede de membros dinâmico. O parâmetro networkGroupMembershipType determina qual deles será implantado; apenas um dos dois recursos é criado.

Grupo de rede de membros estáticos

O recurso estático do grupo de rede, Microsoft.Network/networkManagers/networkGroups na versão 2022-09-01da API, nomeia seus membros explicitamente. Os recursos aninhados staticMembers adicionam redes virtuais spoke A, B e C, além da rede virtual hub, por ID de recurso. Para direcionar suas próprias redes virtuais, altere os parâmetros spokeNetworkGroupMembers e hubVnetId.

@description('This is the static network group for the all VNETs.')
resource networkGroupSpokesStatic 'Microsoft.Network/networkManagers/networkGroups@2022-09-01' = if (networkGroupMembershipType == 'static') {
  name: 'ng-learn-prod-${location}-static001'
  parent: networkManager
  properties: {
    description: 'Network Group - Static'
  }

  // add spoke vnets A, B, and C to the static network group
  resource staticMemberSpoke 'staticMembers@2022-09-01' = [for spokeMember in spokeNetworkGroupMembers: if (contains(groupedVNETs,last(split(spokeMember,'/')))) {
    name: 'sm-${(last(split(spokeMember, '/')))}'
    properties: {
      resourceId: spokeMember
    }
  }]

  resource staticMemberHub 'staticMembers@2022-09-01' = {
    name: 'sm-${(toLower(last(split(hubVnetId, '/'))))}'
    properties: {
      resourceId: hubVnetId
    }
  }
}

Grupo dinâmico de rede de membros

O recurso de grupo de rede dinâmica não declara membros. A membresia é preenchida pela definição do Azure Policy descrita em Definir a política dinâmica de membros.

@description('This is the dynamic group for all VNETs.')
resource networkGroupSpokesDynamic 'Microsoft.Network/networkManagers/networkGroups@2022-09-01' = if (networkGroupMembershipType == 'dynamic') {
  name: 'ng-learn-prod-${location}-dynamic001'
  parent: networkManager
  properties: {
    description: 'Network Group - Dynamic'
  }
}

Defina a configuração de conectividade da malha

O recurso de configuração de conectividade, Microsoft.Network/networkManagers/connectivityConfigurations na versão 2022-09-01da API , associa o grupo de rede à topologia da rede em malha. A appliesToGroups propriedade faz referência ao grupo de rede que você implantou, e você define connectivityTopology para Mesh.

@description('This connectivity configuration defines the connectivity between VNETs using Direct Connection. The hub will be part of the mesh, but gateway routes from the hub will not propagate to spokes.')
resource connectivityConfigurationMesh 'Microsoft.Network/networkManagers/connectivityConfigurations@2022-09-01' = {
  name: 'cc-learn-prod-${location}-mesh001'
  parent: networkManager
  properties: {
    description: 'Mesh connectivity configuration'
    appliesToGroups: [
      {
        networkGroupId: (networkGroupMembershipType == 'static') ? networkGroupSpokesStatic.id : networkGroupSpokesDynamic.id
        isGlobal: 'False'
        useHubGateway: 'False'
        groupConnectivity: 'DirectlyConnected'
      }
    ]
    connectivityTopology: 'Mesh'
    deleteExistingPeering: 'True'
    hubs: []
    isGlobal: 'False'
  }
}

Comprometa a configuração com um script de implantação

Para implantar a configuração no grupo de rede alvo, use um script de implantação que chama o Deploy-AzNetworkManagerCommit comando PowerShell. O script de implantação precisa de uma identidade com permissões suficientes para rodar o script PowerShell contra o gerenciador de rede virtual. O arquivo Bicep cria uma identidade gerenciada pelo usuário e concede a ele a função Colaborador no grupo de recursos de destino. Para mais informações sobre scripts de implantação e identidades associadas, veja Usar scripts de implantação em modelos do ARM.

O recurso a seguir é um recurso Microsoft.Resources/deploymentScripts na versão 2020-10-01 da API. Ele executa um script PowerShell inline que faz login com a identidade atribuída pelo usuário e chama Deploy-AzNetworkManagerCommit. Mude as propriedades azPowerShellVersion, retentionInterval, e timeout para sua própria implantação. Altere os valores passados por meio de arguments: o nome do gerenciador de rede, os locais de destino, as IDs de configuração, a ID da assinatura, o tipo de configuração e o nome do grupo de recursos.

@description('Create a Deployment Script resource to perform the commit/deployment of the Network Manager connectivity configuration.')
resource deploymentScript 'Microsoft.Resources/deploymentScripts@2020-10-01' = {
  name: deploymentScriptName
  location: location
  kind: 'AzurePowerShell'
  identity: {
    type: 'UserAssigned'
    userAssignedIdentities: {
      '${userAssignedIdentityId}': {}
    }
  }
  properties: {
    azPowerShellVersion: '8.3'
    retentionInterval: 'PT1H'
    timeout: 'PT1H'
    arguments: '-networkManagerName "${networkManagerName}" -targetLocations ${location} -configIds ${configurationId} -subscriptionId ${subscription().subscriptionId} -configType ${configType} -resourceGroupName ${resourceGroup().name}'
    scriptContent: '''
    param (
      # AVNM subscription id
      [parameter(mandatory=$true)][string]$subscriptionId,

      # AVNM resource name
      [parameter(mandatory=$true)][string]$networkManagerName,

      # string with comma-separated list of config ids to deploy. ids must be of the same config type
      [parameter(mandatory=$true)][string[]]$configIds,

      # string with comma-separated list of deployment target regions
      [parameter(mandatory=$true)][string[]]$targetLocations,

      # configuration type to deploy. must be either connectivity or securityadmin
      [parameter(mandatory=$true)][ValidateSet('Connectivity','SecurityAdmin')][string]$configType,

      # AVNM resource group name
      [parameter(mandatory=$true)][string]$resourceGroupName
    )
  
    $null = Login-AzAccount -Identity -Subscription $subscriptionId
  
    [System.Collections.Generic.List[string]]$configIdList = @()  
    $configIdList.addRange($configIds) 
    [System.Collections.Generic.List[string]]$targetLocationList = @() # target locations for deployment
    $targetLocationList.addRange($targetLocations)     
    
    $deployment = @{
        Name = $networkManagerName
        ResourceGroupName = $resourceGroupName
        ConfigurationId = $configIdList
        TargetLocation = $targetLocationList
        CommitType = $configType
    }
  
    try {
      Deploy-AzNetworkManagerCommit @deployment -ErrorAction Stop
    }
    catch {
      Write-Error "Deployment failed with error: $_"
      throw "Deployment failed with error: $_"
    }
    '''
    }
}

Defina a política dinâmica de associação

Quando você configura a implantação para usar a associação ao grupo de rede dynamic, a solução também implanta uma definição e uma atribuição de Política do Azure.

O recurso a seguir é um recurso Microsoft.Authorization/policyDefinitions da versão 2021-06-01 da API. Ele utiliza o Microsoft.Network.Data modo de política e o addToNetworkGroup efeito, que adicionam redes virtuais correspondentes ao grupo de redes identificado por networkGroupId. A regra de política corresponde às redes virtuais que contêm a tag _avnm_quickstart_deployment e que estão no grupo de recursos deste exemplo. Mude o nome da tag e o filtro do grupo de recursos na condição like para corresponder ao seu ambiente.

@description('This is a Policy definition for dynamic group membership')
resource policyDefinition 'Microsoft.Authorization/policyDefinitions@2021-06-01' = {
  name: uniqueString(networkGroupId)
  properties: {
    description: 'AVNM quickstart dynamic group membership Policy'
    displayName: 'AVNM quickstart dynamic group membership Policy'
    mode: 'Microsoft.Network.Data'
    policyRule: {
      if: {
        allof: [
          {
            field: 'type'
            equals: 'Microsoft.Network/virtualNetworks'
          }
          {
            // virtual networks must have a tag where the key is '_avnm_quickstart_deployment'
            field: 'tags[_avnm_quickstart_deployment]'
            exists: true
          }
          {
            // virtual network ids must include this sample's resource group ID - limiting the chance that dynamic membership impacts other vnets in your subscriptions
            field: 'id'
            like: '${subscription().id}/resourcegroups/${resourceGroupName}/*'
          }
        ]
      }
      then: {
        // 'addToNetworkGroup' is a special effect used by AVNM network groups
        effect: 'addToNetworkGroup'
        details: {
          networkGroupId: networkGroupId
        }
      }
    }
  }
}

Implantar a solução Bicep

Pré-requisitos de implementação

  • Uma conta do Azure com uma assinatura ativa. Crie uma conta gratuitamente.
  • Permissões para criar uma Definição de Política e uma Atribuição de Política no escopo da assinatura de destino. Você precisa dessas permissões ao usar o parâmetro networkGroupMembershipType=Dynamic de implantação para implantar os recursos de política necessários para associação ao Grupo de Rede. O padrão é static, que não implanta uma Política.
  • Todos os recursos nesta solução estão disponíveis no repositório GitHub Azure Exemplos. Você pode baixar a solução Bicep do repositório ou clonar o repositório para seu computador local.

Fazer o download da solução Bicep

  1. Baixe um arquivo ZIP do repositório de exemplo neste link.
  2. Extraia o arquivo ZIP baixado. No terminal, vá para o diretório extraído avnm-mesh-connected-group . Os arquivos Bicep para essa solução estão no bicep subdiretório.

Como alternativa, você pode usar git para clonar o repositório:

git clone https://github.com/Azure-Samples/avnm-mesh-connected-group
cd avnm-mesh-connected-group

Conectar-se ao Azure

Entre na sua conta do Azure e selecione sua assinatura

Para iniciar sua configuração, entrar na sua conta do Azure:

Connect-AzAccount

Em seguida, conecte-se à sua assinatura:

Set-AzContext -Subscription <subscription name or id>
Instalar módulo do Azure PowerShell

Instale o módulo Az.Network mais recente do Azure PowerShell usando este comando:

 Install-Module -Name Az.Network -RequiredVersion 5.3.0

Parâmetros de implantação

  • resourceGroupName: [obrigatório] O nome do grupo de recursos em que você deseja implantar o gerenciador de rede virtual e as redes virtuais de exemplo.
  • localização: [obrigatório] A localização em que os recursos serão implantados.
  • networkGroupMembershipType: [opcional] O tipo de associação do Grupo de Rede a ser implantado. O padrão é static, mas você pode usar dynamic para associação dinâmica de grupo.

Observação

Escolher a associação dinâmica de grupo implanta um Azure Policy para gerenciar a associação, o que requer mais permissões.

Implantação padrão com participação estática em grupo de rede

New-AzSubscriptionDeployment -Name avnm-mesh-connected-group -Location <deploymentLocation> -TemplateFile ./bicep/main.bicep -resourceGroupName <newOrExistingResourceGroup>

Implantação com pertencimento dinâmico a grupo de rede

Para usar Azure Policy para gerenciar dinamicamente a associação do grupo de rede, inclua o parâmetro networkGroupMembershipType de implantação com um valor de dynamic.

New-AzSubscriptionDeployment -Name avnm-mesh-connected-group -Location <deploymentLocation> -TemplateFile ./bicep/main.bicep -resourceGroupName <newOrExistingResourceGroup> -networkGroupMembershipType dynamic

Verificar a implantação da configuração

Use a seção Gerenciador de Rede de cada rede virtual para verificar se você implantou sua configuração:

  1. Acesse a rede virtual vnet-learn-prod-{location}-spoke001.

  2. Em Configurações, selecione Gerenciador de Rede.

  3. Na guia Configurações de conectividade, verifique se cc-learn-prod-{location}-mesh001 aparece na lista.

    Captura de tela de uma configuração de conectividade listada para uma rede virtual.

  4. Repita as etapas anteriores em vnet-learn-prod-{location}-spoke004– você deve ver que vnet-learn-prod-{location}-spoke004 foi excluída da configuração de conectividade.

Limpar os recursos

Se você não precisar mais Gerenciador de Rede Virtual do Azure e as redes virtuais associadas, remova-as excluindo o grupo de recursos e seus recursos.

  1. No portal do Azure, navegue até o grupo de recursos – resource-group.
  2. Selecione resource-group e selecione Excluir grupo de recursos.
  3. Em Excluir um grupo de recursos, confirme se deseja excluir inserindo o grupo de recursos na caixa de texto e selecione Excluir.
  4. Se você usou a Associação Dinâmica a Grupos de Rede, exclua a Definição e Atribuição de Política do Azure implantadas navegando até a Assinatura no portal e selecionando as Políticas. Em Políticas, localize a Atribuição nomeada AVNM quickstart dynamic group membership Policy e exclua-a e faça o mesmo para a Definição nomeada AVNM quickstart dynamic group membership Policy.

Próximas etapas

Agora que você criou uma instância Gerenciador de Rede Virtual do Azure, saiba como bloquear o tráfego de rede usando uma configuração de administrador de segurança: