将 PostgreSQL 与 Azure Active Directory 连接 - 服务器意外关闭了连接

Connect PostgreSQL with Azure Active Directory - server closed the connection unexpectedly

看了之前的问题,可以看出这是一个普遍的问题,但是没有看到专门针对我的问题。

在本地数据库管理员的顶部,我设置了 AAD 身份验证,但我只能使用在配置期间添加的本地数据库管理员连接到 postgres 数据库服务。

当我尝试使用任何工具(包括 powershell 测试脚本中的 psql)连接 AAD 时,出现以下错误:

server closed the connection unexpectedly
This probably means the server terminated
abnormally before or while processing the request.

尝试连接 AAD 帐户时,我遵循如下规则:

aad_acc_name@domain.com@servername

同样的错误也来自 PGAdmin,而我可以轻松连接到 postgresql 管理员。

我不知道在哪里可以找到问题,欢迎任何想法!

• 请检查为您的 PostgreSQL 数据库服务器分配的 Azure AD 管理员是否在数据库角色中具有 ‘azure_ad_admin’ 角色。此外,请检查 Azure AD 管理员是否已从服务器中删除,因为正如您所说,您无法使用 PGAdmin 帐户登录数据库,因此如果 Azure AD 管理员帐户已从服务器中删除,服务器将不再与 Azure 租户关联,因此您的服务器也可能无法进行 AAD 身份验证。

• 请检查您的 PostgreSQL 服务器是否正在侦听外部接口,即通信和可访问性是否未被任何防火墙或 NSG 或类似的东西阻止。另外,要通过 PostgreSQL DB Server 将此问题排除在外部通信之外,请转到 ‘postgresql.conf’ 文件并执行以下命令对其进行修改:-

 sudo vim /etc/postgresql/9.3/main/postgresql.conf

在该文件中添加以下行:-

 listen_addresses = '*'

然后通过以下命令重启 PostgreSQL 服务:-

 sudo /etc/init.d/postgresql restart

以上命令是针对 Linux (Ubuntu),对于 Windows 版本的本地 PostgreSQL 客户端,'postgresql.conf' 文件可以位于 'C:\Program Files\PostgreSQL\data'

• 另外,我建议您查看下面的社区帖子 link,了解有关解决问题的更多详细信息:-

由于您的 PostgreSQL 数据库服务器面临持久连接问题,很可能是由于不正确的服务器和客户端防火墙配置,用户输入服务器的后缀名称及其凭据时出错 以及其他一般问题。请查看下面的文档 link 以获取详细信息:-

https://docs.microsoft.com/en-us/azure/postgresql/howto-troubleshoot-common-connection-issues#troubleshoot-persistent-errors

所以问题是我必须为安全组或用户提供角色。如果安全组获得角色,使用PGAdmin登录时,需要使用组名登录,而不是组中的用户。

Reference from Microsoft

我们也收到了一些可以支持我们解决问题的代码:

az account get-access-token --resource-type oss-rdbms

export PGPASSWORD=az account get-access-token --resource-type oss-rdbms

psql -h aaduserpostresss.postgres.database.azure.com -U <GroupName>@<PGServerName> dbname=postgres

\du

user@xxx.onmicrosoft.com@<PGServerName>

CREATE ROLE "username@xxx.onmicrosoft.com" WITH LOGIN IN ROLE azure_ad_user;

Security groups
CREATE ROLE "readonly" WITH LOGIN IN ROLE azure_ad_user; !!CASE SENSITIVE for group names!!

GRANT SELECT ON ALL TABLES ON SCHEMA public TO "readonly";
GRANT ALL ON ALL TABLES IN SCHEMA public TO "writegroup";