共用方式為


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

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

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

比較驗證選項

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

Microsoft Entra 驗證

Microsoft Entra 驗證是一種機制,可使用 Microsoft Entra ID 中定義的身分識別連線到適用於 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 會自動切換為使用 受控識別。 此轉換不需要變更程式碼。

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

在本機開發環境中,您可以使用 Azure CLI、Azure PowerShell、Visual Studio 或 Visual Studio Code 或 IntelliJ 的 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 的 Microsoft Entra ID 存取使用,您應該先設定 Microsoft Entra 系統管理員使用者。 只有 Microsoft Entra 系統管理員使用者可以建立/啟用使用者以進行 Microsoft Entra ID 型驗證。

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

備註

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

2) 設定 Azure Database for PostgreSQL 以進行本機開發

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 電腦上的適用於 Linux 的 Windows 子系統 (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 資料庫的位置。 更新 urluser 以符合下列值:

    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 Service 執行個體的應用程式可以連線到 Azure 儲存體。

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

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

備註

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

這很重要

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

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

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

  1. 在 Azure App Service 執行個體的主要概觀頁面上,從導覽窗格中選取 [身分識別 ]。

  2. 系統指派 索引標籤上,確保將 狀態 欄位設定為 開啟。 系統指派的身分識別是由 Azure 內部管理,並為您處理系統管理工作。 身分識別的詳細資料和識別碼永遠不會在您的程式碼中公開。

您也可以使用 Azure CLI 在 Azure 裝載環境中指派受控識別。

您可以使用 az webapp identity assign 命令將受控識別指派給 Azure App Service 執行個體,如下列範例所示:

export AZ_MI_OBJECT_ID=$(az webapp identity assign \
    --resource-group $AZ_RESOURCE_GROUP \
    --name <service-instance-name> \
    --query principalId \
    --output tsv)

將角色指派給受控識別

接下來,將權限授與您指派的受控識別,以存取 PostgreSQL 執行個體。

如果您使用服務連接器連線服務,則上一個步驟的命令已指派角色,因此您可以略過此步驟。

測試應用程式

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

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

備註

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

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

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

後續步驟

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

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