Azure Cosmos DB for PostgreSQL 中的公共访问
适用对象:PostgreSQL 的 Azure Cosmos DB (由 PostgreSQL 的 Citus 数据库扩展提供支持)
Azure Cosmos DB for PostgreSQL 支持三种网络选项:
- 无访问权限
- 这是新创建的群集的默认选项(如果未启用公共或专用访问权限)。 任何计算机(无论位于 Azure 内部或外部)都无法连接到数据库节点。
- 公共访问权限
- 将公共 IP 地址分配给协调器节点。
- 访问协调器节点受防火墙的保护。
- 可以选择启用访问所有工作器节点。 在这种情况下,会将公共 IP 地址分配给工作器节点,并使用同一防火墙保护该节点。
- 专用访问权限
- 仅将专用 IP 地址分配给群集的节点。
- 每个节点都需要一个专用终结点,以允许所选虚拟网络中的主机访问节点。
- Azure 虚拟网络的安全功能(如网络安全组)可用于访问控制。
在创建群集时,可以启用公共或专用访问,或选择默认的“无访问权限”。 创建群集后,可以选择在公共或专用访问之间进行切换,或将二者同时激活。
此页介绍公共访问选项。 有关专用访问,请参阅 Azure Cosmos DB for PostgreSQL 中的专用访问。
防火墙概述
Azure Cosmos DB for PostgreSQL 服务器防火墙会阻止对协调器节点的所有访问,除非你指定哪些计算机有权访问。 防火墙基于每个请求的起始 IP 地址授予对服务器的访问权限。 要配置防火墙,请创建防火墙规则,以指定可接受的 IP 地址的范围。 可以在服务器级别创建防火墙规则。
防火墙规则:借助这些规则,客户端可以访问协调器节点,即同一逻辑服务器内的所有数据库。 服务器级别防火墙规则可以使用 Azure 门户进行配置。 若要创建服务器级防火墙规则,用户必须是订阅所有者或订阅参与者。
默认情况下,防火墙会阻止所有对协调器节点的数据库访问。 若要从另一台计算机开始使用服务器,需要指定一个或多个服务器级防火墙规则以允许访问服务器。 使用防火墙规则指定要允许的来自 Internet 的 IP 地址范围。 对 Azure 门户网站本身的访问不受防火墙规则影响。 来自 Internet 和 Azure 的连接尝试必须首先通过防火墙,然后才能访问 PostgreSQL 数据库,如下图所示:
从 Internet 和 Azure 进行连接
群集防火墙控制谁可以连接到组的协调器节点。 防火墙通过咨询可配置的规则列表来确定访问权限。 每个规则都是允许进入访问的 IP 地址或地址范围。
当防火墙阻止连接时,可能会导致应用程序错误。 例如,使用 PostgreSQL JDBC 驱动程序会引发如下错误:
java.util.concurrent.ExecutionException: java.lang.RuntimeException: org.postgresql.util.PSQLException: FATAL: no pg\_hba.conf entry for host "123.45.67.890", user "citus", database "citus", SSL
若要了解规则是如何定义的,请参阅创建和管理防火墙规则。
排查数据库服务器防火墙问题
如果访问 Azure Cosmos DB for PostgreSQL 服务时的行为不符合预期,请考虑以下几点:
对允许列表的更改尚未生效:对 Azure Cosmos DB for PostgreSQL 防火墙配置所做的更改可能需要经历长达 5 分钟的延迟才会生效。
用户未获得授权或使用的密码不正确:如果用户对服务器没有权限,或使用的密码不正确,则与服务器的连接会被拒绝。 创建防火墙设置只是为客户端提供尝试连接到服务器的机会。 每个客户端必须提供必需的安全凭据。
例如,使用 JDBC 客户端可能会出现以下错误。
java.util.concurrent.ExecutionException: java.lang.RuntimeException: org.postgresql.util.PSQLException: FATAL: password authentication failed for user "yourusername"
动态 IP 地址:如果 Internet 连接使用动态 IP 寻址,在通过防火墙时遇到问题,则可以尝试以下解决方案之一:
向 Internet 服务提供商 (ISP) 询问分配给访问协调器节点的客户端计算机的 IP 地址范围,然后将此 IP 地址范围添加为防火墙规则。
改为获取客户端计算机的静态 IP 地址,然后将该静态 IP 地址作为防火墙规则添加。
后续步骤
有关如何创建服务器级和数据库级防火墙规则的文章,请参阅: