共用方式為


將 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 Database 驗證

您可以在 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以標識碼為基礎的驗證

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

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

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

然後,執行下列命令來設定 Microsoft Entra admin:

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 Connector,可協助您將主控服務與 SQL Server 連線。 使用服務連接器來設定裝載環境,您可以省略將角色指派給受控識別的步驟,因為 Service Connector 會為您執行此作業。 下一節說明如何以兩種方式設定 Azure 主控環境:一種是透過 Service Connector,另一種是直接設定每個裝載環境。

重要

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

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

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

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

  2. 在 [ 系統指派] 索引 標籤上,請務必將 [ 狀態 ] 字段設定為 [開啟]。 系統指派的身分識別由 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)

將角色指派給受控識別

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

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

測試應用程式

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

下一步

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

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