Share via


將應用程式移轉至使用無密碼連線與 適用於 MySQL 的 Azure 資料庫

本文說明如何從傳統驗證方法移轉至更安全、無密碼的連線與 適用於 MySQL 的 Azure 資料庫。

必須驗證 適用於 MySQL 的 Azure 資料庫的應用程式要求。 適用於 MySQL 的 Azure 資料庫 提供數種不同的方式讓應用程式安全地連線。 其中一種方式是使用密碼。 不過,您應該盡可能排定應用程式中無密碼連線的優先順序。

比較驗證選項

當應用程式使用 適用於 MySQL 的 Azure 資料庫 進行驗證時,它會提供使用者名稱和密碼組來連線到資料庫。 根據身分識別的儲存位置,有兩種類型的驗證:Microsoft Entra 驗證和 MySQL 驗證。

Microsoft Entra 驗證

Microsoft Entra 驗證是使用 Microsoft Entra 識別碼中定義的身分識別連線到 適用於 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 Entra ID 型驗證

若要搭配 適用於 MySQL 的 Azure 資料庫 使用 Microsoft Entra 識別符存取,您應該先設定 Microsoft Entra 系統管理員使用者。 只有 Microsoft Entra 管理員 使用者可以建立/啟用 Microsoft Entra 識別符型驗證的使用者。

如果您使用 Azure CLI,請執行下列命令以確定其具有足夠的權限:

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

執行下列命令以建立使用者身分識別以指派:

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

重要

建立使用者指派的身分識別之後,請要求全域 管理員 istrator 或 Privileged Role 管理員 istrator 授與此身分識別的下列許可權:User.Read.AllGroupMember.Read.AllApplication.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 管理員:

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 的 Azure 資料庫 中建立使用者中,閱讀建立 MySQL 使用者的詳細資訊。

3) 登入並移轉應用程式程式代碼以使用無密碼連線

針對本機開發,請確定您已使用您在 MySQL 上指派角色的相同 Microsoft Entra 帳戶進行驗證。 您可以透過 Azure CLI、Visual Studio、Azure PowerShell 或其他工具進行驗證,例如 IntelliJ。

使用下列命令透過 Azure CLI 登入 Azure:

az login

接下來,使用下列步驟來更新您的程序代碼,以使用無密碼連線。 雖然在概念上類似,但每個語言都使用不同的實作詳細數據。

  1. 在您的專案內,將下列參考新增至 azure-identity-extensions 封裝。 此連結庫包含實作無密碼連線所需的所有實體。

    <dependency>
        <groupId>com.azure</groupId>
        <artifactId>azure-identity-extensions</artifactId>
        <version>1.0.0</version>
    </dependency>
    
  2. 在 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
    
  3. 將一個 $AZ_DATABASE_SERVER_NAME 變數、一個 $AZ_DATABASE_NAME 變數和一個 $AZ_MYSQL_AD_NON_ADMIN_USERNAME 變數取代為您在本文開頭設定的值。

  4. password從 JDBC URL 移除 。

在本機執行應用程式

進行這些程式代碼變更之後,請在本機執行您的應用程式。 如果您登入相容的 IDE 或命令行工具,例如 Azure CLI、Visual Studio 或 IntelliJ,新的組態應該會挑選您的本機認證。 您在 Azure 中指派給本機開發人員使用者的角色,可讓您的應用程式在本機連線到 Azure 服務。

4) 設定 Azure 裝載環境

將應用程式設定為使用無密碼連線並在本機執行之後,相同的程式代碼可以在部署至 Azure 之後向 Azure 服務進行驗證。 例如,部署至已指派受控識別之 Azure App 服務 實例的應用程式可以連線到 Azure 儲存體。

在本節中,您將執行兩個步驟,讓應用程式以無密碼的方式在 Azure 主控環境中執行:

  • 為您的 Azure 裝載環境指派受控識別。
  • 將角色指派給受控識別。

注意

Azure 也提供 Service 連線 or,可協助您將主控服務與 PostgreSQL 連線。 使用服務 連線 or 來設定裝載環境,您可以省略將角色指派給受控識別的步驟,因為服務 連線 或會為您執行此動作。 下一節說明如何以兩種方式設定 Azure 主控環境:一種是透過服務 連線 或另一種方式,直接設定每個裝載環境。

重要

服務 連線 或命令需要 Azure CLI 2.41.0 或更高版本。

使用 Azure 入口網站 指派受控識別

下列步驟說明如何為各種 Web 主機服務指派系統指派的受控識別。 受控識別可以使用您先前設定的應用程式設定,安全地連線到其他 Azure 服務。

  1. 在 Azure App 服務 實例的主要概觀頁面上,從瀏覽窗格中選取 [身分識別]。

  2. 在 [ 系統指派] 索引 標籤上,請務必將 [ 狀態 ] 字段設定為 [開啟]。 系統指派的身分識別是由 Azure 內部管理,並為您處理系統管理工作。 身分識別的詳細數據和標識符永遠不會在您的程式代碼中公開。

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

您也可以使用 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。

更新您的程式代碼,以使用為受控識別建立的使用者:

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

進行這些程式代碼變更之後,您可以建置並重新部署應用程式。 然後,瀏覽至瀏覽器中的託管應用程式。 您的應用程式應該能夠成功連線到 MySQL 資料庫。 請記住,角色指派可能需要幾分鐘的時間,才能透過 Azure 環境傳播。 您的應用程式現在已設定為在本機和生產環境中執行,而開發人員不需要在應用程式本身管理秘密。

下一步

在本教學課程中,您已瞭解如何將應用程式遷移至無密碼連線。

您可以閱讀下列資源,以更深入地探索本文中討論的概念: