PostgreSQL / psycopg2 аутентификация по паролю с использованием туннелирования S SH - PullRequest
0 голосов
/ 16 февраля 2020

Я пытаюсь подключиться к базе данных PostgreSQL через туннель s sh. Он настроен на прослушивание через порт 3333 и переадресацию на порт 5432 на компьютере с базой данных. Я могу подключиться с помощью команды psql с аутентификацией по паролю через туннель, но по какой-то причине, когда я пытаюсь подключиться с помощью psycopg2 через туннель, я получаю ошибку FATAL: password authentication failed for user database_user. Я пытался поставить кавычки вокруг имен пользователей и паролей, но безрезультатно.

Успешная команда psql:

psql -h localhost -p 3333 -U database_name database_user 
#This command brings up password prompt

Ошибка pscyopg2 Команда:

psycopg2.connect("dbname='database_name' user='database_user' host='localhost' password='database_password' port=3333")

Вывод:

Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "/home/database_user/.local/share/virtualenvs/project-QNhT-Vzg/lib/python3.7/site-packages/psycopg2/__init__.py", line 126, in connect
    conn = _connect(dsn, connection_factory=connection_factory, **kwasync)
psycopg2.OperationalError: FATAL:  password authentication failed for user "database_user"
FATAL:  password authentication failed for user "database_user"

Вот часть моего pg_hba.conf для справки:

# Database administrative login by Unix domain socket
local   all             postgres                                peer

# TYPE  DATABASE        USER            ADDRESS                 METHOD

# "local" is for Unix domain socket connections only
local   all             all                                     peer
# IPv4 local connections:
host    all             all             127.0.0.1/32            md5
# IPv6 local connections:
host    all             all             ::1/128                 md5
# Allow replication connections from localhost, by a user with the
# replication privilege.
local   replication     all                                     peer
host    replication     all             127.0.0.1/32            md5
host    replication     all             ::1/128                 md5

1 Ответ

1 голос
/ 17 февраля 2020

При отладке проблемы с подключением всегда стоит помнить, через какие уровни мы должны go пройти, прежде чем достигнуть сервиса. При подключении службы PostgreSQL будет как минимум три уровня:

  • Сеть: межсетевой экран, NAT, переадресация портов
  • PostgreSQL ACL
  • PostgreSQL login

Важно понимать, какой слой вызывает проблему, ошибка клиента PostgreSQL (в вашем сценарии заключена в psycopg2) поможет вам решить эту проблему, выдав ad-ho c сообщение об ошибке:

  • Обычно возникает проблема с сетью: Is the server running locally and accepting connections on Unix domain socket "/var/run/postgresql/.s.PGSQL.5432"?, что означает, что вам вообще не удалось подключить службу PostgreSQL, проблема зависит от службы;
  • Проблема ACL, как правило, вызывает типичную ошибку: No pg_hba.conf entry for host <hostname>, user <username>, database <database>, что означает, что вы подключили службу PostgreSQL, но соединение не считается действительным в ACL;
  • Проблема при входе в систему обычно вызывает возникшую ошибку. : password authentication failed for user "<user>", что означает, что вы подключили службу PostgreSQL, и соединение соответствует записи ACL, но аутентификация не удалась.

В более позднем сценарии важно знать, какие запись сработала, потому что она определяет режим аутентификации. В вашем случае это была запись md5 (поскольку в режиме peer пароль отсутствует, и ваш туннель S SH должен отображать локальный хост, чтобы вы видели как host вместо local для postgreSQL ракурс):

host    all             all             127.0.0.1/32            md5

Очевидно, ваш пароль не тот, который вы ожидаете. Чтобы решить эту проблему, убедитесь, что:

  • вы установили пароль для пользователя postgreSQL и проверили привилегии LOGIN (не для пользователя unix / S SH, существуют разные концепции);
  • вы используете тот же пароль в вашем psycopg2 соединении, тогда вы должны быть в состоянии соединиться;

Читая ваш комментарий, кажется, вы можете иметь ' цитату в вашем пароле как хорошо. Таким образом, ваш пароль в вашем соединении может быть:

psycopg2.connect("dbname='database_name' user='database_user' host='localhost' password="'database_password'" port=3333")

Или, если требуется кавычка, это может означать, что вы используете некоторые специальные символы, которые необходимо экранировать. Вы также можете попробовать более простой пароль для отладки, а затем использовать более надежный.

...