Zulassen des Zugriffs auf Azure Event Hubs-Namespaces aus bestimmten virtuellen Netzwerken

Die Integration von Event Hubs und VNET-Dienstendpunkten ermöglicht den sicheren Zugriff auf Messagingfunktionen für Workloads, z. B. an virtuelle Netzwerke (VNETs) gebundene virtuelle Computer, wobei der Pfad für den Netzwerkdatenverkehr an beiden Enden geschützt ist.

Nachdem die Konfiguration der Bindung an mindestens einen Dienstendpunkt des VNET-Subnetzes durchgeführt wurde, akzeptiert der entsprechende Event Hubs-Namespace nur noch Datenverkehr von autorisierten Subnetzen in virtuellen Netzwerken. Aus Sicht des virtuellen Netzwerks wird durch die Bindung eines Event Hubs-Namespace an einen Dienstendpunkt ein isolierter Netzwerktunnel vom Subnetz des virtuellen Netzwerks zum Messagingdienst konfiguriert.

Das Ergebnis ist eine private und isolierte Beziehung zwischen den Workloads, die an das Subnetz gebunden sind, und dem entsprechenden Event Hubs-Namespace, obwohl sich die beobachtbare Netzwerkadresse des Messaging-Dienstendpunkts in einem öffentlichen IP-Bereich befindet. Es gibt eine Ausnahme für dieses Verhalten. Durch die Aktivierung eines Dienstendpunkts wird standardmäßig die denyall-Regel in der IP-Firewall aktiviert, die dem virtuellen Netzwerk zugeordnet ist. Sie können bestimmte IP-Adressen in der IP-Firewall hinzufügen, um Zugriff auf den öffentlichen Event Hubs-Endpunkt zu ermöglichen.

Wichtige Punkte

  • Dieses Feature wird im Basic-Tarif nicht unterstützt.
  • Durch Aktivieren von virtuellen Netzwerken für Ihren Event Hubs-Namespace werden eingehende Anforderungen automatisch blockiert. Dies gilt nicht, wenn die Anforderungen von einem Dienst stammen, der in zulässigen virtuellen Netzwerken betrieben wird. Unter anderem werden Anforderungen von anderen Azure-Diensten, aus dem Azure-Portal und von Protokollierungs-/Metrikdiensten blockiert. Als Ausnahme können Sie bestimmten vertrauenswürdigen Diensten selbst dann den Zugriff auf Event Hubs-Ressourcen erlauben, wenn virtuelle Netzwerke aktiviert sind. Eine Liste der vertrauenswürdigen Dienste finden Sie unter Vertrauenswürdige Dienste.
  • Geben Sie mindestens eine IP-Regel oder VNET-Regel für den Namespace an, um nur Datenverkehr von den angegebenen IP-Adressen oder dem Subnetz eines virtuellen Netzwerks zuzulassen. Wenn keine IP- und VNET-Regeln vorliegen, kann (mithilfe des Zugriffsschlüssels) über das öffentliche Internet auf den Namespace zugegriffen werden.

Erweiterte Sicherheitsszenarien basierend auf der VNET-Integration

Lösungen, für die eine strikte und auf mehrere Bereiche aufgeteilte Sicherheit erforderlich ist und bei denen die VNET-Subnetze die Segmentierung zwischen den einzelnen aufgeteilten Diensten bereitstellen, benötigen weiterhin Kommunikationspfade zwischen den Diensten, die sich in diesen Bereichen befinden.

Für alle direkten IP-Routen zwischen den Bereichen (auch für HTTPS per TCP/IP) besteht die Gefahr, dass ab der Vermittlungsschicht Sicherheitsrisiken ausgenutzt werden. Bei Messagingdiensten werden isolierte Kommunikationspfade bereitgestellt, für die Nachrichten während des Übergangs zwischen Parteien sogar auf Datenträger geschrieben werden. Workloads in zwei einzelnen virtuellen Netzwerken, die beide an dieselbe Event Hubs-Instanz gebunden sind, können über Nachrichten effizient und zuverlässig kommunizieren, während die Integrität der jeweiligen Netzwerkisolationsgrenze aufrechterhalten wird.

Dies bedeutet, dass Ihre sicherheitsrelevanten Cloudlösungen nicht nur Zugriff auf zuverlässige und skalierbare Azure-Funktionen für asynchrones Messaging eines Branchenführers haben, sondern dass das Messaging jetzt auch genutzt werden kann, um Kommunikationspfade zwischen sicheren Lösungsbereichen zu erstellen. Diese sind deutlich sicherer als alle Optionen des Peer-to-Peer-Kommunikationsmodus, einschließlich HTTPS und andere per TLS geschützte Socketprotokolle.

Binden von Event Hubs an virtuelle Netzwerke

VNET-Regeln sind ein Feature für die Firewallsicherheit, mit dem gesteuert wird, ob Ihr Azure Event Hubs-Namespace Verbindungen eines bestimmten VNET-Subnetzes akzeptiert.

Das Binden eines Event Hubs-Namespace an ein virtuelles Netzwerk ist ein Prozess mit zwei Schritten. Zuerst müssen Sie einen VNET-Dienstendpunkt in einem Subnetz eines virtuellen Netzwerks erstellen und für Microsoft.EventHub aktivieren, wie im Artikel Übersicht über Dienstendpunkte beschrieben. Nachdem Sie den Dienstendpunkt hinzugefügt haben, binden Sie den Event Hubs-Namespace mit einer VNET-Regel daran.

Die VNET-Regel ist eine Zuordnung des Event Hubs-Namespace zu einem Subnetz eines virtuellen Netzwerks. Während die Regel vorhanden ist, wird allen Workloads, die an das Subnetz gebunden sind, Zugriff auf den Event Hubs-Namespace gewährt. Event Hubs selbst stellt niemals ausgehende Verbindungen her, muss keinen Zugriff erhalten und erhält daher niemals die Gewährung des Zugriffs auf Ihr Subnetz, indem diese Regel aktiviert wird.

Verwenden des Azure-Portals

Beim Erstellen eines Namespace können Sie entweder nur öffentlichen Zugriff (aus allen Netzwerken) oder nur privaten Zugriff (nur über private Endpunkte) auf den Namespace zulassen. Nachdem der Namespace erstellt wurde, können Sie den Zugriff von bestimmten IP-Adressen oder aus bestimmten virtuellen Netzwerken (mithilfe von Netzwerkdienstendpunkten) zulassen.

Konfigurieren des öffentlichen Zugriffs beim Erstellen eines Namespace

Um den öffentlichen Zugriff zu aktivieren, wählen Sie im Assistenten zum Erstellen von Namespaces auf der Seite Netzwerk die Option Öffentlicher Zugriff aus.

Screenshot showing the Networking page of the Create namespace wizard with Public access option selected.

Wählen Sie nach Erstellung des Namespace im linken Menü der Seite Service Bus-Namespace die Option Netzwerk aus. Sie sehen, dass die Option Alle Netzwerke ausgewählt ist. Sie können die Option Ausgewählte Netzwerke auswählen und den Zugriff von bestimmten IP-Adressen oder bestimmten virtuellen Netzwerken zulassen. Im nächsten Abschnitt finden Sie Details zur Angabe der Netzwerke, von denen aus der Zugriff zulässig sein soll.

Konfigurieren ausgewählter Netzwerke für einen vorhandenen Namespace

In diesem Abschnitt erfahren Sie, wie Sie mit dem Azure-Portal einen VNET-Dienstendpunkt hinzufügen. Zum Beschränken des Zugriffs müssen Sie den VNET-Dienstendpunkt für diesen Event Hubs-Namespace integrieren.

  1. Navigieren Sie im Azure-Portal zu Ihrem Event Hubs-Namespace.

  2. Wählen Sie im linken Menü unter Einstellungen die Option Netzwerk aus.

  3. Auf der Seite Netzwerk können Sie für Zugriff über öffentliche Netzwerke eine der folgenden drei Optionen festlegen. Wählen Sie die Option Ausgewählte Netzwerke aus, um Zugriff aus bestimmten virtuellen Netzwerken zu erlauben.

    Hier finden Sie weitere Details zu den Optionen, die auf der Seite Öffentlicher Netzwerkzugriff zur Verfügung stehen:

    • Deaktiviert. Mit dieser Option wird jeglicher öffentliche Zugriff auf den Namespace deaktiviert. Auf den Namespace kann nur über private Endpunkte zugegriffen werden.

    • Ausgewählte Netzwerke: Diese Option ermöglicht den öffentlichen Zugriff auf den Namespace unter Verwendung eines Zugriffsschlüssels aus ausgewählten Netzwerken.

      Wichtig

      Wenn Sie Ausgewählte Netzwerke auswählen, fügen Sie mindestens eine IP-Firewallregel oder ein virtuelles Netzwerk hinzu, das Zugriff auf den Namespace hat. Wählen Sie Deaktiviert, wenn Sie den gesamten Datenverkehr an diesen Namespace auf private Endpunkte beschränken möchten.

    • Alle Netzwerke (Standardeinstellung): Diese Option ermöglicht den öffentlichen Zugriff aus allen Netzwerken mit einem Zugriffsschlüssel. Wenn Sie die Option Alle Netzwerke auswählen, akzeptiert der Event Hub Verbindungen von beliebigen IP-Adressen (mit dem Zugriffsschlüssel). Diese Einstellung entspricht einer Regel, bei der der IP-Adressbereich 0.0.0.0/0 zulässig ist.

  4. Um den Zugriff auf bestimmte Netzwerke zu beschränken, wählen Sie die Option Ausgewählte Netzwerke am Anfang der Seite aus, sofern sie noch nicht ausgewählt wurde.

  5. Wählen Sie im Abschnitt Virtuelle Netzwerke der Seite die Option + Vorhandenes virtuelles Netzwerk hinzufügen* aus. Wählen Sie + Neues virtuelles Netzwerk erstellen aus, wenn Sie ein neues VNET erstellen möchten.

    Selection of Add existing virtual network menu item.

    Wichtig

    Wenn Sie Ausgewählte Netzwerke auswählen, fügen Sie mindestens eine IP-Firewallregel oder ein virtuelles Netzwerk hinzu, das Zugriff auf den Namespace hat. Wählen Sie Deaktiviert, wenn Sie den gesamten Datenverkehr an diesen Namespace auf private Endpunkte beschränken möchten.

  6. Wählen Sie in der Liste mit den virtuellen Netzwerken das virtuelle Netzwerk und anschließend das Subnetz aus. Sie müssen den Dienstendpunkt aktivieren, bevor Sie das virtuelle Netzwerk der Liste hinzufügen. Wenn der Dienstendpunkt nicht aktiviert ist, erhalten Sie im Portal eine entsprechende Eingabeaufforderung zur Aktivierung.

    Image showing the selection of a subnet.

  7. Die folgende Erfolgsmeldung sollte angezeigt werden, nachdem der Dienstendpunkt für das Subnetz für Microsoft.EventHub aktiviert wurde. Wählen Sie unten auf der Seite die Option Hinzufügen aus, um das Netzwerk hinzuzufügen.

    Image showing the selection of a subnet and enabling an endpoint.

    Hinweis

    Falls Sie den Dienstendpunkt nicht aktivieren können, können Sie den fehlenden VNET-Dienstendpunkt ignorieren und die Resource Manager-Vorlage verwenden. Diese Funktionalität ist nicht im Portal verfügbar.

  8. Wählen Sie unter Vertrauenswürdigen Microsoft-Diensten die Umgehung dieser Firewall erlauben? die Option „Ja“ oder „Nein“ aus. Weitere Informationen finden Sie unter Vertrauenswürdige Microsoft-Dienste.

  9. Wählen Sie auf der Symbolleiste Speichern aus, um die Einstellungen zu speichern. Warten Sie einige Minuten, bis die Bestätigung in den Portalbenachrichtigungen angezeigt wird.

    Image showing the saving of virtual network.

    Hinweis

    Informationen, wie Sie den Zugriff auf bestimmte IP-Adressen oder -Adressbereiche beschränken, finden Sie unter Zulassen des Zugriffs von bestimmten IP-Adressen oder -Adressbereichen.

Vertrauenswürdige Microsoft-Dienste

Wenn Sie die Einstellung Vertrauenswürdigen Microsoft-Diensten die Umgehung dieser Firewall erlauben aktivieren, wird den folgenden Diensten im gleichen Mandanten Zugriff auf Ihre Event Hubs-Ressourcen gewährt.

