Skydda en Azure Machine Learning en inferenterande miljö med virtuella nätverk

I den här artikeln får du lära dig hur du skyddar inferensmiljöer med ett virtuellt nätverk i Azure Machine Learning.

Tips

Den här artikeln ingår i en serie om att skydda ett Azure Machine Learning arbetsflöde. Se de andra artiklarna i den här serien:

En självstudie om hur du skapar en säker arbetsyta finns i Självstudie: Skapa en säker arbetsyta eller Självstudie: Skapa en säker arbetsyta med hjälp av en mall.

I den här artikeln får du lära dig hur du skyddar följande inferensresurser i ett virtuellt nätverk:

  • AKS Azure Kubernetes Service kluster (Default Azure Kubernetes Service)
  • Privat AKS-kluster
  • AKS-kluster med privat länk
  • Azure Container Instances (ACI)

Förutsättningar

  • Läs artikeln Översikt över nätverkssäkerhet för att förstå vanliga scenarier för virtuella nätverk och övergripande arkitektur för virtuella nätverk.

  • Ett befintligt virtuellt nätverk och undernät som ska användas med dina beräkningsresurser.

  • Om du vill distribuera resurser till ett virtuellt nätverk eller undernät måste ditt användarkonto ha behörighet till följande åtgärder i rollbaserad åtkomstkontroll i Azure (Azure RBAC):

    • "Microsoft.Network/virtualNetworks/join/action" på den virtuella nätverksresursen.
    • "Microsoft.Network/virtualNetworks/subnet/join/action" på undernätsresursen.

    Mer information om Azure RBAC med nätverk finns i Inbyggda roller för nätverk

Begränsningar

Azure Container Instances

  • När du använder Azure Container Instances i ett virtuellt nätverk måste det virtuella nätverket finnas i samma resursgrupp som din Azure Machine Learning-arbetsyta. Annars kan det virtuella nätverket finnas i en annan resursgrupp.
  • Om arbetsytan har en privat slutpunktmåste det virtuella nätverket som används Azure Container Instances vara samma som det som används av arbetsytans privata slutpunkt.
  • När du använder Azure Container Instances i det virtuella nätverket kan Azure Container Registry (ACR) för din arbetsyta inte finnas i det virtuella nätverket.

Azure Kubernetes Service

Azure Kubernetes Service

Viktigt

Om du vill använda ett AKS-kluster i ett virtuellt nätverk följer du först förutsättningarna i Konfigurera avancerade nätverk i Azure Kubernetes Service (AKS).

Använd följande steg för att lägga till AKS i ett virtuellt nätverk på din arbetsyta:

  1. Logga in på Azure Machine Learning studiooch välj sedan din prenumeration och arbetsyta.

  2. Välj Compute till vänster, Härledningskluster från mitten och välj sedan + Ny.

    Screenshot of create inference cluster dialog

  3. I dialogrutan Create inference cluster (Skapa härledningskluster) väljer du Create new (Skapa ny) och vm size to use for the cluster (VM-storlek som ska användas för klustret). Välj slutligen Nästa.

    Screenshot of VM settings

  4. I avsnittet Konfigurera Inställningar anger du ett Beräkningsnamn,väljer Klustersyfte, Antal noder och väljer sedan Avancerat för att visa nätverksinställningarna. I området Konfigurera virtuellt nätverk anger du följande värden:

    • Ange det virtuella nätverk som ska användas.

      Tips

      Om arbetsytan använder en privat slutpunkt för att ansluta till det virtuella nätverket är fältet Virtuellt nätverk nedtonat.

    • Ange undernätet som klustret ska skapas i.

    • I fältet Kubernetes Service-adressintervall anger du Kubernetes-tjänstens adressintervall. Det här adressintervallet använder ett IP-adressintervall för CIDR (Classless Inter-Domain Routing) för att definiera de IP-adresser som är tillgängliga för klustret. Det får inte överlappa med undernätets IP-intervall (till exempel 10.0.0.0/16).

    • I fältet IP-adress för Kubernetes DNS-tjänst anger du Kubernetes DNS-tjänstens IP-adress. Den här IP-adressen tilldelas till Kubernetes DNS-tjänsten. Det måste vara inom Kubernetes-tjänstens adressintervall (till exempel 10.0.0.10).

    • I fältet Docker-bryggadress anger du Docker-bryggadressen. Den här IP-adressen tilldelas Docker Bridge. Det får inte finnas i några IP-intervall för undernät eller Kubernetes-tjänstens adressintervall (till exempel 172.18.0.1/16).

    Screenshot of configure network settings

  5. När du distribuerar en modell som en webbtjänst till AKS skapas en bedömningsslutpunkt för att hantera inferensbegäranden. Kontrollera att nätverkssäkerhetsgruppen (NSG) som styr det virtuella nätverket har en inkommande säkerhetsregel aktiverad för IP-adressen för bedömningsslutpunkten om du vill anropa den utanför det virtuella nätverket.

    Om du vill hitta IP-adressen för bedömningsslutpunkten kan du titta på bedömnings-URI för den distribuerade tjänsten. Information om hur du visar bedömnings-URI finns i Använda en modell som distribuerats som en webbtjänst.

    Viktigt

    Behåll standardreglerna för utgående trafik för NSG:n. Mer information finns i standardsäkerhetsreglerna i Säkerhetsgrupper.

    An inbound security rule

    Viktigt

    IP-adressen som visas i bilden för bedömningsslutpunkten skiljer sig åt för dina distributioner. Samma IP-adress delas av alla distributioner till ett AKS-kluster, men varje AKS-kluster har olika IP-adresser.

Du kan också använda Azure Machine Learning SDK för att lägga Azure Kubernetes Service i ett virtuellt nätverk. Om du redan har ett AKS-kluster i ett virtuellt nätverk kopplar du det till arbetsytan enligt beskrivningen i Så här distribuerar du till AKS. Följande kod skapar en ny AKS-instans i default undernätet för ett virtuellt nätverk med namnet mynetwork :

from azureml.core.compute import ComputeTarget, AksCompute

# Create the compute configuration and set virtual network information
config = AksCompute.provisioning_configuration(location="eastus2")
config.vnet_resourcegroup_name = "mygroup"
config.vnet_name = "mynetwork"
config.subnet_name = "default"
config.service_cidr = "10.0.0.0/16"
config.dns_service_ip = "10.0.0.10"
config.docker_bridge_cidr = "172.17.0.1/16"

# Create the compute target
aks_target = ComputeTarget.create(workspace=ws,
                                  name="myaks",
                                  provisioning_configuration=config)

När skapandeprocessen har slutförts kan du köra slutsatsledning eller modellbedömning på ett AKS-kluster bakom ett virtuellt nätverk. Mer information finns i Så här distribuerar du till AKS.

Mer information om hur du använder Role-Based Access Control med Kubernetes finns i Använda Azure RBAC för Kubernetes-auktorisering.

Nätverksdeltagareroll

Viktigt

Om du skapar eller kopplar ett AKS-kluster genom att tillhandahålla ett virtuellt nätverk som du skapade tidigare, måste du tilldela tjänstens huvudnamn (SP) eller den hanterade identiteten för ditt AKS-kluster rollen Nätverksdeltagare till den resursgrupp som innehåller det virtuella nätverket.

Använd följande steg för att lägga till identiteten som nätverksdeltagare:

  1. Använd följande Azure CLI-kommandon för att hitta tjänstens huvudnamn eller ID för hanterad identitet för AKS. Ersätt <aks-cluster-name> med namnet på klustret. Ersätt <resource-group-name> med namnet på resursgruppen som innehåller <resource-group-name>

    az aks show -n <aks-cluster-name> --resource-group <resource-group-name> --query servicePrincipalProfile.clientId
    

    Om det här kommandot returnerar värdet msi använder du följande kommando för att identifiera huvudnamns-ID:t för den hanterade identiteten:

    az aks show -n <aks-cluster-name> --resource-group <resource-group-name> --query identity.principalId
    
  2. Använd följande kommando för att hitta ID:t för resursgruppen som innehåller ditt virtuella nätverk. Ersätt <resource-group-name> med namnet på resursgruppen som innehåller det virtuella <resource-group-name>:

    az group show -n <resource-group-name> --query id
    
  3. Om du vill lägga till tjänstens huvudnamn eller hanterade identitet som nätverksdeltagare använder du följande kommando. Ersätt <SP-or-managed-identity> med det ID som returneras för tjänstens huvudnamn eller hanterade identitet. Ersätt <resource-group-id> med det ID som returneras för resursgruppen som innehåller det virtuella nätverket:

    az role assignment create --assignee <SP-or-managed-identity> --role 'Network Contributor' --scope <resource-group-id>
    

Mer information om hur du använder den interna lastbalanseraren med AKS finns i Använda en intern lastbalanserare med Azure Kubernetes Service.

Skydda VNet-trafik

Det finns två sätt att isolera trafik till och från AKS-klustret till det virtuella nätverket:

  • Privat AKS-kluster:Den här metoden använder Azure Private Link för att skydda kommunikationen med klustret för distribution/hanteringsåtgärder.
  • Intern AKS-lastbalanserare:Den här metoden konfigurerar slutpunkten för dina distributioner till AKS för att använda en privat IP-adress i det virtuella nätverket.

Privat AKS-kluster

Som standard har AKS-kluster ett kontrollplan eller en API-server med offentliga IP-adresser. Du kan konfigurera AKS att använda ett privat kontrollplan genom att skapa ett privat AKS-kluster. Mer information finns i Skapa ett privat Azure Kubernetes Service kluster.

När du har skapat det privata AKS-klustret kopplar du klustret till det virtuella nätverket som ska användas med Azure Machine Learning.

Intern AKS-lastbalanserare

Som standard använder AKS-distributioner en offentlig lastbalanserare. I det här avsnittet får du lära dig hur du konfigurerar AKS för att använda en intern lastbalanserare. En intern (eller privat) lastbalanserare används där endast privata IP-adresser tillåts som frontend. Interna lastbalanserare används för att belastningsutjämna trafik i ett virtuellt nätverk

En privat lastbalanserare aktiveras genom att konfigurera AKS att använda en intern lastbalanserare.

Aktivera privat lastbalanserare

Viktigt

Du kan inte aktivera privat IP när du skapar Azure Kubernetes Service klustret i Azure Machine Learning Studio. Du kan skapa en med en intern lastbalanserare när du använder Python SDK eller Azure CLI-tillägget för maskininlärning.

Följande exempel visar hur du skapar ett nytt AKS-kluster med en privat IP-adress/intern lastbalanserare med hjälp av SDK och CLI:

import azureml.core
from azureml.core.compute import AksCompute, ComputeTarget

# Verify that cluster does not exist already
try:
    aks_target = AksCompute(workspace=ws, name=aks_cluster_name)
    print("Found existing aks cluster")

except:
    print("Creating new aks cluster")

    # Subnet to use for AKS
    subnet_name = "default"
    # Create AKS configuration
    prov_config=AksCompute.provisioning_configuration(load_balancer_type="InternalLoadBalancer")
    # Set info for existing virtual network to create the cluster in
    prov_config.vnet_resourcegroup_name = "myvnetresourcegroup"
    prov_config.vnet_name = "myvnetname"
    prov_config.service_cidr = "10.0.0.0/16"
    prov_config.dns_service_ip = "10.0.0.10"
    prov_config.subnet_name = subnet_name
    prov_config.load_balancer_subnet = subnet_name
    prov_config.docker_bridge_cidr = "172.17.0.1/16"

    # Create compute target
    aks_target = ComputeTarget.create(workspace = ws, name = "myaks", provisioning_configuration = prov_config)
    # Wait for the operation to complete
    aks_target.wait_for_completion(show_output = True)

När du kopplar ett befintligt kluster till din arbetsyta måste du vänta tills efter anslutningåtgärden för att konfigurera lastbalanseraren. Information om hur du kopplar ett kluster finns i Koppla ett befintligt AKS-kluster.

När du har bifogat det befintliga klustret kan du uppdatera klustret så att det använder en intern lastbalanserare/privat IP-adress:

import azureml.core
from azureml.core.compute.aks import AksUpdateConfiguration
from azureml.core.compute import AksCompute

# ws = workspace object. Creation not shown in this snippet
aks_target = AksCompute(ws,"myaks")

# Change to the name of the subnet that contains AKS
subnet_name = "default"
# Update AKS configuration to use an internal load balancer
update_config = AksUpdateConfiguration(None, "InternalLoadBalancer", subnet_name)
aks_target.update(update_config)
# Wait for the operation to complete
aks_target.wait_for_completion(show_output = True)

Aktivera Azure Container Instances (ACI)

Azure Container Instances skapas dynamiskt när du distribuerar en modell. Om du Azure Machine Learning skapa ACI i det virtuella nätverket måste du aktivera delegering av undernät för det undernät som används av distributionen. Använd följande steg för att använda ACI i ett virtuellt nätverk till din arbetsyta:

  1. Om du vill aktivera delegering av undernät i ditt virtuella nätverk använder du informationen i artikeln Lägga till eller ta bort en undernätsdelegering. Du kan aktivera delegering när du skapar ett virtuellt nätverk eller lägga till det i ett befintligt nätverk.

    Viktigt

    När du aktiverar delegering använder Microsoft.ContainerInstance/containerGroups du som värdet Delegera Microsoft.ContainerInstance/containerGroups tjänst.

  2. Distribuera modellen med hjälp AciWebservice.deploy_configuration(), använd subnet_name parametrarna och . Ange de här parametrarna till det virtuella nätverkets namn och undernät där du har aktiverat delegering.

Begränsa utgående anslutningar från det virtuella nätverket

Om du inte vill använda standardreglerna för utgående trafik och vill begränsa utgående åtkomst för ditt virtuella nätverk måste du tillåta åtkomst till Azure Container Registry. Kontrollera till exempel att dina nätverkssäkerhetsgrupper (NSG) innehåller en regel som tillåter åtkomst till tjänsttaggen AzureContainerRegistry.RegionName där {RegionName} är namnet på en Azure-region.

Nästa steg

Den här artikeln ingår i en serie om att skydda ett Azure Machine Learning arbetsflöde. Se de andra artiklarna i den här serien: