Exercise - 限制 Azure 服務對公用資料庫的存取
在這個單元中,你會用 Azure-services 例外取代允許所有公用 IPv4 位址嘗試連線的 PostgreSQL 防火牆規則。 資料庫保留其公開端點。 該例外允許 Azure 服務與資源,包括這個 Quarkus 應用程式,嘗試驗證連線;並未限制對此應用程式或容器應用環境的存取。
繼續在同一個本地 Bash shell 中,或在 Windows 上使用 WSL,並沿用前述練習中的AZ_*變數。 從非 Azure 的公開來源網路執行資料庫檢查。 使用 Azure CLI 2.87.0 或更新版本,且不要重跑資源名稱或密碼設定。
使用 CLI 存取 PostgreSQL 伺服器
首先,確認你是否能從目前的客戶端網路查詢 PostgreSQL 伺服器:
az postgres flexible-server execute \
--name "$AZ_POSTGRES_SERVER_NAME" \
--database-name "$AZ_POSTGRES_DB_NAME" \
--admin-user "$AZ_POSTGRES_USERNAME" \
--admin-password="$AZ_POSTGRES_PASSWORD" \
--querytext "select * from Todo" \
--output table
確認查詢回傳的是你之前建立的 to-do 項目。 這確認的是來自你 shell 來源網路的連線,而不是每個用戶端網路的連線。 在更換防火牆前,先解決任何查詢錯誤,這樣你才有一個後續測試的基線。
移除寬鬆的防火牆規則
當您建立新的 PostgreSQL 伺服器時,--public-access All已啟用其公開端點,並為所有公開 IPv4 位址建立一條防火牆規則。
Note
這些防火牆指令使用 Azure CLI 2.87.0 引入的參數名稱:--server-name 識別伺服器,--name 識別防火牆規則。 獨立的az postgres flexible-server execute命令仍對伺服器使用--name。 語法細節請參見防火牆指令參考。
在繼續前請先解決任何失敗的防火牆命令;遭拒的命令不會變更防火牆。 列出您練習專用伺服器上的現有規則:
az postgres flexible-server firewall-rule list \
--server-name "$AZ_POSTGRES_SERVER_NAME" \
--resource-group "$AZ_RESOURCE_GROUP" \
--output table
找出其 StartIpAddress 是 0.0.0.0 且 EndIpAddress 是 255.255.255.255 的規則。 在 Name 欄中產生的名稱會有所不同。 這應該是本模組新伺服器上唯一的規則。 如果結果不同,請確認你使用的是該練習專用的伺服器,並解決差異後再繼續。 不要刪除現有或共用伺服器上的無關規則。
此範圍允許任何公共 IPv4 來源位址嘗試資料庫連線。 用戶端仍然需要有效的 PostgreSQL 憑證。 在後續加入 Azure-services 例外前,先移除此規則。
PostgreSQL 防火牆更新可能需要長達五分鐘才能完成。 每次成功變更後,請稍候一段時間再檢查連線。 在新的調用中重複 CLI 查詢以測試新的資料庫連線;對應用程式的 HTTP 請求則是獨立的應用程式層級檢查。
在接下來的指令中,請將 <allow-all-rule-name> 替換為你剛才列出的全地址規則的實際 Name 值。 移除角括號,保留引號,只刪除那條規則:
az postgres flexible-server firewall-rule delete \
--server-name "$AZ_POSTGRES_SERVER_NAME" \
--resource-group "$AZ_RESOURCE_GROUP" \
--name "<allow-all-rule-name>" \
--yes
刪除成功後,再次列出規則:
az postgres flexible-server firewall-rule list \
--server-name "$AZ_POSTGRES_SERVER_NAME" \
--resource-group "$AZ_RESOURCE_GROUP" \
--output table
成功執行 list 指令後,現在應該不會回傳任何規則。 如果命令失敗或有任何留存的規則,請先處理該結果再繼續。 空清單會會確認已設定的規則,但不代表網路更新已經傳播。
允許傳播時間後,透過再次執行查詢建立新的直接資料庫連線:
az postgres flexible-server execute \
--name "$AZ_POSTGRES_SERVER_NAME" \
--database-name "$AZ_POSTGRES_DB_NAME" \
--admin-user "$AZ_POSTGRES_USERNAME" \
--admin-password="$AZ_POSTGRES_PASSWORD" \
--querytext "select * from Todo" \
--output table
刪除生效後,應拒絕新的資料庫連線。 錯誤文字取決於用戶端與網路路徑;例如,PostgreSQL 可以回報沒有匹配 pg_hba.conf 的條目。 不要期待會有特定的逾時訊息。 刪除後立即查詢成功,可能代表防火牆變更仍在傳播中。
此無規則階段會刻意阻擋應用程式在變更生效後的新資料庫連線。 應用程式的 HTTPS 端點保持公開狀態。 Quarkus 使用資料庫連線池,因此 HTTP 請求不一定會開啟新的資料庫連線。 檢查 HTTP 狀態與正文,但不要用一次即時回應作為防火牆傳播已完成的證明:
curl --include "https://$AZ_APP_URL/api/todos"
--include 選項會顯示 HTTP 回應標頭以及主體。 預設情況下,curl 不會將 HTTP 錯誤狀態視為指令失敗,因此請檢查狀態,而非依賴其退出碼。 詳情請參閱 curl 手冊。
新增 Azure-services 例外狀況
新增 Azure-services 例外,讓已部署的應用程式能重新連接資料庫:
az postgres flexible-server firewall-rule create \
--server-name "$AZ_POSTGRES_SERVER_NAME" \
--resource-group "$AZ_RESOURCE_GROUP" \
--name "Allow_Azure-services" \
--start-ip-address "0.0.0.0" \
--end-ip-address "0.0.0.0"
起始值與結尾值0.0.0.0會啟用允許從 Azure 內任一 Azure 服務對此伺服器的公開存取,如 PostgreSQL 防火牆規則中所述。 這是資料庫公開端點上的服務定義例外,而非私有 IP 位址範圍。
Important
該例外同時允許來自其他客戶訂閱中的 Azure 資源嘗試連線。 它不會識別 Quarkus 應用程式,也不會將存取限制於單一環境、訂閱或租戶。 用戶端仍必須驗證。 此練習不設定私人網路或僅限應用程式的存取權。
創建成功後,再次列出規則:
az postgres flexible-server firewall-rule list \
--server-name "$AZ_POSTGRES_SERVER_NAME" \
--resource-group "$AZ_RESOURCE_GROUP" \
--output table
這個新伺服器唯一的規則現在應該是 Allow_Azure-services,並將 StartIpAddress 和 EndIpAddress 都設為 0.0.0.0。 如果指令失敗或規則與結果不符,請先解決差異再測試連線。 請預留最多五分鐘讓變更生效。
驗證資料庫與應用程式存取權
允許傳播時間後,請在新的叫用中,從非 Azure 公開來源網路上的本機開發電腦執行以下命令。 使用與初始查詢相同的運作中的資料庫認證資訊。 當沒有其他防火牆規則允許該來源位址時,資料庫連線應該被拒絕。
防火牆規則評估的是來源地址,而不是客戶端是否是 Azure CLI。 請勿使用 Azure Cloud Shell 進行此項否定測試:Azure-services 例外可以允許其連線。 從 Azure 託管的用戶端並透過有效認證的成功查詢,並不表示防火牆更新已失敗。
az postgres flexible-server execute \
--name "$AZ_POSTGRES_SERVER_NAME" \
--database-name "$AZ_POSTGRES_DB_NAME" \
--admin-user "$AZ_POSTGRES_USERNAME" \
--admin-password="$AZ_POSTGRES_PASSWORD" \
--querytext "select * from Todo" \
--output table
在給予Azure服務例外生效的時間後,透過已部署的應用程式取得 to-do 項目。 檢查 HTTP 200 以及包含你之前建立 to-do 項目的 JSON 陣列:
curl --include "https://$AZ_APP_URL/api/todos"
如果新資料庫連線在傳播視窗後仍有意外結果,請在更改憑證前檢查實際防火牆規則及用戶端的來源網路。 如果應用程式回應沒有 HTTP 200 和預期的 JSON 資料,就無法通過正面檢查。
當沒有其他規則允許時,來自非 Azure 來源地址的直接 PostgreSQL 連線會被封鎖。 持有有效資料庫憑證的來源自 Azure 的用戶端仍可連線。 應用程式的 HTTPS API 保持公開;這些檢查並未建立僅限應用程式的資料庫隔離。