Memigrasikan aplikasi untuk menggunakan koneksi tanpa kata sandi dengan Azure Database for MySQL

Artikel ini menjelaskan cara bermigrasi dari metode autentikasi tradisional ke koneksi tanpa kata sandi yang lebih aman dengan Azure Database for MySQL.

Permintaan aplikasi ke Azure Database for MySQL harus diautentikasi. Azure Database for MySQL menyediakan beberapa cara berbeda agar aplikasi terhubung dengan aman. Salah satu caranya adalah dengan menggunakan kata sandi. Namun, Anda harus memprioritaskan koneksi tanpa kata sandi di aplikasi jika memungkinkan.

Membandingkan opsi autentikasi

Saat aplikasi mengautentikasi dengan Azure Database for MySQL, aplikasi menyediakan pasangan nama pengguna dan kata sandi untuk menyambungkan ke database. Bergantung pada tempat identitas disimpan, ada dua jenis autentikasi: Autentikasi Microsoft Entra dan autentikasi MySQL.

Autentikasi Microsoft Entra

Autentikasi Microsoft Entra adalah mekanisme untuk menyambungkan ke Azure Database for MySQL menggunakan identitas yang ditentukan dalam ID Microsoft Entra. Dengan autentikasi Microsoft Entra, Anda dapat mengelola identitas pengguna database dan layanan Microsoft lain di lokasi pusat, yang menyederhanakan manajemen izin.

Menggunakan ID Microsoft Entra untuk autentikasi memberikan manfaat berikut:

  • Autentikasi pengguna di seluruh Layanan Azure dengan cara yang seragam.
  • Manajemen kebijakan kata sandi dan rotasi kata sandi di satu tempat.
  • Beberapa bentuk autentikasi yang didukung oleh ID Microsoft Entra, yang dapat menghilangkan kebutuhan untuk menyimpan kata sandi.
  • Pelanggan dapat mengelola izin database menggunakan grup eksternal (MICROSOFT Entra ID).
  • Autentikasi Microsoft Entra menggunakan pengguna database MySQL untuk mengautentikasi identitas di tingkat database.
  • Dukungan autentikasi berbasis token untuk aplikasi yang terhubung ke Azure Database for MySQL.

Autentikasi MySQL

Anda dapat membuat akun di MySQL. Jika Anda memilih untuk menggunakan kata sandi sebagai kredensial untuk akun, kredensial ini akan disimpan dalam user tabel. Karena kata sandi ini disimpan di MySQL, Anda perlu mengelola rotasi kata sandi sendiri.

Meskipun dimungkinkan untuk menyambungkan ke Azure Database for MySQL dengan kata sandi, Anda harus menggunakannya dengan hati-hati. Anda harus rajin untuk tidak pernah mengekspos kata sandi di lokasi yang tidak aman. Siapa pun yang mendapatkan akses ke kata sandi dapat mengautentikasi. Misalnya, ada risiko bahwa pengguna jahat dapat mengakses aplikasi jika string koneksi secara tidak sengaja diperiksa ke kontrol sumber, dikirim melalui email yang tidak aman, ditempelkan ke obrolan yang salah, atau dilihat oleh seseorang yang seharusnya tidak memiliki izin. Sebagai gantinya, pertimbangkan untuk memperbarui aplikasi Anda untuk menggunakan koneksi tanpa kata sandi.

Memperkenalkan koneksi tanpa kata sandi

Dengan koneksi tanpa kata sandi, Anda dapat terhubung ke layanan Azure tanpa menyimpan kredensial apa pun dalam kode aplikasi, file konfigurasinya, atau dalam variabel lingkungan.

Banyak layanan Azure mendukung koneksi tanpa kata sandi, misalnya melalui Azure Managed Identity. Teknik ini menyediakan fitur keamanan kuat yang dapat Anda terapkan menggunakan DefaultAzureCredential dari pustaka klien Azure Identity. Dalam tutorial ini, Anda akan mempelajari cara memperbarui aplikasi yang ada untuk digunakan DefaultAzureCredential alih-alih alternatif seperti string koneksi.

