共用方式為


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

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

對 適用於 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 會自動切換為使用 受控識別。 此轉移不需要變更程式碼。

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

在本機開發環境中,您可以使用適用於 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>:P ostgreSQL 伺服器的名稱。 此名稱在 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以標識碼為基礎的驗證

若要搭配 適用於 PostgreSQL 的 Azure 資料庫 使用 Microsoft Entra ID 存取,您應該先設定 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 使用者的更多詳細資訊,請參閱在適用於 PostgreSQL 的 Azure 資料庫中建立使用者

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

將角色指派給受控識別

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

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

測試應用程式

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

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

注意

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

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

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

下一步

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

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