Azure üzerinde barındırılan C++ uygulamalarının, kullanıcı tarafından atanmış yönetilen kimlik kullanarak Azure kaynaklarına kimlik doğrulaması

Azure barındırılan bir uygulamanın kimliğini diğer Azure kaynaklarda doğrulamak için önerilen yaklaşım, managed identity kullanmaktır. Bu yaklaşım, Azure App Service, Azure Container Apps ve Azure Virtual Machines üzerinde barındırılan uygulamalar dahil olmak üzere çoğu Azure hizmeti için desteklenir. kimlik doğrulamasına genel bakış sayfasında farklı kimlik doğrulama teknikleri ve yaklaşımları hakkında daha fazla bilgi edinin. İlerideki bölümlerde şunları öğreneceksiniz:

  • Temel yönetilen kimlik kavramları
  • Uygulamanız için yönetilen kullanıcı atamalı kimlik oluşturma
  • Kullanıcı tarafından atanan yönetilen kimliğe nasıl rol atanır?
  • Uygulama kodunuzda kullanıcı tarafından atanan yönetilen kimliği kullanarak kimlik doğrulaması yapma

Temel yönetilen kimlik kavramları

Yönetilen kimlik, uygulamanızın gizli anahtarlar veya diğer uygulama gizli dizileri kullanmadan diğer Azure kaynaklarına güvenli bir şekilde bağlanmasını sağlar. Azure, kimliği ve bağlanmasına izin verilen kaynakları dahili olarak izler. Azure, uygulamanın diğer Azure kaynaklarına bağlanmasına izin vermek üzere Microsoft Entra belirteçlerini otomatik olarak almak için bu bilgileri kullanır.

Barındırılan uygulamanızı yapılandırırken göz önünde bulundurmanız gereken iki tür yönetilen kimlik vardır:

  • System-assigned yönetilen kimlikler doğrudan bir Azure kaynağında etkinleştirilerek yaşam döngüsüne bağlanır. Kaynak silindiğinde Azure sizin için kimliği otomatik olarak siler. Sistem tarafından atanan kimlikler, yönetilen kimlikleri kullanmaya yönelik minimalist bir yaklaşım sağlar.
  • User tarafından atanan yönetilen kimlikler tek başına Azure kaynakları olarak oluşturulur ve daha fazla esneklik ve yetenek sunar. Bunlar, aynı kimliği ve izinleri paylaşması gereken birden çok Azure kaynağı içeren çözümler için idealdir. Örneğin, birden çok sanal makinenin aynı Azure kaynakları kümesine erişmesi gerekiyorsa, kullanıcı tarafından atanan yönetilen kimlik yeniden kullanılabilirlik ve iyileştirilmiş yönetim sağlar.

Tavsiye

Yönetilen kimlik en iyi uygulama önerileri makalesinde sistem tarafından atanan ve kullanıcı tarafından atanan yönetilen kimlikleri seçme ve yönetme hakkında daha fazla bilgi edinin.

Aşağıdaki bölümlerde, Azure barındırılan bir uygulama için kullanıcı tarafından atanan yönetilen kimliği etkinleştirme ve kullanma adımları açıklanmaktadır. Sistem tarafından atanan bir yönetilen kimlik kullanmanız gerekiyorsa daha fazla bilgi için sistem tarafından atanan yönetilen kimlikler makalesini ziyaret edin.

Kullanıcının atadığı yönetilen kimliği oluşturun

