Skip to main content

Configurando rede privada para executores hospedados no GitHub na sua organização

Saiba como usar executores hospedados pela GitHub com uma rede privada do Azure na sua organização.

Quem pode usar esse recurso?

Os proprietários da organização com o plano GitHub Team podem configurar a rede privada do Azure para executores hospedados da GitHub no nível da organização.

Sobre redes privadas do Azure com executores hospedados por GitHub

Para usar executores hospedados em GitHub com a VNET do Azure, primeiro configure seus recursos do Azure. Em seguida, crie uma configuração da rede privada em GitHub.

Os procedimentos a seguir guiarão você pelas etapas.

Para obter mais informações sobre como solucionar problemas comuns com o uso de executores hospedados em GitHub com o Azure VNET, consulte Resolução de problemas nas configurações de rede privada do Azure para runners hospedados pelo GitHub em sua organização.

Configurando seus recursos de Azure

Você usará um script para automatizar a configuração dos recursos do Azure.

Pré-requisitos

  • Use uma conta do Azure com a função Colaborador de Assinatura e a função Colaborador de Rede. Essas funções permitem registrar o provedor de recursos GitHub.Network e delegar a sub-rede. Para obter mais informações, consulte Funções internas do Azure no Microsoft Learn.

  • Para associar corretamente as sub-redes ao usuário certo, os recursos de NetworkSettings do Azure devem ser criados nas mesmas assinaturas onde as redes virtuais são criadas.

  • Para garantir a disponibilidade de recursos/residência de dados, os recursos devem ser criados na mesma região do Azure.

  • O tráfego de rede de saída da sub-rede não deve estar sujeito à interceptação TLS, pois nossas Máquinas Virtuais não serão configuradas para confiar em certificados intermediários que sua rede usa para executar a interceptação TLS. Para obter mais detalhes, consulte Certificados usados pelo Firewall do Azure Premium na documentação da Microsoft.

    Se você precisar usar a interceptação TLS, poderá instalar certificados intermediários por meio de uma imagem personalizada. Confira Usando imagens personalizadas.

  • Salve o seguinte arquivo .bicep. Dê o nome actions-nsg-deployment.bicep para o arquivo.

    O arquivo.bicep que fornecemos contém o conjunto mínimo de regras para usar executores hospedados na GitHub com a VNET do Azure. Pode ser necessário adicionar regras para seu caso de uso específico.

    Se você usar a GitHub Enterprise Cloud com residência de dados, na seção AllowOutBoundGitHub, também precisará incluir os intervalos de IP de entrada do GHE.com. Confira Detalhes de rede do GHE.com.

    Observação

    Como alternativa ao uso do arquivo a seguir, para permitir que o GitHub Actions se comunique com os executores, você pode permitir os mesmos domínios de firewall necessários para a comunicação entre os executores auto-hospedados e o GitHub. Para saber mais, confira Referência de executores auto-hospedados. Para determinar o intervalo de endereços IP de sub-rede apropriado, recomendamos adicionar um buffer de 30% à simultaneidade máxima de trabalho prevista. Por exemplo, se os executores da configuração de rede estiverem definidos para uma simultaneidade de trabalho máxima de 300, é recomendável utilizar um intervalo de endereços IP de sub-rede que possa acomodar pelo menos 390 executores. Esse buffer ajuda a garantir que sua rede possa lidar com aumentos inesperados nas necessidades de VM para atender à simultaneidade de trabalho sem ficar sem endereços IP.

    Bicep
    @description('NSG for outbound rules')
    param location string
    param nsgName string = 'actions_NSG'
    
    resource actions_NSG 'Microsoft.Network/networkSecurityGroups@2017-06-01' = {
      name: nsgName
      location: location
      properties: {
        securityRules: [
          {
            name: 'AllowVnetOutBoundOverwrite'
            properties: {
              protocol: 'TCP'
              sourcePortRange: '*'
              destinationPortRange: '443'
              sourceAddressPrefix: '*'
              destinationAddressPrefix: 'VirtualNetwork'
              access: 'Allow'
              priority: 200
              direction: 'Outbound'
              destinationAddressPrefixes: []
            }
          }
          {
            name: 'AllowOutBoundActions'
            properties: {
              protocol: '*'
              sourcePortRange: '*'
              destinationPortRange: '443'
              sourceAddressPrefix: '*'
              access: 'Allow'
              priority: 210
              direction: 'Outbound'
              destinationAddressPrefixes: [
                '4.175.114.51/32'
                '20.102.35.120/32'
                '4.175.114.43/32'
                '20.72.125.48/32'
                '20.19.5.100/32'
                '20.7.92.46/32'
                '20.232.252.48/32'
                '52.186.44.51/32'
                '20.22.98.201/32'
                '20.246.184.240/32'
                '20.96.133.71/32'
                '20.253.2.203/32'
                '20.102.39.220/32'
                '20.81.127.181/32'
                '52.148.30.208/32'
                '20.14.42.190/32'
                '20.85.159.192/32'
                '52.224.205.173/32'
                '20.118.176.156/32'
                '20.236.207.188/32'
                '20.242.161.191/32'
                '20.166.216.139/32'
                '20.253.126.26/32'
                '52.152.245.137/32'
                '40.118.236.116/32'
                '20.185.75.138/32'
                '20.96.226.211/32'
                '52.167.78.33/32'
                '20.105.13.142/32'
                '20.253.95.3/32'
                '20.221.96.90/32'
                '51.138.235.85/32'
                '52.186.47.208/32'
                '20.7.220.66/32'
                '20.75.4.210/32'
                '20.120.75.171/32'
                '20.98.183.48/32'
                '20.84.200.15/32'
                '20.14.235.135/32'
                '20.10.226.54/32'
                '20.22.166.15/32'
                '20.65.21.88/32'
                '20.102.36.236/32'
                '20.124.56.57/32'
                '20.94.100.174/32'
                '20.102.166.33/32'
                '20.31.193.160/32'
                '20.232.77.7/32'
                '20.102.38.122/32'
                '20.102.39.57/32'
                '20.85.108.33/32'
                '40.88.240.168/32'
                '20.69.187.19/32'
                '20.246.192.124/32'
                '20.4.161.108/32'
                '20.22.22.84/32'
                '20.1.250.47/32'
                '20.237.33.78/32'
                '20.242.179.206/32'
                '40.88.239.133/32'
                '20.121.247.125/32'
                '20.106.107.180/32'
                '20.22.118.40/32'
                '20.15.240.48/32'
                '20.84.218.150/32'
              ]
            }
          }
          {
            name: 'AllowOutBoundGitHub'
            properties: {
              protocol: '*'
              sourcePortRange: '*'
              destinationPortRange: '443'
              sourceAddressPrefix: '*'
              access: 'Allow'
              priority: 220
              direction: 'Outbound'
              destinationAddressPrefixes: [
                '140.82.112.0/20'
                '143.55.64.0/20'
                '185.199.108.0/22'
                '192.30.252.0/22'
                '20.175.192.146/32'
                '20.175.192.147/32'
                '20.175.192.149/32'
                '20.175.192.150/32'
                '20.199.39.227/32'
                '20.199.39.228/32'
                '20.199.39.231/32'
                '20.199.39.232/32'
                '20.200.245.241/32'
                '20.200.245.245/32'
                '20.200.245.246/32'
                '20.200.245.247/32'
                '20.200.245.248/32'
                '20.201.28.144/32'
                '20.201.28.148/32'
                '20.201.28.149/32'
                '20.201.28.151/32'
                '20.201.28.152/32'
                '20.205.243.160/32'
                '20.205.243.164/32'
                '20.205.243.165/32'
                '20.205.243.166/32'
                '20.205.243.168/32'
                '20.207.73.82/32'
                '20.207.73.83/32'
                '20.207.73.85/32'
                '20.207.73.86/32'
                '20.207.73.88/32'
                '20.217.135.1/32'
                '20.233.83.145/32'
                '20.233.83.146/32'
                '20.233.83.147/32'
                '20.233.83.149/32'
                '20.233.83.150/32'
                '20.248.137.48/32'
                '20.248.137.49/32'
                '20.248.137.50/32'
                '20.248.137.52/32'
                '20.248.137.55/32'
                '20.26.156.215/32'
                '20.26.156.216/32'
                '20.26.156.211/32'
                '20.27.177.113/32'
                '20.27.177.114/32'
                '20.27.177.116/32'
                '20.27.177.117/32'
                '20.27.177.118/32'
                '20.29.134.17/32'
                '20.29.134.18/32'
                '20.29.134.19/32'
                '20.29.134.23/32'
                '20.29.134.24/32'
                '20.87.245.0/32'
                '20.87.245.1/32'
                '20.87.245.4/32'
                '20.87.245.6/32'
                '20.87.245.7/32'
                '4.208.26.196/32'
                '4.208.26.197/32'
                '4.208.26.198/32'
                '4.208.26.199/32'
                '4.208.26.200/32'
                '4.225.11.196/32'
                '4.237.22.32/32'
              ]
            }
          }
          {
            name: 'AllowStorageOutbound'
            properties: {
              protocol: '*'
              sourcePortRange: '*'
              destinationPortRange: '443'
              sourceAddressPrefix: '*'
              destinationAddressPrefix: 'Storage'
              access: 'Allow'
              priority: 230
              direction: 'Outbound'
              destinationAddressPrefixes: []
            }
          }
        ]
      }
    }
    