Vertrauenswürdiger Dienst Unterstützte Verwendungsszenarien
Azure Event Grid Ermöglicht Azure Event Grid das Senden von Ereignissen an Event Hubs in Ihrem Event Hubs-Namespace. Sie müssen außerdem die folgenden Schritte ausführen:
  • Aktivieren der vom System zugewiesenen Identität für ein Thema oder eine Domäne
  • Hinzufügen der Identität der Rolle „Azure Event Hubs-Datenabsender“ für den Event Hubs-Namespace
  • Konfigurieren Sie dann das Ereignisabonnement, das einen Event Hub als Endpunkt verwendet, um die vom System zugewiesene Identität zu verwenden.

Weitere Informationen finden Sie unter Ereignisübermittlung mit einer verwalteten Identität.

Azure Stream Analytics Ermöglicht einem Azure Stream Analytics-Auftrag das Lesen von Daten von Event Hubs für Eingaben bzw. das Schreiben von Daten in Event Hubs für Ausgaben in Ihrem Event Hubs-Namespace.

Wichtig: Der Stream Analytics-Auftrag sollte so konfiguriert werden, dass er eine verwaltete Identität für den Zugriff auf den Event Hub verwendet. Weitere Informationen finden Sie unter Verwenden von verwalteten Identitäten für den Zugriff auf den Event Hub aus einem Azure Stream Analytics-Auftrag (Vorschau).

Azure IoT Hub Ermöglicht IoT Hub das Senden von Nachrichten an Event Hubs in Ihrem Event Hubs-Namespace. Sie müssen außerdem die folgenden Schritte ausführen:
  • Aktivieren der systemseitig zugewiesenen Identität für Ihren IoT-Hub
  • Fügen Sie die Identität der Rolle „Azure Event Hubs-Datensender“ im Event Hubs-Namespace hinzu.
  • Konfigurieren Sie dann die IoT Hub-Instanz, die einen Event Hub als benutzerdefinierten Endpunkt nur Nutzung der identitätsbasierten Authentifizierung verwendet.
Azure API Management

Mit dem API Management-Dienst können Sie Ereignisse an einen Event Hub im Event Hubs-Namespace senden.

Azure Monitor (Diagnoseeinstellungen und Aktionsgruppen) Ermöglicht Azure Monitor das Senden von Diagnoseinformationen und Warnungsbenachrichtigungen an Event Hubs in Ihrem Event Hubs-Namespace. Azure Monitor kann Daten aus dem Event Hub lesen und in den Event Hub schreiben.
Azure Synapse Ermöglicht Azure Synapse, mithilfe der verwalteten Identität des Synapse-Arbeitsbereichs eine Verbindung mit dem Event Hub herzustellen. Fügen Sie die Rolle Azure Event Hubs-Datensender, -Datenempfänger oder -Datenbesitzer zur Identität im Event Hubs-Namespace hinzu.
Azure-Daten-Explorer Ermöglicht Azure Data Explorer den Empfang von Ereignissen von Event Hub mithilfe der verwalteten Identität des Clusters. Sie müssen dann die folgenden Schritte ausführen:
  • Konfigurieren der verwalteten Identität in Azure Data Explorer
  • Erteilen der Identität im Event Hub die Rolle Azure Event Hubs-Datenempfänger.
 
Azure IoT Central

Ermöglicht IoT Central das Exportieren von Daten zu Event Hubs in Ihrem Event Hubs-Namespace. Sie müssen außerdem die folgenden Schritte ausführen:

  • Aktivieren Sie die systemseitig zugewiesene Identität für Ihre IoT Central-Anwendung.
  • Fügen Sie die Identität der Rolle Azure Event Hubs-Datensender im Event Hubs-Namespace hinzu.
  • Konfigurieren Sie dann das Event Hubs-Exportziel in Ihrer IoT Central-Anwendung, um die identitätsbasierte Authentifizierung zu verwenden.
