Не суперпользователь не может подключиться, если сервер не запрашивает пароль при использовании dblink

Я хочу сделать несколько ссылок на базы данных в моем приложении. Вкратце, у меня есть две базы данных, называемые мета и op. Я хочу сделать запрос select из мета в таблицу в базе данных 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), я не могу запустить указанный выше запрос?

Ответ 1

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

Только суперпользователи могут использовать dblink_connect для создания соединения, не прошедшие проверку пароля. Если не-суперпользователи нуждаются в этом, используйте dblink_connect_u.

и

dblink_connect_u() идентичен dblink_connect(), за исключением того, что он позволит не-суперпользователям подключаться с использованием любого метода проверки подлинности.

Это означает, что ваш вызов dblink использует dblink_connect неявно. Используйте dblink_connect_u или измените свой метод auth, например. 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');

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

ERROR:  password is required
DETAIL:  Non-superuser cannot connect if the server does not request a password.
HINT:  Target server 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 DB, но сообщение об ошибке отличается:

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.

Ответ 2

Там был обход, который помогло. Не суперпользователи могут выполнять функции с привилегиями суперпользователя, если установлена ​​опция "ЗАЩИТА БЕЗОПАСНОСТИ". (http://www.postgresql.org/docs/9.1/static/sql-createfunction.html)

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

Ответ 3

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

my 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 authentication method must be changed.

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

note: изменение метода auth от trust to md5 на 9.2.3 не имеет никакого значения и все еще работает.

Ответ 4

Я обнаружил, что этот вопрос гуглится для того же сообщения об ошибке, хотя я использую расширение 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');