練習 - 限制對 Azure Container Apps 環境的存取
在此單元中,您會確定 PostgreSQL 資料庫只能由 Quarkus 應用程式存取,而不是由其他外部用戶端存取。 您目前可以使用 Azure CLI 從任何用戶端存取資料庫,並在本機執行 Quarkus。 此設定不安全。 您必須新增防火牆規則,以只允許 Azure Container Apps 環境內的 IP 位址存取資料庫伺服器。
使用 CLI 存取 PostgreSQL 伺服器
首先,請確定您可以使用 Azure CLI 來存取 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
您應該可以看到資料庫的內容。 如果可以,可以在環境外部存取資料庫。
拿掉寬鬆防火牆規則
適用於 PostgreSQL 的 Azure 資料庫預設會提供安全性。 其防火牆通常不允許連入連線。 但是當您建立 PostgreSQL 伺服器時,您指定了 --public-access "All" 參數來啟用外部存取,這會將防火牆設定為開放給公用。
您可以執行下列命令來列出現有的防火牆規則:
az postgres flexible-server firewall-rule list \
--name "$AZ_POSTGRES_SERVER_NAME" \
--resource-group "$AZ_RESOURCE_GROUP" \
--output table
您應該會看到下列輸出:
EndIpAddress Name ResourceGroup StartIpAddress
--------------- --------------------------- ---------------------- ----------------
255.255.255.255 AllowAll_2025-2-26_16-57-40 rgazure-deploy-quarkus 0.0.0.0
請注意,允許的 IP 位址範圍 0.0.0.0 到 255.255.255.255。 這樣的防火牆規則可讓任何用戶端存取資料庫。 若要確保只有 Quarkus 應用程式可以存取資料庫,您必須更新 PostgreSQL 伺服器的防火牆規則。
在此情況下,這隻是移除公用規則的問題。 若要移除它,請執行下列命令:
az postgres flexible-server firewall-rule delete \
--name "$AZ_POSTGRES_SERVER_NAME" \
--resource-group "$AZ_RESOURCE_GROUP" \
--rule-name <name of the AllowAll firewall rule> \
--yes
現在,請從 CLI 執行 SQL 語句來嘗試查詢資料庫:
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
呼叫最終會逾時。您應該會看到此訊息:
Unable to connect to flexible server: connection to server failed: Operation timed out
因為您移除了所有防火牆規則,現在即使是 Quarkus 應用程式也無法存取資料庫。 如果您嘗試從資料庫擷取 to-dos,要求會失敗。 執行下列 cURL 要求:
curl https://$AZ_APP_URL/api/todos
新增防火牆規則
您必須設定防火牆,以只允許存取 Quarkus 應用程式。 您需要新增防火牆規則。 若要新增規則,請執行此命令:
az postgres flexible-server firewall-rule create \
--name "$AZ_POSTGRES_SERVER_NAME" \
--resource-group "$AZ_RESOURCE_GROUP" \
--rule-name "Allow_Azure-internal-IP-addresses" \
--start-ip-address "0.0.0.0" \
--end-ip-address "0.0.0.0"
將 start-ip-address 和 end-ip-address 設定為 0.0.0.0 允許從所有 Azure 內部 IP 位址存取,但不允許從外部 IP 位址存取。 這種做法有助於保護資料庫免受外部存取。
如果您嘗試透過執行下列命令從 CLI 存取資料庫,嘗試應該會失敗:
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
但是,如果您嘗試使用下列命令,透過在 Container Apps 上執行的 Quarkus 應用程式,從資料庫擷取 to-dos,則嘗試會成功:
curl https://$AZ_APP_URL/api/todos
此命令會傳回資料庫中所有 to-do 項目的清單。 PostgreSQL 伺服器可以從在 Azure 服務上執行的 Quarkus 應用程式存取,但無法從 Azure 外部存取。