移轉應用程式以搭配使用無密碼連線與 適用於 MySQL 的 Azure 資料庫
本文說明如何使用 適用於 MySQL 的 Azure 資料庫,從傳統驗證方法遷移至更安全、無密碼的連線。
對 適用於 MySQL 的 Azure 資料庫 的應用程式要求必須經過驗證。 適用於 MySQL 的 Azure 資料庫 提供數種不同的方式讓應用程式安全地連線。 其中一種方式是使用密碼。 不過,您應該盡可能在應用程式中排定無密碼連線的優先順序。
比較驗證選項
當應用程式向 適用於 MySQL 的 Azure 資料庫 進行驗證時,它會提供使用者名稱和密碼組來連線到資料庫。 根據身分識別的儲存位置,有兩種類型的驗證:Microsoft Entra 驗證和 MySQL 驗證。
Microsoft Entra 驗證
Microsoft Entra 驗證是使用 Microsoft Entra ID 中所定義的身分識別來連線到適用於 MySQL 的 Azure 資料庫的機制。 透過 Microsoft Entra 驗證,您可以在集中的位置管理資料庫使用者的身分識別和其他 Microsoft 服務,從而簡化權限管理。
使用 Microsoft Entra ID 進行驗證可提供下列優點:
- 以統一的方式驗證跨 Azure 服務的使用者。
- 在單一位置管理密碼原則和密碼輪替。
- Microsoft Entra ID 支援多種形式的驗證,這可以消除儲存密碼的需求。
- 客戶可以使用外部 (Microsoft Entra ID) 群組來管理資料庫權限。
- Microsoft Entra 驗證會使用 MySQL 資料庫用戶來驗證資料庫層級的身分識別。
- 支援連線到 適用於 MySQL 的 Azure 資料庫的應用程式令牌型驗證。
MySQL 驗證
您可以在 MySQL 中建立帳戶。 如果您選擇使用密碼作為帳戶的認證,則這些認證會儲存在 user
資料表中。 因為這些密碼會儲存在 MySQL 中,因此您必須自行管理密碼的輪替。
雖然您可以使用密碼連線到 適用於 MySQL 的 Azure 資料庫,但您應該謹慎使用它們。 您必須勤奮地不要在不安全的位置公開密碼。 任何獲得密碼存取權的人都可以進行驗證。 例如,如果不小心將 連接字串 簽入原始檔控制、透過不安全的電子郵件傳送、貼入錯誤的聊天,或由不應該擁有許可權的人員檢視,惡意使用者可能會存取應用程式。 相反地,請考慮將應用程式更新為使用無密碼連線。
無密碼連線簡介
透過無密碼連線,您可以連線到 Azure 服務,而不需將任何認證儲存在應用程式程式代碼、其組態檔或環境變數中。
許多 Azure 服務都支援無密碼連線,例如透過 Azure 受控識別。 這些技術提供強固的安全性功能,您可以從 Azure 身分識別用戶端連結庫使用 DefaultAzureCredential 來實作。 在本教學課程中,您將瞭解如何更新現有的應用程式以使用DefaultAzureCredential
,而不是 連接字串 之類的替代方案。
DefaultAzureCredential
支援多個驗證方法,並在執行階段自動判斷應該使用何者。 此方法可讓您的應用程式在不同的環境中 (本機開發或實際執行環境) 使用不同的驗證方法,而不需要實作環境特有的程式碼。
您可以在 Azure 身分識別連結庫概觀中找到搜尋認證的順序和位置DefaultAzureCredential
。 例如,在本機工作時, DefaultAzureCredential
通常會使用開發人員用來登入Visual Studio的帳戶進行驗證。 當應用程式部署至 Azure 時, DefaultAzureCredential
會自動切換為使用 受控識別。 此轉移不需要變更程式碼。
若要確保連線是無密碼的,您必須同時考慮本機開發和生產環境。 如果任一位置都需要 連接字串,則應用程式不是無密碼的。
在本機開發環境中,您可以使用適用於 Visual Studio Code 或 IntelliJ 的 Azure CLI、Azure PowerShell、Visual Studio 或 Azure 外掛程式進行驗證。 在此情況下,您可以在應用程式中使用該認證,而不是設定屬性。
當您將應用程式部署至 Azure 主控環境,例如虛擬機時,您可以在該環境中指派受控識別。 然後,您不需要提供認證來連線到 Azure 服務。
注意
受控識別提供安全性身分識別來代表應用程式或服務。 身分識別由 Azure 平台負責管理,因此您不需要佈建或輪替任何密碼。 您可以在概觀文件中深入了解受控識別。
移轉現有的應用程式以使用無密碼連線
下列步驟說明如何將現有的應用程式移轉至使用無密碼連線,而不是以密碼為基礎的解決方案。
0) 準備工作環境
首先,使用下列命令來設定一些環境變數。
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)
將預留位置取代為下列值,本文通篇都將使用這些值:
<YOUR_RESOURCE_GROUP>
:資源所屬的資源群組名稱。<YOUR_DATABASE_SERVER_NAME>
:您的 MySQL 伺服器名稱,此名稱在整個 Azure 中應該是唯一的。<YOUR_AZURE_AD_NON_ADMIN_USER_DISPLAY_NAME>
:Microsoft Entra 非系統管理員用戶的顯示名稱。 請確定名稱是您Microsoft Entra 租使用者中的有效使用者。<YOUR_AZURE_AD_MI_DISPLAY_NAME>
:受控識別Microsoft Entra 用戶的顯示名稱。 請確定名稱是您Microsoft Entra 租使用者中的有效使用者。<YOUR_USER_ASSIGNED_MANAGEMED_IDENTITY_NAME>
:使用者指派的受控識別伺服器名稱,在 Azure 中應該是唯一的。
1) 設定 適用於 MySQL 的 Azure 資料庫
1.1) 啟用Microsoft以標識碼為基礎的驗證
若要搭配 適用於 MySQL 的 Azure 資料庫 使用 Microsoft Entra 識別符存取,您應該先設定 Microsoft Entra 系統管理員使用者。 只有 Microsoft Entra 管理使用者可以針對 Microsoft Entra ID 型驗證來建立/啟用使用者。
如果您正在使用 Azure CLI,請執行下列命令來確定其具有足夠的權限:
az login --scope https://graph.microsoft.com/.default
執行下列命令以建立使用者身分識別以指派:
az identity create \
--resource-group $AZ_RESOURCE_GROUP \
--name $AZ_USER_IDENTITY_NAME
重要
建立使用者指派的身分識別之後,請要求全域管理員或特殊權限角色管理員授與此身分識別的下列權限:User.Read.All
、GroupMember.Read.All
和 Application.Read.ALL
。 如需詳細資訊,請參閱 Active Directory 驗證的權限一節。
執行下列命令,將身分識別指派給 MySQL 伺服器,以建立 Microsoft Entra 系統管理員:
az mysql flexible-server identity assign \
--resource-group $AZ_RESOURCE_GROUP \
--server-name $AZ_DATABASE_SERVER_NAME \
--identity $AZ_USER_IDENTITY_NAME
然後,執行下列命令來設定 Microsoft Entra admin:
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
此命令會將 Microsoft Entra 系統管理員設定為目前的登入使用者。
注意
您只能為每部 MySQL 伺服器建立一個 Microsoft Entra 系統管理員。 選取另一個選項將會覆寫為伺服器設定的現有Microsoft Entra 系統管理員。
2) 設定本機開發的 適用於 MySQL 的 Azure 資料庫
2.1) 設定本機 IP 的防火牆規則
適用於 MySQL 的 Azure 資料庫 實例預設會受到保護。 其防火牆不允許任何連入連線。
如果您使用 Bash,因為 flexible-server create
命令已經偵測到本地 IP 位址,並在 MySQL 伺服器上設定,因此可以略過此步驟。
如果您要從 Windows 電腦上的 Windows 子系統 Linux 版 (WSL) 連線到 MySQL 伺服器,您必須將 WSL 主機識別元新增至防火牆。 在 WSL 中執行下列命令,以取得您主機電腦的 IP 位址:
cat /etc/resolv.conf
複製下列字詞 nameserver
的IP位址,然後使用下列命令來設定WSL IP位址的環境變數:
export AZ_WSL_IP_ADDRESS=<the-copied-IP-address>
然後,使用下列命令,將伺服器的防火牆開啟至 WSL 應用程式:
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) 建立 MySQL 非系統管理員使用者並授與許可權
接下來,建立非系統管理員Microsoft Entra 使用者,並將資料庫的所有許可權 $AZ_DATABASE_NAME
授與其。 您可以變更資料庫名稱 $AZ_DATABASE_NAME
以符合您的需求。
建立名為 create_ad_user.sql 的 SQL 指令碼,以建立非管理使用者。 新增下列內容,並將其儲存在本地:
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
然後,使用下列命令以執行 SQL 指令碼,以建立 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
現在,使用下列命令來移除暫存 SQL 指令檔:
rm create_ad_user.sql
注意
如需建立 MySQL 使用者的更多詳細資訊,請參閱在適用於 MySQL 的 Azure 資料庫中建立使用者。
3) 登入並移轉應用程式程式代碼以使用無密碼連線
針對本機開發,請確定您已使用您在 MySQL 上指派角色的相同Microsoft Entra 帳戶進行驗證。 您可以透過 Azure CLI、Visual Studio、Azure PowerShell 或其他工具 (例如 IntelliJ) 進行驗證。
使用下列命令透過 Azure CLI 登入 Azure:
az login
接下來,使用下列步驟來更新您的程序代碼,以使用無密碼連線。 雖然在概念上類似,但每個語言都使用不同的實作詳細數據。
在您的專案內,將下列參考新增至
azure-identity-extensions
封裝。 此連結庫包含實作無密碼連線所需的所有實體。<dependency> <groupId>com.azure</groupId> <artifactId>azure-identity-extensions</artifactId> <version>1.0.0</version> </dependency>
在 JDBC URL 中啟用 Azure MySQL 驗證外掛程式。 識別您程式代碼中目前建立
java.sql.Connection
以連線至 適用於 MySQL 的 Azure 資料庫 的位置。 更新url
application.properties 檔案中的 和user
,以符合下列值: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
注意
如果您使用 類別
MysqlConnectionPoolDataSource
作為應用程式中的數據源,請務必從URL中移除defaultAuthenticationPlugin=com.azure.identity.extensions.jdbc.mysql.AzureMysqlAuthenticationPlugin
。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
將一個
$AZ_DATABASE_SERVER_NAME
變數、一個$AZ_DATABASE_NAME
變數和一個$AZ_MYSQL_AD_NON_ADMIN_USERNAME
變數取代為您在本文開頭設定的值。password
從 JDBC URL 移除 。
在本機執行應用程式
完成這些程式碼變更之後,請在本機執行您的應用程式。 如果您登入相容的 IDE 或命令行工具,例如 Azure CLI、Visual Studio 或 IntelliJ,新的組態應該會挑選您的本機認證。 您在 Azure 中指派給本機開發人員使用者的角色,可讓您的應用程式在本機連線到 Azure 服務。
4) 設定 Azure 裝載環境
將應用程式設定為使用無密碼連線並在本機執行之後,相同的程式代碼可以在部署至 Azure 之後向 Azure 服務進行驗證。 例如,部署至已指派受控識別之 Azure App 服務 實例的應用程式可以連線到 Azure 儲存體。
在本節中,您將執行兩個步驟,讓應用程式以無密碼的方式在 Azure 主控環境中執行:
- 為您的 Azure 裝載環境指派受控識別。
- 將角色指派給受控識別。
注意
Azure 也提供 Service Connector,可協助您將主控服務與 PostgreSQL 連線。 使用服務連接器來設定裝載環境,您可以省略將角色指派給受控識別的步驟,因為 Service Connector 會為您執行此作業。 下一節說明如何以兩種方式設定 Azure 主控環境:一種是透過 Service Connector,另一種是直接設定每個裝載環境。
重要
服務連接器的命令需要 Azure CLI 2.41.0 或更高版本。
使用 Azure 入口網站 指派受控識別
下列步驟說明如何為各種 Web 主機服務指派系統指派的受控識別。 受控識別可以使用您先前設定的應用程式設定,安全地連線至其他 Azure 服務。
在 Azure App 服務 實例的主要概觀頁面上,從瀏覽窗格中選取 [身分識別]。
在 [ 系統指派] 索引 標籤上,請務必將 [ 狀態 ] 字段設定為 [開啟]。 系統指派的身分識別由 Azure 在內部管理,可替您處理管理工作。 身分識別的詳細資料和識別碼絕對不會在程式碼中公開。
您也可以使用 Azure CLI 在 Azure 主控環境中指派受控識別。
您可以使用 az webapp identity assign 命令,將受控識別指派給 Azure App 服務 實例,如下列範例所示:
export AZ_MI_OBJECT_ID=$(az webapp identity assign \
--resource-group $AZ_RESOURCE_GROUP \
--name <service-instance-name> \
--query principalId \
--output tsv)
將角色指派給受控識別
接下來,將許可權授與您指派來存取 MySQL 實例的受控識別。
這些步驟會為受控識別建立Microsoft Entra 使用者,並將資料庫 $AZ_DATABASE_NAME
的所有許可權授與其。 您可以變更資料庫名稱 $AZ_DATABASE_NAME
以符合您的需求。
首先,建立名為 create_ad_user.sql 的 SQL 腳本,以建立非系統管理員使用者。 新增下列內容,並將其儲存在本地:
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
然後,使用下列命令以執行 SQL 指令碼,以建立 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
現在,使用下列命令來移除暫存 SQL 指令檔:
rm create_ad_user.sql
測試應用程式
將應用程式部署至主控環境之前,您必須對程式代碼進行一次變更,因為應用程式會使用為受控識別建立的用戶連線到 MySQL。
進行這些程式代碼變更之後,您可以建置並重新部署應用程式。 然後,瀏覽至瀏覽器中的託管應用程式。 您的應用程式應該能夠成功連線到 MySQL 資料庫。 請記住,角色指派可能需要幾分鐘才會傳播到整個 Azure 環境。 您的應用程式現在已設定為在本機和實際執行環境中執行,而不需要開發人員管理應用程式本身的秘密。
下一步
在本教學課程中,您已了解如何將應用程式移轉為無密碼連線。
您可以閱讀下列資源,以更深入探索本文所討論的概念:
- 使用 Azure 資源的受控識別來授權 Blob 數據的存取權。
- 使用 Microsoft Entra ID 授權 blob 的存取權