Aracılığıyla paylaş


Go için Azure SDK ile Azure'da barındırılan uygulamaların Azure kaynaklarına kimliğini doğrulama

Azure App Service, Azure Sanal Makineler veya Azure Container Instances gibi hizmetleri kullanarak bir uygulamayı Azure'da barındırdığınızda, Azure kaynaklarına bir uygulamanın kimliğini doğrulamak için önerilen yaklaşım yönetilen kimlik'tir.

Yönetilen kimlik, gizli anahtar veya başka bir uygulama gizli dizisi kullanmaya gerek kalmadan diğer Azure kaynaklarına bağlanabilecek şekilde uygulamanız için bir kimlik sağlar. Azure, uygulamanızın kimliğini ve bağlanmasına izin verilen kaynakları dahili olarak bilir. Azure, uygulama gizli dizilerini yönetmek zorunda kalmadan uygulamanın diğer Azure kaynaklarına bağlanmasına izin vermek üzere otomatik olarak Microsoft Entra belirteçlerini almak için bu bilgileri kullanır.

Not

Azure Kubernetes Service (AKS) üzerinde çalışan uygulamalar, Azure kaynaklarıyla kimlik doğrulaması yapmak için bir iş yükü kimliği kullanabilir. AKS'de iş yükü kimliği, yönetilen kimlik ile Kubernetes hizmet hesabı arasındaki güven ilişkisini temsil eder. AKS'ye dağıtılan bir uygulama böyle bir ilişkide Kubernetes hizmet hesabıyla yapılandırılmışsa DefaultAzureCredential yönetilen kimliği kullanarak uygulamanın kimliğini Azure'da doğrular. İş yükü kimliği kullanarak kimlik doğrulaması, Azure Kubernetes Serviceile Microsoft Entra İş Yükü Kimliğini Kullanma bölümünde ele alınmaktadır. İş yükü kimliğini yapılandırma adımları için bkz. Azure Kubernetes Service (AKS) kümesinde iş yükü kimliğini dağıtma ve yapılandırma.

Yönetilen kimlik türleri

İki tür yönetilen kimlik vardır:

  • Sistem tarafından atanan yönetilen kimlikler - Bu tür yönetilen kimlikler Azure tarafından sağlanır ve doğrudan bir Azure kaynağına bağlıdır. Bir Azure kaynağında yönetilen kimliği etkinleştirdiğinizde, bu kaynak için sistem tarafından atanan bir yönetilen kimlik alırsınız. Sistem tarafından atanan yönetilen kimlik, ilişkili olduğu Azure kaynağının yaşam döngüsüne bağlıdır. Kaynak silindiğinde Azure sizin için kimliği otomatik olarak siler. Tek yapmanız gereken kodunuzu barındıran Azure kaynağı için yönetilen kimliği etkinleştirmek olduğundan, bu yaklaşım en kolay yönetilen kimlik türüdür.
  • Kullanıcı tarafından atanan yönetilen kimlikler - Yönetilen kimliği tek başına Azure kaynağı olarak da oluşturabilirsiniz. Bu yaklaşım en sık çözümünüzde aynı kimliği ve aynı izinleri paylaşması gereken birden çok Azure kaynağı üzerinde çalışan birden çok iş yükü olduğunda kullanılır. Örneğin, çözümünüzde aynı Azure kaynakları kümesine erişmesi gereken birden çok App Service ve sanal makine örneğinde çalışan bileşenler varsa, bu kaynaklar arasında kullanılan kullanıcı tarafından atanan yönetilen kimlik mantıklıdır.

Bu makale, bir uygulama için sistem tarafından atanan yönetilen kimliği etkinleştirme ve kullanma adımlarını kapsar. Kullanıcı tarafından atanan yönetilen kimlik kullanmanız gerekiyorsa, kullanıcı tarafından atanan yönetilen kimliğin nasıl oluşturulacağını görmek için Kullanıcı tarafından atanan yönetilen kimlikleri yönetme makalesine bakın.

1 - Uygulamayı barındıran Azure kaynağında yönetilen kimliği etkinleştirme

İlk adım, uygulamanızı barındıran Azure kaynağında yönetilen kimliği etkinleştirmektir. Örneğin, Azure Container Apps kullanarak bir Gin uygulaması barındırırsanız kapsayıcı uygulaması için yönetilen kimliği etkinleştirmeniz gerekir. Uygulamanızı barındırmak için bir sanal makine kullanıyorsanız VM'nizin yönetilen kimliği kullanmasını sağlayabilirsiniz.

Yönetilen kimliğin Azure portalı veya Azure CLI kullanarak Bir Azure kaynağı için kullanılmasını etkinleştirebilirsiniz.

Azure CLI komutları Azure Cloud Shell veyaAzure CLI yüklü bir iş istasyonunda çalıştırılabilir.

Bir Azure kaynağı için yönetilen kimliği etkinleştirmek için kullanılan Azure CLI komutları az <command-group> identity --resource-group <resource-group-name> --name <resource-name>biçimindedir. Popüler Azure hizmetleri için belirli komutlar aşağıda gösterilmiştir.

az containerapp identity assign \
    --resource-group <resource-group-name> \
    --name <container-app-name> \
    --system-assigned

Çıkış aşağıdaki gibi görünür.

{
  "principalId": "aaaaaaaa-bbbb-cccc-1111-222222222222",
  "tenantId": "aaaabbbb-0000-cccc-1111-dddd2222eeee",
  "type": "SystemAssigned",
  "userAssignedIdentities": null
}

principalId değeri, yönetilen kimliğin benzersiz kimliğidir. Sonraki adımda bu değerlere ihtiyaç duyacağınız için bu çıkışın bir kopyasını saklayın.

2 - Yönetilen kimliğe rol atama

Ardından, uygulamanızın hangi rollere (izinlere) ihtiyacı olduğunu belirlemeniz ve yönetilen kimliği Azure'daki bu rollere atamanız gerekir. Yönetilen kimliğe kaynak, kaynak grubu veya abonelik kapsamında roller atanabilir. Bu örnekte, çoğu uygulama tüm Azure kaynaklarını tek bir kaynak grubunda gruplandırdığından kaynak grubu kapsamında rollerin nasıl atandığı gösterilmektedir.

Azure'da yönetilen kimliğe az role assignment create komutu kullanılarak bir rol atanır. Atanan için, 1. adımda kopyaladığınız principalId kullanın.

az role assignment create --assignee {managedIdentityprincipalId} \
    --scope /subscriptions/{subscriptionId}/resourceGroups/{resourceGroupName} \
    --role "{roleName}" 

Bir hizmet sorumlusunun atanabileceği rol adlarını almak için az role definition list komutunu kullanın.

az role definition list \
    --query "sort_by([].{roleName:roleName, description:description}, &roleName)" \
    --output table

Örneğin, kimliği olan yönetilen kimliğe, kimliği olan abonelikteki kaynak grubu-adı kaynak grubu içindeki tüm depolama hesaplarındaki blob kapsayıcılarına ve verilere okuma, yazma ve silme izni vermek için, aşağıdaki komutu kullanarak uygulama hizmet sorumlusunu Depolama Blobu Veri Katkıda Bulunanı rolüne atayabilirsiniz.

az role assignment create --assignee aaaaaaaa-bbbb-cccc-1111-222222222222 \
    --scope /subscriptions/aaaa0a0a-bb1b-cc2c-dd3d-eeeeee4e4e4e/resourceGroups/your-resource-group-name \
    --role "Storage Blob Data Contributor"

Azure CLI kullanarak kaynak veya abonelik düzeyinde izin atama hakkında bilgi için Azure CLIkullanarak Azure rollerini atama makalesine bakın.

3 - Uygulamanızda DefaultAzureCredential'i kullanın

Kodunuz Azure'da çalıştırıldığında ve uygulamanızı barındıran Azure kaynağında yönetilen kimlik etkinleştirildiğinde, DefaultAzureCredential kullanılacak kimlik bilgilerini aşağıdaki sırayla belirler:

  1. AZURE_CLIENT_ID, AZURE_TENANT_IDve AZURE_CLIENT_SECRET veya AZURE_CLIENT_CERTIFICATE_PATH ve (isteğe bağlı olarak) AZURE_CLIENT_CERTIFICATE_PASSWORDortam değişkenleri tarafından tanımlanan hizmet sorumlusunun ortamını denetleyin.
  2. Kullanıcı tarafından atanan yönetilen kimliğin istemci kimliği için AZURE_CLIENT_ID ortam değişkenini denetleyin.
  3. Azure kaynağı için sistem tarafından atanan yönetilen kimliği, etkinleştirildiyse kullanın.

Bu makalede, Azure Container App için sistem tarafından atanan yönetilen kimliği kullanıyoruz, bu nedenle ortamda yönetilen kimlik yapılandırmamız veya bunu parametre olarak geçirmemiz gerekmez. Aşağıdaki adımlarda DefaultAzureCredentialnasıl kullanacağınız gösterilmektedir.

İlk olarak, azidentity paketini uygulamanıza ekleyin.

go get github.com/Azure/azure-sdk-for-go/sdk/azidentity

