练习 - 限制对 Azure 容器应用环境的访问

已完成 100 XP

在本单元中,请确保 PostgreSQL 数据库只能由 Quarkus 应用程序访问,而不能由其他外部客户端访问。 目前,可以使用 Azure CLI 从任何客户端访问数据库,并在本地运行 Quarkus。 此配置是不安全的。 需要添加防火墙规则,以仅允许 Azure 容器应用环境中的 IP 地址访问数据库服务器。

使用 CLI 访问 PostgreSQL 服务器

首先,请确保可以使用 Azure CLI 访问 PostgreSQL 服务器。 为此,请运行以下命令:

Azure 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

应能够看到数据库的内容。 如果可以,可以在环境外部访问数据库。

删除宽松的防火墙规则

默认情况下,Azure Database for PostgreSQL 提供安全性。 其防火墙通常不允许传入连接。 但是,创建 PostgreSQL 服务器时,指定了 --public-access "All" 参数以启用外部访问,该参数将防火墙配置为向公共开放。

可以通过运行以下命令列出现有防火墙规则:

Azure CLI
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 地址范围通过 255.255.255.2550.0.0.0。 此类防火墙规则允许任何客户端访问数据库。 若要确保只有 Quarkus 应用程序可以访问数据库,需要更新 PostgreSQL 服务器的防火墙规则。 在这种情况下,这只是删除公共规则的问题。 若要将其删除,请运行以下命令:

Azure CLI
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 语句来查询数据库:

Azure 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

调用最终超时。应会看到以下消息:

输出
Unable to connect to flexible server: connection to server failed: Operation timed out

由于删除了所有防火墙规则,因此现在即使是 Quarkus 应用程序也无法访问数据库。 如果尝试从数据库检索 to-dos,请求将失败。 运行以下 cURL 请求:

Bash
curl https://$AZ_APP_URL/api/todos

添加新的防火墙规则

需要配置防火墙以仅允许访问 Quarkus 应用程序。 需要添加新的防火墙规则。 若要添加规则,请运行以下命令:

Azure CLI
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-addressend-ip-address 设置为 0.0.0.0 允许从所有 Azure 内部 IP 地址进行访问,但不允许从外部 IP 地址进行访问。 这种做法有助于保护数据库免受外部访问。

如果尝试通过运行以下命令从 CLI 访问数据库,则尝试应失败:

Azure 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 应用程序从数据库中检索 to-dos,则尝试成功:

Bash
curl https://$AZ_APP_URL/api/todos

此命令返回数据库中所有 to-do 项的列表。 可以从在 Azure 服务上运行的 Quarkus 应用程序访问 PostgreSQL 服务器,但不能从 Azure 外部访问它。


下一单元: 知识检查

上一篇 下一步