DefaultAzureCredential mendukung beberapa metode autentikasi dan otomatis menentukan metode autentikasi yang harus digunakan saat runtime bahasa umum. Pendekatan ini memungkinkan aplikasi Anda menggunakan metode autentikasi yang berbeda di lingkungan yang berbeda (pengembangan lokal dibandingkan dengan produksi) tanpa menerapkan kode khusus lingkungan.

Urutan dan lokasi tempat DefaultAzureCredential pencarian kredensial dapat ditemukan di gambaran umum pustaka Azure Identity. Misalnya, saat bekerja secara lokal, DefaultAzureCredential umumnya akan mengautentikasi menggunakan akun yang digunakan pengembang untuk masuk ke Visual Studio. Saat aplikasi disebarkan ke Azure, DefaultAzureCredential akan otomatis beralih menggunakan identitas terkelola. Tidak diperlukan perubahan kode untuk transisi ini.

Untuk memastikan bahwa koneksi tanpa kata sandi, Anda harus mempertimbangkan pengembangan lokal dan lingkungan produksi. Jika string koneksi diperlukan di salah satu tempat, aplikasi tidak tanpa kata sandi.

Di lingkungan pengembangan lokal, Anda dapat mengautentikasi dengan plugin Azure CLI, Azure PowerShell, Visual Studio, atau Azure untuk Visual Studio Code atau IntelliJ. Dalam hal ini, Anda dapat menggunakan kredensial tersebut di aplikasi Anda alih-alih mengonfigurasi properti.

Saat Anda menyebarkan aplikasi ke lingkungan hosting Azure, seperti komputer virtual, Anda dapat menetapkan identitas terkelola di lingkungan tersebut. Kemudian, Anda tidak perlu memberikan kredensial untuk menyambungkan ke layanan Azure.

Catatan

Identitas terkelola menyediakan identitas keamanan untuk mewakili aplikasi atau layanan. Identitas dikelola oleh platform Azure dan tidak mengharuskan Anda memprovisikan atau memutar rahasia. Anda dapat membaca selengkapnya tentang identitas terkelola dalam dokumentasi gambaran umum.

Memigrasikan aplikasi yang ada untuk menggunakan koneksi tanpa kata sandi

Langkah-langkah berikut menjelaskan cara memigrasikan aplikasi yang ada untuk menggunakan koneksi tanpa kata sandi alih-alih solusi berbasis kata sandi.

0) Menyiapkan lingkungan kerja

Pertama, gunakan perintah berikut untuk menyiapkan beberapa variabel lingkungan.

export AZ_RESOURCE_GROUP=<YOUR_RESOURCE_GROUP>
export AZ_DATABASE_SERVER_NAME=<YOUR_DATABASE_SERVER_NAME>
export AZ_DATABASE_NAME=demo
export AZ_MYSQL_AD_NON_ADMIN_USERNAME=<YOUR_AZURE_AD_NON_ADMIN_USER_DISPLAY_NAME>
export AZ_MYSQL_AD_MI_USERNAME=<YOUR_AZURE_AD_MI_DISPLAY_NAME>
export AZ_USER_IDENTITY_NAME=<YOUR_USER_ASSIGNED_MANAGEMED_IDENTITY_NAME>
export CURRENT_USERNAME=$(az ad signed-in-user show --query userPrincipalName --output tsv)
export CURRENT_USER_OBJECTID=$(az ad signed-in-user show --query id --output tsv)

Ganti tempat penampung dengan nilai berikut, yang digunakan di seluruh artikel ini:

  • <YOUR_RESOURCE_GROUP>: Nama grup sumber daya tempat sumber daya Anda berada.
  • <YOUR_DATABASE_SERVER_NAME>: Nama server MySQL Anda, yang harus unik di seluruh Azure.
  • <YOUR_AZURE_AD_NON_ADMIN_USER_DISPLAY_NAME>: Nama tampilan pengguna non-admin Microsoft Entra Anda. Pastikan nama tersebut adalah pengguna yang valid di penyewa Microsoft Entra Anda.
  • <YOUR_AZURE_AD_MI_DISPLAY_NAME>: Nama tampilan pengguna Microsoft Entra untuk identitas terkelola Anda. Pastikan nama tersebut adalah pengguna yang valid di penyewa Microsoft Entra Anda.
  • <YOUR_USER_ASSIGNED_MANAGEMED_IDENTITY_NAME>: Nama server identitas terkelola yang ditetapkan pengguna Anda, yang harus unik di seluruh Azure.

1) Mengonfigurasi Azure Database for MySQL

1.1) Aktifkan autentikasi berbasis ID Microsoft Entra

Untuk menggunakan akses ID Microsoft Entra dengan Azure Database for MySQL, Anda harus mengatur pengguna admin Microsoft Entra terlebih dahulu. Hanya pengguna Admin Microsoft Entra yang dapat membuat/mengaktifkan pengguna untuk autentikasi berbasis ID Microsoft Entra.

Jika Anda menggunakan Azure CLI, jalankan perintah berikut untuk memastikannya memiliki izin yang memadai:

az login --scope https://graph.microsoft.com/.default

Jalankan perintah berikut ke buat identitas pengguna untuk menetapkan:

az identity create \
    --resource-group $AZ_RESOURCE_GROUP \
    --name $AZ_USER_IDENTITY_NAME

Penting

Setelah membuat identitas yang ditetapkan pengguna, minta Administrator Global atau Administrator Peran Istimewa Anda untuk memberikan izin berikut untuk identitas ini: User.Read.All, GroupMember.Read.All, dan Application.Read.ALL. Untuk informasi selengkapnya, lihat bagian Izin autentikasi Direktori Aktif.

Jalankan perintah berikut untuk menetapkan identitas ke server MySQL untuk membuat admin Microsoft Entra:

az mysql flexible-server identity assign \
    --resource-group $AZ_RESOURCE_GROUP \
    --server-name $AZ_DATABASE_SERVER_NAME \
    --identity $AZ_USER_IDENTITY_NAME

Kemudian, jalankan perintah berikut untuk mengatur admin Microsoft Entra:

az mysql flexible-server ad-admin create \
    --resource-group $AZ_RESOURCE_GROUP \
    --server-name $AZ_DATABASE_SERVER_NAME \
    --display-name $CURRENT_USERNAME \
    --object-id $CURRENT_USER_OBJECTID \
    --identity $AZ_USER_IDENTITY_NAME

Perintah ini akan mengatur admin Microsoft Entra ke pengguna yang masuk saat ini.

Catatan

Anda hanya dapat membuat satu admin Microsoft Entra per server MySQL. Pilihan yang lain akan menimpa admin Microsoft Entra yang ada yang dikonfigurasi untuk server.

2) Mengonfigurasi Azure Database for MySQL untuk pengembangan lokal

2.1) Mengonfigurasi aturan firewall untuk IP lokal

Instans Azure Database for MySQL diamankan secara default. Mereka memiliki firewall yang tidak mengizinkan koneksi masuk.

Anda dapat melewati langkah ini jika Anda menggunakan Bash karena flexible-server create perintah sudah mendeteksi alamat IP lokal Anda dan mengaturnya di server MySQL.

Jika Anda menyambungkan ke server MySQL dari Subsistem Windows untuk Linux (WSL) di komputer Windows, Anda perlu menambahkan ID host WSL ke firewall Anda. Dapatkan alamat IP komputer host Anda dengan menjalankan perintah berikut di WSL:

cat /etc/resolv.conf

Salin alamat IP dengan mengikuti istilah nameserver, lalu gunakan perintah berikut untuk mengatur variabel lingkungan untuk alamat IP WSL:

export AZ_WSL_IP_ADDRESS=<the-copied-IP-address>

Kemudian, gunakan perintah berikut untuk membuka firewall server ke aplikasi berbasis WSL Anda:

az mysql server firewall-rule create \
    --resource-group $AZ_RESOURCE_GROUP \
    --name $AZ_DATABASE_SERVER_NAME-database-allow-local-ip-wsl \
    --server $AZ_DATABASE_SERVER_NAME \
    --start-ip-address $AZ_WSL_IP_ADDRESS \
    --end-ip-address $AZ_WSL_IP_ADDRESS \
    --output tsv

2.2) Membuat pengguna non-admin MySQL dan memberikan izin

Selanjutnya, buat pengguna Microsoft Entra non-admin dan berikan semua izin pada database ke $AZ_DATABASE_NAME dalamnya. Anda dapat mengubah nama $AZ_DATABASE_NAME database agar sesuai dengan kebutuhan Anda.

Buat skrip SQL yang disebut create_ad_user.sql untuk membuat pengguna non-admin. Tambahkan konten berikut dan simpan secara lokal:

export AZ_MYSQL_AD_NON_ADMIN_USERID=$(az ad signed-in-user show --query id --output tsv)

cat << EOF > create_ad_user.sql
SET aad_auth_validate_oids_in_tenant = OFF;
CREATE AADUSER '$AZ_MYSQL_AD_NON_ADMIN_USERNAME' IDENTIFIED BY '$AZ_MYSQL_AD_NON_ADMIN_USERID';
GRANT ALL PRIVILEGES ON $AZ_DATABASE_NAME.* TO '$AZ_MYSQL_AD_NON_ADMIN_USERNAME'@'%';
FLUSH privileges;
EOF

Kemudian, gunakan perintah berikut untuk menjalankan skrip SQL untuk membuat pengguna non-admin Microsoft Entra:

mysql -h $AZ_DATABASE_SERVER_NAME.mysql.database.azure.com --user $CURRENT_USERNAME --enable-cleartext-plugin --password=$(az account get-access-token --resource-type oss-rdbms --output tsv --query accessToken) < create_ad_user.sql

Sekarang gunakan perintah berikut untuk menghapus file skrip SQL sementara:

rm create_ad_user.sql

Catatan

Anda dapat membaca informasi selengkapnya tentang membuat pengguna MySQL di Membuat pengguna di Azure Database for MySQL.

3) Masuk dan migrasikan kode aplikasi untuk menggunakan koneksi tanpa kata sandi

Untuk pengembangan lokal, pastikan Anda diautentikasi dengan akun Microsoft Entra yang sama dengan yang Anda tetapkan perannya di MySQL Anda. Anda dapat melakukan autentikasi melalui Azure CLI, Visual Studio, Azure PowerShell, atau alat lain seperti IntelliJ.

Masuk ke Azure melalui Azure CLI dengan menggunakan perintah berikut:

az login

Selanjutnya, gunakan langkah-langkah berikut untuk memperbarui kode Anda untuk menggunakan koneksi tanpa kata sandi. Meskipun secara konseptual mirip, setiap bahasa menggunakan detail implementasi yang berbeda.

  1. Di dalam proyek Anda, tambahkan referensi berikut ke azure-identity-extensions paket. Pustaka ini berisi semua entitas yang diperlukan untuk menerapkan koneksi tanpa kata sandi.

    <dependency>
        <groupId>com.azure</groupId>
        <artifactId>azure-identity-extensions</artifactId>
        <version>1.0.0</version>
    </dependency>
    
  2. Aktifkan plugin autentikasi Azure MySQL di URL JDBC. Identifikasi lokasi dalam kode Anda yang saat ini membuat java.sql.Connection untuk menyambungkan ke Azure Database for MySQL. Perbarui url dan user di file application.properties Anda agar sesuai dengan nilai berikut:

    url=jdbc:mysql://$AZ_DATABASE_SERVER_NAME.mysql.database.azure.com:3306/$AZ_DATABASE_NAME?serverTimezone=UTC&sslMode=REQUIRED&defaultAuthenticationPlugin=com.azure.identity.extensions.jdbc.mysql.AzureMysqlAuthenticationPlugin&authenticationPlugins=com.azure.identity.extensions.jdbc.mysql.AzureMysqlAuthenticationPlugin
    user=$AZ_MYSQL_AD_NON_ADMIN_USERNAME
    

    Catatan

    Jika Anda menggunakan MysqlConnectionPoolDataSource kelas sebagai sumber data di aplikasi Anda, pastikan untuk menghapus defaultAuthenticationPlugin=com.azure.identity.extensions.jdbc.mysql.AzureMysqlAuthenticationPlugin dari URL.

    url=jdbc:mysql://$AZ_DATABASE_SERVER_NAME.mysql.database.azure.com:3306/$AZ_DATABASE_NAME?serverTimezone=UTC&sslMode=REQUIRED&authenticationPlugins=com.azure.identity.extensions.jdbc.mysql.AzureMysqlAuthenticationPlugin
    user=$AZ_MYSQL_AD_NON_ADMIN_USERNAME
    
  3. Ganti satu $AZ_DATABASE_SERVER_NAME variabel, satu $AZ_DATABASE_NAME variabel, dan satu $AZ_MYSQL_AD_NON_ADMIN_USERNAME variabel dengan nilai yang Anda konfigurasi di awal artikel ini.

  4. password Hapus dari URL JDBC.

Menjalankan aplikasi secara lokal

Setelah menerapkan perubahan kode ini, jalankan aplikasi Anda secara lokal. Konfigurasi baru harus mengambil kredensial lokal Anda jika Anda masuk ke IDE atau alat baris perintah yang kompatibel, seperti Azure CLI, Visual Studio, atau IntelliJ. Peran yang Anda tetapkan untuk pengguna dev lokal Anda di Azure akan memungkinkan aplikasi terhubung ke layanan Azure secara lokal.

4) Mengonfigurasi lingkungan hosting Azure

Setelah aplikasi Anda dikonfigurasi untuk menggunakan koneksi tanpa kata sandi dan berjalan secara lokal, kode yang sama dapat mengautentikasi ke layanan Azure setelah disebarkan ke Azure. Misalnya, aplikasi yang disebarkan ke instans Azure App Service yang memiliki identitas terkelola yang ditetapkan dapat tersambung ke Azure Storage.

Di bagian ini, Anda akan menjalankan dua langkah untuk memungkinkan aplikasi Anda berjalan di lingkungan hosting Azure dengan cara tanpa kata sandi:

  • Tetapkan identitas terkelola untuk lingkungan hosting Azure Anda.
  • Tetapkan peran ke identitas terkelola.

Catatan

Azure juga menyediakan Service Koneksi or, yang dapat membantu Anda menghubungkan layanan hosting Anda dengan PostgreSQL. Dengan Service Koneksi or untuk mengonfigurasi lingkungan hosting Anda, Anda dapat menghilangkan langkah menetapkan peran ke identitas terkelola Anda karena Service Koneksi or akan melakukannya untuk Anda. Bagian berikut menjelaskan cara mengonfigurasi lingkungan hosting Azure Anda dengan dua cara: satu melalui service Koneksi or dan yang lainnya dengan mengonfigurasi setiap lingkungan hosting secara langsung.

Penting

Perintah service Koneksi or memerlukan Azure CLI 2.41.0 atau yang lebih tinggi.

Menetapkan identitas terkelola menggunakan portal Azure

Langkah-langkah berikut menunjukkan kepada Anda cara menetapkan identitas terkelola yang ditetapkan sistem untuk berbagai layanan hosting web. Identitas terkelola dapat terhubung dengan aman ke Layanan Azure lainnya menggunakan konfigurasi aplikasi yang Anda siapkan sebelumnya.

  1. Pada halaman gambaran umum utama instans Azure App Service Anda, pilih Identitas dari panel navigasi.

  2. Pada tab Sistem yang ditetapkan, pastikan untuk mengatur bidang Status ke aktif. Identitas yang ditetapkan sistem dikelola oleh Azure secara internal dan menangani tugas administratif untuk Anda. Detail dan ID identitas tidak pernah terekspos dalam kode Anda.

    Screenshot of Azure portal Identity page of App Service resource with System assigned tab showing and Status field highlighted.

Anda juga dapat menetapkan identitas terkelola di lingkungan hosting Azure dengan menggunakan Azure CLI.

Anda dapat menetapkan identitas terkelola ke instans Azure App Service dengan perintah az webapp identity assign , seperti yang ditunjukkan dalam contoh berikut:

export AZ_MI_OBJECT_ID=$(az webapp identity assign \
    --resource-group $AZ_RESOURCE_GROUP \
    --name <service-instance-name> \
    --query principalId \
    --output tsv)

Menetapkan peran ke identitas terkelola

Selanjutnya, berikan izin ke identitas terkelola yang Anda tetapkan untuk mengakses instans MySQL Anda.

Langkah-langkah ini akan membuat pengguna Microsoft Entra untuk identitas terkelola dan memberikan semua izin untuk database ke dalamnya $AZ_DATABASE_NAME . Anda dapat mengubah nama $AZ_DATABASE_NAME database agar sesuai dengan kebutuhan Anda.

Pertama, buat skrip SQL yang disebut create_ad_user.sql untuk membuat pengguna non-admin. Tambahkan konten berikut dan simpan secara lokal:

export AZ_MYSQL_AD_MI_USERID=$(az ad sp show --id $AZ_MI_OBJECT_ID --query appId --output tsv)

cat << EOF > create_ad_user.sql
SET aad_auth_validate_oids_in_tenant = OFF;
CREATE AADUSER '$AZ_MYSQL_AD_MI_USERNAME' IDENTIFIED BY '$AZ_MYSQL_AD_MI_USERID';
GRANT ALL PRIVILEGES ON $AZ_DATABASE_NAME.* TO '$AZ_MYSQL_AD_MI_USERNAME'@'%';
FLUSH privileges;
EOF

Kemudian, gunakan perintah berikut untuk menjalankan skrip SQL untuk membuat pengguna non-admin Microsoft Entra:

mysql -h $AZ_DATABASE_SERVER_NAME.mysql.database.azure.com --user $CURRENT_USERNAME --enable-cleartext-plugin --password=$(az account get-access-token --resource-type oss-rdbms --output tsv --query accessToken) < create_ad_user.sql

Sekarang gunakan perintah berikut untuk menghapus file skrip SQL sementara:

rm create_ad_user.sql

Menguji aplikasi

Sebelum menyebarkan aplikasi ke lingkungan hosting, Anda perlu membuat satu perubahan lagi pada kode karena aplikasi akan terhubung ke MySQL menggunakan pengguna yang dibuat untuk identitas terkelola.

Perbarui kode Anda untuk menggunakan pengguna yang dibuat untuk identitas terkelola:

properties.put("user", "$AZ_MYSQL_AD_MI_USERNAME");

Setelah membuat perubahan kode ini, Anda dapat membangun dan menyebarkan ulang aplikasi. Kemudian, telusuri ke aplikasi yang dihosting di browser. Aplikasi Anda harus berhasil tersambung ke database MySQL. Perlu diingat bahwa mungkin perlu waktu beberapa menit agar penetapan peran disebarkan melalui lingkungan Azure Anda. Aplikasi Anda kini dikonfigurasikan untuk berjalan baik secara lokal maupun di lingkungan produksi tanpa pengembang harus mengelola rahasia dalam aplikasi itu sendiri.

Langkah berikutnya

Dalam tutorial ini, Anda belajar cara memigrasikan aplikasi ke koneksi tanpa kata sandi.

Anda dapat membaca sumber daya berikut untuk menjelajahi konsep yang dibahas dalam artikel ini secara lebih mendalam: