Azure Container Instances ile yönetilen kimlikleri kullanma

Diğer Azure hizmetleriyle etkileşim kuran Azure Container Instances'ta kod çalıştırmak için Azure kaynakları için yönetilen kimlikleri kullanın. Kod içerisinde gizli anahtarlar veya kimlik bilgilerini tutmanız gerekmez. Bu özellik, Microsoft Entra Id'de otomatik olarak yönetilen bir kimliğe sahip bir Kapsayıcı Örnekleri dağıtımı sağlar.

Bu makalede, Container Instances'daki yönetilen kimlikler hakkında daha fazla bilgi ediniyorsunuz. Ayrıca:

  • Kapsayıcı grubunda kullanıcı tarafından atanan veya sistem tarafından atanan kimliği etkinleştirme.
  • Azure anahtar kasasına kimlik erişimi verme.
  • Yönetilen kimliği kullanarak çalışan bir kapsayıcıdan anahtar kasasına erişin.

Kimlikleri etkinleştirip kullanarak diğer Azure hizmetlerine erişmek için Kapsayıcı Örneklerindeki örnekleri uyarlayın. Bu örnekler etkileşimlidir. Pratikte, kapsayıcı görüntüleriniz Azure hizmetlerine erişmek için kod çalıştırır.

Yönetilen kimlik neden kullanılır?

Kapsayıcı kodunuzda kimlik bilgilerini yönetmenize gerek kalmadan Microsoft Entra kimlik doğrulamasını destekleyen herhangi bir hizmette kimlik doğrulaması yapmak için, çalışan bir kapsayıcıda yönetilen bir kimlik kullanın. Microsoft Entra kimlik doğrulamasını desteklemeyen hizmetler için gizli dizileri bir Azure anahtar kasasında depolayabilir ve kimlik bilgilerini almak üzere anahtar kasasına erişmek için yönetilen kimliği kullanabilirsiniz. Yönetilen kimlik kullanma hakkında daha fazla bilgi için bkz. Azure kaynakları için yönetilen kimlikler nelerdir?.

Yönetilen kimliği etkinleştirme

Kapsayıcı grubu oluşturduğunuzda, ContainerGroupIdentity özelliğini ayarlayarak bir veya daha fazla yönetilen kimlik etkinleştirin. Ayrıca, bir kapsayıcı grubu çalıştırıldıktan sonra yönetilen kimlikleri etkinleştirebilir veya güncelleştirebilirsiniz. Her iki eylem de kapsayıcı grubunun yeniden başlatılmasına neden olur. Yeni veya mevcut bir kapsayıcı grubunda kimlikleri ayarlamak için Azure CLI'yı, Azure Resource Manager şablonunu, YAML dosyasını veya başka bir Azure aracını kullanın.

Kapsayıcı Örnekleri, yönetilen Azure kimliklerinin her iki türünü de destekler: kullanıcı tarafından atanan ve sistem tarafından atanan. Kapsayıcı grubunda, sistem tarafından atanan bir kimliği, bir veya daha fazla kullanıcı tarafından atanan kimliği veya her iki kimlik türünü de etkinleştirebilirsiniz. Azure kaynakları için yönetilen kimlikleri bilmiyorsanız genel bakışa bakın.

Yönetilen kimlik kullanma

Yönetilen kimlik kullanmak için, kimliğe abonelikteki bir veya daha fazla Azure hizmet kaynağına (web uygulaması, anahtar kasası veya depolama hesabı gibi) erişim verilmelidir. Çalışan bir kapsayıcıda yönetilen kimlik kullanmak, Azure sanal makinesinde (VM) kimlik kullanmaya benzer. Daha fazla bilgi için belirteç, Azure PowerShell veya Azure CLI ya da AzureSDK'ları kullanmaya yönelik VM kılavuzuna bakın.

Prerequisites

  • Bu makale, Azure CLI'nın 2.0.49 veya sonraki bir sürümünü gerektirir. Azure Cloud Shell kullanıyorsanız en son sürüm zaten yüklüdür.

Azure anahtar kasası oluşturma

Bu makaledeki örneklerde, Azure Key Vault gizli anahtarına erişmek için Kapsayıcı Örnekleri'nde bir yönetilen kimlik kullanılır.

İlk olarak, aşağıdaki az group create komutuyla eastus konumunda myResourceGroup adlı bir kaynak grubu oluşturun:

az group create --name myResourceGroup --location eastus

Bir anahtar kasası oluşturmak için az keyvault create komutunu kullanın. Benzersiz bir anahtar kasası adı belirttiğinizden emin olun.

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

az keyvault secret set komutunu kullanarak anahtar kasasında örnek bir gizli dizi depolayın :

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

Container Instances'ta kullanıcı tarafından atanan veya sistem tarafından atanan yönetilen kimliği kullanarak anahtar kasasına erişmek için aşağıdaki örneklerle devam edin.

Örnek 1: Azure anahtar kasasına erişmek için kullanıcı tarafından atanan bir kimlik kullanma

Kimlik oluşturma

önce az identity create komutunu kullanarak aboneliğinizde bir kimlik oluşturun . Anahtar kasasını oluşturmak için kullanılan kaynak grubunu kullanabilirsiniz. Farklı bir tane de kullanabilirsiniz.

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

Aşağıdaki adımlarda kimliği kullanmak için az identity show komutunu kullanarak kimliğin hizmet sorumlusu kimliğini ve kaynak kimliğini değişkenlerde depolayın.

# 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)

Anahtar kasasına kullanıcıya atanan kimliğin erişimini sağlama

Anahtar kasasında erişim ilkesi ayarlamak için aşağıdaki az keyvault set-policy komutunu çalıştırın. Aşağıdaki örnek, kullanıcı tarafından atanan kimliğin anahtar kasasından sırları erişmesine izin verir.

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

Kapsayıcı grubunda kullanıcı tarafından atanan kimliği etkinleştirme

Microsoft'un görüntüsünü temel alan bir kapsayıcı örneği oluşturmak için aşağıdaki azure-cli komutunu çalıştırın. Bu örnek, diğer Azure hizmetlerine erişmek üzere Azure CLI'yi çalıştırmak için etkileşimli olarak kullanabileceğiniz tek bir kapsayıcı grubu sağlar. Bu bölümde yalnızca temel işletim sistemi kullanılır. Kapsayıcıda Azure CLI'yı kullanma örneği için bkz. Kapsayıcı grubunda sistem tarafından atanan kimliği etkinleştirme.

--assign-identity parametresi, kullanıcı tarafından atanan yönetilen kimliğinizi gruba geçirir. Uzun süre çalışan komut kapsayıcıyı çalışır durumda tutar. Bu örnek, anahtar kasasını oluşturmak için kullanılan kaynak grubunu kullanır, ancak farklı bir kaynak grubu belirtebilirsiniz.

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

Birkaç saniye içinde Azure CLI'dan dağıtımın tamamlandığını belirten bir yanıt almanız gerekir. az container show komutuyla durumunu denetleyin.

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

identity Çıktıdaki bölüm, kimliğin kapsayıcı grubunda ayarlandığını gösteren aşağıdaki örneğe benzer. principalID altındauserAssignedIdentities, Microsoft Entra Id'de oluşturduğunuz kimliğin hizmet sorumlusudur:

[...]
"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"
      }
    }
  },
[...]

Anahtar kasasından gizli almak için kullanıcı tarafından atanan kimliği kullanma

Artık anahtar kasasına erişmek için çalışan kapsayıcı örneğindeki yönetilen kimliği kullanabilirsiniz. İlk olarak kapsayıcıda bir Bash kabuğu açın.

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

Kapsayıcıdaki Bash kabuğunda aşağıdaki komutları çalıştırın. Anahtar kasasında kimlik doğrulaması yapmak üzere Microsoft Entra Id kullanmak üzere bir erişim belirteci almak için aşağıdaki komutu çalıştırın:

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

Çıktı:

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

Erişim belirtecini kimlik doğrulaması için sonraki komutlarda kullanılacak bir değişkende depolamak için aşağıdaki komutu çalıştırın:

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')

Anahtar kasasında kimlik doğrulaması yapmak ve bir gizli anahtarı okumak için şimdi erişim belirtecini kullanın. URL'ye anahtar kasanızın adını yazdığınızdan emin olun (https://mykeyvault.vault.azure.net/...):

curl https://mykeyvault.vault.azure.net/secrets/SampleSecret/?api-version=7.4 -H "Authorization: Bearer $TOKEN"

Yanıt, sırrı gösteren örneğe benzerdir. Kodunuzda, gizliyi elde etmek için bu çıkışı ayrıştırırsınız. Ardından, başka bir Azure kaynağına erişmek için sırrı sonraki işlemlerde kullanın.

{"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"}}

Örnek 2: Azure anahtar kasasına erişmek için sistem tarafından atanan bir kimlik kullanma

Kapsayıcı grubunda sistem tarafından atanan kimliği etkinleştirme

Microsoft'un görüntüsünü temel alan bir kapsayıcı örneği oluşturmak için aşağıdaki azure-cli komutunu çalıştırın. Bu örnek, diğer Azure hizmetlerine erişmek üzere Azure CLI'yi çalıştırmak için etkileşimli olarak kullanabileceğiniz tek bir kapsayıcı grubu sağlar.

Başka --assign-identity değer içermeyen parametresi, grupta sistem tarafından atanan yönetilen kimliği etkinleştirir. Kimlik, kapsayıcı grubun kaynak grubuna göre belirlenmiştir. Uzun süre çalışan komut kapsayıcıyı çalışır durumda tutar. Bu örnek, kimlik kapsamındaki anahtar kasasını oluşturmak için daha önce kullanılan aynı kaynak grubunu kullanır.

# 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"

Birkaç saniye içinde Azure CLI'dan dağıtımın tamamlandığını belirten bir yanıt almanız gerekir. az container show komutuyla durumunu denetleyin.

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

identity Çıktıdaki bölüm, sistem tarafından atanan bir kimliğin Microsoft Entra Kimliği'nde oluşturulduğunu gösteren aşağıdaki örneğe benzer şekilde görünür:

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

Sonraki adımlarda kullanılacak kimliğin principalId değerine (hizmet sorumlusu kimliği) bir değişken ayarlayın.

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

Anahtar kasasına kapsayıcı grubunun erişimini sağlama

Anahtar kasasında erişim ilkesi ayarlamak için aşağıdaki az keyvault set-policy komutunu çalıştırın. Aşağıdaki örnek, sistem yönetimli kimliğin anahtar kasasından gizli bilgileri almasına izin verir.

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

Anahtar kasasından gizli anahtar almak için kapsayıcı grup kimliği kullanma

Artık yönetilen kimliği kullanarak çalışan kapsayıcı örneğindeki anahtar kasasına erişebilirsiniz. İlk olarak kapsayıcıda bir Bash kabuğu açın.

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

Kapsayıcıdaki Bash kabuğunda aşağıdaki komutları çalıştırın. İlk olarak, yönetilen kimliği kullanarak Azure CLI'da oturum açın:

az login --identity

Anahtar kasasından, çalışan kapsayıcıdan gizli bilgiyi alın.

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

Gizli anahtarın değeri alınır:

"Hello Container Instances"

Resource Manager şablonu kullanarak yönetilen kimliği etkinleştirme

Resource Manager şablonu kullanarak kapsayıcı grubunda yönetilen kimliği etkinleştirmek için nesnenin identity özelliğini bir Microsoft.ContainerInstance/containerGroups nesneyle ayarlayınContainerGroupIdentity. Aşağıdaki kod parçacıkları, identity özelliğinin farklı senaryolar için nasıl yapılandırıldığını gösterir. Daha fazla bilgi için bkz. Resource Manager şablon başvurusu. En az apiVersion değerini 2018-10-01belirtin.

Kullanıcı tarafından atanan kimlik

Kullanıcı tarafından atanan kimlik, aşağıdaki formun kaynak kimliğidir:

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

Kullanıcı tarafından atanan bir veya daha fazla kimliği etkinleştirebilirsiniz.

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

Sistem tarafından atanan kimlik

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

Sistem tarafından atanan ve kullanıcı tarafından atanan kimlikler

Kapsayıcı grubunda, hem sistem tarafından atanan kimliği hem de kullanıcı tarafından atanan bir veya daha fazla kimliği etkinleştirebilirsiniz.

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

YAML dosyası kullanarak yönetilen kimliği etkinleştirme

YAML dosyası kullanılarak dağıtılan bir kapsayıcı grubunda yönetilen kimliği etkinleştirmek için aşağıdaki YAML'yi ekleyin. En az apiVersion değerini 2018-10-01belirtin.

Kullanıcı tarafından atanan kimlik

Kullanıcı tarafından atanan kimlik, aşağıdaki formun kaynak kimliğidir:

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

Kullanıcı tarafından atanan bir veya daha fazla kimliği etkinleştirebilirsiniz.

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

Sistem tarafından atanan kimlik

identity:
  type: SystemAssigned

Sistem tarafından atanan ve kullanıcı tarafından atanan kimlikler

Kapsayıcı grubunda, hem sistem tarafından atanan kimliği hem de kullanıcı tarafından atanan bir veya daha fazla kimliği etkinleştirebilirsiniz.

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

Windows kapsayıcılarında yönetilen kimlik

Windows kapsayıcı gruplarında yönetilen kimlik, Linux kapsayıcı gruplarından farklı çalışır. Windows kapsayıcılar için meta veri sunucusu (169.254.169.254) Microsoft Entra belirteci almak için kullanılamaz. Bunun yerine, IDENTITY_ENDPOINT öğesine bir belirteç isteği gönderin ve IDENTITY_HEADER değerini gizli üst bilgi olarak ekleyin. Azure, IDENTITY_ENDPOINT ve IDENTITY_HEADER öğelerini kapsayıcıya ortam değişkenleri olarak ekler.

Yönetilen kimlik ile bir Windows kapsayıcı grubu oluşturun

Kullanıcı tarafından atanan yönetilen kimliğe sahip bir Windows kapsayıcı grubu oluşturmak için aşağıdaki az container create komutunu çalıştırın. Kaynak grubu, ad ve kimlik kaynak kimliğini kendi değerlerinizle değiştirin.

az container create \
  --resource-group myResourceGroup \
  --name mywindowscontainer \
  --image mcr.microsoft.com/windows/nanoserver:1809 \
  --assign-identity $RESOURCE_ID \
  --os-type windows \
  --command-line "ping -t localhost"

Windows kapsayıcısında bir belirteç alma

Kullanıcı tarafından atanan bir yönetilen kimlik kullanıyorsanız, isteğe ekleyin principalId . Sistem tarafından atanan yönetilen kimlik kullanıyorsanız, principalId öğesini atlayın.

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

Örnek PowerShell isteği:

$identityEndpoint = $env:IDENTITY_ENDPOINT
$identityHeader = $env:IDENTITY_HEADER
$resource = "https://vault.azure.net"
$principalId = "aaaaaaaa-bbbb-cccc-1111-222222222222"

$response = Invoke-RestMethod -Uri $identityEndpoint `
    -Method Get `
    -Headers @{ secret = $identityHeader } `
    -Body @{ resource = $resource; principalId = $principalId } `
    -ContentType "application/x-www-form-urlencoded"

$response.access_token

Meta az login veri sunucusuna (169.254.169.254) bağımlı olan komut ve istemci kitaplıkları Windows kapsayıcısında çalışmaz.

sanal ağdaki Windows kapsayıcıları yönetilen kimlik uç noktasına bağlanamaz. Sonuç olarak, bu senaryoda yönetilen kimlik belirteci oluşturamazsınız.

Tip

Kullanıcı tarafından atanan bir kimlik için, önceki betikte gösterildiği gibi belirteç isteğine kimliğin principalId değerini ekleyin. sistem tarafından atanan bir kimlik için principalId öğesini atlayın.

Örnek: Bir Windows kapsayıcısından Azure Depolama blobunu okumak

Bu uçtan uca örnek, kullanıcı tarafından atanan bir kimliğe sahip bir Windows kapsayıcı grubu dağıtır ve ardından blob indirmek için kapsayıcının içinden bu kimliği kullanır.

İlk olarak, kullanıcı tarafından atanan kimliğe depolama hesabına (bir kez) erişim verin. Depolama Blobu Veri Okuyucusu rolü bir blobu indirmek için yeterlidir:

PRINCIPAL_ID=$(az identity show --resource-group myResourceGroup --name myACIId --query principalId --output tsv)
STORAGE_ID=$(az storage account show --name mystorageaccount --query id --output tsv)

az role assignment create \
  --assignee-object-id $PRINCIPAL_ID \
  --assignee-principal-type ServicePrincipal \
  --role "Storage Blob Data Reader" \
  --scope $STORAGE_ID

Ardından, Windows kapsayıcı grubunu bir YAML dosyası (deploy-aci.yaml kullanarak) dağıtın. Uzun süre çalışan komut, gruba az container exec ile girebilmeniz için grubu çalışır durumda tutar:

apiVersion: '2023-05-01'
location: eastus
name: mywindowscg
type: Microsoft.ContainerInstance/containerGroups
identity:
  type: UserAssigned
  userAssignedIdentities:
    '/subscriptions/<subscriptionId>/resourceGroups/myResourceGroup/providers/Microsoft.ManagedIdentity/userAssignedIdentities/myACIId': {}
properties:
  osType: Windows
  restartPolicy: Always
  containers:
    - name: mycontainer
      properties:
        image: mcr.microsoft.com/powershell:lts-nanoserver-ltsc2022
        command:
          - pwsh
          - -NoProfile
          - -Command
          - 'while ($true) { Start-Sleep -Seconds 3600 }'
        resources:
          requests:
            cpu: 2
            memoryInGB: 4
az container create --resource-group myResourceGroup --file deploy-aci.yaml

Grup çalıştırıldıktan sonra kapsayıcıda bir PowerShell kabuğu açın:

az container exec \
  --resource-group myResourceGroup \
  --name mywindowscg \
  --container-name mycontainer \
  --exec-command "pwsh"

Kapsayıcı kabuğunun içinde, kapsamı depolama olarak belirlenmiş bir belirteç isteyin ve blobu indirmek için bu belirteci kullanın. Kapsayıcı Azure CLI içermediğinden, kimliğin principalId değerini doğrudan geçirin:

$principalId = "<user-assigned-identity-principalId>"
$storageAccount = "mystorageaccount"
$container = "mycontainer"
$blob = "hello.txt"

$tokenResponse = Invoke-RestMethod -Uri $env:IDENTITY_ENDPOINT `
    -Method Get `
    -Headers @{secret = $env:IDENTITY_HEADER} `
    -Body @{resource = "https://storage.azure.com/"; principalId = $principalId} `
    -ContentType "application/x-www-form-urlencoded"

$blobUrl = "https://$storageAccount.blob.core.windows.net/$container/$blob"
Invoke-WebRequest -Uri $blobUrl `
    -Headers @{ Authorization = "Bearer $($tokenResponse.access_token)"; "x-ms-version" = "2023-11-03" } `
    -OutFile "C:\$blob"

Get-Content "C:\$blob"

Kapsayıcı yalnızca yönetilen kimliğini kullanarak depolamada kimlik doğrulaması yapar. resource değerini ve hedef uç noktayı diğer Azure hizmetlerini çağırmak için uyarlayın.