连接到 PostgreSQL

已完成

与 Azure Database for PostgreSQL 建立安全连接需要了解连接字符串组件、身份验证选项和传输层安全配置。 对于经常读取和写入数据的 AI 应用程序,从头开始获取连接配置可防止生产中的身份验证失败和安全漏洞。

连接基础知识

PostgreSQL 连接需要多个参数来标识服务器、数据库和用户凭据。 Azure Database for PostgreSQL 使用特定的终结点格式,并默认强制实施安全传输。

服务器终结点遵循模式 <server-name>.postgres.database.azure.com,即 <server-name> 创建服务器时指定的唯一名称。 使用公共访问时,完全限定域名(FQDN)会解析为服务器的公共 IP 地址;而在使用 VNet 集成时,则会解析为私有 IP 地址。

PostgreSQL 连接需要以下核心参数:主机(服务器 FQDN)、端口(5432(用于直接连接)或 PgBouncer 的 6432、数据库名称、用户名(用于 Entra 身份验证、使用 username@servername 格式)、密码(静态或 Entra 令牌)和 SSL 模式。 不同的客户端库和工具采用各种格式接受这些参数,包括连接字符串、关键字值对或单个参数。

身份验证方法

Azure Database for PostgreSQL 支持两种身份验证方法:Microsoft Entra 身份验证通过基于令牌的访问提供更强大的安全性,而 PostgreSQL 本机身份验证使用传统的用户名和密码凭据。

Microsoft Entra 身份验证使用 OAuth 2.0 令牌而不是密码。 此方法与 Azure 的标识平台集成并提供集中式标识管理、消除密码存储(令牌生存期较短)、支持 Azure 托管应用程序的托管标识,并在 Entra 登录日志中创建审核线索。 若要使用 Entra 身份验证,请在服务器上配置 Microsoft Entra 管理员(用户帐户、组或服务主体)。 配置后,Entra 标识通过从 https://ossrdbms-aad.database.windows.net 资源获取令牌进行连接。

连接过程如下所示:

  1. 应用程序从 Microsoft Entra ID 请求访问令牌。
  2. Entra 验证标识并返回令牌。
  3. 应用程序使用令牌作为密码连接到 PostgreSQL。
  4. PostgreSQL 针对配置的 Entra 管理员验证令牌。

在 Python 中,可以使用 azure-identity 库获取令牌:

from azure.identity import DefaultAzureCredential

credential = DefaultAzureCredential()
token = credential.get_token("https://ossrdbms-aad.database.windows.net/.default")
# Use token.token as the password in your connection string

该 DefaultAzureCredential 类按顺序自动尝试多种身份验证方法,包括托管标识(在 Azure 上运行时)、Azure CLI 凭据(用于本地开发)和其他选项。

PostgreSQL 本机身份验证将用户名和加密密码存储在数据库中。 当应用无法使用 Entra 身份认证(遗留应用)、需要授予 Entra 租户外的身份访问,或在开发环境中没有 Azure 连接时,此方法适用。 使用 PostgreSQL 身份验证时,将密码存储在 Azure Key Vault 而不是应用程序配置中,定期轮换密码,使用强随机生成的密码,并限制每个数据库用户的权限。 在创建服务器期间指定的管理员用户名和密码使用 PostgreSQL 身份验证。

TLS/SSL 配置

Azure Database for PostgreSQL 使用传输层安全性(TLS)加密所有连接。 服务器默认需要 TLS,并支持 TLS 1.2 和 1.3。 使用较旧 TLS 版本的连接被拒绝。

PostgreSQL 客户端使用 sslmode 参数来控制加密和证书验证。 可用模式包括:

  • 禁用: 无加密。 Azure 拒绝使用此模式的连接。
  • 允许: 如果服务器需要它,但不验证证书,则加密。
  • prefer:如果服务器支持则加密,但不验证证书。
  • 需要: 强制加密,但不验证证书。
  • verify-ca: 强制加密并针对受信任的证书颁发机构验证服务器证书。
  • verify-full: 强制加密、验证 CA,并确认证书主机名与服务器匹配。

对于生产应用程序,用于 verify-full 确保连接到真正的 Azure PostgreSQL 服务器。 此模式验证服务器是否提供由受信任的证书颁发机构签名的证书,并且证书的公用名或使用者可选名称是否与服务器主机名匹配。

这些 verify-ca 和 verify-full 模式要求客户端有权访问对服务器证书进行签名的根 CA 证书。 大多数操作系统和 Azure 托管环境已包含 Azure Database for PostgreSQL 使用的 DigiCert 和 Microsoft 根证书颁发机构。 如果证书验证失败,可能需要从 Microsoft 的 PKI 存储库下载根证书,并将客户端配置为使用它们。

使用 PgBouncer 建立连接池

Azure Database for PostgreSQL 包括内置的 PgBouncer,可以通过 Azure 门户中的服务器配置设置或使用 Azure CLI 启用。 启用后,在端口 6432 而不是 5432 上进行连接。

重要

PgBouncer 仅适用于常规用途和内存优化计算层。 如果服务器使用可突发层,无法启用内置 PgBouncer。

PgBouncer 维护到数据库服务器的连接池,并将客户端连接复用到该池中。 这减少了连接建立的开销,这对于生成许多短期连接的应用程序非常有用。

使用 Azure CLI 启用 PgBouncer:

az postgres flexible-server parameter set \
    --resource-group myResourceGroup \
    --server-name myserver \
    --name pgbouncer.enabled \
    --value true

启用后,更新连接字符串以使用端口 6432:

postgresql://user@myserver.postgres.database.azure.com:6432/mydb?sslmode=require

“优化性能、索引和缩放”模块中介绍了连接池优化策略,包括池大小调整和事务与会话模式。

网络访问注意事项

Azure Database for PostgreSQL 支持两种网络模型:使用防火墙规则进行公共访问,以及使用 VNet 集成的专用访问。 平台或运营团队通常会配置这些设置,但了解这些设置有助于排查连接问题。

通过 公共访问,服务器具有公共 IP 地址和防火墙规则来控制哪些客户端 IP 可以连接。 如果无法从开发计算机进行连接,请验证防火墙规则中是否允许 IP 地址。

通过 专用访问,服务器在 Azure 虚拟网络中只有专用 IP 地址。 只能从同一虚拟网络、对等网络或通过 VPN/ExpressRoute 的资源连接。 专用访问在需要网络隔离的生产环境中很常见。

连接字符串示例

以下示例显示了 Azure Database for PostgreSQL 的常见连接字符串模式。

# Basic connection with SSL required
postgresql://myuser:mypassword@myserver.postgres.database.azure.com/mydb?sslmode=require

# Connection with certificate verification
postgresql://myuser:mypassword@myserver.postgres.database.azure.com/mydb?sslmode=verify-full&sslrootcert=/etc/ssl/certs/ca-certificates.crt

# Connection through PgBouncer (note port 6432)
postgresql://myuser:mypassword@myserver.postgres.database.azure.com:6432/mydb?sslmode=require

其他资源