練習 - 限制對 Azure 容器應用程式環境的存取權
在此單元中,您需確定 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_2023-1-3_10-20-4 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 應用程式也無法存取資料庫。 如果您嘗試從資料庫擷取待辦事項,該要求會失敗。 執行下列 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
但是,如果您嘗試使用下列命令,透過在容器應用程式上執行的 Quarkus 應用程式,從資料庫擷取待辦事項,則該嘗試會成功:
curl https://$AZ_APP_URL/api/todos
此命令會從資料庫傳回所有待辦事項的清單。 PostgreSQL 伺服器可從在 Azure 服務上執行的 Quarkus 應用程式存取,但無法從 Azure 外部進行存取。