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

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

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

比較驗證選項

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

Microsoft Entra 驗證

Microsoft Entra 驗證是一種機制,可使用Microsoft Entra ID 中定義的身分識別連線到 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 Database 會儲存這些密碼,你需要自己管理密碼的輪替。

雖然你可以用密碼連接 Azure SQL Database,但使用時要小心。 務必謹慎,絕不要在不安全的地方暴露密碼。 任何取得密碼存取權的人都可以進行認證。 例如,如果你不小心將連線字串提交到原始碼控制系統中、透過未加密的電子郵件傳送、貼到錯誤的聊天對話中,或讓不應擁有權限的人看見,惡意使用者就可能存取該應用程式。 相反地,請考慮更新您的應用程式以使用無密碼連線。

引入無密碼連線

透過無密碼連線,您可以連線到 Azure 服務,而不需要在應用程式程式碼、其組態檔或環境變數中儲存任何認證。

許多 Azure 服務都支援無密碼連線,例如透過 Azure 受控識別。 這些技術提供強大的安全性功能,您可以使用 Azure 身分識別用戶端程式庫中的 DefaultAzureCredential 來實作。 在本教學課程中,您將瞭解如何更新現有的應用程式以使用 DefaultAzureCredential ,而不是連接字串等替代方案。

DefaultAzureCredential 支援多種身份驗證方法,並自動確定在運行時應該使用哪種身份驗證方法。 此方法可讓您的應用程式在不同的環境中使用不同的驗證方法 (本機開發與生產環境),而無需實作環境特定的程式碼。

DefaultAzureCredential 搜尋認證時的順序和位置可在 Azure Identity library overview 中找到。 例如,在本機工作時, DefaultAzureCredential 通常會使用開發人員用來登入 Visual Studio 的帳戶進行驗證。 當應用程式部署至 Azure 時, DefaultAzureCredential 會自動切換為使用 受控識別。 此轉換不需要變更程式碼。

若要確保連線是無密碼的,您必須同時考量本端開發和生產環境。 如果任一位置都需要連接字串,則應用程式不會無密碼。

在本機開發環境中,您可以使用 Azure CLI、Azure PowerShell、Visual Studio 或 Visual Studio Code 或 IntelliJ 的 Azure 外掛程式進行驗證。 在此情況下,您可以在應用程式中使用該認證,而不是設定內容。

當您將應用程式部署至 Azure 裝載環境 (例如虛擬機器) 時,您可以在該環境中指派受控識別。 然後,您不需要提供認證即可連線到 Azure 服務。

備註

受控識別提供安全性身分識別來代表應用程式或服務。 身分識別是由 Azure 平台管理,不需要您佈建或輪替任何秘密。 您可以在 概觀 檔中深入瞭解受控識別。

備註

由於 Azure SQL Database 的 JDBC 驅動程式尚未支援本地環境的無密碼連線,本文僅聚焦於部署到 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 Database Microsoft Entra ID 存取權限,請先設定 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 中啟用 Microsoft Entra 受控識別身分驗證。v 找出程式碼中目前建立 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. 從 JDBC URL 中移除 user and password 。

3) 配置 Azure 託管環境

當你設定應用程式使用無密碼連線後,部署到 Azure 後,這些程式碼就能驗證給 Azure 服務。 例如,部署至已指派受控識別的 Azure App 服務 執行個體的應用程式可以連線到 Azure 儲存體。

在本節中,你執行兩個步驟,讓你的應用程式能以無密碼方式在 Azure 主機環境中運行:

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

備註

Azure 也提供 服務連接器,可協助您將裝載服務與 SQL Server 連線。 透過使用 Service Connector 配置你的主機環境,你可以省去為管理身份指派角色的步驟,因為 Service Connector 會幫你完成這件事。 下一節說明如何以兩種方式設定 Azure 裝載環境:一種是透過服務連接器,另一種是直接設定每個裝載環境。

這很重要

服務連接器的命令需要 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 環境中傳遞。 您的應用程式現在已設定為在本機和生產環境中執行,而開發人員不必管理應用程式本身中的密碼。

後續步驟

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

若想更深入探討本文討論的概念,請參閱以下資源: