用户
本文可帮助你解决连接到 Azure Database for PostgreSQL 灵活服务器时可能出现的问题。
现象
尝试连接到 Azure Database for PostgreSQL 灵活服务器时,可能会遇到以下错误消息:
psql: 错误: 连接到服务器 "<server-name>.postgres.database.chinacloudapi.cn" (x.x.x.x) 的端口 5432 失败:FATAL: 用户 "<user-name>" 的密码认证失败
此错误表示为用户 <user-name> 提供的密码不正确。
在初始密码身份验证错误之后,你可能会看到另一条错误消息,指出客户端正在尝试重新连接到服务器,这次没有 SSL 加密。 此处的失败是由于服务器的 pg_hba.conf 配置不允许未加密的连接。
连接到服务器 "<server-name>.postgres.database.chinacloudapi.cn" (x.x.x.x),端口 5432 失败:FATAL:主机 "y.y.y.y"、用户 "<user-name>"、数据库 "postgres" 没有对应的 pg_hba.conf 条目,没有加密。
使用支持 SSL 的 libpq 客户端(如 psql、pg_dump 或 pgbench 工具)时,尝试使用 SSL 连接一次,然后不使用 SSL 连接一次是标准的行为。 此方法的原因是服务器可能对 SSL 和非 SSL 连接有不同的 pg_hba 规则。
在此情境中收到的组合错误消息如下所示:
psql:错误:连接到“server-name.postgres.database.chinacloudapi.cn”(x.x.x.x)的服务器失败,端口5432:FATAL:用户“user-name”的密码认证失败;连接到“server-name.postgres.database.chinacloudapi.cn”(x.x.x.x)的服务器失败,端口5432:FATAL:主机“y.y.y.y”,用户“user-name”,数据库“postgres”的pg_hba.conf中没有条目,且没有加密
若要避免这种双重尝试并指定所需的 SSL 模式,请在客户端配置中使用 sslmode 连接选项。 例如,如果在 bash shell 中使用 libpq 变量,则可以使用以下命令设置 SSL 模式:
export PGSSLMODE=require
原因
连接到 Azure Database for PostgreSQL 灵活服务器时遇到的错误主要源于与密码身份验证相关的问题:
密码不正确 用户密码不正确时会出现用户
<user-name>的密码身份验证失败错误。 这可能是由于密码类型错误、连接设置中未更新最近的密码更改或其他类似问题导致的。在没有密码的情况下创建的用户或角色 此错误的另一个可能原因是在 PostgreSQL 中创建用户或角色,而未指定密码。 执行类似
CREATE USER <user-name>或CREATE ROLE <role-name>等命令而没有附带密码语句时,会导致用户或角色未设置密码。 在未设置密码的情况下尝试使用这些类型的用户或角色进行连接将导致身份验证失败,并出现密码身份验证失败错误。潜在的安全漏洞 如果身份验证失败是意外的,特别是如果记录了多次失败的尝试,则可能表示存在潜在的安全漏洞。 未经授权的访问尝试可能会触发此类错误。
决议
如果遇到“用户 <user-name> 的密码身份验证失败”错误,请按照这些步骤解决此问题。
尝试使用其他工具进行连接
如果错误来自应用程序,则请尝试使用其他工具(例如
psql或 pgAdmin)连接到数据库,使用相同的用户名和密码。 此步骤有助于确定问题是特定于客户端,还是更广泛的身份验证问题。 请留意可能影响连接的任何相关防火墙规则。 如需使用不同工具进行连接的说明,请参阅 Azure 门户中的“连接”边栏选项卡。更改密码
如果在尝试其他工具后仍遇到密码身份验证问题,请考虑更改用户的密码。 对于管理员用户,可以直接在 Azure 门户中更改密码,如本链接中所述。 对于其他用户或特定条件下的管理员用户,可以从命令行更改密码。 确保你以具有
CREATEROLE属性和角色上ADMIN选项的用户身份登录到数据库。 更改密码的命令为:ALTER USER <user-name> PASSWORD '<new-password>';为创建时没有密码的用户或角色设置密码
如果错误的原因是创建用户或角色时没有密码,请登录到 PostgreSQL 实例并设置角色的密码。 对于不使用
LOGIN特权创建的角色,请确保授予此权限并设置密码:ALTER ROLE <role-name> LOGIN; ALTER ROLE <role-name> PASSWORD '<new-password>';如果你怀疑存在潜在的安全漏洞
如果怀疑潜在的安全漏洞导致未经授权访问 Azure Database for PostgreSQL 灵活服务器,请按照以下步骤解决此问题:
启用日志捕获 如果日志捕获尚未启用,请立即设置它。 日志捕获键,用于监视数据库活动并捕获任何奇怪的访问模式。 有多种方法可以执行此操作,包括 Azure Monitor Log Analytics 和服务器日志,它们有助于存储和分析数据库事件日志。
- Log Analytics 在此处查看 Azure Monitor Log Analytics 的设置说明: 在 Azure Database for PostgreSQL 灵活服务器中配置和访问日志。
- 服务器日志,有关实际操作日志管理,请参阅配置捕获 PostgreSQL 服务器日志和主要版本升级日志。
标识攻击者的 IP 地址
检查日志以查找执行未经授权的访问尝试的 IP 地址。 如果攻击者使用的是基于
libpq的工具,则你会看到与失败的连接尝试关联的日志条目中的 IP 地址:连接到服务器 "<server-name>.postgres.database.chinacloudapi.cn" (x.x.x.x),端口 5432 失败:FATAL:主机 "y.y.y.y"、用户 "<user-name>"、数据库 "postgres" 没有对应的 pg_hba.conf 条目,没有加密。
在此示例中,
y.y.y.y是攻击者尝试连接时所用的 IP 地址。修改
log_line_prefix若要改进日志记录并更轻松地进行故障排除,应修改 PostgreSQL 配置中的log_line_prefix参数以包含远程主机的 IP 地址。 若要记录远程主机名或 IP 地址,请将%h转义代码添加到你的log_line_prefix。例如,可以将你的
log_line_prefix更改为以下格式,以进行全面的日志记录:log_line_prefix = '%t [%p]: [%l-1] db=%d,user=%u,app=%a,client=%h '此格式包括:
-
%t表示事件时间戳 -
%p表示进程 ID -
[%l-1]表示会话行号 -
%d表示数据库名称 -
%u表示用户名 -
%a表示应用程序名称 -
%h表示客户端 IP 地址
借助此日志行前缀,你可以跟踪与每个日志条目关联的时间、进程 ID、用户、应用程序和客户端 IP 地址,为服务器日志中的每个事件提供有价值的上下文。
-
阻止攻击者的 IP 地址 挖掘日志,发现任何可疑的 IP 地址,这些 IP 地址会在未经授权的访问尝试中重复出现。 找到这些 IP 后,立即在防火墙设置中阻止它们。 这会切断其访问权限,并阻止任何其他未经授权的尝试。 此外,请检查你的防火墙规则,确保它们不会太宽松。 过于广泛的规则可能会使数据库面临潜在的攻击。 将访问权限局限于已知和必要的 IP 范围。
按照以下步骤作,应能够解决身份验证问题,并成功连接到 Azure Database for PostgreSQL 灵活服务器。 如果遵循提供的指南后仍遇到问题,请尽管提交支持工单。