簡體   English   中英

如果服務器在使用 dblink 時不請求密碼,則非超級用戶無法連接

[英]Non-superuser cannot connect if the server does not request a password while using dblink

我想在我的應用程序中做一些跨數據庫引用。 簡而言之,我有兩個名為 meta 和 op 的數據庫。 我想從 meta 到 op 數據庫中的表進行一些選擇查詢,如下所示,但出現以下錯誤。 我嘗試使用密碼和不使用密碼。 順便說一句, caixa用戶是非超級用戶,我的目標服務器( op db 服務器具有 MD5 身份驗證模式。)

meta=> select * from dblink('dbname=op password=caixa','SELECT op_col from op_table') AS t(op_col varchar);

錯誤:需要密碼

詳細信息:如果服務器不請求密碼,則非超級用戶無法連接。

提示:必須更改目標服務器的身份驗證方法。

上述錯誤消息中的 HINT 暗示了什么? 我需要更改服務器的身份驗證模式嗎? 在不更改服務器的身份驗證模式 (MD5) 的情況下,我不能運行上述查詢嗎?

文檔

只有超級用戶可以使用 dblink_connect 創建非密碼認證的連接。 如果非超級用戶需要此功能,請改用dblink_connect_u

dblink_connect_u() 與 dblink_connect() 相同,只是它允許非超級用戶使用任何身份驗證方法進行連接。

這意味着您的dblink調用正在隱式使用dblink_connect 請改用dblink_connect_u或將您的身份驗證方法更改為例如 md5。

請注意,您還需要向caixa角色授予執行權限,例如:

GRANT EXECUTE ON FUNCTION dblink_connect_u(text) TO caixa;
GRANT EXECUTE ON FUNCTION dblink_connect_u(text, text) TO caixa;

工作示例(在GRANT之后):

meta=> SELECT dblink_connect_u('conn1', 'dbname=op');
meta=> SELECT * FROM dblink('conn1','SELECT op_col from op_table')
            AS t(op_col varchar);
 op_col 
--------
 aaa
 bbb
 ccc
(3 rows)
meta=> SELECT dblink_disconnect('conn1');

編輯:

抱歉,回答有點誤導。 當然,md5 認證連接不需要dblink_connect_u 我看到了一種可能性。 PostgreSQL 有兩種不同的連接類型:主機本地

跑步:

psql -h localhost..

包含主機連接,但

dblink_connect('mycon','dbname=vchitta_op user=caixa password=caixa');

使用本地類型,因此如果您有本地連接的非密碼方法(例如 ident 方法或 trust),則返回

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.

查看

dblink_connect('mycon','hostaddr=127.0.0.1 dbname=vchitta_op user=caixa password=caixa')

用於主機連接。 為了清楚起見,請發布您的pg_hba.conf

我還檢查了vchitta_op DB 上的CONNECT權限,但錯誤消息不同:

REVOKE CONNECT ON DATABASE vchitta_op FROM PUBLIC;
REVOKE CONNECT ON DATABASE vchitta_op FROM caixa;

SELECT dblink_connect('mycon','dbname=vchitta_op user=caixa password=caixa');
ERROR:  could not establish connection
DETAIL:  FATAL:  permission denied for database "vchitta_op"
DETAIL:  User does not have CONNECT privilege.

有一種解決方法對我有用。 如果設置了“SECURITY DEFINER”選項,非超級用戶可以使用超級用戶的權限執行功能。 http://www.postgresql.org/docs/9.1/static/sql-createfunction.html

這意味着您可以創建一個 function(具有超級用戶所有者和 SECURITY DEFINER 選項)進行跨數據庫操作(使用dblink()沒有密碼)並在非超級用戶下執行它

我有一個類似但不同的問題。 我有兩台具有相同 postgres.conf 和 pg_hba.conf 的服務器。 但是,一個在 9.2.3 版本上,一個在 9.2.4 上

9.2.3

pg_hba.conf 有

    local   all     dblinkuser      trust

然后我使用任何普通用戶連接到數據庫

    theater_map=# select dblink_connect('dbname=TheaterDB user=dblinkuser password=dbl123');
    dblink_connect 
    ----------------
    OK
    (1 row)

連接成功。

9.2.4

我的 pg_hba.conf 具有與上面相同的條目

    theater_map=> select dblink_connect('dbname=TheaterDB user=dblinkuser password=dbl123');
    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.

現在我在 9.2.4 上更改我的 pg_hba.conf 如下

    local   all     dblinkuser      md5

並重新啟動 postgres

    theater_map=> select dblink_connect('dbname=TheaterDB user=dblinkuser password=dbl123');
    dblink_connect 
    ----------------
   OK
   (1 row)

我檢查了版本 9.2.3 和 9.2.4 之間的更改日志,但找不到任何詳細信息。

注意:在 9.2.3 上將身份驗證方法從 trust 更改為 md5 沒有任何區別,並且仍然有效。

盡管我使用 fdw 擴展而不是 db_link,但我發現這個問題在谷歌上搜索相同的錯誤消息。 以下步驟有助於解決我的問題:

  • 查找用戶沒有密碼並將其設置為打開 - alter user myuser with password 'mypassword'
  • 查找身份驗證方法是trust並將其設置為md5 - vim /var/lib/postgresql/data_/pg_hba.conf
  • 重新加載pg_hba.conf - SELECT pg_reload_conf(); 從 psql (注銷並登錄以驗證密碼是必需的)
  • (可選擇嘗試從遠程機器、數據庫瀏覽器等訪問)
  • 設置外部服務器及其用戶映射 - CREATE USER MAPPING FOR CURRENT_USER SERVER myserver OPTIONS (user 'myuser', password 'mypassword');

PostgreSQL 11.10

SELECT ext.column1 from
dblink('hostaddr=192.192.192.192 dbname=yourDbname user=yourUsername password=yourpass',
'select a."column1" from "Table1" a where a."column2"=2')
as ext(column1 text)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM