Не суперпользователь не может подключиться, если сервер не запрашивает пароль при использовании dblink - PullRequest
13 голосов
/ 11 августа 2011

Я хочу сделать несколько ссылок на базы данных в моем приложении.Вкратце, у меня есть две базы данных, называемые meta и op.Я хочу сделать несколько запросов на выборку из мета-таблицы к таблице в базе данных, как показано ниже, но получаю ошибку ниже.Я пытался с паролем и без пароля.кстати caixa пользователь не суперпользователь и мой целевой сервер (op дБ сервер имеет режим аутентификации MD5.)

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

ОШИБКА: требуется пароль

ДЕТАЛИ: не-суперпользователь не может подключиться, если сервер не запрашивает пароль.

СОВЕТ: Необходимо изменить метод аутентификации целевого сервера.

Что СОВЕТ в приведенном вышесообщение об ошибке подсказывает?мне нужно изменить режим авторизации сервера?Без изменения режима авторизации сервера (MD5) я не могу выполнить вышеуказанный запрос?

Ответы [ 3 ]

13 голосов
/ 11 августа 2011

Из документации :

Только суперпользователи могут использовать 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');

EDIT:

Извините за слегка вводящий в заблуждение ответ. Конечно, вам не нужно dblink_connect_u для аутентификации md5 подключение. Я вижу одну возможность. PostgreSQL имеет два разных типа подключения: хост и локальный .

Продолжительность:

psql -h localhost ..

включает соединение с хостом, но

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

использует тип local , поэтому, если у вас есть метод без пароля для локального соединения (например, метод идентификатора или доверие), он возвращает

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.

Я также проверил привилегию CONNECT на vchitta_op БД, но сообщение об ошибке другое:

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.
3 голосов
/ 12 мая 2015

Есть обходной путь, который помог мне.Номера для суперпользователей могут выполнять функции с привилегиями суперпользователя, если установлена ​​опция «SECURITY DEFINER».(http://www.postgresql.org/docs/9.1/static/sql-createfunction.html)

Это означает, что вы можете создать функцию (с владельцем суперпользователя и опцией SECURITY DEFINER), которая будет выполнять манипуляции между базами данных (используя dblink () без пароля)и выполнить его под суперпользователем

1 голос
/ 11 июля 2013

У меня похожая, но другая проблема.У меня есть два сервера с одинаковыми 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.

СЕЙЧАС я изменяюМой pg_hba.conf на 9.2.4, как показано ниже

    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, но могне найти никаких деталей.

примечание: изменение метода аутентификации с доверия на md5 на 9.2.3 не имеет никакого значения и все еще работает.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...