Hizmet sorumlularını kullanarak yerel geliştirme sırasında Azure hizmetlerinde Python uygulamalarının kimliğini doğrulama

Bulut uygulamaları oluştururken geliştiricilerin yerel iş istasyonlarında uygulamaların hatalarını ayıklaması ve test etmeleri gerekir. Yerel geliştirme sırasında bir uygulama geliştiricinin iş istasyonunda çalıştırıldığında, yine de uygulama tarafından kullanılan tüm Azure hizmetlerinde kimlik doğrulaması yapması gerekir. Bu makalede, yerel geliştirme sırasında kullanılacak ayrılmış uygulama hizmet sorumlusu nesnelerinin nasıl ayarlanacağı ele alınıyor.

Yerel geliştiricide çalışan bir uygulamanın uygulama hizmet sorumlusunu bir .env dosyasından nasıl edindiğini ve ardından Azure kaynaklarına bağlanmak için bu kimliği nasıl kullandığını gösteren diyagram.

Yerel geliştirme için ayrılmış uygulama hizmet sorumluları, uygulama geliştirme sırasında en az ayrıcalık ilkesini izlemenize olanak sağlar. İzinlerin kapsamı, geliştirme sırasında uygulama için tam olarak gerekenlerle belirlenmiş olduğundan, uygulama kodunun farklı bir uygulama tarafından kullanılmak üzere tasarlanan bir Azure kaynağına yanlışlıkla erişmesi engellenir. Bu, uygulama geliştirme ortamında fazla ayrıcalıklı olduğundan uygulama üretime taşındığında hataların oluşmasını da engeller.

Uygulama Azure'a kaydedildiğinde uygulama için bir uygulama hizmet sorumlusu ayarlanır. Yerel geliştirme için uygulama kaydederken şunların kullanılması önerilir:

  • Uygulama üzerinde çalışan her geliştirici için ayrı uygulama kayıtları oluşturun. Bu, her geliştiricinin yerel geliştirme sırasında kullanması için ayrı uygulama hizmet sorumluları oluşturur ve geliştiricilerin tek bir uygulama hizmet sorumlusu için kimlik bilgilerini paylaşma gereksinimini önler.
  • Uygulama başına ayrı uygulama kayıtları oluşturun. Bu, uygulamanın izinlerini yalnızca uygulama için gerekli olan izinlere göre kapsamlar.

Yerel geliştirme sırasında ortam değişkenleri uygulama hizmeti sorumlusunun kimliğiyle ayarlanır. Python için Azure SDK bu ortam değişkenlerini okur ve bu bilgileri kullanarak uygulamanın kimliğini ihtiyaç duyduğu Azure kaynaklarında doğrular.

1 - Uygulamayı Azure'a kaydetme

Uygulama hizmeti sorumlusu nesneleri Azure'da bir uygulama kaydıyla oluşturulur. Bu, Azure portalı veya Azure CLI kullanılarak yapılabilir.

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

İlk olarak az ad sp create-for-rbac komutunu kullanarak uygulama için yeni bir hizmet sorumlusu oluşturun. Komutu aynı anda uygulama için uygulama kaydını da oluşturur.

az ad sp create-for-rbac --name {service-principal-name}

Bu komutun çıkışı aşağıdaki gibi görünür. Bu değerleri not alın veya sonraki adımlarda bu değerlere ihtiyacınız olacağı ve parola (istemci gizli dizisi) değerini yeniden görüntüleyemeyeceğiniz için bu pencereyi açık tutun. Ancak, gerekirse hizmet sorumlusunu veya mevcut parolaları geçersiz hale getirmeden daha sonra yeni bir parola ekleyebilirsiniz.

{
  "appId": "00000000-0000-0000-0000-000000000000",
  "displayName": "{service-principal-name}",
  "password": "abcdefghijklmnopqrstuvwxyz",
  "tenant": "33333333-3333-3333-3333-333333333333"
}

2 - Yerel geliştirme için bir Microsoft Entra güvenlik grubu oluşturma

