Aracılığıyla paylaş


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

Geliştiricilerin genellikle bulut uygulamaları oluştururken uygulamalarını yerel olarak çalıştırmaları ve test etmeleri gerekir. Yerel geliştirme sırasında bile uygulamanın etkileşimde olduğu tüm Azure hizmetlerinde kimlik doğrulaması yapması gerekir. Bu makalede, özel olarak yerel geliştirme sırasında kullanılmak üzere ayrılmış hizmet sorumlusu kimliklerinin nasıl yapılandırılır açıklanmaktadır.

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ı en az ayrıcalık ilkesini izler. Yalnızca geliştirme sırasında uygulamanın ihtiyaç duyduğu Azure kaynaklarına erişim verir. Bu sınırlı erişim, istemeden diğer kaynaklara ulaşma riskini azaltır. Ayrıca, daha geniş izinlerin sorunlara neden olabileceği üretime geçerken izinle ilgili hataları önlemeye yardımcı olur.

Azure'da yerel geliştirme için uygulama kaydederken:

  • Her geliştirici için ayrı uygulama kayıtları oluşturma: Bu yaklaşım, her geliştiriciye kendi hizmet sorumlusunu sağlar ve kimlik bilgilerini paylaşma gereğini önler ve daha ayrıntılı erişim denetimi sağlar.
  • Her uygulama için ayrı uygulama kayıtları oluşturma: Bu yaklaşım, her uygulamanın yalnızca ihtiyaç duyduğu izinlere sahip olmasını sağlayarak olası saldırı yüzeyini azaltır.

Yerel geliştirme sırasında kimlik doğrulamasını etkinleştirmek için, uygulama hizmeti sorumlusunun kimlik bilgileriyle ortam değişkenlerini ayarlayın. Python için Azure SDK bu değişkenleri algılar ve Azure hizmetlerine yönelik isteklerin kimliğini doğrulamak için kullanır.

Uygulamayı Azure'a kaydetme

Uygulama hizmet sorumlusu nesneleri, Azure'a bir uygulama kaydettiğinizde oluşturulur. Bu kayıt, Azure portalı veya Azure CLI kullanılarak gerçekleştirilebilir. Kayıt işlemi, Microsoft Entra Id içinde bir uygulama kaydı oluşturur ve uygulama için bir hizmet sorumlusu nesnesi oluşturur. Hizmet sorumlusu nesnesi, azure hizmetlerinde uygulamanın kimliğini doğrulamak için kullanılır. Uygulama kayıt işlemi ayrıca uygulama için bir istemci sırrı (parola) oluşturur. Bu gizli anahtar, Azure hizmetlerinde uygulamanın kimliğini doğrulamak için kullanılır. İstemci sırrı hiçbir zaman kaynak denetiminde saklanmaz, bunun yerine uygulama dizinindeki bir .env dosyasında depolanır. Uygulama çalışma zamanında dosyasını okur .env ve Python için Azure SDK'sının uygulamanın kimliğini doğrulamak için kullandığı ortam değişkenlerini ayarlar.

Aşağıdaki adımlarda bir uygulamanın Azure'a nasıl kaydedileceğini ve uygulama için bir hizmet sorumlusunun nasıl oluşturulacağı gösterilmektedir. Adımlar hem Azure CLI hem de Azure portalı için gösterilir.

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 service principal oluşturun. Komutu aynı anda uygulama için uygulama kaydını da oluşturur.

SERVICE_PRINCIPAL_NAME=<service-principal-name>
az ad sp create-for-rbac --name $SERVICE_PRINCIPAL_NAME

Bu komutun çıktısı aşağıdakine benzer. 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": "00001111-aaaa-2222-bbbb-3333cccc4444",
  "displayName": "<service-principal-name>",
  "password": "Ee5Ff~6Gg7.-Hh8Ii9Jj0Kk1Ll2Mm3_Nn4Oo5Pp6",
  "tenant": "aaaabbbb-0000-cccc-1111-dddd2222eeee"
}

Ardından değeri alıp appID bir değişkende depolamanız gerekir. Bu değer, Python için Azure SDK'sının hizmet sorumlusunu kullanarak Azure'da kimlik doğrulaması gerçekleştirmesi için yerel geliştirme ortamınızda ortam değişkenlerini ayarlamak için kullanılır.

APP_ID=$(az ad sp list \
  --all \
  --query "[?displayName=='$SERVICE_PRINCIPAL_NAME'].appId | [0]" \
  --output tsv)

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

Birden çok geliştirici genellikle aynı uygulama üzerinde çalıştığından, izinleri bir Microsoft Entra güvenlik grubu aracılığıyla yönetmek daha iyidir. Her geliştiricinin hizmet sorumlusuna ayrı ayrı roller atamak yerine uygulamanın yerel geliştirme için ihtiyaç duyduğu rolleri içeren bir güvenlik grubu oluşturun. Güvenlik grubu kullanmak aşağıdaki avantajları sunar:

  • Roller grup düzeyinde atandığından, her geliştiricinin aynı rollere atandığından emin olunur.
  • 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.

GROUP_DISPLAY_NAME="<group-name>"
GROUP_MAIL_NICKNAME="<group-mail-nickname>"
GROUP_DESCRIPTION="<group-description>"
az ad group create \
  --display-name $GROUP_DISPLAY_NAME \
  --mail-nickname $GROUP_MAIL_NICKNAME \
  --description $GROUP_DESCRIPTION

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 parametresi sütunları yalnızca ilgilendiğiniz sütunlarla sınırlar.

SP_OBJECT_ID=$(az ad sp list \
  --filter "startswith(displayName,'$GROUP_DISPLAY_NAME')" \
  --query "[0].id" \
  --output tsv)

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

az ad group member add \
    --group $GROUP_DISPLAY_NAME \
    --member-id $SP_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.

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.

az role assignment create Kullanıcıya, gruba veya uygulama hizmet sorumlusuna rol atamak için komutunu kullanın. Nesne kimliğine sahip bir grup belirtebilirsiniz. Uygulama kimliği (appId) ile bir uygulama servis sorumlusu belirtebilirsiniz.

RESOURCE_GROUP_NAME=<resource-group-name>
SUBSCRIPTION_ID=$(az account show --query id --output tsv)
ROLE_NAME=<role-name>
az role assignment create \
  --assignee "$APP_ID" \
  --scope "./subscriptions/$SUBSCRIPTION_ID/resourceGroups/$RESOURCE_GROUP_NAME" \
  --role "$ROLE_NAME"

![!NOTE] Git Bash'in /subscriptions/... yolunu bir dosya yolu olarak algılamasını önlemek için, scope parametresine önceden ./ ekleyin ve tüm dizeyi çift tırnak içinde yazın.

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, kimliği 00001111-aaaa-2222-bbbb-3333cccc4444 olan uygulama hizmet sorumlusuna, kimlik numarası olan abonelikteki aaaa0a0a-bb1b-cc2c-dd3d-eeeeee4e4e4e kaynak grubundaki tüm depolama hesaplarındaki Azure Depolama blob kapsayıcılarına ve verilere okuma, yazma ve silme erişim izni vermek için, aşağıdaki komutu kullanarak uygulama hizmet sorumlusunu Depolama Blob Verileri Katkıda Bulunanı rolüne atayabilirsiniz.

az role assignment create --assignee 00001111-aaaa-2222-bbbb-3333cccc4444 \
    --scope "./subscriptions/aaaa0a0a-bb1b-cc2c-dd3d-eeeeee4e4e4e/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.

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

nesne, DefaultAzureCredential çalışma zamanında bir dizi ortam değişkeninde hizmet ilkesi 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 gibi python-dotenv bir .env paket kullanın. Bu kurulum ortam değişkenlerini kapsamlar, böylece yalnızca bu uygulama bunları Kullanarak Azure'da kimlik doğrulaması yapabilir.

Dosya .env, Azure için uygulama gizli anahtarını içerdiği için hiçbir zaman kaynak kontrolüne alınmaz. Python için standart .gitignore dosyası, .env dosyasını otomatik olarak gönderme işleminden hariç 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ğeri.
  • AZURE_TENANT_ID Kiracı kimliği değeri.
  • AZURE_CLIENT_SECRET → Uygulama için oluşturulan parola/kimlik bilgisi.
AZURE_CLIENT_ID=00001111-aaaa-2222-bbbb-3333cccc4444
AZURE_TENANT_ID=aaaabbbb-0000-cccc-1111-dddd2222eeee
AZURE_CLIENT_SECRET=Ee5Ff~6Gg7.-Hh8Ii9Jj0Kk1Ll2Mm3_Nn4Oo5Pp6

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

from dotenv import load_dotenv

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

Uygulamanızda DefaultAzureCredential'i devreye alın

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 ortam değişkenleri olan AZURE_CLIENT_ID, AZURE_TENANT_ID ve AZURE_CLIENT_SECRET'ün ayarlandığını algılar ve bu değişkenleri okuyarak Azure'a bağlanmak için uygulama hizmeti sorumlusu bilgilerini elde eder.

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:

  1. DefaultAzureCredential sınıfını azure.identity modülünden içeri aktarın.
  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)