Я пытаюсь решить проблему, обнаруженную во время сканирования Nessus, когда учетная запись postgres по умолчанию не имеет аутентификации.
https://www.tenable.com/plugins/nessus/10483
Я пытался добавить аутентификацию md5 пользователю postgres, и я не уверен, что делаю не так. Я сгенерировал md5sum для пароля со следующим:
echo -n test | md5sum
Я скопировал этот хеш и применил его к следующей команде:
psql -c "alter user postgres password 'md5{hash here}';"
И я получил обратную связь "ALTER ROLE". Затем я попытался изменить свой файл pg_hba.conf, чтобы показать следующее. В этом примере «другой» - это пользователь, используемый нашим приложением, которое не может иметь аутентификацию или нарушает функциональность (нам пришлось бы переписать значительный объем кода, чтобы это разрешить).
local postgres postgres md5
local other other trust
host other other 0.0.0.0/0 trust
host postgres postgres 0.0.0.0/0 md5
host replication postgres 0.0.0.0/0 md5
host all all ::1/128 ident
Тогда как исходный файл выглядел так:
local all all trust
host all all 0.0.0.0/0 trust
host replication postgres 0.0.0.0/0 trust
host all all ::1/128 ident
С этими изменениями каждый раз, когда я пытаюсь ввести пароль для postgres, появляется следующая ошибка:
psql: server closed the connection unexpectedly
This probably means the server terminated abnormally
before or while processing the request.
А затем попытка подключиться к «другому» пользователю приводит к этой ошибке:
psql: could not connect to server: Connection refused
Is the server running locally and accepting
connections on Unix domain socket "/tmp/.s.PGSQL.9999"?
В файле postgresql.conf есть строка:
listen_addresses = *
Я что-то упускаю? Оба пользователя смогли подключиться до того, как я внес эти изменения с помощью метода «доверия».
Кроме того, был ли мой метод создания и ввода суммы md5 пароля правильным способом его настройки, чтобы вы могли подключиться, указав пароль, а не хеш, при подключении?
РЕДАКТИРОВАТЬ: Найдя и проверив файлы журнала, я обнаружил следующее:
>FATAL: password authentication failed for user "postgres"
>DETAIL: Connection matched pg_hba.conf line 83: "host all postgres 0.0.0.0/0 md5"
Это появляется несколько раз для одной и той же метки времени. Это было сразу после перезагрузки после внесения изменений в файл pg_hba.conf. Я еще даже не пытался войти в postgres. Что-то в фоновом режиме должно быть пытается подключиться. Мне нужен файл учетных данных где-нибудь для хранения хэша пароля или чего-то еще?
РЕДАКТИРОВАТЬ: Мне удалось заставить его запрашивать пароль только для учетной записи postgres, установив метод аутентификации в pg_hba.conf на 'пароль' вместо md5 и используя пароль в виде открытого текста при изменении пользователя, но теперь служба, похоже, периодически дает сбой . Я войду в одну учетную запись, выйду, попробую другую учетную запись, выйду, затем попробую другую, и вдруг он скажет:
psql: could not connect to server: No such file or directory
Is the server running locally and accepting
connections on Unix domain socket "/tmp/.s.PGSQL.9999"?
Кто-нибудь знает, что вызывает это?
Во-первых, схема хеширования пароля, используемая Postgres, немного сложнее, чем хэш пароля MD5: это хеш MD5 конкатенации пароля и имени пользователя (см. этот вопрос). Поэтому в вашем примере вы должны использовать:
ALTER ROLE postgres WITH PASSWORD 'md5633bc3c3d823be2a52d3dff94031e2c2';
где 633bc3c3d823be2a52d3dff94031e2c2
это хеш testpostgres
. Однако это эквивалентно:
ALTER ROLE postgres WITH ENCRYPTED PASSWORD 'test';
или без ENCRYPTED
ключевое слово, если password_encryption
параметр на (дефолт).
Ваша вторая проблема вызвана задачи обслуживания невозможность войти в Postgres. Вы должны разрешить пользователю postgres
для входа без пароля через сокет домена Unix:
local all postgres peer
Это совершенно безопасно, поскольку сокеты домена Unix идентифицируют вызывающего пользователя.