Genellikle bir uygulama üzerinde çalışan birden çok geliştirici olduğundan, rolleri tek tek hizmet sorumlusu nesnelerine atamak yerine yerel geliştirmede uygulamanın ihtiyaç duyduğu rolleri (izinleri) kapsüllemek için bir Microsoft Entra güvenlik grubu oluşturmanız önerilir. Bu, aşağıdaki avantajları sunar:

  • Roller grup düzeyinde atandığından her geliştiricinin aynı rollere atandığından emin olur.
  • Uygulama için yeni bir rol gerekiyorsa, yalnızca uygulama için Microsoft Entra grubuna eklenmesi gerekir.
  • Ekibe yeni bir geliştirici katılırsa, geliştirici için yeni bir uygulama hizmet sorumlusu oluşturulur ve gruba eklenir ve geliştiricinin uygulama üzerinde çalışmak için doğru izinlere sahip olması sağlanır.

az ad group create komutu, Microsoft Entra ID'de güvenlik grupları oluşturmak için kullanılır. --display-name ve --main-nickname parametreleri zorunludur. Gruba verilen ad, uygulamanın adına dayalı olmalıdır. Grubun amacını belirtmek için grubun adına 'local-dev' gibi bir tümcecik eklemek de yararlıdır.

az ad group create \
    --display-name MyDisplay \
    --mail-nickname MyDisplay  \
    --description "<group-description>"

komutunun id çıkışındaki özelliğinin değerini kopyalayın. Bu, grubun nesne kimliğidir. Sonraki adımlarda buna ihtiyacınız vardır. Bu özelliği almak için az ad group show komutunu da kullanabilirsiniz.

Gruba üye eklemek için, uygulama hizmet sorumlusunun uygulama kimliğinden farklı olan nesne kimliğine ihtiyacınız vardır. Kullanılabilir hizmet sorumlularını listelemek için az ad sp listesini kullanın. --filter parametre komutu OData stil filtrelerini kabul eder ve listeyi gösterildiği gibi filtrelemek için kullanılabilir. --query Parametre, sütunları yalnızca ilgilendiğiniz sütunlarla sınırlar.

az ad sp list \
    --filter "startswith(displayName, 'msdocs')" \
    --query "[].{objectId:id, displayName:displayName}" \
    --output table

Ardından az ad group member add komutu, gruplara üye eklemek için kullanılabilir.

az ad group member add \
    --group <group-name> \
    --member-id <object-id>

Not

Varsayılan olarak, Microsoft Entra güvenlik gruplarının oluşturulması bir dizindeki belirli ayrıcalıklı rollerle sınırlıdır. Grup oluşturamıyorsanız dizininizin yöneticisine başvurun. Mevcut bir gruba üye ekleyemiyorsanız, grup sahibine veya dizin yöneticisine başvurun. Daha fazla bilgi edinmek için bkz . Microsoft Entra gruplarını ve grup üyeliğini yönetme.

3 - Uygulamaya rol atama

Ardından, uygulamanızın hangi kaynaklar üzerinde hangi rollere (izinlere) ihtiyacı olduğunu belirlemeniz ve bu rolleri uygulamanıza atamanız gerekir. Bu örnekte roller, 2. adımda oluşturulan Microsoft Entra grubuna atanır. Roller bir kaynak, kaynak grubu veya abonelik kapsamında 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 az role assignment create komutu kullanılarak bir kullanıcı, grup veya uygulama hizmet sorumlusuna bir rol atanır. Nesne kimliğine sahip bir grup belirtebilirsiniz. AppId değeriyle bir uygulama hizmet sorumlusu belirtebilirsiniz.

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

Atanabilecek 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, uygulama hizmet sorumlusuna kimliği olan 00000000-0000-0000-0000-000000000000 abonelikteki msdocs-python-sdk-auth-example kaynak grubundaki tüm depolama hesaplarındaki azure Depolama blob kapsayıcılarına ve verilerine okuma, yazma ve silme erişimine izin vermek için aşağıdaki komutu kullanarak uygulama hizmet sorumlusunu Depolama Blob Veri Katkıda Bulunanı rolüne atayabilirsiniz11111111-1111-1111-1111-111111111111.

az role assignment create --assignee 00000000-0000-0000-0000-000000000000 \
    --scope /subscriptions/11111111-1111-1111-1111-111111111111/resourceGroups/msdocs-python-sdk-auth-example \
    --role "Storage Blob Data Contributor"

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

4 - Yerel geliştirme ortamı değişkenlerini ayarlama

DefaultAzureCredential nesnesi, çalışma zamanında bir dizi ortam değişkeninde hizmet sorumlusu bilgilerini arar. Geliştiricilerin çoğu birden çok uygulama üzerinde çalıştığından geliştirme sırasında uygulamanın dizininde depolanan bir dosyadan ortama erişmek için python-dotenv gibi bir .env paket kullanmanız önerilir. Bu, azure'da uygulamanın kimliğini doğrulamak için kullanılan ortam değişkenlerini yalnızca bu uygulama tarafından kullanılabilecek şekilde kapsar.

Dosya .env , Azure için uygulama gizli anahtarı içerdiğinden hiçbir zaman kaynak denetimine iade edilemez. Python için standart .gitignore dosyası, dosyayı otomatik olarak iade işleminin .env dışında tutar.

python-dotenv paketini kullanmak için önce paketi uygulamanıza yükleyin.

pip install python-dotenv

Ardından, uygulama kök dizininizde bir .env dosya oluşturun. Ortam değişkeni değerlerini, uygulama kayıt işleminden alınan değerlerle aşağıdaki gibi ayarlayın:

  • AZURE_CLIENT_ID Uygulama kimliği değerini →.
  • AZURE_TENANT_ID kiracı kimliği değerini →.
  • AZURE_CLIENT_SECRET → Uygulama için oluşturulan parola/kimlik bilgisi.
AZURE_CLIENT_ID=00000000-0000-0000-0000-000000000000
AZURE_TENANT_ID=11111111-1111-1111-1111-111111111111
AZURE_CLIENT_SECRET=abcdefghijklmnopqrstuvwxyz

Son olarak, uygulamanızın başlangıç kodunda python-dotenv , başlangıçtaki dosyadan .env ortam değişkenlerini okumak için kitaplığını kullanın.

from dotenv import load_dotenv

if ( os.environ['ENVIRONMENT'] == 'development'):
    print("Loading environment variables from .env file")
    load_dotenv(".env")

5 - Uygulamanızda DefaultAzureCredential uygulama

Azure SDK istemci nesnelerinin kimliğini Azure'da doğrulamak için uygulamanız paketteki DefaultAzureCredentialazure.identity sınıfını kullanmalıdır. Bu senaryoda, DefaultAzureCredential ile Azure'a bağlanılacak uygulama hizmeti sorumlusu bilgilerini almak için , AZURE_TENANT_IDve AZURE_CLIENT_SECRET ortam değişkenlerini AZURE_CLIENT_IDalgılar ve bu değişkenleri okur.

Uygulamanıza azure.identity paketini ekleyerek başlayın.

pip install azure-identity

Ardından, uygulamanızda bir Azure SDK istemci nesnesi oluşturan tüm Python kodları için şunları yapmak istersiniz:

  1. sınıfını DefaultAzureCredential modülden içeri aktarın azure.identity .
  2. Bir DefaultAzureCredential nesne oluşturun.
  3. DefaultAzureCredential Nesnesini Azure SDK istemci nesnesi oluşturucusna geçirin.

Bunun bir örneği aşağıdaki kod kesiminde gösterilmiştir.

from azure.identity import DefaultAzureCredential
from azure.storage.blob import BlobServiceClient

# Acquire a credential object
token_credential = DefaultAzureCredential()

blob_service_client = BlobServiceClient(
        account_url="https://<my_account_name>.blob.core.windows.net",
        credential=token_credential)