练习 - 限制对Azure服务的公共数据库访问
在本单元中,将允许来自所有公共 IPv4 地址的连接尝试的 PostgreSQL 防火墙规则替换为 Azure 服务例外。 数据库保留其公共端点。 此异常允许Azure服务和资源(包括此 Quarkus 应用程序)尝试经过身份验证的连接;它不会限制对此应用程序或容器应用环境的访问。
在 Windows 上继续在同一个本地 Bash shell 或 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 地址创建了一条防火墙规则。
注意
这些防火墙命令使用 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服务异常之前,请删除此规则。
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 服务例外
添加 Azure 服务例外,以便已部署的应用程序可以重新连接到数据库:
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 服务例外可以允许其连接。 来自具有有效凭据的 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 仍然是公开的;这些检查并不能确保仅限应用程序的数据库隔离。