用户 <user-name> 密码身份验证失败

本文可帮助你解决连接到 Azure Database for PostgreSQL - 灵活服务器时可能出现的问题。

现象

尝试连接到 Azure Database for PostgreSQL - 灵活服务器时,可能会遇到以下错误消息:

psql: error: connection to server at "<server-name>.postgres.database.chinacloudapi.cn" (x.x.x.x), port 5432 failed: FATAL: password authentication failed for user "<user-name>"

此错误表示为用户 <user-name> 提供的密码不正确。

在初始密码身份验证错误之后,你可能会看到另一条错误消息,指出客户端正在尝试重新连接到服务器,这次没有 SSL 加密。 此处的失败是由于服务器的 pg_hba.conf 配置不允许未加密的连接。

connection to server at "<server-name>.postgres.database.chinacloudapi.cn" (x.x.x.x), port 5432 failed: FATAL: no pg_hba.conf entry for host "y.y.y.y", user "<user-name>", database "postgres", no encryption

使用支持 SSL 的 libpq 客户端(如 psqlpg_dumppgbench 工具)时,尝试使用 SSL 连接一次,然后不使用 SSL 连接一次是标准的行为。 此方法的原因是服务器可能对 SSL 和非 SSL 连接有不同的 pg_hba 规则。 在此方案中收到的合并错误消息类似于下例:

psql: error: connection to server at "<server-name>.postgres.database.chinacloudapi.cn" (x.x.x.x), port 5432 failed: FATAL: password authentication failed for user "<user-name>" connection to server at "<server-name>.postgres.database.chinacloudapi.cn" (x.x.x.x), port 5432 failed: FATAL: no pg_hba.conf entry for host "y.y.y.y", user "<user-name>", database "postgres", no encryption

若要避免这种双重尝试并指定所需的 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 - 灵活服务器,请按照以下步骤解决此问题:

    1. 启用日志捕获 如果日志捕获尚未启用,请立即设置它。 日志捕获键,用于监视数据库活动并捕获任何奇怪的访问模式。 可通过多种方式实现此目的,包括使用 Azure Monitor Log Analytics,它可以帮助你存储和分析数据库事件日志。

    2. 标识攻击者的 IP 地址

      • 检查日志以查找执行未经授权的访问尝试的 IP 地址。 如果攻击者使用的是基于 libpq 的工具,则你会看到与失败的连接尝试关联的日志条目中的 IP 地址:

        connection to server at "<server-name>.postgres.database.chinacloudapi.cn" (x.x.x.x), port 5432 failed: FATAL: no pg_hba.conf entry for host "y.y.y.y", user "<user-name>", database "postgres", no encryption

        在此示例中,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 地址,为服务器日志中的每个事件提供有价值的上下文。

    3. 阻止攻击者的 IP 地址 挖掘日志,发现任何可疑的 IP 地址,这些 IP 地址会在未经授权的访问尝试中重复出现。 找到这些 IP 后,立即在防火墙设置中阻止它们。 这会切断其访问权限,并阻止任何其他未经授权的尝试。 此外,请检查你的防火墙规则,确保它们不会太宽松。 过于广泛的规则可能会使数据库面临潜在的攻击。 将访问权限局限于已知和必要的 IP 范围。

按照以下步骤操作后,应该能够解决身份验证问题,并成功连接到你的 Azure Database for PostgreSQL - 灵活服务器。 如果你遵循提供的指导后仍遇到问题,请毫不犹豫地提交支持工单