练习 - 限制对 Azure 容器应用环境的访问
在本单元中,你将确保 PostgreSQL 数据库只能由 Quarkus 应用程序访问,而不能由其他外部客户端访问。 目前,你可以从任何客户端访问数据库(使用 Azure CLI 并在本地运行 Quarkus)。 此配置是不安全的。 你需要添加防火墙规则,仅允许 Azure 容器应用环境中的 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
你应该能够看到数据库的内容。 如果可以,数据库能够从环境外部访问。
移除允许的防火墙规则
默认情况下,Azure Database for PostgreSQL 提供安全性。 其防火墙通常不允许传入连接。 但在之前创建 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
此命令返回数据库中所有待办事项的列表。 可从 Azure 服务上运行的 Quarkus 应用程序访问 PostgreSQL 服务器,但不能从 Azure 外部访问。