Skip to main content

Configuración de redes privadas para los ejecutores hospedados en GitHub en su empresa

Aprenda a usar ejecutores hospedados GitHub con una red privada Azure.

¿Quién puede utilizar esta característica?

Enterprise owners can configure private networking for GitHub-hosted runners at the enterprise level.

Acerca de la red privada de Azure para los ejecutores hospedados en GitHub

Para usar ejecutores hospedados en GitHub con VNET de Azure, primero configure los recursos de Azure. A continuación, cree una configuración de red privada en GitHub.

Los siguientes procedimientos le guiarán a través de ambos pasos.

Para más información sobre cómo solucionar problemas comunes con el uso de ejecutores hospedados por GitHub con VNET de Azure, consulte "Solución de problemas de configuraciones de red privada de Azure para ejecutores hospedados en GitHub en su empresa".

Configuración de recursos de Azure

Usará un script para automatizar la configuración de los recursos de Azure.

Requisitos previos

  • Use una cuenta de Azure con el rol de colaborador de la suscripción y el rol de colaborador de red. Estos roles permiten registrar el proveedor de recursos GitHub.Network y delegar la subred. Para más información, consulta Roles integrados de Azure en Microsoft Learn.

  • Para asociar correctamente las subredes con el usuario adecuado, los recursos de NetworkSettings de Azure se deben crear en las mismas suscripciones en las que se crean las redes virtuales.

  • Para garantizar la disponibilidad de recursos o la residencia de datos, los recursos deben crearse en la misma región de Azure.

  • Guarde el siguiente archivo .bicep. Asigne al archivo el nombre actions-nsg-deployment.bicep.

    Nota: Como alternativa, para permitir que los GitHub Actions se comunique con los ejecutores, puede permitir los mismos dominios de firewall necesarios para la comunicación entre ejecutores autohospedados y GitHub Enterprise Cloud. Para obtener más información, vea «Acerca de los ejecutores autohospedados».

    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: 'TCP'
              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: 'TCP'
              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.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.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'
              ]
            }
          }
          {
            name: 'AllowStorageOutbound'
            properties: {
              protocol: '*'
              sourcePortRange: '*'
              destinationPortRange: '*'
              sourceAddressPrefix: '*'
              destinationAddressPrefix: 'Storage'
              access: 'Allow'
              priority: 230
              direction: 'Outbound'
              destinationAddressPrefixes: []
            }
          }
          {
            name: 'DenyInternetOutBoundOverwrite'
            properties: {
              protocol: '*'
              sourcePortRange: '*'
              destinationPortRange: '*'
              sourceAddressPrefix: '*'
              destinationAddressPrefix: 'Internet'
              access: 'Deny'
              priority: 400
              direction: 'Outbound'
            }
          }
        ]
      }
    }
    

1. Obtenga el databaseId para su empresa

Puede usar la siguiente consulta de GraphQL para recuperar su empresa databaseId. Usará la empresa databaseId para el valor de la variable de entorno DATABASE_ID en el paso siguiente. Para más información sobre cómo trabajar con GraphQL, consulta "Formar llamados con GraphQl".

Variable de consultaDescripción
slugEl slug de aplicación de la cuenta empresarial, que puedes identificar examinando la dirección URL de tu empresa, https://github.com/enterprises/SLUG.
query(
  $slug: String!
){
  enterprise (slug: $slug)
  {
    slug
    databaseId
  }
}
'
Variables
{
  "slug": "ENTERPRISE_SLUG"
}

De forma alternativa, puede usar el siguiente comando curl para buscar su databaseId.

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

2. Use un script para configurar los recursos de Azure

Use el siguiente script para configurar una subred para redes privadas de Azure. El script crea todos los recursos en el mismo grupo de recursos.

Para usar el script, rellene los valores de la variable de entorno de marcador de posición con los valores reales y ejecute el script desde un shell de Bash o Subsistema de Windows para Linux.

Notas:

  • Ejecute el siguiente script en el mismo directorio donde guardó el archivo actions-nsg-deployment.bicep.
  • Al establecer la variable de entorno YOUR_AZURE_LOCATION, use el nombre de la región. Este valor es diferente del nombre para mostrar de la región. Para ver una lista de nombres y nombres para mostrar, use az account list-locations -o table.
  • Al crear el recurso de configuración de red, se aplica un vínculo de asociación de servicio a la subred que proporcione. Este vínculo evita la eliminación accidental de la subred mientras se usa en el servicio GitHub Actions.
  • Si personaliza esta secuencia de comandos para usar recursos de red en subredes existentes, debe asegurarse de que las interfaces de red existentes (NIC) conectadas a la subred se eliminan antes de que la subred se delegue al servicio GitHub Actions. De lo contrario, el servicio no podrá aplicar el vínculo de asociación de servicio a la subred.
Bash
#!/bin/bash

# This script creates the following resources in the specified subscription:
# - Resource group
# - Network Security Group rules
# - Virtual network (vnet) and subnet
# - Network Settings with specified subnet and GitHub Enterprisedatabase ID
#
# It also registers the `GitHub.Network` resource provider with the subscription,
# delegates the created subnet to the Actions service via the `GitHub.Network/NetworkSettings`
# resource type, and applies the NSG rules to the created subnet.

# stop on failure
set -e

#set environment
export AZURE_LOCATION=YOUR_AZURE_LOCATION
export SUBSCRIPTION_ID=YOUR_SUBSCRIPTION_ID
export RESOURCE_GROUP_NAME=YOUR_RESOURCE_GROUP_NAME
export VNET_NAME=YOUR_VNET_NAME
export SUBNET_NAME=YOUR_SUBNET_NAME
export NSG_NAME=YOUR_NSG_NAME
export NETWORK_SETTINGS_RESOURCE_NAME=YOUR_NETWORK_SETTINGS_RESOURCE_NAME
export DATABASE_ID=YOUR_DATABASE_ID

# These are the default values. You can adjust your address and subnet prefixes.
export ADDRESS_PREFIX=10.0.0.0/16
export SUBNET_PREFIX=10.0.0.0/24

echo
echo login to Azure
. az login --output none

echo
echo set account context $SUBSCRIPTION_ID
. az account set --subscription $SUBSCRIPTION_ID

echo
echo Register resource provider GitHub.Network
. az provider register --namespace GitHub.Network

echo
echo Create resource group $RESOURCE_GROUP_NAME at $AZURE_LOCATION
. az group create --name $RESOURCE_GROUP_NAME --location $AZURE_LOCATION

echo
echo Create NSG rules deployed with 'actions-nsg-deployment.bicep' file
. az deployment group create --resource-group $RESOURCE_GROUP_NAME --template-file ./actions-nsg-deployment.bicep --parameters location=$AZURE_LOCATION nsgName=$NSG_NAME

echo
echo Create vnet $VNET_NAME and subnet $SUBNET_NAME
. az network vnet create --resource-group $RESOURCE_GROUP_NAME --name $VNET_NAME --address-prefix $ADDRESS_PREFIX --subnet-name $SUBNET_NAME --subnet-prefixes $SUBNET_PREFIX

echo
echo Delegate subnet to GitHub.Network/networkSettings and apply NSG rules
. az network vnet subnet update --resource-group $RESOURCE_GROUP_NAME --name $SUBNET_NAME --vnet-name $VNET_NAME --delegations GitHub.Network/networkSettings --network-security-group $NSG_NAME

echo
echo Create network settings resource $NETWORK_SETTINGS_RESOURCE_NAME
. az resource create --resource-group $RESOURCE_GROUP_NAME  --name $NETWORK_SETTINGS_RESOURCE_NAME --resource-type GitHub.Network/networkSettings --properties "{ \"location\": \"$AZURE_LOCATION\", \"properties\" : {  \"subnetId\": \"/subscriptions/$SUBSCRIPTION_ID/resourceGroups/$RESOURCE_GROUP_NAME/providers/Microsoft.Network/virtualNetworks/$VNET_NAME/subnets/$SUBNET_NAME\", \"businessId\": \"$DATABASE_ID\" }}" --is-full-object --output table --query "{GitHubId:tags.GitHubId, name:name}" --api-version 2024-04-02

echo
echo To clean up and delete resources run the following command:
echo az group delete --resource-group $RESOURCE_GROUP_NAME

El script devolverá la carga completa del recurso creado. El valor hash de GitHubId devuelto en la carga útil del recurso creado es el identificador de recurso de configuración de red que usará en los pasos siguientes al configurar una opción de red en GitHub.

Creación de una configuración de red para su empresa en GitHub

Después de configurar los recursos de Azure, puede usar una instancia de Azure Virtual Network (VNET) para redes privadas mediante la creación de una configuración de red a nivel de empresa. A continuación, puede asociar esa configuración de red a grupos de ejecutores. Para más información acerca de los grupos de ejecutores, consulta "Control del acceso a los ejecutores más grandes."

Una vez asociada la configuración de red a un grupo de ejecutores, todos los ejecutores de ese grupo tendrán acceso a la red virtual de Azure que se ha conectado a la configuración subyacente.

Requisitos previos

Asegúrese de que los recursos de Azure se han configurado antes de agregar una configuración de red en GitHub. Para obtener más información, consulte "Configuración de redes privadas para los ejecutores hospedados en GitHub en su empresa".

1. Agregue una nueva configuración de red para su empresa

  1. En la esquina superior derecha de GitHub.com, haga clic en la imagen de perfil y después en Your enterprises.

  2. En la lista de empresas, da clic en aquella que quieras ver.

  3. En la barra lateral de la cuenta de empresa, haz clic en Configuración.

  4. En la barra lateral de la izquierda, haz clic en Red informática alojada.

  5. Haga clic en la lista desplegable Nueva configuración de red. A continuación, haga clic en Red privada de Azure.

  6. Aporte un nombre a la configuración de red.

  7. Haga clic en Agregar red virtual de Azure.

  8. En la ventana emergente, escriba el identificador de recurso de configuración de red que recuperó al configurar los recursos de Azure para redes privadas.

  9. Haga clic en Agregar red virtual de Azure.

2. Cree un grupo de ejecutores para su empresa

Nota: para que el grupo de ejecutores sea accesible por los repositorios de las organizaciones, dichos repositorios deben tener acceso a ese grupo de ejecutores a nivel de organización. Para obtener más información, vea «Control del acceso a los ejecutores más grandes».

  1. Cree un nuevo grupo de ejecutores para la empresa. Para más información acerca de cómo crear un grupo de ejecutores, consulte "Control del acceso a los ejecutores más grandes".

  2. Para elegir una directiva para el acceso de la organización, selecciona el menú desplegable Acceso de la organización y haz clic en una directiva. Puedes configurar un grupo de ejecutores para que sea accesible a una lista de organizaciones específica o a todas las organizaciones en la empresa.

  3. Al configurar el grupo de ejecutores, en "Configuraciones de red", use el menú desplegable para seleccionar la configuración de red que creó para la red virtual de Azure.

  4. Para crear el grupo y aplicar la directiva, haga clic en Crear grupo.

3. Agregue el ejecutor hospedado por GitHub al grupo de ejecutores de la empresa

Nota: Al agregar los datos del ejecutor hospedado en GitHub a un grupo de ejecutores, seleccione el grupo de ejecutores creado en los procedimientos anteriores.

  1. Agregue un ejecutor GitHub hospedado al grupo de ejecutores Para obtener más información, vea «Administración de ejecutores más grandes».

4. Opcionalmente, administrar configuraciones de red

  1. En la esquina superior derecha de GitHub.com, haga clic en la imagen de perfil y después en Your enterprises.

  2. En la lista de empresas, da clic en aquella que quieras ver.

  3. En la barra lateral de la cuenta de empresa, haz clic en Configuración.

  4. En la barra lateral de la izquierda, haga clic en Redes de equipo hospedadas.

  5. Para editar una configuración de red, a la derecha de la configuración de red, haga clic en . A continuación, haga clic en Editar configuración.

  6. Para deshabilitar una configuración de red, a la derecha de la configuración de red, haga clic en . Posteriormente, haga clic en Deshabilitar.

  7. Para eliminar una configuración de red, a la derecha de la configuración de red, haga clic en . Luego haga clic en Eliminar.

Eliminación de una subred

Al crear el recurso de configuración de red, se aplica un vínculo de asociación de servicio a la subred que proporcione. Este vínculo evita la eliminación accidental de la subred mientras se usa en el servicio GitHub Actions.

Para eliminar la subred, primero debe quitarse el vínculo de asociación de servicio. El vínculo de asociación de servicio se quita de forma segura y automática una vez se ha eliminado el recurso de configuración de red.

Para eliminar el recurso de configuración de red, primero debe eliminarse la configuración de red que la usa.

  1. En la esquina superior derecha de GitHub.com, haga clic en la imagen de perfil y después en Your enterprises.

  2. En la lista de empresas, da clic en aquella que quieras ver.

  3. En la barra lateral de la cuenta de empresa, haz clic en Configuración.

  4. En la barra lateral de la izquierda, haga clic en Redes de equipo hospedadas.

  5. Abra la configuración de red que usa la subred que desea eliminar.

  6. Revise la lista de grupos de ejecutores mediante la configuración de red.

  7. En la esquina superior derecha, haga clic en el botón "". A continuación, haga clic en Eliminar configuración.

  8. Para eliminar el recurso de configuración de red y quitar el vínculo de asociación de servicio, use sus propias entradas con los siguientes comandos con la CLI de Azure. Para más información, véase la documentación de la interfaz de la línea de comandos Azure (CLI).

    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 '2023-11-01-preview'
    
  9. Elimine la subred en Azure. Para más información, consulta Eliminación de una subred en Microsoft Learn.