Ardından, uygulamanızda bir Azure SDK istemcisi örneği oluşturan tüm Go kodları için şunları yapmak istersiniz:

  1. azidentity paketini içeri aktarın.
  2. DefaultAzureCredential türünün bir örneğini oluşturun.
  3. DefaultAzureCredential türünün örneğini Azure SDK istemci oluşturucusna geçirin.

Aşağıdaki kod kesiminde azure depolama blob istemcisi ile bu adımların bir örneği gösterilmiştir.

import (
	"context"

	"github.com/Azure/azure-sdk-for-go/sdk/azidentity"
	"github.com/Azure/azure-sdk-for-go/sdk/storage/azblob"
)

const (
	account       = "https://<replace_with_your_storage_account_name>.blob.core.windows.net/"
	containerName = "sample-container"
	blobName      = "sample-blob"
	sampleFile    = "path/to/sample/file"
)

func main() {
    // create a credential
    cred, err := azidentity.NewDefaultAzureCredential(nil)
    if err != nil {
      // TODO: handle error
    }
    
    // create a client for the specified storage account
    client, err := azblob.NewClient(account, cred, nil)
    if err != nil {
      // TODO: handle error
    }
    
    // TODO: perform some action with the azblob Client
    // _, err = client.DownloadFile(context.TODO(), <containerName>, <blobName>, <target_file>, <DownloadFileOptions>)
}

Go için Azure SDK kimlik doğrulamasına genel bakış makalesinde açıklandığı gibi, DefaultAzureCredential birden çok kimlik doğrulama yöntemini destekler ve çalışma zamanında kullanılan kimlik doğrulama yöntemini belirler. Bu yaklaşımın avantajı, uygulamanızın ortama özgü kod uygulamadan farklı ortamlarda farklı kimlik doğrulama yöntemleri kullanabilmesidir. Yerel geliştirme sırasında iş istasyonunuzda yukarıdaki kod çalıştırıldığında, DefaultAzureCredential, ortam ayarları tarafından belirlenen bir uygulama hizmeti ilkesi veya geliştirici aracı kimlik bilgilerini kullanarak diğer Azure kaynaklarına kimlik doğrulaması yapar. Bu nedenle, hem yerel geliştirme sırasında hem de Azure'a dağıtıldığında uygulamanızın Kimliğini Azure kaynaklarına doğrulamak için aynı kod kullanılabilir.

Önemli

DefaultAzureCredential, Azure barındırma ortamlarında kullanılan kimlik bilgilerini ve yerel geliştirmede kullanılan kimlik bilgilerini birleştirerek Azure'a dağıtım yapan uygulamalar geliştirirken kimlik doğrulamasını basitleştirir. Üretimde, kimlik doğrulamasının daha öngörülebilir ve hata ayıklaması daha kolay olması için belirli bir kimlik bilgisi türünü kullanmak daha iyidir.

4 - Uygulamanızda ManagedIdentityCredential'i uygulayın

ManagedIdentityCredential uygulama adımları, DefaultAzureCredential türünü kullanmakla aynıdır.

İlk olarak, azidentity paketini uygulamanıza ekleyin.

go get github.com/Azure/azure-sdk-for-go/sdk/azidentity

Ardından, uygulamanızda bir Azure SDK istemcisi örneği oluşturan tüm Go kodları için şunları yapmak istersiniz:

  1. azidentity paketini içeri aktarın.
  2. ManagedIdentityCredential türünün bir örneğini oluşturun.
  3. ManagedIdentityCredential türünün örneğini Azure SDK istemci oluşturucusna geçirin.

Aşağıdaki kod kesiminde azure depolama blob istemcisi ile bu adımların bir örneği gösterilmiştir.

import (
	"context"

	"github.com/Azure/azure-sdk-for-go/sdk/azidentity"
	"github.com/Azure/azure-sdk-for-go/sdk/storage/azblob"
)

const (
	account       = "https://<replace_with_your_storage_account_name>.blob.core.windows.net/"
	containerName = "sample-container"
	blobName      = "sample-blob"
	sampleFile    = "path/to/sample/file"
)

func main() {
    // create a credential
    cred, err := azidentity.NewManagedIdentityCredential(nil)
    
    // When using User Assigned Managed Identity use this instead and pass your client id in the options
    // clientID := azidentity.ClientID("abcd1234-...")
    // opts := azidentity.ManagedIdentityCredentialOptions{ID: clientID}
    // cred, err := azidentity.NewManagedIdentityCredential(&opts)
    
    if err != nil {
      // TODO: handle error
    }
    
    // create a client for the specified storage account
    client, err := azblob.NewClient(account, cred, nil)
    if err != nil {
      // TODO: handle error
    }
    
    // TODO: perform some action with the azblob Client
    // _, err = client.DownloadFile(context.TODO(), <containerName>, <blobName>, <target_file>, <DownloadFileOptions>)
}