Aracılığıyla paylaş


Şirket içinde barındırılan Python uygulamalarından Azure kaynaklarına kimlik doğrulama

Azure dışında barındırılan uygulamalar (örneğin şirket içi veya üçüncü taraf veri merkezinde), Azure kaynaklarına erişirken Azure'da kimlik doğrulaması yapmak için bir uygulama hizmet sorumlusu kullanmalıdır. Uygulama hizmet sorumlusu nesneleri, Azure'da uygulama kaydı işlemi kullanılarak oluşturulur. Yeni bir uygulama hizmet sorumlusu oluşturmak, uygulamanız için bir istemci kimliği ve istemci gizli dizisi oluşturur. İstemci kimliğini, istemci sırrını ve kiracı kimliğinizi, Python için Azure SDK'sı tarafından çalışma zamanında Azure'da uygulamanızın kimliğini doğrulamak için kullanılacak ortam değişkenlerinde depolarsınız.

Uygulamanın barındırılacağı her ortam için farklı bir uygulama kaydı oluşturulmalıdır. Farklı bir uygulama kaydı oluşturmak, her hizmet sorumlusu için ortama özgü kaynak izinlerinin yapılandırılmasına olanak tanır ve bir ortama dağıtılan bir uygulamanın başka bir ortamın parçası olan Azure kaynaklarıyla konuşmamasını sağlar.

Uygulamayı Azure'a kaydetme

Bir uygulama Azure portalı veya Azure CLI kullanılarak Azure'a kaydedilebilir.

APP_NAME=<app-name>
az ad sp create-for-rbac --name $APP_NAME

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.

{
  "appId": "00001111-aaaa-2222-bbbb-3333cccc4444",
  "displayName": "msdocs-python-sdk-auth-prod",
  "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 create-for-rbac \
  --name $APP_NAME --query appId --output tsv)

Uygulama hizmet sorumlusuna 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. Rollere kaynak, kaynak grubu veya abonelik kapsamında bir rol atanabilir. Bu örnekte, çoğu uygulama tüm Azure kaynaklarını tek bir kaynak grubunda gruplandırdığından kaynak grubu kapsamında hizmet sorumlusu için rollerin nasıl atandığı gösterilmektedir.

Azure'da az role assignment create komutu kullanılarak bir hizmet sorumlusuna rol atanır.

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.

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, appId'si 00001111-aaaa-2222-bbbb-3333cccc4444 olan hizmet sorumlusuna, kimliği olan abonelikteki aaaa0a0a-bb1b-cc2c-dd3d-eeeeee4e4e4e kaynak grubunda yer alan tüm depolama hesaplarındaki Azure Depolama blob kapsayıcıları ve verilerine okuma, yazma ve silme erişimi sağlamak için aşağıdaki komutu kullanarak uygulama hizmet sorumlusunu Depolama Blob Verisi 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.

Uygulama için ortam değişkenlerini yapılandırma

Python uygulamanızı çalıştıran işlem için AZURE_CLIENT_ID, AZURE_TENANT_ID ve AZURE_CLIENT_SECRET ortam değişkenlerini ayarlamanız gerekir, böylece uygulama hizmeti sorumlusu kimlik bilgileri çalışma zamanında uygulamanızın kullanımına sunulabilir. DefaultAzureCredential nesnesi, bu ortam değişkenlerinde hizmet sorumlusu bilgilerini arar.

Unix sunucu ortamında Python web uygulamalarını çalıştırmak için Gunicorn kullanırken, içindeki yönergesi EnvironmentFilegunicorn.serverkullanılarak bir uygulamanın ortam değişkenleri belirtilebilir. Aşağıdaki örneğe bakın.

[Unit]
Description=gunicorn daemon
After=network.target  
  
[Service]  
User=www-user
Group=www-data
WorkingDirectory=/path/to/python-app
EnvironmentFile=/path/to/python-app/py-env/app-environment-variables
ExecStart=/path/to/python-app/py-env/gunicorn --config config.py wsgi:app
            
[Install]  
WantedBy=multi-user.target

yönergesinde EnvironmentFile belirtilen dosya, aşağıdaki gibi değerleriyle ortam değişkenlerinin listesini içermelidir.

AZURE_CLIENT_ID=<value>
AZURE_TENANT_ID=<value>
AZURE_CLIENT_SECRET=<value>

Uygulamada DefaultAzureCredential uygula

Azure SDK istemci nesnelerinin kimliğini Azure'da doğrulamak için uygulamanız paketteki DefaultAzureCredentialazure.identity sınıfını kullanmalıdır.

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

pip install azure-identity

Ardından, uygulamanızda Azure SDK istemci nesnesi oluşturan tüm Python kodları için şunları yapmalısınız:

  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.

Bu yaklaşımın 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)

Bu örnekte, kod DefaultAzureCredential nesnesinin örneğini oluşturduğunda, DefaultAzureCredential ile Azure'a bağlanmak için gereken uygulama hizmeti sorumlusu bilgilerini almak amacıyla AZURE_TENANT_ID, AZURE_CLIENT_ID ve AZURE_CLIENT_SECRET ortam değişkenlerini okur.