移轉應用程式以搭配使用無密碼連線與 適用於 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
接下來,使用下列步驟來更新您的程序代碼,以使用無密碼連線。 雖然在概念上類似,但每個語言都使用不同的實作詳細數據。
在您的專案內,將下列參考新增至
azure-identity-extensions
封裝。 此連結庫包含實作無密碼連線所需的所有實體。<dependency> <groupId>com.azure</groupId> <artifactId>azure-identity-extensions</artifactId> <version>1.0.0</version> </dependency>
在 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
$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 服務。
在 Azure App 服務 實例的主要概觀頁面上,從瀏覽窗格中選取 [身分識別]。
在 [ 系統指派] 索引 標籤上,請務必將 [ 狀態 ] 字段設定為 [開啟]。 系統指派的身分識別由 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 實例的受控識別。
測試應用程式
將應用程式部署至主控環境之前,您必須對程式代碼進行一次變更,因為應用程式會使用為受控識別建立的用戶連線到 PostgreSQL。
更新您的程式代碼,以使用為受控識別建立的使用者:
注意
如果您使用 Service Connector 命令,請略過此步驟。
properties.put("user", "$AZ_POSTGRESQL_AD_MI_USERNAME");
進行這些程式代碼變更之後,您可以建置並重新部署應用程式。 然後,瀏覽至瀏覽器中的託管應用程式。 您的應用程式應該能夠順利連線到PostgreSQL資料庫。 請記住,角色指派可能需要幾分鐘才會傳播到整個 Azure 環境。 您的應用程式現在已設定為在本機和實際執行環境中執行,而不需要開發人員管理應用程式本身的秘密。
下一步
在本教學課程中,您已了解如何將應用程式移轉為無密碼連線。
您可以閱讀下列資源,以更深入探索本文所討論的概念:
- 使用 Azure 資源的受控識別來授權 Blob 數據的存取權。
- 使用 Microsoft Entra ID 授權 blob 的存取權