Azure Health Data Services Ermöglicht dem IoT-Connector von Healthcare APIs, medizinische Gerätedaten aus Ihrem Event Hubs-Namensraum zu erfassen und die Daten in Ihrem konfigurierten Fast Healthcare Interoperability Resources (FHIR®)-Dienst zu speichern. Der IoT-Connector sollte so konfiguriert werden, dass er eine verwaltete Identität für den Zugriff auf den Event Hub verwendet. Weitere Informationen finden Sie unter Erste Schritte mit dem IoT-Connector – Azure Healthcare-APIs.
Azure Digital Twins Ermöglicht Azure Digital Twins das Auslesen von Daten zu Event Hubs in Ihrem Event Hubs-Namespace. Sie müssen außerdem die folgenden Schritte ausführen:

  • Aktivieren Sie die systemseitig zugewiesene Identität für Ihre Azure Digital Twins-Instanz.
  • Fügen Sie die Identität der Rolle Azure Event Hubs-Datensender im Event Hubs-Namespace hinzu.
  • Konfigurieren Sie dann einen Azure Digital Twins-Endpunkt oder eine Azure Digital Twins-Datenverlaufsverbindung, welche die systemseitig zugewiesene Identität zur Authentifizierung verwendet. Weitere Informationen zum Konfigurieren von Endpunkten und Ereignisrouten zu Event Hub-Ressourcen von Azure Digital Twins finden Sie unter Routen von Azure Digital Twins-Ereignissen und Erstellen von Endpunkten in Azure Digital Twins.

Die anderen vertrauenswürdigen Dienste für Azure Event Hubs finden Sie unten:

  • Azure Arc
  • Azure Kubernetes
  • Azure Machine Learning
  • Microsoft Purview

Verwenden von Resource Manager-Vorlagen

Die folgende Resource Manager-Beispielvorlage fügt einem vorhandenen Event Hubs-Namespace eine VNET-Regel hinzu. Die Netzwerkregel gibt die ID eines Subnetzes in einem virtuellen Netzwerk an.

Die ID ist ein voll qualifizierter Resource Manager-Pfad für das Subnetz des virtuellen Netzwerks. Beispielsweise /subscriptions/{id}/resourceGroups/{rg}/providers/Microsoft.Network/virtualNetworks/{vnet}/subnets/default für das Standardsubnetz eines virtuellen Netzwerks.

Legen Sie beim Hinzufügen von VNET- oder Firewallregeln den Wert von defaultAction auf Deny fest.

{
    "$schema": "https://schema.management.azure.com/schemas/2015-01-01/deploymentTemplate.json#",
    "contentVersion": "1.0.0.0",
    "parameters": {
      "eventhubNamespaceName": {
        "type": "string",
        "metadata": {
          "description": "Name of the Event Hubs namespace"
        }
      },
      "virtualNetworkName": {
        "type": "string",
        "metadata": {
          "description": "Name of the Virtual Network Rule"
        }
      },
      "subnetName": {
        "type": "string",
        "metadata": {
          "description": "Name of the Virtual Network Sub Net"
        }
      },
      "location": {
        "type": "string",
        "metadata": {
          "description": "Location for Namespace"
        }
      }
    },
    "variables": {
      "namespaceNetworkRuleSetName": "[concat(parameters('eventhubNamespaceName'), concat('/', 'default'))]",
      "subNetId": "[resourceId('Microsoft.Network/virtualNetworks/subnets/', parameters('virtualNetworkName'), parameters('subnetName'))]"
    },
    "resources": [
      {
        "apiVersion": "2018-01-01-preview",
        "name": "[parameters('eventhubNamespaceName')]",
        "type": "Microsoft.EventHub/namespaces",
        "location": "[parameters('location')]",
        "sku": {
          "name": "Standard",
          "tier": "Standard"
        },
        "properties": { }
      },
      {
        "apiVersion": "2017-09-01",
        "name": "[parameters('virtualNetworkName')]",
        "location": "[parameters('location')]",
        "type": "Microsoft.Network/virtualNetworks",
        "properties": {
          "addressSpace": {
            "addressPrefixes": [
              "10.0.0.0/23"
            ]
          },
          "subnets": [
            {
              "name": "[parameters('subnetName')]",
              "properties": {
                "addressPrefix": "10.0.0.0/23",
                "serviceEndpoints": [
                  {
                    "service": "Microsoft.EventHub"
                  }
                ]
              }
            }
          ]
        }
      },
      {
        "apiVersion": "2018-01-01-preview",
        "name": "[variables('namespaceNetworkRuleSetName')]",
        "type": "Microsoft.EventHub/namespaces/networkruleset",
        "dependsOn": [
          "[concat('Microsoft.EventHub/namespaces/', parameters('eventhubNamespaceName'))]"
        ],
        "properties": {
          "publicNetworkAccess": "Enabled",
          "defaultAction": "Deny",
          "virtualNetworkRules": 
          [
            {
              "subnet": {
                "id": "[variables('subNetId')]"
              },
              "ignoreMissingVnetServiceEndpoint": false
            }
          ],
          "ipRules":[],
          "trustedServiceAccessEnabled": false
        }
      }
    ],
    "outputs": { }
  }