Kullanıcı tarafından atanan yönetilen kimlikler, Azure portalı veya Azure CLI kullanılarak Azure aboneliğinizde tek başına kaynaklar olarak oluşturulur. Azure CLI komutları Azure Cloud Shell içinde veya Azure CLI yüklü yüklü bir iş istasyonunda çalıştırılabilir.

  1. Azure portalında ana arama çubuğuna Yönetilen kimlikler girin ve Services bölümünde eşleşen sonucu seçin.

  2. Yönetilen Kimlikler sayfasında +Oluştur'u seçin.

    Kullanıcı tarafından atanan yönetilen kimlikleri yönetme sayfasını gösteren ekran görüntüsü.

  3. Kullanıcı Tarafından Atanan Yönetilen Kimlik oluştur sayfasında, kullanıcı tarafından atanan yönetilen kimlik için bir abonelik, kaynak grubu ve bölge seçin ve bir ad sağlayın.

  4. Girişlerinizi gözden geçirmek ve doğrulamak için Gözden geçir + oluştur seçeneğini seçin.

    Kullanıcı tarafından atanan yönetilen kimlik oluşturma formunu gösteren ekran görüntüsü.

  5. Kullanıcı tarafından atanan yönetilen kimliği oluşturmak için oluştur'u seçin.

  6. Kimlik oluşturulduktan sonra Kaynağa git'i seçin.

  7. Yeni kimliğin Genel Bakış sayfasında, uygulama kodunu yapılandırırken kullanmak üzere İstemci Kimliği değerini kopyalayın.

Uygulamanıza yönetilen kimliği atayın

Kullanıcı tarafından atanan yönetilen kimlik, bir veya daha fazla Azure kaynağıyla ilişkilendirilebilir. Bu kimliği kullanan tüm kaynaklar, kimliğe ait roller üzerinden verilen izinleri alır.

  1. Azure portalında, Azure App Service veya Azure Container Apps örneği gibi uygulama kodunuzu barındıran kaynağa gidin.

  2. Kaynağın Genel Bakış sayfasında Ayarlar bölümünü genişletin ve navigasyon menüsünden Kimlik'i seçin.

  3. Kimlik sayfasına gidin ve Kullanıcı tarafından atanan sekmesine geçin.

  4. + Ekle'yi seçin ve Kullanıcı tarafından atanan yönetilen kimlik ekle panelini açın.

  5. Kullanıcı tarafından atanan yönetilen kimliği ekle panelinde, kimlikleriniz için yapılan arama sonuçlarını filtrelemek amacıyla Abonelik açılır listesini kullanın. Uygulamanızı barındıran Azure kaynağı için etkinleştirdiğiniz kullanıcı tarafından atanan yönetilen kimliği bulmak için User tarafından atanan yönetilen kimlikler arama kutusunu kullanın.

  6. Devam etmek için kimliği seçin ve panelin alt kısmındaki Ekle'i seçin.

    Kullanıcı tarafından atanan yönetilen kimliğin bir uygulamayla nasıl ilişkilendirildiğini gösteren ekran görüntüsü.

Yönetilen kimliğe roller atayın

Ardından, uygulamanızın hangi rollere ihtiyacı olduğunu belirleyin ve bu rolleri yönetilen kimliğe atayın. Yönetilen kimliğe aşağıdaki kapsamlarda rol atayabilirsiniz:

  • Kaynak: Atanan roller yalnızca o belirli kaynağa uygulanır.
  • Kaynak grubu: Atanan roller, kaynak grubunda yer alan tüm kaynaklara uygulanır.
  • abonelik : Atanan roller, abonelikte yer alan tüm kaynaklar için geçerlidir.

Aşağıdaki örnekte, birçok uygulama tüm ilgili Azure kaynaklarını tek bir kaynak grubu kullanarak yönettiğinden kaynak grubu kapsamında rollerin nasıl atandığı gösterilmektedir.

  1. Kullanıcı tarafından atanan yönetilen kimlikle uygulamayı içeren kaynak grubunun Genel Bakış sayfasına gidin.

  2. Soldaki gezinti bölmesinde Erişim Denetimi (IAM) seçin.

  3. Erişim denetimi (IAM) sayfasında, üst menüden + Ekle'yi seçin ve ardından Rol Ataması Ekle'yi seçerek Rol Ataması Ekle sayfasına gidin.

    Kimlik rolü atama sayfasına erişmeyi gösteren ekran görüntüsü.

  4. Rol ataması ekle sayfası, kimliklere rol atamak için sekmeli, çok adımlı bir iş akışı sunar. İlk Rol sekmesinde, kimliğe atamak istediğiniz rolü bulmak için üstteki arama kutusunu kullanın.

  5. Sonuçlardan rolü seçin ve ardından İleri seçeneğine tıklayarak Üyeler sekmesine geçin.

  6. erişim atama seçeneği için yönetilen kimlikseçin.

  7. Üyeler seçeneği için, + Üyeleri seç'ni seçin ve Yönetilen kimlikleri seç panelini açın.

  8. Yönetilen kimlikleri seçin panelinde Abonelik kullanın ve yönetilen kimlik açılan listelerini kullanarak kimliklerinizin arama sonuçlarını filtreleyin. Uygulamanızı barındıran Azure kaynağı için etkinleştirdiğiniz kullanıcı tarafından atanan yönetilen kimliği bulmak için Select arama kutusunu kullanın.

    Yönetilen kimlik atama işlemini gösteren ekran görüntüsü.

  9. Devam etmek için kimliği seçin ve panelin altındaki seçeneğini tıklayın.

  10. Sayfanın alt kısmındaki Gözden Geçir + Ata seçeneğini seçin.

  11. Son gözden geçir + ata sekmesinde, iş akışını tamamlamak için gözden geçir + ata'ü seçin.

Uygulamanızdan Azure hizmetleri için kimlik doğrulaması

Azure Kimliği kitaplığı, çeşitli kimlik bilgileri—Microsoft Entra kimlik doğrulama akışlarını ve farklı senaryoları desteklemeye uyarlanmış TokenCredential uygulamaları sağlar. Yönetilen kimlik yerel olarak çalıştırılırken kullanılamadığından, sonraki adımlar hangi senaryoda hangi kimlik bilgilerinin kullanılacağını gösterir:

  • Yerel geliştirme ortamı: Sadece yerel geliştirme sırasında, önceden yapılandırılmış bir kimlik bilgileri zinciri için DefaultAzureCredential adlı bir sınıf kullanın. DefaultAzureCredential, Azure CLI veya Visual Studio gibi yerel araçlarınızdan veya IDE'nizden kullanıcı kimlik bilgilerini bulur. Ayrıca yeniden denemeler, yanıtlar için bekleme süreleri ve birden çok kimlik doğrulama seçeneği için destek için esneklik ve kolaylık sağlar. Daha fazla bilgi edinmek için Authenticate to Azure services during local development makalesini ziyaret edin.
  • Azure barındırılan uygulamalar: Uygulamanız Azure çalışırken, uygulamanız için yapılandırılan yönetilen kimliği güvenle bulmak için ManagedIdentityCredential kullanın. Bu tam kimlik bilgisi türünün belirtilmesi, diğer kullanılabilir kimlik bilgilerinin beklenmedik bir şekilde alınmasını engeller.

Kodu uygulama

  1. vcpkg kullanarak azure-identity-cpp paketini uygulamanıza ekleyin.

    Seçtiğiniz bir terminalde uygulama projesi dizinine gidin ve aşağıdaki komutu çalıştırın:

    vcpkg add port azure-identity-cpp
    
  2. CMake dosyanıza aşağıdakileri ekleyin:

    find_package(azure-identity-cpp CONFIG REQUIRED)
    target_link_libraries(<your project name> PRIVATE Azure::azure-identity)
    
  3. Azure hizmetlere çeşitli Azure SDK istemci kitaplıklarından özel istemciler kullanılarak erişilir. Uygulamanızda bir Azure SDK istemcisi örneği oluşturan tüm C++ kodları için şunları yapmanız gerekir:

    1. azure/identity.hpp Üst bilgiyi dahil edin.
    2. öğesinin bir örneğini DefaultAzureCredentialoluşturun.
    3. DefaultAzureCredential örneğini Azure SDK istemci oluşturucusna geçirin.
    4. Ortam değişkenini AZURE_CLIENT_ID kullanıcı tarafından atanan yönetilen kimliğinizin istemci kimliğine ayarlayın.
    5. AZURE_TOKEN_CREDENTIALS ortam değişkenini ManagedIdentityCredential olarak ayarlayarak DefaultAzureCredential'nin yönetilen kimlik kimlik bilgilerini kullandığından emin olun. Bu uygulama, kimlik doğrulamasını daha öngörülebilir hale getirir ve Azure dağıtıldığında hata ayıklamayı kolaylaştırır. Daha fazla bilgi için bkz. Belirli bir kimlik bilgilerini kullanma.

    Bu adımların bir örneği, Azure Storage Blob istemcisiyle aşağıdaki kod kesiminde gösterilmiştir.

    #include <azure/identity.hpp>
    #include <azure/storage/blobs.hpp>
    #include <iostream>
    #include <memory>
    #include <cstdlib>
    
    int main() {
        try {
            // Set the AZURE_CLIENT_ID environment variable to your user-assigned managed identity client ID
            // This can be done in your deployment environment or in code (shown below for demonstration)
            // std::putenv("AZURE_CLIENT_ID=your-user-assigned-identity-client-id");
    
            // Create a credential - DefaultAzureCredential will use the AZURE_CLIENT_ID environment variable
            // Create a credential - DefaultAzureCredential will use the AZURE_CLIENT_ID and AZURE_TOKEN_CREDENTIALS environment variables
            auto credential = std::make_shared<Azure::Identity::DefaultAzureCredential>(true);
    
            // Create a client for the specified storage account
            std::string accountUrl = "https://<replace_with_your_storage_account_name>.blob.core.windows.net/";
            Azure::Storage::Blobs::BlobServiceClient blobServiceClient(accountUrl, credential);
    
            // Get a reference to a container
            std::string containerName = "sample-container";
            auto containerClient = blobServiceClient.GetBlobContainerClient(containerName);
    
            // Get a reference to a blob
            std::string blobName = "sample-blob";
            auto blobClient = containerClient.GetBlobClient(blobName);
    
            // TODO: perform some action with the blob client
            // auto downloadResult = blobClient.DownloadTo("path/to/local/file");
    
            std::cout << "Successfully authenticated using user-assigned managed identity." << std::endl;
    
        } catch (const std::exception& ex) {
            std::cout << "Exception: " << ex.what() << std::endl;
            return 1;
        }
    
        return 0;
    }
    

C++ kimlik doğrulamasına genel bakış için Azure SDK makalesinde açıklandığı gibi, 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. Önceki kod, yerel geliştirme sırasında iş istasyonunuzda çalıştırıldığında, DefaultAzureCredential, ortam ayarlarınca belirlenen bir uygulama hizmet sorumlusu 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 dağıtıldığında uygulamanızın kimliğini doğrulamak için Azure kaynaklar için aynı kod kullanılabilir.

Önemli

DefaultAzureCredential, Azure barındırma ortamları ve yerel geliştirme için kullanılan kimlik bilgilerini birleştirerek Azure’a dağıtılan 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.

DefaultAzureCredential alternatifi, ManagedIdentityCredential kullanmaktır. ManagedIdentityCredential kullanma adımları, DefaultAzureCredential türünü kullanmayla aynıdır.

Bu adımların bir örneği, Azure Storage Blob istemcisiyle aşağıdaki kod kesiminde gösterilmiştir.

#include <azure/identity.hpp>
#include <azure/storage/blobs.hpp>
#include <iostream>
#include <memory>

int main() {
    try {
        // Create a user-assigned managed identity credential with the client ID
        Azure::Identity::ManagedIdentityCredentialOptions options;
        options.ClientId = "abcd1234-..."; // Replace with your user-assigned managed identity client ID
        auto credential = std::make_shared<Azure::Identity::ManagedIdentityCredential>(options);
        
        // Create a client for the specified storage account
        std::string accountUrl = "https://<replace_with_your_storage_account_name>.blob.core.windows.net/";
        Azure::Storage::Blobs::BlobServiceClient blobServiceClient(accountUrl, credential);
        
        // Get a reference to a container
        std::string containerName = "sample-container";
        auto containerClient = blobServiceClient.GetBlobContainerClient(containerName);
        
        // Get a reference to a blob
        std::string blobName = "sample-blob";
        auto blobClient = containerClient.GetBlobClient(blobName);
        
        // TODO: perform some action with the blob client
        // auto downloadResult = blobClient.DownloadTo("path/to/local/file");
        
        std::cout << "Successfully authenticated using user-assigned managed identity." << std::endl;
        
    } catch (const std::exception& ex) {
        std::cout << "Exception: " << ex.what() << std::endl;
        return 1;
    }
    
    return 0;
}