1. Obtenha o databaseId para sua organização

Dica

Seu token exigirá, no mínimo, permissões de read:org para executar uma consulta bem-sucedida.

Você pode usar a consulta GraphQL a seguir para recuperar sua organização databaseId. Você usará o databaseId da organização para o valor da variável de ambiente DATABASE_ID na próxima etapa. Para saber mais sobre como trabalhar com GraphQL, confira Realizar chamadas com o GraphQL.

Variável da consultaDescrição
loginO logon da conta da sua organização, que você pode identificar observando a URL da sua organização, https://github.com/organizations/ORGANIZATION_LOGIN.
query(
  $login: String!
){
  organization (login: $login)
  {
    login
    databaseId
  }
}
'
Variables
{
  "login": "ORGANIZATION_LOGIN"
}

Como alternativa, pode usar o seguinte comando curl para localizar seu databaseId.

Shell
curl -H "Authorization: Bearer BEARER_TOKEN" -X POST \
  -d '{ "query": "query($login: String!) { organization (login: $login) { login databaseId } }" ,
        "variables": {
          "login": "ORGANIZATION_LOGIN"
        }
      }' \
https://api.github.com/graphql

Criando uma configuração da rede para sua empresa no GitHub

Depois de configurar seus recursos do Azure, use uma VNET (Rede Virtual) do Azure para a rede privada criando uma configuração de rede na organização. Em seguida, você pode associar essa configuração de rede a grupos de executores.

Depois que a configuração de rede estiver associada a um grupo de executores, todos os executores desse grupo terão acesso à VNET do Azure que foi conectada à configuração subjacente.

Pré-requisitos

Verifique se seus recursos do Azure foram configurados antes de adicionar uma configuração da rede em GitHub. Para saber mais, confira Configurando rede privada para executores hospedados no GitHub na sua organização.

1. Adicione uma nova configuração de rede para sua organização

  1. No canto superior direito de GitHub, clique na foto de perfil e clique em Your organizations.
  2. Ao lado da organização, clique em Configurações.
  3. Na barra lateral esquerda, clique em Rede de computação hospedada.
  4. Clique na lista suspensa Nova configuração de rede. Em seguida, clique em Azure rede privada.
  5. Dê um nome para a configuração da rede.
  6. Clique em Add Azure Virtual Network.
  7. Na janela pop-up, insira a ID do recurso de configurações de rede que você recuperou quando configurou seus recursos de Azure para rede privada.
  8. Clique em Add Azure Virtual Network.

2. Crie um grupo de corredores para sua organização

Observação

Para que o grupo de executores seja acessível pelos repositórios dentro de suas organizações, esses repositórios devem ter acesso a esse grupo de executores no nível da organização. Para saber mais, confira Como controlar o acesso a executores maiores.

  1. Crie um novo grupo de runners para sua organização. Para saber mais sobre como criar um grupo de runners, confira Como controlar o acesso a executores maiores.
  2. Para escolher uma política para o acesso ao repositório, selecione o menu suspenso Acesso ao repositório e clique em uma política. Você pode configurar um grupo de executores para ser acessível a uma lista específica de repositórios ou a todos os repositórios na organização.
  3. Ao configurar seu grupo de executores, em "Configurações de rede", use o menu suspenso para selecionar a configuração de rede criada para a VNET do Azure.
  4. Para criar o grupo e aplicar a política, clique em Criar grupo.

3. Adicione um executor hospedado pela GitHub

ao grupo de executores da organização

Observação

Ao adicionar seu runner hospedado em GitHub a um grupo de runners, selecione o grupo de runners que você criou nos procedimentos anteriores.

  1. Adicione um executor hospedado pela GitHub ao grupo de executores. Para saber mais, confira Gerenciar executores maiores.

4. Opcionalmente, gerencie configurações de rede

  1. No canto superior direito de GitHub, clique na foto de perfil e clique em Your organizations.
  2. Ao lado da organização, clique em Configurações.
  3. Na barra lateral esquerda, clique em Rede de computação hospedada.
  4. Para editar uma configuração de rede, à direita da configuração de rede, clique em . Em seguida, clique em Editar configuração.
  5. Para desabilitar uma configuração de rede, à direita da configuração de rede, clique em . Em seguida, clique em Desabilitar.
  6. Para excluir uma configuração de rede, à direita da configuração de rede, clique em . Em seguida, clique em Excluir.

Como excluir uma sub-rede

Quando você cria o recurso de configurações de rede, um link de associação de serviço é aplicado à sub-rede fornecida. Esse link evita a exclusão acidental da sub-rede durante seu uso pelo serviço GitHub Actions.

Antes da exclusão da sub-rede, o link de associação desse serviço precisa ser removido. O link de associação de serviço é removido com segurança automaticamente depois que o recurso de configurações de rede é excluído.

Para excluir o recurso de configurações de rede, a configuração da rede que o usa precisa ser excluída primeiro.

  1. No canto superior direito de GitHub, clique na foto de perfil e clique em Your organizations.

  2. Ao lado da organização, clique em Configurações.

  3. Na barra lateral esquerda, clique em Rede de computação hospedada.

  4. Abra a configuração de rede que está usando a sub-rede que você deseja excluir.

  5. Revise a lista de grupos de executores usando a configuração de rede.

  6. No canto superior direito, clique no botão "". Em seguida, clique em Excluir configuração.

  7. Para excluir o recurso de configurações de rede e remover o link de associação de serviço, use suas próprias entradas com os seguintes comandos com a CLI do Azure. Para obter mais informações, confira a documentação da CLI (interface de linha de comando) do Azure.

    Bash
    az account set --subscription $SUBSCRIPTION_ID
    az resource delete -g $RESOURCE_GROUP_NAME --name $NETWORK_SETTINGS_RESOURCE_NAME --resource-type 'GitHub.Network/networkSettings' --api-version $API_VERSION
    
  8. Exclua a sub-rede no Azure. Para obter informações, confira Excluir uma sub-rede no Microsoft Learn.