Share via


移轉應用程式以使用無密碼連線搭配 適用於 PostgreSQL 的 Azure 資料庫

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

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

比較驗證選項

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

Microsoft Entra 驗證

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

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

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

PostgreSQL 驗證

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

雖然您可以使用密碼連線到 適用於 PostgreSQL 的 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_POSTGRESQL_AD_NON_ADMIN_USERNAME=<YOUR_AZURE_AD_NON_ADMIN_USER_DISPLAY_NAME>
export AZ_LOCAL_IP_ADDRESS=<YOUR_LOCAL_IP_ADDRESS>
export CURRENT_USERNAME=$(az ad signed-in-user show --query userPrincipalName --output tsv)

將預留位置取代為下列值,此值會在整個文章中使用:

  • <YOUR_RESOURCE_GROUP>:資源所屬的資源群組名稱。
  • <YOUR_DATABASE_SERVER_NAME>:PostgreSQL 伺服器的名稱。 此名稱在 Azure 中必須是唯一。
  • <YOUR_AZURE_AD_NON_ADMIN_USER_DISPLAY_NAME>:Microsoft Entra 非系統管理員使用者的顯示名稱。 請確定名稱是 Microsoft Entra 租使用者中的有效使用者。
  • <YOUR_LOCAL_IP_ADDRESS>:本機電腦的 IP 位址,您將從中執行 Spring Boot 應用程式。 找到它的一個便利方式是開啟 whatismyip.akamai.com

1) 設定適用於 PostgreSQL 的 Azure 資料庫

1.1) 啟用 Microsoft Entra ID 型驗證

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

若要在建立伺服器之後設定 Microsoft Entra 系統管理員,請遵循在 適用於 PostgreSQL 的 Azure 資料庫 - 彈性伺服器 中管理 Microsoft Entra 角色中的 步驟。

注意

PostgreSQL 彈性伺服器可以建立多個 Microsoft Entra 系統管理員。

2) 設定本機開發的適用於 PostgreSQL 的 Azure 資料庫

2.1) 設定本機 IP 的防火牆規則

適用於 PostgreSQL 的 Azure 資料庫實例預設會受到保護。 其具有不允許任何連入連線的防火牆。 若要能夠使用您的資料庫,您必須新增防火牆規則,以允許本機 IP 位址存取資料庫伺服器。

由於您已在本文開頭設定本機 IP 位址,因此您可以執行下列命令來開啟伺服器的防火牆:

az postgres flexible-server firewall-rule create \
    --resource-group $AZ_RESOURCE_GROUP \
    --name $AZ_DATABASE_SERVER_NAME \
    --rule-name $AZ_DATABASE_SERVER_NAME-database-allow-local-ip \
    --start-ip-address $AZ_LOCAL_IP_ADDRESS \
    --end-ip-address $AZ_LOCAL_IP_ADDRESS \
    --output tsv

如果您要從 Windows 電腦上的 Windows 子系統 Linux 版 (WSL) 連線到 PostgreSQL 伺服器,您必須將 WSL 主機識別碼新增至防火牆。

在 WSL 中執行下列命令,以取得主機電腦的 IP 位址:

cat /etc/resolv.conf

複製下列詞彙 nameserver 後面的 IP 位址,然後使用下列命令來設定 WSL IP 位址的環境變數:

export AZ_WSL_IP_ADDRESS=<the-copied-IP-address>

然後,使用下列命令,將伺服器的防火牆開啟至以 WSL 為基礎的應用程式:

az postgres flexible-server firewall-rule create \
    --resource-group $AZ_RESOURCE_GROUP \
    --name $AZ_DATABASE_SERVER_NAME \
    --rule-name $AZ_DATABASE_SERVER_NAME-database-allow-local-ip \
    --start-ip-address $AZ_WSL_IP_ADDRESS \
    --end-ip-address $AZ_WSL_IP_ADDRESS \
    --output tsv

2.2) 建立 PostgreSQL 非系統管理員使用者並授與許可權

接下來,建立非系統管理員 Microsoft Entra 使用者,並將資料庫的擁有權限 $AZ_DATABASE_NAME 授與其。 您可以變更資料庫名稱 $AZ_DATABASE_NAME 以符合您的需求。

建立名為 create_ad_user_local.sql 的 SQL 腳本,以建立非系統管理員使用者。 新增下列內容,並將其儲存在本機:

cat << EOF > create_ad_user_local.sql
select * from pgaadauth_create_principal('$AZ_POSTGRESQL_AD_NON_ADMIN_USERNAME', false, false);
EOF

然後,使用下列命令執行 SQL 腳本來建立 Microsoft Entra 非系統管理員使用者:

psql "host=$AZ_DATABASE_SERVER_NAME.postgres.database.azure.com user=$CURRENT_USERNAME dbname=postgres port=5432 password=$(az account get-access-token --resource-type oss-rdbms --output tsv --query accessToken) sslmode=require" < create_ad_user_local.sql

現在,請使用下列命令來移除暫存 SQL 腳本檔案:

rm create_ad_user_local.sql

注意

您可以在建立適用於 PostgreSQL 的 Azure 資料庫 中的使用者中 ,閱讀有關建立 PostgreSQL 使用者的詳細資訊。

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

針對本機開發,請確定您已使用您在 PostgreSQL 上指派角色的相同 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 PostgreSQL 驗證外掛程式。 識別程式代碼中目前建立 java.sql.Connection 以連線至 適用於 PostgreSQL 的 Azure 資料庫 的位置。 更新 url application.properties 檔案中的 和 user ,以符合下列值:

    url=jdbc:postgresql://$AZ_DATABASE_SERVER_NAME.postgres.database.azure.com:5432/$AZ_DATABASE_NAME?sslmode=require&authenticationPluginClassName=com.azure.identity.extensions.jdbc.postgresql.AzurePostgresqlAuthenticationPlugin
    user=$AZ_POSTGRESQL_AD_NON_ADMIN_USERNAME
    
  3. $AZ_POSTGRESQL_AD_NON_ADMIN_USERNAME將和 兩$AZ_DATABASE_SERVER_NAME個變數取代為您在本文中開頭所設定的值。

在本機執行應用程式

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

4) 設定 Azure 裝載環境

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

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

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

注意

Azure 也提供 Service 連線or ,可協助您將主控服務與 PostgreSQL 連線。 使用服務連線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)

將角色指派給受控識別

接下來,將許可權授與您指派來存取 PostgreSQL 實例的受控識別。

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

測試應用程式

將應用程式部署至主控環境之前,您必須對程式碼進行一次變更,因為應用程式會使用為受控識別建立的使用者連線到 PostgreSQL。

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

注意

如果您使用 Service 連線or 命令,請略過此步驟。

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

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

下一步

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

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