Mengautentikasi aplikasi yang dihosting Azure ke sumber daya Azure dengan Azure SDK for Python

Saat Anda menghosting aplikasi di Azure menggunakan layanan seperti Azure App Service, Azure Virtual Machines, atau Azure Container Instances, pendekatan yang direkomendasikan untuk mengautentikasi aplikasi ke sumber daya Azure adalah dengan identitas terkelola.

Identitas terkelola menyediakan identitas untuk aplikasi Anda sehingga dapat terhubung ke sumber daya Azure lainnya tanpa perlu menggunakan kunci rahasia atau rahasia aplikasi lainnya. Secara internal, Azure mengetahui identitas aplikasi Anda dan sumber daya apa yang diizinkan untuk disambungkan. Azure menggunakan informasi ini untuk secara otomatis mendapatkan token Microsoft Entra untuk aplikasi guna memungkinkannya terhubung ke sumber daya Azure lainnya, semua tanpa Anda harus mengelola rahasia aplikasi apa pun.

Tipe identitas terkelola

Ada dua jenis identitas terkelola:

  • Identitas terkelola yang ditetapkan sistem - Jenis identitas terkelola ini disediakan oleh dan diikat langsung ke sumber daya Azure. Saat Mengaktifkan identitas terkelola pada sumber daya Azure, Anda mendapatkan identitas terkelola yang ditetapkan sistem untuk sumber daya tersebut. Identitas terkelola yang ditetapkan sistem terkait dengan siklus hidup sumber daya Azure yang terkait dengannya. Jadi, ketika sumber daya dihapus, Azure akan secara otomatis menghapus identitas untuk Anda. Karena yang harus Anda lakukan adalah mengaktifkan identitas terkelola untuk sumber daya Azure yang menghosting kode Anda, pendekatan ini adalah jenis identitas terkelola termampukan untuk digunakan.
  • Identitas terkelola yang ditetapkan pengguna - Anda juga dapat membuat identitas terkelola sebagai sumber daya Azure mandiri. Pendekatan ini paling sering digunakan ketika solusi Anda memiliki beberapa beban kerja yang berjalan pada beberapa sumber daya Azure yang semuanya perlu berbagi identitas yang sama dan izin yang sama. Misalnya, jika solusi Anda memiliki komponen yang berjalan pada beberapa App Service dan instans komputer virtual yang semuanya memerlukan akses ke set sumber daya Azure yang sama, identitas terkelola yang ditetapkan pengguna yang digunakan di seluruh sumber daya tersebut masuk akal.

Artikel ini membahas langkah-langkah untuk mengaktifkan dan menggunakan identitas terkelola yang ditetapkan sistem untuk aplikasi. Jika Anda perlu menggunakan identitas terkelola yang ditetapkan pengguna, lihat artikel Mengelola identitas terkelola yang ditetapkan pengguna untuk melihat cara membuat identitas terkelola yang ditetapkan pengguna.

1 - Aktifkan identitas terkelola di sumber daya Azure yang menghosting aplikasi

Langkah pertama adalah mengaktifkan identitas terkelola di sumber daya Azure yang menghosting aplikasi Anda. Misalnya, jika Anda menghosting aplikasi Django menggunakan Azure App Service, Anda perlu mengaktifkan identitas terkelola untuk aplikasi web App Service yang menghosting aplikasi Anda. Jika Anda menggunakan komputer virtual untuk menghosting aplikasi, Anda akan mengaktifkan VM untuk menggunakan identitas terkelola.

Anda dapat mengaktifkan identitas terkelola yang akan digunakan untuk sumber daya Azure menggunakan portal Microsoft Azure atau Azure CLI.

Perintah Azure CLI dapat dijalankan di Azure Cloud Shell atau pada stasiun kerja dengan Azure CLI terpasang.

Perintah Azure CLI yang digunakan untuk mengaktifkan identitas terkelola untuk sumber daya Azure adalah formulir az <command-group> identity --resource-group <resource-group-name> --name <resource-name>. Perintah khusus untuk layanan Azure populer ditunjukkan di bawah ini.

az webapp identity assign --resource-group <resource-group-name> -name <web-app-name>

Output akan terlihat seperti di bawah ini.

{
  "principalId": "99999999-9999-9999-9999-999999999999",
  "tenantId": "33333333-3333-3333-3333-333333333333",
  "type": "SystemAssigned",
  "userAssignedIdentities": null
}

Nilai principalId adalah ID unik dari identitas terkelola. Simpan salinan output ini karena Anda akan membutuhkan nilai-nilai ini di langkah berikutnya.

2 - Menetapkan peran ke identitas terkelola

