Postgresql

IMPORT FOREIGN SCHEMA 因 127.0.0.1 的密碼錯誤而失敗,但對於遠端 IP(同一伺服器的)卻沒有

  • January 18, 2022

我在 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”)的服務帳戶所有,因此您正在利用您無權利用的身份。出於安全原因,必須禁止這樣做。

由於您使用的是託管服務,因此您可以由主機來修復它。他們有幾種方法可以解決這個問題。沒有他們的合作,除了停止使用他們的服務之外,沒有其他方法可以解決它。

使用遠端 IP 的“僅允許 SSL 連接”失敗,因為我沒有證書

SSL 證書通常會有主機名,而不是主機 IP 地址。您是否嘗試使用主機名?可能是Google自動安裝了他們自己的證書(或者你可以說服他們這樣做)

引用自:https://dba.stackexchange.com/questions/288914