Mengautentikasi aplikasi Python ke layanan Azure selama pengembangan lokal menggunakan perwakilan layanan

Saat membuat aplikasi cloud, pengembang perlu men-debug dan menguji aplikasi di stasiun kerja lokal mereka. Saat aplikasi dijalankan di stasiun kerja pengembang selama pengembangan lokal, aplikasi masih harus mengautentikasi ke setiap layanan Azure yang digunakan oleh aplikasi. Artikel ini membahas cara menyiapkan objek perwakilan layanan aplikasi khusus yang akan digunakan selama pengembangan lokal.

Diagram yang menunjukkan bagaimana aplikasi yang berjalan di pengembang lokal mendapatkan perwakilan layanan aplikasi dari file .env lalu menggunakan identitas tersebut untuk menyambungkan ke sumber daya Azure.

Perwakilan layanan aplikasi khusus untuk pengembangan lokal memungkinkan Anda untuk mengikuti prinsip hak istimewa paling sedikit selama pengembangan aplikasi. Karena izin dilingkup ke apa saja yang diperlukan untuk aplikasi selama pengembangan, kode aplikasi dicegah untuk mengakses sumber daya Azure secara tidak sengaja yang dimaksudkan untuk digunakan oleh aplikasi yang berbeda. Hal ini juga mencegah bug terjadi ketika aplikasi dipindahkan ke produksi karena aplikasi memiliki hak istimewa berlebihan di lingkungan pengembangan.

Perwakilan layanan aplikasi disiapkan untuk aplikasi saat aplikasi terdaftar di Azure. Saat mendaftarkan aplikasi untuk pengembangan lokal, disarankan untuk:

  • Membuat pendaftaran aplikasi terpisah untuk setiap pengembang yang bekerja di aplikasi. Hal ini akan membuat perwakilan layanan aplikasi terpisah untuk digunakan setiap pengembang selama pengembangan lokal dan menghindari kebutuhan pengembang untuk berbagi mandat untuk satu perwakilan layanan aplikasi.
  • Membuat pendaftaran aplikasi terpisah per aplikasi. Hal ini mencakup izin aplikasi hanya untuk apa yang diperlukan oleh aplikasi.

Selama pengembangan lokal, variabel lingkungan diatur dengan identitas perwakilan layanan aplikasi. Azure SDK untuk Python membaca variabel lingkungan ini dan menggunakan informasi ini untuk mengautentikasi aplikasi ke sumber daya Azure yang dibutuhkan.

1 - Mendaftarkan aplikasi di Azure

Objek perwakilan layanan aplikasi dibuat dengan pendaftaran aplikasi di Azure. Anda dapat menggunakan portal Azure atau Azure CLI.

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

Pertama, gunakan perintah az ad sp create-for-rbac untuk membuat perwakilan layanan baru untuk aplikasi. Perintah ini juga membuat pendaftaran aplikasi untuk aplikasi secara bersamaan.

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

Output perintah ini akan terlihat seperti berikut ini. Catat nilai-nilai ini atau biarkan jendela ini terbuka karena Anda akan memerlukan nilai-nilai ini di langkah berikutnya dan tidak akan dapat melihat nilai kata sandi (rahasia klien) lagi. Namun, Anda dapat menambahkan kata sandi baru nanti tanpa membatalkan perwakilan layanan atau kata sandi yang ada jika diperlukan.

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

2 - Membuat grup keamanan Microsoft Entra untuk pengembangan lokal

Karena biasanya ada beberapa pengembang yang mengerjakan aplikasi, disarankan untuk membuat grup keamanan Microsoft Entra untuk merangkum peran (izin) yang dibutuhkan aplikasi dalam pengembangan lokal, daripada menetapkan peran ke objek perwakilan layanan individual. Ini menawarkan keuntungan berikut:

  • Setiap pengembang diyakinkan untuk memiliki peran yang sama yang ditetapkan karena peran ditetapkan di tingkat grup.
  • Jika peran baru diperlukan untuk aplikasi, peran tersebut hanya perlu ditambahkan ke grup Microsoft Entra untuk aplikasi tersebut.
  • Jika pengembang baru bergabung dengan tim, perwakilan layanan aplikasi baru dibuat untuk pengembang dan ditambahkan ke grup, memastikan pengembang memiliki izin yang tepat untuk bekerja di aplikasi.

Perintah az ad group create digunakan untuk membuat grup keamanan di ID Microsoft Entra. Parameter --display-name dan --main-nickname dihitung. Nama yang diberikan ke grup harus didasarkan pada nama aplikasi. Akan sangat berguna untuk menyertakan frasa seperti 'local-dev' dalam nama grup untuk menunjukkan tujuan grup.

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

Salin nilai id properti dalam output perintah. Ini adalah ID objek untuk grup. Anda membutuhkannya di langkah-langkah selanjutnya. Anda juga dapat menggunakan perintah az ad group show untuk mengambil properti ini.

Untuk menambahkan anggota ke grup, Anda memerlukan ID objek dari perwakilan layanan aplikasi, yang berbeda dari ID aplikasi. Gunakan daftar az ad sp untuk mencantumkan perwakilan layanan yang tersedia. Perintah parameter --filter menerima filter gaya OData dan dapat digunakan untuk memfilter daftar seperti yang ditunjukkan. Parameter --query membatasi kolom hanya untuk kolom yang diminati.

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

Perintah az ad group member add kemudian dapat digunakan untuk menambahkan anggota ke grup.

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

Catatan

Secara default, pembuatan grup keamanan Microsoft Entra terbatas pada peran istimewa tertentu dalam direktori. Jika Anda tidak dapat membuat grup, hubungi administrator untuk direktori Anda. Jika Anda tidak dapat menambahkan anggota ke grup yang sudah ada, hubungi pemilik grup atau administrator direktori. Untuk mempelajari selengkapnya, lihat Mengelola grup Microsoft Entra dan keanggotaan grup.

3 - Menetapkan peran ke aplikasi

Selanjutnya, Anda perlu menentukan peran (izin) apa yang dibutuhkan aplikasi Anda pada sumber daya apa dan menetapkan peran tersebut ke aplikasi Anda. Dalam contoh ini, peran ditetapkan ke grup Microsoft Entra yang dibuat di langkah 2. Peran dapat ditetapkan 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.

Pengguna, grup, atau perwakilan layanan aplikasi diberi peran di Azure menggunakan perintah az role assignment create . Anda dapat menentukan grup dengan ID objeknya. Anda dapat menentukan perwakilan layanan aplikasi dengan appId-nya.

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

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

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

Misalnya, untuk mengizinkan perwakilan layanan aplikasi dengan appId 00000000-0000-0000-0000-000000000000 baca, tulis, dan hapus akses ke kontainer blob Azure Storage dan data 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 00000000-0000-0000-0000-000000000000 \
    --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.

4 - Mengatur variabel lingkungan pengembangan lokal

Objek DefaultAzureCredential akan mencari informasi perwakilan layanan dalam sekumpulan variabel lingkungan saat runtime. Karena sebagian besar pengembang bekerja pada beberapa aplikasi, disarankan untuk menggunakan paket seperti python-dotenv untuk mengakses lingkungan dari file yang .env disimpan di direktori aplikasi selama pengembangan. Ini mencakup variabel lingkungan yang digunakan untuk mengautentikasi aplikasi ke Azure sehingga hanya dapat digunakan oleh aplikasi ini.

File .env tidak pernah diperiksa ke kontrol sumber karena berisi kunci rahasia aplikasi untuk Azure. File .gitignore standar untuk Python secara otomatis mengecualikan .env file dari check-in.

Untuk menggunakan paket python-dotenv, pertama-tama instal paket di aplikasi Anda.

pip install python-dotenv

Kemudian, buat .env file di direktori akar aplikasi Anda. Atur nilai variabel lingkungan dengan nilai yang diperoleh dari proses pendaftaran aplikasi sebagai berikut:

  • AZURE_CLIENT_ID → Nilai ID aplikasi.
  • AZURE_TENANT_ID → Nilai ID penyewa.
  • AZURE_CLIENT_SECRET → Kata sandi/mandat yang dihasilkan untuk aplikasi.
AZURE_CLIENT_ID=00000000-0000-0000-0000-000000000000
AZURE_TENANT_ID=11111111-1111-1111-1111-111111111111
AZURE_CLIENT_SECRET=abcdefghijklmnopqrstuvwxyz

Terakhir, dalam kode startup untuk aplikasi Anda, gunakan python-dotenv pustaka untuk membaca variabel lingkungan dari file saat .env startup.

from dotenv import load_dotenv

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

5 - Menerapkan DefaultAzureCredential di aplikasi Anda

Untuk mengautentikasi objek klien Azure SDK ke Azure, aplikasi Anda harus menggunakan DefaultAzureCredential kelas dari azure.identity paket. Dalam skenario ini, DefaultAzureCredential akan mendeteksi variabel AZURE_CLIENT_IDlingkungan , , AZURE_TENANT_IDdan AZURE_CLIENT_SECRET diatur dan membaca variabel tersebut untuk mendapatkan informasi utama layanan aplikasi untuk terhubung ke Azure.

Mulailah dengan menambahkan paket azure.identity ke 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 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)