Selanjutnya, Anda perlu menentukan peran (izin) apa yang dibutuhkan aplikasi Anda dan menetapkan identitas terkelola ke peran tersebut di Azure. Identitas terkelola dapat ditetapkan peran di sumber daya, grup sumber daya, atau cakupan langganan. Contoh ini menunjukkan cara menetapkan peran di cakupan grup sumber daya karena sebagian besar aplikasi mengelompokkan semua sumber daya Azure mereka ke dalam satu grup sumber daya.

Identitas terkelola diberi peran di Azure menggunakan perintah az role assignment create . Untuk penerima tugas, gunakan yang principalId Anda salin di langkah 1.

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

Untuk mendapatkan nama peran yang dapat ditetapkan oleh perwakilan layanan, gunakan perintah az role definition list.

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

Misalnya, untuk mengizinkan identitas terkelola dengan ID 99999999-9999-9999-9999-999999999999 baca, tulis, dan hapus akses ke kontainer dan data blob Azure Storage di semua akun penyimpanan dalam grup sumber daya msdocs-python-sdk-auth-example dalam langganan dengan ID 11111111-1111-1111-1111-111111111111, Anda akan menetapkan perwakilan layanan aplikasi ke peran Kontributor Data Blob Penyimpanan menggunakan perintah berikut.

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

Untuk informasi tentang menetapkan izin di tingkat sumber daya atau langganan menggunakan Azure CLI, lihat artikel Menetapkan peran Azure menggunakan Azure CLI.

3 - Menerapkan DefaultAzureCredential di aplikasi Anda

Saat kode Anda berjalan di Azure dan identitas terkelola telah diaktifkan pada sumber daya Azure yang menghosting aplikasi Anda, DefaultAzureCredential menentukan kredensial yang akan digunakan dalam urutan berikut:

  1. Periksa lingkungan untuk perwakilan layanan seperti yang didefinisikan oleh variabel AZURE_CLIENT_IDlingkungan , , AZURE_TENANT_IDdan baik AZURE_CLIENT_SECRET atau AZURE_CLIENT_CERTIFICATE_PATH dan (opsional) AZURE_CLIENT_CERTIFICATE_PASSWORD.
  2. Periksa parameter kata kunci untuk identitas terkelola yang ditetapkan pengguna. Anda dapat meneruskan identitas terkelola yang ditetapkan pengguna dengan menentukan ID kliennya dalam managed_identity_client_id parameter .
  3. AZURE_CLIENT_ID Periksa variabel lingkungan untuk ID klien identitas terkelola yang ditetapkan pengguna.
  4. Gunakan identitas terkelola yang ditetapkan sistem untuk sumber daya Azure jika diaktifkan.

Anda dapat mengecualikan identitas terkelola dari kredensial dengan mengatur exclude_managed_identity_credential parameter Truekata kunci .

Dalam artikel ini, kami menggunakan identitas terkelola yang ditetapkan sistem untuk aplikasi web Azure App Service, jadi kami tidak perlu mengonfigurasi identitas terkelola di lingkungan atau meneruskannya sebagai parameter. Langkah-langkah berikut menunjukkan kepada Anda cara menggunakan DefaultAzureCredential.

Pertama, tambahkan paket ke azure.identity aplikasi Anda.

pip install azure-identity

Selanjutnya, untuk kode Python apa pun yang membuat objek klien Azure SDK di aplikasi, Anda harus:

  1. DefaultAzureCredential Impor kelas dari azure.identity modul.
  2. Buat objek DefaultAzureCredential.
  3. Teruskan DefaultAzureCredential objek ke konstruktor objek klien Azure SDK.

Contoh langkah-langkah ini ditampilkan di segmen kode berikut.

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)

Seperti yang dibahas dalam artikel gambaran umum autentikasi Azure SDK for Python, DefaultAzureCredential mendukung beberapa metode autentikasi dan menentukan metode autentikasi yang digunakan saat runtime. Manfaat dari pendekatan ini adalah aplikasi Anda dapat menggunakan metode autentikasi yang berbeda di lingkungan yang berbeda tanpa menerapkan kode khusus lingkungan. Ketika kode sebelumnya dijalankan di stasiun kerja Anda selama pengembangan lokal, DefaultAzureCredential akan menggunakan perwakilan layanan aplikasi, seperti yang ditentukan oleh pengaturan lingkungan, atau kredensial alat pengembang untuk mengautentikasi dengan sumber daya Azure lainnya. Dengan demikian, kode yang sama dapat digunakan untuk mengautentikasi aplikasi Anda ke sumber daya Azure selama pengembangan lokal dan saat disebarkan ke Azure.