Gehen Sie zum Bereitstellen der Vorlage gemäß den Anweisungen für Azure Resource Manager vor.

Wichtig

Wenn keine IP- und VNET-Regeln vorliegen, fließt der gesamte Datenverkehr auch dann in den Namespace, wenn Sie für defaultAction den Wert deny festlegen. Der Zugriff auf den Namespace erfolgt (mithilfe des Zugriffsschlüssels) über das öffentliche Internet. Geben Sie mindestens eine IP-Regel oder eine VNET-Regel für den Namespace an, um nur Datenverkehr von den angegebenen IP-Adressen oder dem Subnetz eines virtuellen Netzwerks zuzulassen.

Mithilfe der Azure-Befehlszeilenschnittstelle

Verwenden Sie az eventhubs namespace network-rule-set-Befehle zum Hinzufügen, Auflisten, Aktualisieren und Entfernen, um VNET-Regeln für einen Service Bus-Namespace zu verwalten.

Mithilfe von Azure PowerShell

Verwenden Sie die folgenden Azure PowerShell-Befehle zum Hinzufügen, Auflisten, Entfernen, Aktualisieren und Löschen von Netzwerkregeln für einen Service Bus-Namespace:

Standardaktion und Zugriff auf das öffentliche Netzwerk

REST-API

Der Standardwert der Eigenschaft defaultAction war Deny (für API-Versionen bis einschließlich 2021-01-01-preview). Die Ablehnungsregel wird jedoch nur erzwungen, wenn Sie IP-Filter oder VNet-Regeln (virtuelles Netzwerk) festlegen. Wenn Sie über keine IP-Filter oder VNet-Regeln verfügen, wird sie als Allow behandelt.

Ab der API-Version 2021-06-01-preview hat die Eigenschaft defaultAction den Standardwert Allow, um die dienstseitige Erzwingung korrekt widerzuspiegeln. Wenn die Standardaktion auf Deny festgelegt ist, werden IP-Filter und VNet-Regeln erzwungen. Ist die Standardaktion auf Allow festgelegt, werden IP-Filter und VNet-Regeln nicht erzwungen. Der Dienst speichert die Regeln, wenn Sie sie deaktivieren und dann wieder aktivieren.

Mit der API-Version 2021-06-01-preview wird auch eine neue Eigenschaft namens publicNetworkAccess eingeführt. Wenn sie auf Disabled festgelegt ist, sind Vorgänge auf private Verbindungen beschränkt. Ist sie auf Enabled festgelegt, sind Vorgänge über das öffentliche Internet zulässig.

Weitere Informationen zu diesen Eigenschaften finden Sie unter Namespaces: Netzwerkregelsatz: Erstellen oder Aktualisieren des Netzwerkregelsatzes sowie unter Verbindungen mit privaten Endpunkten: Erstellen oder Aktualisieren.

Hinweis

Keine der obigen Einstellungen umgeht die Validierung von Ansprüchen per SAS- oder Microsoft Entra-Authentifizierung. Die Authentifizierungsüberprüfung wird immer erst im Anschluss an die durch die Einstellungen defaultAction, publicNetworkAccess und privateEndpointConnections konfigurierten Netzwerküberprüfungen ausgeführt.

Azure-Portal

Das Azure-Portal verwendet immer die neueste API-Version, um Eigenschaften abzurufen und festzulegen. Wenn Sie Ihren Namespace zuvor mit einer Version bis einschließlich 2021-01-01-preview konfiguriert und dabei defaultAction auf Deny festgelegt sowie keine IP-Filter und VNet-Regeln angegeben haben, hätte das Portal in der Vergangenheit Ausgewählte Netzwerke auf der Seite Netzwerk Ihres Namespace überprüft. Nun wird die Option Alle Netzwerke überprüft.

Screenshot that shows the Public access page with the All networks option selected.

Nächste Schritte

Weitere Informationen zu virtuellen Netzwerken finden Sie unter den folgenden Links: