Udostępnij za pośrednictwem


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 usłudze Azure Container Instances, który współdziała z innymi usługami platformy Azure — bez obsługi żadnych wpisów tajnych ani poświadczeń w kodzie. Ta funkcja zapewnia wdrożenie usługi Azure Container Instances z automatycznie zarządzaną tożsamością w usłudze Microsoft Entra ID.

W tym artykule dowiesz się więcej o tożsamościach zarządzanych w usłudze 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 włączyć i używać tożsamości w usłudze 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 firmy Microsoft Entra bez zarządzania poświadczeniami w kodzie kontenera. W przypadku usług, które nie obsługują uwierzytelniania usługi AD, możesz 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 — 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 usługi Resource Manager, pliku YAML lub innego narzędzia platformy Azure.

Usługa 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, zapoznaj się z omówieniem.

Korzystanie z tożsamości zarządzanej

Aby 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 ramach 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 używania tokenu, programu 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. W przypadku korzystania z usługi Azure Cloud Shell najnowsza wersja jest już zainstalowana.

Tworzenie magazynu kluczy platformy Azure

Przykłady w tym artykule używają tożsamości zarządzanej w usłudze Azure Container Instances do uzyskiwania 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 przy użyciu polecenia az keyvault secret set :

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

Kontynuuj pracę z poniższymi przykładami, aby uzyskać dostęp do magazynu kluczy przy użyciu tożsamości zarządzanej przypisanej przez użytkownika lub przypisanej przez system w usłudze 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
SP_ID=$(az identity show \
  --resource-group myResourceGroup \
  --name myACIId \
  --query principalId --output tsv)

# Get resource ID of the user-assigned identity
RESOURCE_ID=$(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 $SP_ID \
    --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ę pojedynczego kontenera, 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 utrzymuje 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 $RESOURCE_ID \
  --command-line "tail -f /dev/null"

W ciągu kilku sekund powinna zostać wyświetlona odpowiedź z interfejsu wiersza polecenia platformy Azure wskazująca, że wdrożenie zostało ukończone. 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ść jest ustawiona w grupie kontenerów. Element under principalID userAssignedIdentities jest jednostką usługi tożsamości utworzonej w usłudze Microsoft Entra ID:

[...]
"identity": {
    "principalId": "null",
    "tenantId": "aaaabbbb-0000-cccc-1111-dddd2222eeee",
    "type": "UserAssigned",
    "userAssignedIdentities": {
      "/subscriptions/aaaa0a0a-bb1b-cc2c-dd3d-eeeeee4e4e4e/resourcegroups/danlep1018/providers/Microsoft.ManagedIdentity/userAssignedIdentities/myACIId": {
        "clientId": "00001111-aaaa-2222-bbbb-3333cccc4444",
        "principalId": "aaaaaaaa-bbbb-cccc-1111-222222222222"
      }
    }
  },
[...]

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 używania identyfikatora Entra firmy Microsoft do uwierzytelniania w magazynie kluczy, uruchom następujące polecenie:

client_id="00001111-aaaa-2222-bbbb-3333cccc4444"
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

Wyjście:

{"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, aby uwierzytelnić się w magazynie kluczy i odczytać wpis tajny. 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=7.4 -H "Authorization: Bearer $TOKEN"

Odpowiedź wygląda podobnie do poniższej, pokazując wpis tajny. W kodzie przeanalizujesz te dane wyjściowe, aby uzyskać wpis tajny. 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ę pojedynczego kontenera, 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 przypisaną przez system tożsamość zarządzaną w grupie. Tożsamość jest ograniczona do grupy zasobów grupy kontenerów. Długotrwałe polecenie utrzymuje działanie kontenera. W tym przykładzie użyto tej samej grupy zasobów używanej do utworzenia magazynu kluczy, który znajduje się w zakresie tożsamości.

# Get the resource ID of the resource group
RG_ID=$(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 $RG_ID \
  --command-line "tail -f /dev/null"

W ciągu kilku sekund powinna zostać wyświetlona odpowiedź z interfejsu wiersza polecenia platformy Azure wskazująca, że wdrożenie zostało ukończone. 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 identyfikatorze Entra firmy Microsoft:

[...]
"identity": {
    "principalId": "bbbbbbbb-cccc-dddd-2222-333333333333",
    "tenantId": "aaaabbbb-0000-cccc-1111-dddd2222eeee",
    "type": "SystemAssigned",
    "userAssignedIdentities": null
},
[...]

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

SP_ID=$(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 $SP_ID \
   --secret-permissions get

Uzyskiwanie wpisu tajnego z magazynu kluczy przy użyciu 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

Wartość wpisu tajnego jest pobierana:

"Hello Container Instances"

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

Aby włączyć tożsamość zarządzaną w grupie kontenerów przy użyciu szablonu usługi Resource Manager, ustaw identity właściwość Microsoft.ContainerInstance/containerGroups obiektu z obiektem ContainerGroupIdentity . Poniższe fragmenty kodu pokazują identity właściwość skonfigurowaną dla różnych scenariuszy. Zobacz dokumentację szablonu usługi 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": "SystemAssigned, 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':{}}

Tożsamość zarządzana w kontenerach systemu Windows

Tożsamość zarządzana w grupach kontenerów systemu Windows działa inaczej niż grupy kontenerów systemu Linux. W przypadku kontenerów systemu Windows serwer metadanych (169.254.169.254) nie jest dostępny do pobrania tokenu identyfikatora Entra firmy Microsoft. Klienci mogą postępować zgodnie z innym wzorcem, aby uzyskać token dostępu w kontenerach systemu Windows. Wzorzec obejmuje wysyłanie żądania tokenu do IDENTITY_ENDPOINT wraz z dodatkowymi informacjami, takimi jak identyfikator podmiotu zabezpieczeń i wpis tajny, jak pokazano poniżej. IDENTITY_ENDPOINT i IDENTITY_HEADER są wstrzykiwane jako zmienna środowiskowa w kontenerze.

curl -G -v %IDENTITY_ENDPOINT% --data-urlencode resource=https://vault.azure.net --data-urlencode principalId=<principal id> -H secret:%IDENTITY_HEADER%

Przykładowy skrypt programu PowerShell

identityEndpoint = $env:IDENTITY_ENDPOINT
$identityHeader = $env:IDENTITY_HEADER
$resource = "https://vault.azure.net"
$principalId = "b2ee9347-623c-4794-85af-2d5261356f67"
 
Invoke-RestMethod -Uri "$identityEndpoint" `
    -Method Get `
    -Headers @{secret = $identityHeader} `
    -Body @{resource = $resource; principalId = $principalId} `
    -ContentType "application/x-www-form-urlencoded"

Moduł Az Login i inne biblioteki klienta zależne od serwera metadanych (169.254.169.254) nie będą działać w kontenerze systemu Windows. Ponadto kontenery systemu Windows w sieci wirtualnej nie będą mogły łączyć się z punktem końcowym; w związku z tym nie można wygenerować tokenu tożsamości zarządzanej w kontenerze sieci wirtualnej systemu Windows.

Następne kroki

W tym artykule przedstawiono informacje o tożsamościach zarządzanych w usłudze Azure Container Instances i o tym, jak wykonać następujące działania:

  • 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