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.
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>
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. Perbaruiurl
danuser
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 menghapusdefaultAuthenticationPlugin=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
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.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 Konektor Layanan, yang dapat membantu Anda menghubungkan layanan hosting Anda dengan PostgreSQL. Dengan Konektor Layanan untuk mengonfigurasi lingkungan hosting Anda, Anda dapat menghilangkan langkah menetapkan peran ke identitas terkelola Anda karena Konektor Layanan akan melakukannya untuk Anda. Bagian berikut menjelaskan cara mengonfigurasi lingkungan hosting Azure Anda dengan dua cara: satu melalui Konektor Layanan dan yang lainnya dengan mengonfigurasi setiap lingkungan hosting secara langsung.
Penting
Perintah Konektor Layanan 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.
Pada halaman gambaran umum utama instans Azure App Service Anda, pilih Identitas dari panel navigasi.
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.
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: