Skip to main content

Konfigurieren von privaten Netzwerken mit von GitHub gehosteten Runnern in Ihrem Unternehmen

Erfahre, wie Du GitHub-gehostete Runner mit einem virtuellen Azure Privatnetzwerk konfigurierst.

Wer kann dieses Feature verwenden?

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

Konfigurieren eines Azure Privatnetzwerks für GitHub-gehostete Runner

Um GitHub-gehostete Runner mit Azure VNET zu verwenden, konfigurieren Sie zuerst Ihre Azure-Ressourcen. Erstellen Sie dann eine private Netzwerkkonfiguration in GitHub.

Die folgenden Vorgehensweisen begleiten Sie durch diese beiden Schritte.

Weitere Informationen zur Behebung häufiger Probleme bei der Nutzung von GitHub-gehosteten Runnern mit Azure VNET findest du unter “Problembehandlung bei einem Azure Privatnetzwerk für von GitHub gehostete Runner in Ihrem Unternehmen.“

Konfigurieren Ihrer Azure-Ressourcen

Sie verwenden ein Skript, um die Konfiguration Ihrer Azure-Ressourcen zu automatisieren.

Voraussetzungen

  • Verwenden Sie ein Azure-Konto mit der Subscription „Teilnehmerrolle“ und der „Netzwerkteilnehmerrolle“. Mit diesen Rollen können Sie den GitHub.Network-Ressourcenanbieter registrieren und das Subnetz delegieren. Weitere Informationen finden Sie unter Integrierte Azure-Rollen auf Microsoft Learn.

  • Um die Subnetze ordnungsgemäß den richtigen Benutzer*innen zuzuordnen, müssen NetworkSettings-Ressourcen von Azure in denselben Abonnements erstellt werden, in denen virtuelle Netzwerke erstellt werden.

  • Um die Ressourcenverfügbarkeit/Datenresidenz sicherzustellen, müssen Ressourcen in derselben Azure-Region erstellt werden.

  • Speichern Sie die folgende .bicep-Datei. Nennen Sie die Datei actions-nsg-deployment.bicep.

    Die bereitgestellte Datei .bicep enthält den minimalen Satz von Regeln für die Verwendung von -gehosteten Runnern mit Azure VNET. Sie müssen unter Umständen Regeln für Ihren spezifischen Anwendungsfall hinzufügen.

    Wenn du GitHub Enterprise Cloud with data residency verwendest, musst du im Abschnitt AllowOutBoundGitHub auch die ausgehenden IP-Adressbereiche für GHE.com angeben. Weitere Informationen finden Sie unter „Netzwerkdetails für GHE.com“.

    Hinweis: Als Alternative zur folgenden Datei kannst du die Kommunikation zwischen GitHub Actions und den Runnern auch ermöglichen, indem du dieselben Firewalldomänen zulässt, die für das Kommunizieren zwischen selbst gehosteten Runnern und GitHub Enterprise Cloud benötigt werden. Weitere Informationen findest du unter Informationen zu selbstgehosteten Runnern. Um den geeigneten Subnetz-IP-Adressbereich zu ermitteln, empfehlen wir, einen Puffer von 30 % zur erwarteten maximalen Auftragsparallelität hinzuzufügen. Wenn die Runner deiner Netzwerkkonfiguration beispielsweise auf eine maximale Parallelität von 300 Jobs festgelegt sind, empfiehlt es sich, einen Subnetz-IP-Adressbereich zu verwenden, der mindestens 390 Runner aufnehmen kann. Dieser Puffer stellt sicher, dass dein Netzwerk unerwartete Erhöhungen der VM verarbeiten kann, um die Job-Parallelität zu erfüllen, ohne dass keine IP-Adressen mehr vorhanden sind.

    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: '*'
              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: '*'
              sourceAddressPrefix: '*'
              access: 'Allow'
              priority: 220
              direction: 'Outbound'
              destinationAddressPrefixes: [
                '140.82.112.0/20'
                '140.82.112.33/32'
                '140.82.112.34/32'
                '140.82.113.33/32'
                '140.82.113.34/32'
                '140.82.114.33/32'
                '140.82.114.34/32'
                '140.82.121.33/32'
                '140.82.121.34/32'
                '143.55.64.0/20'
                '185.199.108.0/22'
                '192.30.252.0/22'
                '192.30.255.164/31'
                '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: '*'
              sourceAddressPrefix: '*'
              destinationAddressPrefix: 'Storage'
              access: 'Allow'
              priority: 230
              direction: 'Outbound'
              destinationAddressPrefixes: []
            }
          }
        ]
      }
    }
    

1. Rufen Sie databaseId für Ihr Unternehmen ab

Sie können die folgende GraphQL-Abfrage verwenden, um die databaseId Ihres Unternehmens abzurufen. Sie verwenden das Unternehmen databaseId für den Wert der DATABASE_ID-Umgebungsvariablen im nächsten Schritt. Weitere Informationen über die Arbeit mit GraphQL finden Sie unter Erstellen von Aufrufen mit GraphQL.

AbfragevariableBeschreibung
slugDer Slug für dein Unternehmenskonto. Du findest ihn in der URL für dein Unternehmen: https://github.com/enterprises/SLUG.
query(
  $slug: String!
){
  enterprise (slug: $slug)
  {
    slug
    databaseId
  }
}
'
Variables
{
  "slug": "ENTERPRISE_SLUG"
}

Alternativ können Sie den folgenden Curl-Befehl verwenden, um Ihr databaseId zu finden.

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. Verwenden Sie einen Skript zum Konfigurieren Ihrer Azure-Ressourcen

Verwenden Sie das folgende Skript, um ein Subnetz für ein privates Azure-Netzwerk einzurichten. Im Skript werden alle erforderlichen Ressourcen in derselben Ressourcengruppe erstellt.

Um das Skript zu verwenden, füllen Sie die Platzhalterumgebungsvariablenwerte mit den tatsächlichen Werten aus, und führen Sie das Skript aus einer Bash-Shell oder Windows-Subsystem für Linux aus.

Note

  • Führen Sie den folgenden Skript im gleichen Verzeichnis aus, in dem Sie die Datei actions-nsg-deployment.bicep gespeichert haben.
  • Verwenden Sie beim Festlegen der Umgebungsvariablen YOUR_AZURE_LOCATION den Namen Ihrer Region. Dieser Wert unterscheidet sich von dem Anzeigenamen Ihrer Region. Um eine Liste der Namen und Anzeigenamen anzuzeigen, verwenden Sie az account list-locations -o table.
  • Wenn Sie die Netzwerkeinstellungsressource erstellen, wird eine Dienstzuordnungsverknüpfung auf das von Ihnen bereitgestellte Subnetz angewendet. Diese Verknüpfung verhindert das versehentliche Löschen des Subnetzes, während es von GitHub Actions verwendet wird.
  • Wenn Sie dieses Skript so anpassen, dass Netzwerkressourcen in vorhandenen Subnetzen verwendet werden, müssen Sie sicherstellen, dass die mit dem Subnetz verbundenen vorhandenen Netzwerkschnittstellen (NICs) gelöscht werden, bevor das Subnetz an den GitHub Actions-Dienst delegiert wird. Andernfalls kann der Dienst den Dienstzuordnungslink nicht auf das Subnetz anwenden.
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

Das Skript gibt die vollständige Payload für die erstellte Ressource zurück. Der in der Payload für die erstellte Ressource zurückgegebene GitHubId-Hashwert ist die ID der Netzwerkeinstellungsressource, die Sie in den nächsten Schritten beim Konfigurieren der Netzwerkkonfiguration mit GitHub verwenden.

Erstellen einer Netzwerkkonfiguration für Ihr Unternehmen in GitHub

Nachdem du deine Azure-Ressourcen konfiguriert hast, kannst du ein virtuelles Azure-Netzwerk (VNET) für private Netzwerke verwenden, indem du eine Netzwerkkonfiguration auf Unternehmens- oder Organisationsebene erstellst. Anschließend kannst du diese Netzwerkkonfiguration Runnergruppen zuordnen. Weitere Informationen zu Runnergruppen findest du unter Steuern des Zugriffs auf größere Runner.

Sobald die Netzwerkkonfiguration einer Runnergruppe zugeordnet ist, haben alle Runner in dieser Gruppe Zugriff auf das Azure-VNET, das mit der zugrunde liegenden Konfiguration verbunden wurde.

Voraussetzungen

Stellen Sie sicher, dass Ihre Azure-Ressourcen konfiguriert wurden, bevor Sie eine Netzwerkkonfiguration in GitHub hinzufügen. Weitere Informationen finden Sie unter Konfigurieren von privaten Netzwerken mit von GitHub gehosteten Runnern in Ihrem Unternehmen.

1. Füge eine neue Netzwerkkonfiguration für dein Unternehmen hinzu

  1. Klicken Sie in der oberen rechten Ecke von GitHub auf Ihr Profilfoto und dann auf Ihre Unternehmen.

  2. Klicke in der Liste der Unternehmen auf das Unternehmen, das du anzeigen möchtest.

  3. Klicken Sie auf der linken Seite der Seite in der Randleiste des Enterprise-Kontos auf Einstellungen.

  4. Klicke in der linken Seitenleiste auf Gehostetes-Compute-Netzwerk.

  5. Klicke auf die Dropdownliste Neue Netzwerkkonfiguration. Klicke dann auf das private Azure-Netzwerk.

  6. Überprüfe dann die Konfiguration des Netzwerks.

  7. Klicke auf Azure Virtual Network hinzufügen.

  8. Gib Popupfenster die Ressourcen-ID der Netzwerkeinstellungen ein, die Du abgerufen haben, als Du Deine Azure-Ressourcen für private Netzwerke konfiguriert hast.

  9. Klicke auf Azure Virtual Network hinzufügen.

2. Erstelle eine Runnergruppe für dein Unternehmen.

Hinweis: Damit die Runnergruppe für Repositorys in Ihren Organisationen zugänglich ist, müssen diese Repositorys auf Organisationsebene auf diese Runnergruppe zugreifen können. Weitere Informationen findest du unter Steuern des Zugriffs auf größere Runner.

  1. Erstelle eine neue Runnergruppe für dein Unternehmen. Weitere Informationen zum Erstellen einer Runnergruppe findest du unter Steuern des Zugriffs auf größere Runner.
  2. Wenn du eine Richtlinie für den Organisationszugriff auswählen möchtest, wähle das Dropdownmenü Organisationszugriff aus, und klicke auf eine Richtlinie. Du kannst eine Runnergruppe so konfigurieren, dass nur eine bestimmte Liste von Organisationen oder alle Organisationen im Unternehmen darauf zugreifen können.
  3. Verwende beim Konfigurieren deiner Läufergruppe unter „Netzwerkkonfigurationen“ das Dropdownmenü, um die Netzwerkkonfiguration auszuwählen, die du für azure VNET erstellt hast.
  4. Klicke auf Gruppe erstellen, um die Gruppe zu erstellen und die Richtlinie anzuwenden.

3. Füge den von GitHub

gehosteten Runner zur Runnergruppe des Unternehmens hinzu

Hinweis: Wenn du deinen von GitHub gehosteten Runner zu einer Runnergruppe hinzufügst, wähle die Runnergruppe aus, die du in den vorherigen Verfahren erstellt hast.

  1. Füge den von GitHub gehosteten Runner zur Runnergruppe hinzu. Weitere Informationen findest du unter Verwalten größerer Runner.

4. Optional können Sie die Netzwerkkonfigurationen verwalten

  1. Klicken Sie in der oberen rechten Ecke von GitHub auf Ihr Profilfoto und dann auf Ihre Unternehmen.

  2. Klicke in der Liste der Unternehmen auf das Unternehmen, das du anzeigen möchtest.

  3. Klicken Sie auf der linken Seite der Seite in der Randleiste des Enterprise-Kontos auf Einstellungen.

  4. Klicke in der linken Seitenleiste auf Gehostetes-Compute-Netzwerk.

  5. Um eine Netzwerkkonfiguration zu bearbeiten, klicken Sie rechts neben der Netzwerkkonfiguration auf . Klicken Sie dann auf „Konfiguration bearbeiten“.

  6. Um eine Netzwerkkonfiguration zu deaktivieren, klicken Sie rechts neben der Netzwerkkonfiguration auf . Klicken Sie dann auf „Deaktivieren“.

  7. Um eine Netzwerkkonfiguration zu löschen, klicken Sie rechts neben der Netzwerkkonfiguration auf . Klicken Sie dann auf Löschen.

Aktivieren der Erstellung von Netzwerkkonfigurationen für Organisationen

Du kannst Organisationsbesitzer*innen in einem Unternehmen erlauben, eigene Netzwerkkonfigurationen auf Organisationsebene zu erstellen.

  1. Klicken Sie in der oberen rechten Ecke von GitHub auf Ihr Profilfoto und dann auf Ihre Unternehmen.

  2. Klicke in der Liste der Unternehmen auf das Unternehmen, das du anzeigen möchtest.

  3. Klicken Sie auf der linken Seite der Seite in der Randleiste des Enterprise-Kontos auf Richtlinien

  4. Klicke auf Hostcomputer-Netzwerke.

  5. Klicke unter „Gehostetes Computenetzwerk“ auf „Aktivieren“.

  6. Klicken Sie auf Speichern.

Löschen eines Subnetzes

Wenn Sie die Netzwerkeinstellungsressource erstellen, wird eine Dienstzuordnungsverknüpfung auf das von Ihnen bereitgestellte Subnetz angewendet. Diese Verknüpfung verhindert das versehentliche Löschen des Subnetzes, während es von GitHub Actions verwendet wird.

Um das Subnetz zu löschen, muss diese Dienstzuordnungsverknüpfung zuerst entfernt werden. Die Dienstzuordnungsverknüpfung wird automatisch sicher entfernt, sobald die Netzwerkeinstellungsressource gelöscht wird.

Um die Netzwerkeinstellungsressource zu löschen, muss die Netzwerkkonfiguration, die sie verwendet, zuerst gelöscht werden.

  1. Klicken Sie in der oberen rechten Ecke von GitHub auf Ihr Profilfoto und dann auf Ihre Unternehmen.

  2. Klicke in der Liste der Unternehmen auf das Unternehmen, das du anzeigen möchtest.

  3. Klicken Sie auf der linken Seite der Seite in der Randleiste des Enterprise-Kontos auf Einstellungen.

  4. Klicke in der linken Seitenleiste auf Gehostetes-Compute-Netzwerk.

  5. Öffnen Sie die Netzwerkkonfiguration, die das zu löschende Subnetz verwendet.

  6. Überprüfen Sie die Liste der Runner-Gruppen mithilfe der Netzwerkkonfiguration.

  7. Klicken Sie rechts oben auf die Schaltfläche „“. Klicken Sie dann auf Konfiguration löschen.

  8. Um die Netzwerkeinstellungsressource zu löschen und den Dienstzuordnungslink zu entfernen, verwenden Sie ihre eigenen Eingaben mit folgenden Befehlen mit der Azure CLI. Weitere Informationen finden Sie in der Dokumentation der Azure-Befehlszeilenschnittstelle (Command-Line Interface, 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. Löschen Sie das Subnetz in Azure. Weitere Informationen finden Sie unter Löschen eines Subnetzes auf Microsoft Learn.