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