我在 Google SQL Cloud 中有一个带有多个数据库的 Postgres 服务器。我想在它们之间创建一个 FOREIGN DATA WRAPPER。如果我使用服务器的远程 IP 它可以工作:
CREATE SERVER "some_db_fdw" FOREIGN DATA WRAPPER postgres_fdw OPTIONS (host '34.94.1.23', dbname 'some_db');
CREATE USER MAPPING FOR some_user SERVER "some_db_fdw" OPTIONS (user 'some_user', password 'some_password');
IMPORT FOREIGN SCHEMA public LIMIT TO (my_table) FROM SERVER "some_db_fdw" INTO public;
...但如果我使用本地 IP(127.0.0.1)代替 34.94.1.23(仅限示例 IP),则会出现错误:
ERROR: password is required
DETAIL: Non-superuser cannot connect if the server does not request a password.
HINT: Target server’s authentication method must be changed.
为什么?我在用户映射中提供密码。实际上,如果我在此处省略密码,则错误将更改为:
ERROR: password is required
DETAIL: Non-superusers must provide a password in the user mapping.
所以它似乎知道它应该从用户映射中获取密码。
我不能只使用远程 IP 的原因是我们需要证书,所以如果我使用远程 IP 启用“仅允许 SSL 连接”失败,因为我在 psql 中没有证书(我在我连接的机器上有它们或者我根本无法连接,但由于此服务器位于 SQL Cloud 中,我没有任何文件系统访问权限,也无法为数据库本身提供连接到另一个数据库的证书 - 因此我尝试使用 127.0.0.1 来避免这个问题)。
问题是当你在本地连接时,PostgreSQL 不需要密码。因此,虽然用户映射可能定义了一个密码,但该密码不能被使用,因为它从未被要求过。如果它不要求输入密码但仍然可以连接,那可能意味着它依赖于进行连接的进程的身份来对其进行身份验证。由于进行连接的进程由运行 PostgreSQL(通常为“postgres”)的服务帐户所有,因此您正在利用您无权利用的身份。出于安全原因,必须禁止这样做。
由于您使用的是托管服务,因此您可以由主机来修复它。他们有几种方法可以解决这个问题。没有他们的合作,除了停止使用他们的服务之外,没有其他方法可以解决它。
SSL 证书通常会有主机名,而不是主机 IP 地址。您是否尝试使用主机名?可能是谷歌自动安装了他们自己的证书(或者你可以说服他们这样做)
基于jjanes 的答案——对于那些仍在您可以控制的环境中寻找答案的人,您需要
local
通过修改以下行来禁用对所有用户的信任pg_hba.conf
:至:
从那里开始,为您想要的本地用户和本地数据库和外部数据库的外部用户分别设置本地身份验证
md5
或任何其他密码身份验证机制。