Jak używać tożsamości zarządzanych z usługą Azure Container Instances

Użyj tożsamości zarządzanych dla zasobów platformy Azure, aby uruchomić kod w Azure Container Instances, który współdziała z innymi usługami platformy Azure — bez utrzymywania żadnych wpisów tajnych ani poświadczeń w kodzie. Ta funkcja zapewnia wdrożenie Azure Container Instances z automatycznie zarządzaną tożsamością w usłudze Azure Active Directory.

W tym artykule dowiesz się więcej o tożsamościach zarządzanych w Azure Container Instances i:

  • Włączanie tożsamości przypisanej przez użytkownika lub przypisanej przez system w grupie kontenerów
  • Udzielanie tożsamości dostępu do magazynu kluczy platformy Azure
  • Używanie tożsamości zarządzanej do uzyskiwania dostępu do magazynu kluczy z uruchomionego kontenera

Dostosuj przykłady, aby umożliwić i używać tożsamości w Azure Container Instances w celu uzyskania dostępu do innych usług platformy Azure. Te przykłady są interaktywne. Jednak w praktyce obrazy kontenerów uruchamiałyby kod w celu uzyskania dostępu do usług platformy Azure.

Dlaczego warto używać tożsamości zarządzanej?

Użyj tożsamości zarządzanej w uruchomionym kontenerze, aby uwierzytelnić się w dowolnej usłudze obsługującej uwierzytelnianie Azure AD bez zarządzania poświadczeniami w kodzie kontenera. W przypadku usług, które nie obsługują uwierzytelniania usługi AD, można przechowywać wpisy tajne w magazynie kluczy platformy Azure i używać tożsamości zarządzanej do uzyskiwania dostępu do magazynu kluczy w celu pobrania poświadczeń. Aby uzyskać więcej informacji na temat korzystania z tożsamości zarządzanej, zobacz Co to są tożsamości zarządzane dla zasobów platformy Azure?

Włączanie tożsamości zarządzanej

Podczas tworzenia grupy kontenerów włącz co najmniej jedną tożsamość zarządzaną, ustawiając właściwość ContainerGroupIdentity . Można również włączyć lub zaktualizować tożsamości zarządzane po uruchomieniu grupy kontenerów — każda akcja powoduje ponowne uruchomienie grupy kontenerów. Aby ustawić tożsamości w nowej lub istniejącej grupie kontenerów, użyj interfejsu wiersza polecenia platformy Azure, szablonu Resource Manager, pliku YAML lub innego narzędzia platformy Azure.

Azure Container Instances obsługuje oba typy tożsamości zarządzanych platformy Azure: przypisane przez użytkownika i przypisane przez system. W grupie kontenerów można włączyć tożsamość przypisaną przez system, co najmniej jedną tożsamość przypisaną przez użytkownika lub oba typy tożsamości. Jeśli nie znasz tożsamości zarządzanych dla zasobów platformy Azure, zobacz omówienie.

Korzystanie z tożsamości zarządzanej

Aby można było korzystać z tożsamości zarządzanej, tożsamość musi mieć dostęp do co najmniej jednego zasobu usługi platformy Azure (na przykład aplikacji internetowej, magazynu kluczy lub konta magazynu) w subskrypcji. Użycie tożsamości zarządzanej w uruchomionym kontenerze jest podobne do użycia tożsamości na maszynie wirtualnej platformy Azure. Zapoznaj się ze wskazówkami dotyczącymi maszyny wirtualnej dotyczącymi używania tokenu, Azure PowerShell lub interfejsu wiersza polecenia platformy Azure lub zestawów SDK platformy Azure.

Wymagania wstępne

  • Ten artykuł wymaga wersji 2.0.49 lub nowszej interfejsu wiersza polecenia platformy Azure. Jeśli korzystasz z usługi Azure Cloud Shell, najnowsza wersja jest już zainstalowana.

Tworzenie magazynu kluczy platformy Azure

W przykładach w tym artykule użyto tożsamości zarządzanej w Azure Container Instances w celu uzyskania dostępu do wpisu tajnego usługi Azure Key Vault.

Najpierw utwórz grupę zasobów o nazwie myResourceGroup w lokalizacji eastus za pomocą następującego polecenia az group create:

az group create --name myResourceGroup --location eastus

Użyj polecenia az keyvault create , aby utworzyć magazyn kluczy. Pamiętaj, aby określić unikatową nazwę magazynu kluczy.

az keyvault create \
  --name mykeyvault \
  --resource-group myResourceGroup \ 
  --location eastus

Zapisz przykładowy wpis tajny w magazynie kluczy za pomocą polecenia az keyvault secret set :

az keyvault secret set \
  --name SampleSecret \
  --value "Hello Container Instances" \
  --description ACIsecret --vault-name mykeyvault

Kontynuuj korzystanie z poniższych przykładów, aby uzyskać dostęp do magazynu kluczy przy użyciu tożsamości zarządzanej przypisanej przez użytkownika lub przypisanej przez system w Azure Container Instances.

Przykład 1. Używanie tożsamości przypisanej przez użytkownika do uzyskiwania dostępu do usługi Azure Key Vault

Tworzenie tożsamości

Najpierw utwórz tożsamość w subskrypcji przy użyciu polecenia az identity create . Możesz użyć tej samej grupy zasobów użytej do utworzenia magazynu kluczy lub użyć innej.

az identity create \
  --resource-group myResourceGroup \
  --name myACIId

Aby użyć tożsamości w poniższych krokach, użyj polecenia az identity show , aby zapisać identyfikator jednostki usługi tożsamości i identyfikator zasobu w zmiennych.

# Get service principal ID of the user-assigned identity
spID=$(az identity show \
  --resource-group myResourceGroup \
  --name myACIId \
  --query principalId --output tsv)

# Get resource ID of the user-assigned identity
resourceID=$(az identity show \
  --resource-group myResourceGroup \
  --name myACIId \
  --query id --output tsv)

Udzielanie tożsamości przypisanej przez użytkownika dostępu do magazynu kluczy

Uruchom następujące polecenie az keyvault set-policy , aby ustawić zasady dostępu w magazynie kluczy. Poniższy przykład umożliwia tożsamości przypisanej przez użytkownika pobieranie wpisów tajnych z magazynu kluczy:

 az keyvault set-policy \
    --name mykeyvault \
    --resource-group myResourceGroup \
    --object-id $spID \
    --secret-permissions get

Włączanie tożsamości przypisanej przez użytkownika w grupie kontenerów

Uruchom następujące polecenie az container create , aby utworzyć wystąpienie kontenera azure-cli na podstawie obrazu firmy Microsoft. W tym przykładzie przedstawiono grupę z jednym kontenerem, której można używać interaktywnie do uruchamiania interfejsu wiersza polecenia platformy Azure w celu uzyskania dostępu do innych usług platformy Azure. W tej sekcji jest używany tylko podstawowy system operacyjny. Aby zapoznać się z przykładem użycia interfejsu wiersza polecenia platformy Azure w kontenerze, zobacz Włączanie tożsamości przypisanej przez system w grupie kontenerów.

Parametr --assign-identity przekazuje tożsamość zarządzaną przypisaną przez użytkownika do grupy. Długotrwałe polecenie zachowuje działanie kontenera. W tym przykładzie użyto tej samej grupy zasobów użytej do utworzenia magazynu kluczy, ale można określić inną grupę.

az container create \
  --resource-group myResourceGroup \
  --name mycontainer \
  --image mcr.microsoft.com/azure-cli \
  --assign-identity $resourceID \
  --command-line "tail -f /dev/null"

W ciągu kilku sekund powinna pojawić się odpowiedź z interfejsu wiersza polecenia platformy Azure, wskazująca ukończenie wdrażania. Sprawdź jego stan za pomocą polecenia az container show .

az container show \
  --resource-group myResourceGroup \
  --name mycontainer

Sekcja identity w danych wyjściowych wygląda podobnie do poniższej, co pokazuje, że tożsamość jest ustawiona w grupie kontenerów. Element under principalIDuserAssignedIdentities to jednostka usługi tożsamości utworzonej w usłudze Azure Active Directory:

[...]
"identity": {
    "principalId": "null",
    "tenantId": "xxxxxxxx-f292-4e60-9122-xxxxxxxxxxxx",
    "type": "UserAssigned",
    "userAssignedIdentities": {
      "/subscriptions/xxxxxxxx-0903-4b79-a55a-xxxxxxxxxxxx/resourcegroups/danlep1018/providers/Microsoft.ManagedIdentity/userAssignedIdentities/myACIId": {
        "clientId": "xxxxxxxx-5523-45fc-9f49-xxxxxxxxxxxx",
        "principalId": "xxxxxxxx-f25b-4895-b828-xxxxxxxxxxxx"
      }
    }
  },
[...]

Uzyskiwanie wpisu tajnego z magazynu kluczy przy użyciu tożsamości przypisanej przez użytkownika

Teraz możesz użyć tożsamości zarządzanej w uruchomionym wystąpieniu kontenera, aby uzyskać dostęp do magazynu kluczy. Najpierw uruchom powłokę bash w kontenerze:

az container exec \
  --resource-group myResourceGroup \
  --name mycontainer \
  --exec-command "/bin/bash"

Uruchom następujące polecenia w powłoce bash w kontenerze. Aby uzyskać token dostępu do uwierzytelniania w magazynie kluczy przy użyciu usługi Azure Active Directory, uruchom następujące polecenie:

client_id="xxxxxxxx-5523-45fc-9f49-xxxxxxxxxxxx"
curl "http://169.254.169.254/metadata/identity/oauth2/token?api-version=2018-02-01&resource=https%3A%2F%2Fvault.azure.net&client_id=$client_id" -H Metadata:true -s

Dane wyjściowe:

{"access_token":"xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1QiLCJhbGciOiJSUzI1NiIsIng1dCI6Imk2bEdrM0ZaenhSY1ViMkMzbkVRN3N5SEpsWSIsImtpZCI6Imk2bEdrM0ZaenhSY1ViMkMzbkVRN3N5SEpsWSJ9......xxxxxxxxxxxxxxxxx","refresh_token":"","expires_in":"28799","expires_on":"1539927532","not_before":"1539898432","resource":"https://vault.azure.net/","token_type":"Bearer"}

Aby przechowywać token dostępu w zmiennej do użycia w kolejnych poleceniach do uwierzytelniania, uruchom następujące polecenie:

token=$(curl 'http://169.254.169.254/metadata/identity/oauth2/token?api-version=2018-02-01&resource=https%3A%2F%2Fvault.azure.net' -H Metadata:true | jq -r '.access_token')

Teraz użyj tokenu dostępu do uwierzytelniania w magazynie kluczy i odczytu wpisu tajnego. Pamiętaj, aby zastąpić nazwę magazynu kluczy adresem URL (https://mykeyvault.vault.azure.net/...):

curl https://mykeyvault.vault.azure.net/secrets/SampleSecret/?api-version=2016-10-01 -H "Authorization: Bearer $token"

Odpowiedź wygląda podobnie do poniższej, pokazując wpis tajny. W kodzie należy przeanalizować te dane wyjściowe w celu uzyskania wpisu tajnego. Następnie użyj wpisu tajnego w kolejnej operacji, aby uzyskać dostęp do innego zasobu platformy Azure.

{"value":"Hello Container Instances","contentType":"ACIsecret","id":"https://mykeyvault.vault.azure.net/secrets/SampleSecret/xxxxxxxxxxxxxxxxxxxx","attributes":{"enabled":true,"created":1539965967,"updated":1539965967,"recoveryLevel":"Purgeable"},"tags":{"file-encoding":"utf-8"}}

Przykład 2. Używanie tożsamości przypisanej przez system do uzyskiwania dostępu do usługi Azure Key Vault

Włączanie tożsamości przypisanej przez system w grupie kontenerów

Uruchom następujące polecenie az container create , aby utworzyć wystąpienie kontenera azure-cli na podstawie obrazu firmy Microsoft. W tym przykładzie przedstawiono grupę z jednym kontenerem, której można używać interaktywnie do uruchamiania interfejsu wiersza polecenia platformy Azure w celu uzyskania dostępu do innych usług platformy Azure.

Parametr --assign-identity bez dodatkowej wartości umożliwia tożsamości zarządzanej przypisanej przez system w grupie. Tożsamość jest ograniczona do grupy zasobów grupy kontenerów. Długotrwałe polecenie zachowuje działanie kontenera. W tym przykładzie użyto tej samej grupy zasobów użytej do utworzenia magazynu kluczy, który znajduje się w zakresie tożsamości.

# Get the resource ID of the resource group
rgID=$(az group show --name myResourceGroup --query id --output tsv)

# Create container group with system-managed identity
az container create \
  --resource-group myResourceGroup \
  --name mycontainer \
  --image mcr.microsoft.com/azure-cli \
  --assign-identity --scope $rgID \
  --command-line "tail -f /dev/null"

W ciągu kilku sekund powinna pojawić się odpowiedź z interfejsu wiersza polecenia platformy Azure, wskazująca ukończenie wdrażania. Sprawdź jego stan za pomocą polecenia az container show .

az container show \
  --resource-group myResourceGroup \
  --name mycontainer

Sekcja identity w danych wyjściowych wygląda podobnie do poniższej, pokazującej, że tożsamość przypisana przez system jest tworzona w usłudze Azure Active Directory:

[...]
"identity": {
    "principalId": "xxxxxxxx-528d-7083-b74c-xxxxxxxxxxxx",
    "tenantId": "xxxxxxxx-f292-4e60-9122-xxxxxxxxxxxx",
    "type": "SystemAssigned",
    "userAssignedIdentities": null
},
[...]

Ustaw zmienną na wartość principalId (identyfikator jednostki usługi) tożsamości, aby użyć jej w kolejnych krokach.

spID=$(az container show \
  --resource-group myResourceGroup \
  --name mycontainer \
  --query identity.principalId --out tsv)

Udzielanie grupie kontenerów dostępu do magazynu kluczy

Uruchom następujące polecenie az keyvault set-policy , aby ustawić zasady dostępu w magazynie kluczy. Poniższy przykład umożliwia tożsamości zarządzanej przez system pobieranie wpisów tajnych z magazynu kluczy:

 az keyvault set-policy \
   --name mykeyvault \
   --resource-group myResourceGroup \
   --object-id $spID \
   --secret-permissions get

Uzyskiwanie wpisu tajnego z magazynu kluczy za pomocą tożsamości grupy kontenerów

Teraz możesz użyć tożsamości zarządzanej, aby uzyskać dostęp do magazynu kluczy w uruchomionym wystąpieniu kontenera. Najpierw uruchom powłokę bash w kontenerze:

az container exec \
  --resource-group myResourceGroup \
  --name mycontainer \
  --exec-command "/bin/bash"

Uruchom następujące polecenia w powłoce bash w kontenerze. Najpierw zaloguj się do interfejsu wiersza polecenia platformy Azure przy użyciu tożsamości zarządzanej:

az login --identity

Z uruchomionego kontenera pobierz wpis tajny z magazynu kluczy:

az keyvault secret show \
  --name SampleSecret \
  --vault-name mykeyvault --query value

Pobierana jest wartość wpisu tajnego:

"Hello Container Instances"

Włączanie tożsamości zarządzanej przy użyciu szablonu Resource Manager

Aby włączyć tożsamość zarządzaną w grupie kontenerów przy użyciu szablonu Resource Manager, ustaw identity właściwość Microsoft.ContainerInstance/containerGroups obiektu na ContainerGroupIdentity obiekt. Poniższe fragmenty kodu pokazują identity właściwość skonfigurowaną dla różnych scenariuszy. Zobacz dokumentację szablonu Resource Manager. Określ minimalną apiVersion wartość 2018-10-01.

Tożsamość przypisana przez użytkownika

Tożsamość przypisana przez użytkownika jest identyfikatorem zasobu formularza:

"/subscriptions/{subscriptionId}/resourceGroups/{resourceGroupName}/providers/Microsoft.ManagedIdentity/userAssignedIdentities/{identityName}"

Można włączyć co najmniej jedną tożsamość przypisaną przez użytkownika.

"identity": {
    "type": "UserAssigned",
    "userAssignedIdentities": {
        "myResourceID1": {
            }
        }
    }

Tożsamość przypisana przez system

"identity": {
    "type": "SystemAssigned"
    }

Tożsamości przypisane przez system i użytkownika

W grupie kontenerów można włączyć zarówno tożsamość przypisaną przez system, jak i co najmniej jedną tożsamość przypisaną przez użytkownika.

"identity": {
    "type": "System Assigned, UserAssigned",
    "userAssignedIdentities": {
        "myResourceID1": {
            }
        }
    }
...

Włączanie tożsamości zarządzanej przy użyciu pliku YAML

Aby włączyć tożsamość zarządzaną w grupie kontenerów wdrożonej przy użyciu pliku YAML, dołącz następujący kod YAML. Określ minimalną apiVersion wartość 2018-10-01.

Tożsamość przypisana przez użytkownika

Tożsamość przypisana przez użytkownika jest identyfikatorem zasobu formularza

'/subscriptions/{subscriptionId}/resourceGroups/{resourceGroupName}/providers/Microsoft.ManagedIdentity/userAssignedIdentities/{identityName}'

Można włączyć co najmniej jedną tożsamość przypisaną przez użytkownika.

identity:
  type: UserAssigned
  userAssignedIdentities:
    {'myResourceID1':{}}

Tożsamość przypisana przez system

identity:
  type: SystemAssigned

Tożsamości przypisane przez system i użytkownika

W grupie kontenerów można włączyć zarówno tożsamość przypisaną przez system, jak i co najmniej jedną tożsamość przypisaną przez użytkownika.

identity:
  type: SystemAssigned, UserAssigned
  userAssignedIdentities:
   {'myResourceID1':{}}

Następne kroki

W tym artykule przedstawiono informacje o tożsamościach zarządzanych w Azure Container Instances i sposobie wykonywania następujących instrukcji:

  • Włączanie tożsamości przypisanej przez użytkownika lub przypisanej przez system w grupie kontenerów
  • Udzielanie tożsamości dostępu do magazynu kluczy platformy Azure
  • Używanie tożsamości zarządzanej do uzyskiwania dostępu do magazynu kluczy z uruchomionego kontenera