Share via


移轉 Java 應用程式以搭配 Azure SQL 資料庫 使用無密碼連線

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

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

比較驗證選項

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

Microsoft Entra 驗證

Microsoft Entra 驗證是使用 Microsoft Entra 識別碼中所定義身分識別連線到 Azure SQL 資料庫 的機制。 透過 Microsoft Entra 驗證,您可以在中央位置管理資料庫使用者身分識別和其他 Microsoft 服務,以簡化許可權管理。

使用 Microsoft Entra ID 進行驗證可提供下列優點:

  • 以統一的方式驗證跨 Azure 服務的使用者。
  • 在單一位置管理密碼原則和密碼輪替。
  • Microsoft Entra ID 支援的多種驗證形式,這可以消除儲存密碼的需求。
  • 客戶可以使用外部 (Microsoft Entra ID) 群組來管理資料庫許可權。
  • Microsoft Entra 驗證會使用 Azure SQL 資料庫用戶來驗證資料庫層級的身分識別。
  • 支援連線至 Azure SQL 資料庫 的應用程式令牌型驗證。

Azure SQL 資料庫 驗證

您可以在 Azure SQL 資料庫 中建立帳戶。 如果您選擇使用密碼作為帳戶的認證,這些認證會儲存在數據表中 sys.database_principals 。 因為這些密碼會儲存在 Azure SQL 資料庫 中,因此您必須自行管理密碼的輪替。

雖然您可以使用密碼連線到 Azure SQL 資料庫,但您應該謹慎使用。 您必須勤奮地不要在不安全的位置公開密碼。 任何獲得密碼存取權的人都可以進行驗證。 例如,如果不小心將 連接字串 簽入原始檔控制、透過不安全的電子郵件傳送、貼入錯誤的聊天,或由不應該擁有許可權的人員檢視,惡意使用者可能會存取應用程式。 相反地,請考慮更新您的應用程式以使用無密碼連線。

無密碼連線簡介

透過無密碼連線,您可以連線到 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 平台負責管理,因此您不需要佈建或輪替任何密碼。 您可以在概觀檔中深入瞭解受控識別

注意

由於適用於 Azure 的 JDBC 驅動程式 SQL 資料庫 尚未支援來自本機環境的無密碼連線,本文僅著重於部署至 Azure 主控環境的應用程式,以及如何將其遷移至使用無密碼連線。

移轉現有的應用程式以使用無密碼連線

下列步驟說明如何將現有的應用程式移轉至使用無密碼連線,而不是以密碼為基礎的解決方案。

0) 準備工作環境

首先,使用下列命令來設定一些環境變數。

export AZ_RESOURCE_GROUP=<YOUR_RESOURCE_GROUP>
export AZ_DATABASE_SERVER_NAME=<YOUR_DATABASE_SERVER_NAME>
export AZ_DATABASE_NAME=demo
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>:Azure SQL 資料庫 伺服器的名稱。 此名稱在 Azure 中必須是唯一。

1) 設定 Azure SQL 資料庫

1.1) 啟用 Microsoft Entra ID 型驗證

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

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

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

然後,執行下列命令來設定 Microsoft Entra 管理員:

az sql server ad-admin create \
    --resource-group $AZ_RESOURCE_GROUP \
    --server $AZ_DATABASE_SERVER_NAME \
    --display-name $CURRENT_USERNAME \
    --object-id $CURRENT_USER_OBJECTID

此命令會將 Microsoft Entra 系統管理員設定為目前的登入使用者。

注意

您只能為每個 Azure SQL 資料庫 伺服器建立一個 Microsoft Entra 系統管理員。 另一個選項將會覆寫為伺服器設定的現有 Microsoft Entra 管理員。

2) 將應用程式程式代碼移轉至使用無密碼連線

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

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

    <dependency>
         <groupId>com.azure</groupId>
         <artifactId>azure-identity</artifactId>
         <version>1.5.4</version>
    </dependency>
    
  2. 在 JDBC URL.v 中啟用 Microsoft Entra 受控識別驗證,識別程式代碼中目前用來連線java.sql.Connection到 Azure SQL 資料庫 的位置。 更新您的程式代碼以符合下列範例:

    String url = "jdbc:sqlserver://$AZ_DATABASE_SERVER_NAME.database.windows.net:1433;databaseName=$AZ_DATABASE_NAME;authentication=ActiveDirectoryMSI;"   
    Connection con = DriverManager.getConnection(url);
    
  3. 將兩 $AZ_DATABASE_SERVER_NAME 個變數和一個 $AZ_DATABASE_NAME 變數取代為您在本文中開頭設定的值。

  4. user從 JDBC URL 移除 與 JDBC URL 移除 。 password

3) 設定 Azure 裝載環境

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

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

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

注意

Azure 也提供 Service 連線 or,可協助您將主控服務與 SQL Server 連線。 使用 Service 連線 or 來設定裝載環境,您可以省略將角色指派給受控識別的步驟,因為 Service 連線 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)

將角色指派給受控識別

接下來,將許可權授與您建立的受控識別,以存取 SQL 資料庫。

如果您使用 Service 連線 or 連線服務,則先前步驟的命令已指派角色,因此您可以略過此步驟。

測試應用程式

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

下一步

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

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