Otorisasi di pustaka Azure SDK untuk Python

Otorisasi di Azure menentukan tindakan apa yang dapat dilakukan pengguna atau layanan terautentikasi pada sumber daya. Artikel ini membahas cara menerapkan otorisasi menggunakan Azure SDK untuk Python, mencakup model, implementasi, pemecahan masalah, dan praktik terbaik. Untuk penyiapan autentikasi terperinci, lihat Mengautentikasi aplikasi Python ke Azure.

Pendahuluan

Autentikasi (AuthN) memverifikasi identitas pengguna atau layanan, sementara otorisasi (AuthZ) menentukan apa yang dapat mereka lakukan. Di Azure, otorisasi memastikan akses aman ke sumber daya, penting untuk melindungi aplikasi dan data. Pengembang dapat menerapkan otorisasi yang kuat dengan Azure SDK for Python untuk mengontrol akses di berbagai alur kerja, mulai dari mengelola sumber daya hingga mengakses data khusus layanan.

Model otorisasi Azure

Azure menyediakan beberapa mekanisme otorisasi untuk mengelola akses. Memahami model ini sangat penting untuk kontrol akses yang efektif.

Kontrol Akses Azure Role-Based

Azure Role-Based Access Control (RBAC) menetapkan peran ke identitas pada cakupan seperti langganan atau grup sumber daya. Peran bawaan termasuk Pemilik, Kontributor, dan Pembaca, sementara peran kustom memungkinkan izin yang disesuaikan. Saat Anda menetapkan peran pada cakupan tertentu, identitas (seperti pengguna atau layanan) mendapatkan izin untuk semua sumber daya dalam cakupan tersebut dan cakupan turunannya. Misalnya, menetapkan peran Kontributor di tingkat langganan memungkinkan manajemen semua sumber daya dalam langganan tersebut. Lihat Memahami cakupan untuk Azure RBAC.

Mekanisme khusus layanan

Beberapa layanan Azure menawarkan metode otorisasi unik:

  • Azure Storage: Menggunakan Tanda Tangan Akses Bersama (SAS) dan Daftar Kontrol Akses (ACL) untuk akses data. Lihat Catatan Otorisasi Khusus Layanan untuk Azure Storage.
  • Azure Key Vault: Merekomendasikan RBAC atas kebijakan akses warisan. Lihat Catatan Otorisasi Service-Specific untuk Azure Key Vault.
  • Microsoft Graph: Menggunakan cakupan OAuth 2.0 dan izin aplikasi. Lihat Catatan Otorisasi Khusus Layanan untuk Microsoft Graph.

Menggunakan otorisasi di Azure SDK untuk Python

Azure SDK untuk Python menyediakan dukungan bawaan untuk menangani autentikasi dan otorisasi melalui azure-identity paket. Kelas DefaultAzureCredential mendukung berbagai mekanisme autentikasi, seperti identitas terkelola dan prinsipal layanan, sehingga dapat beradaptasi dengan lingkungan yang berbeda.

Contoh: Mencantumkan grup sumber daya

Contoh ini menunjukkan bagaimana Azure SDK untuk Python menggunakan kredensial (melalui DefaultAzureCredential) untuk mengautentikasi, dan bagaimana otorisasi menentukan apakah identitas dapat berhasil mencantumkan grup sumber daya. Jika identitas tidak memiliki peran Pembaca atau peran yang lebih tinggi pada cakupan langganan atau grup sumber daya, maka panggilan ini akan mengembalikan kesalahan 403 Forbidden.

from azure.identity import DefaultAzureCredential
from azure.mgmt.resource import ResourceManagementClient

credential = DefaultAzureCredential()
client = ResourceManagementClient(credential, "<subscription-id>")
resource_groups = client.resource_groups.list()
for rg in resource_groups:
    print(rg.name)

Ganti <subscription-id> dengan ID langganan Azure Anda, yang biasanya dalam bentuk 00000000-0000-0000-0000-000000000000.

Microsoft Graph dengan ruang lingkup

Untuk mengakses Microsoft Graph, gunakan Microsoft Graph SDK resmi untuk Python, yang mendukung izin yang didelegasikan dan aplikasi.

Contoh ini menunjukkan bagaimana SDK menggunakan kredensial untuk meminta token akses dengan cakupan https://graph.microsoft.com/.default otorisasi yang diperlukan dan mengakses sumber daya Microsoft Graph. Identitas harus diotorisasi di Microsoft Entra ID dengan izin aplikasi yang sesuai (misalnya User.Read.All) untuk mengambil data pengguna; jika tidak, permintaan akan gagal dengan pesan 403 Forbidden.

Penting

Pastikan aplikasi atau identitas Anda memiliki User.Read.All atau izin lain yang diperlukan yang diberikan di ID Microsoft Entra.

from azure.identity import DefaultAzureCredential
from msgraph.core import GraphClient

credential = DefaultAzureCredential()
client = GraphClient(credential=credential, scopes=["https://graph.microsoft.com/.default"])

response = client.get("/users")
users = response.json().get("value", [])
for user in users:
    print(user["displayName"])

Pelajari lebih lanjut tentang SDK ini dalam tutorial resmi Build Python apps with Microsoft Graph.

Mendiagnosis kesalahan otorisasi

Masalah otorisasi sering menyebabkan kesalahan TERLARANG HTTP 403, yang menunjukkan izin yang tidak memadai. Untuk mendiagnosis masalah ini:

  • Periksa pesan kesalahan: Tinjau respons untuk detail tentang izin yang hilang.

  • Aktifkan pengelogan: Gunakan pengelogan Python untuk memeriksa permintaan dan respons.

    import logging
    logging.basicConfig(level=logging.DEBUG)
    
  • Verifikasi akses: Gunakan Azure CLI atau portal Azure untuk memeriksa penetapan peran.

    az role assignment list --assignee <principal-id> --scope <scope>
    

    Ganti <principal-id> dengan ID objek pengguna, perwakilan layanan, atau identitas terkelola Anda. Ganti <scope> dengan cakupan sumber daya Azure, seperti ID langganan, nama grup sumber daya, atau sumber daya. Lihat Bekerja dengan cakupan.

Bekerja dengan cakupan

Seringkali, Anda perlu memberikan cakupan, seperti dalam contoh berikut:

az role assignment list \
    --assignee <principal-id> \
    --scope <scope>

Berikut adalah beberapa format cakupan umum:

Tingkat Cakupan Contoh Nilai
Subscription /subscriptions/<subscription-id>
Grup Sumber Daya /subscriptions/<subscription-id>/resourceGroups/<resource-group-name>
Nama Sumber Daya /subscriptions/<subscription-id>/resourceGroups/<resource-group-name>/providers/<provider-namespace>/<resource-type>/<resource-name>

Misalnya, untuk mencantumkan semua penetapan peran untuk identitas terkelola di tingkat grup sumber daya:

az role assignment list \
  --assignee 12345678-90ab-cdef-1234-567890abcdef \
  --scope /subscriptions/<subscription-id>/resourceGroups/my-resource-group

Atau di tingkat langganan:

az role assignment list \
  --assignee 12345678-90ab-cdef-1234-567890abcdef \
  --scope /subscriptions/<subscription-id>

Untuk mengambil ID objek (<principal-id>) pengguna atau identitas terkelola, gunakan:

az ad user show --id <user-email> --query id
az identity show --name <identity-name> --resource-group <rg-name> --query principalId

Mengelola akses

Kelola akses melalui penetapan peran dengan menggunakan:

  • Azure portal: Tambahkan peran melalui menu layanan Kontrol akses (IAM).

  • Azure CLI:

    az role assignment create --assignee <principal-id> --role <role-name> --scope <scope>
    

    Ganti <principal-id> dengan ID objek pengguna, perwakilan layanan, atau identitas terkelola Anda. Ganti <scope> dengan cakupan sumber daya Azure, seperti ID langganan, nama grup sumber daya, atau nama sumber daya. Lihat Bekerja dengan cakupan.

  • Templat ARM: Gunakan untuk manajemen deklaratif.

Untuk identitas terkelola, tetapkan peran ke identitas yang terkait dengan sumber daya seperti komputer virtual. Gunakan fitur Periksa akses portal Azure atau Azure CLI untuk memverifikasi izin yang efektif.

Catatan otorisasi khusus layanan

Di bagian Mekanisme khusus layanan, Anda mengetahui bahwa beberapa layanan Azure menawarkan metode otorisasi yang unik. Bagian ini memberikan detail selengkapnya untuk masing-masing dari tiga layanan Azure yang disebutkan.

Azure Storage

  • RBAC: Mengelola operasi sarana kontrol.
  • SAS dan ACL: Mengontrol akses sarana data, dengan autentikasi Microsoft Entra juga didukung.

Contoh: Mengakses blob dengan ID Microsoft Entra

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

credential = DefaultAzureCredential()
client = BlobServiceClient(account_url="https://<account-name>.blob.core.windows.net", credential=credential)
containers = client.list_containers()
for container in containers:
    print(container.name)

Ganti <account-name> dengan nama akun Azure Storage Anda.

Azure Key Vault

Gunakan RBAC alih-alih kebijakan akses warisan untuk konsistensi. Kebijakan akses masih didukung tetapi tidak disukai.

Contoh: Mengambil rahasia

from azure.identity import DefaultAzureCredential
from azure.keyvault.secrets import SecretClient

credential = DefaultAzureCredential()
client = SecretClient(vault_url="https://<vault-name>.vault.azure.net", credential=credential)
secret = client.get_secret("my-secret")
print(secret.value)

Ganti <vault-name> dengan nama sumber daya Key Vault Anda.

Microsoft Graph

Menggunakan cakupan OAuth 2.0 untuk izin yang didelegasikan dan izin aplikasi untuk aplikasi daemon. Tentukan cakupan seperti yang ditunjukkan dalam contoh sebelumnya.

Praktik terbaik

  • Hak istimewa terkecil: Tetapkan hanya izin yang diperlukan, seperti Pembaca, bukan Kontributor.
  • Lebih suka RBAC: Terutama untuk Key Vault, untuk kontrol akses terpadu.
  • Gunakan Identitas Terkelola: Hindari mengelola kredensial dalam kode.
  • Batasi izin Grafik: Minta cakupan tertentu untuk meminimalkan risiko.

Langkah selanjutnya