как получить postgres docker контейнер для инициализации с помощью scram-sha-256 при любом соединении? - PullRequest
2 голосов
/ 16 июня 2020

Я пытаюсь установить POSTGRES_USER & POSTGRES_PASSWORD с конфигурацией docker postgres, используя pg_hba.conf и postgresql.conf файлы:

docker run --name pg \
-e POSTGRES_USER=myUser \
-e POSTGRES_PASSWORD=myPassword \
-e POSTGRES_DB=myDb \
-v $PWD/pg_hba.conf:/etc/postgresql/pg_hba.conf \
-v $PWD/postgresql.conf:/etc/postgresql/postgresql.conf \
--network data-talk \
-d postgres \
-c config_file=/etc/postgresql/postgresql.conf \
-c hba_file=/etc/postgresql/pg_hba.conf
pg_hba.conf

# "local" is for Unix domain socket connections only
local   all             all                                     scram-sha-256
# IPv4 local connections:
host    all             all             127.0.0.1/32            scram-sha-256
host    all             all             172.19.0.0/16           scram-sha-256
# IPv6 local connections:
host    all             all             ::1/128                 scram-sha-256
# Allow replication connections from localhost, by a user with the
# replication privilege.
local   replication     all                                     scram-sha-256
host    replication     all             127.0.0.1/32            scram-sha-256
host    replication     all             ::1/128                 scram-sha-256
postgresql.conf

listen_addresses = '*'
password_encryption = 'scram-sha-256'       # md5 or scram-sha-256

Отсюда https://hub.docker.com/_/postgres

Примечание 1: Образ PostgreSQL устанавливает локальную аутентификацию trust поэтому вы можете заметить, что при подключении с localhost (внутри того же контейнера) пароль не требуется. Однако при подключении с другого хоста / контейнера потребуется пароль.

Я хочу запрашивать пароль для любого / каждого подключения, включая локальное. Заменив pg_hba.conf, я думал, что смогу выполнить этот запрос. Я использую 172.19.0.0/16, поскольку это su bnet для сети docker.

Когда я запускаю указанную выше команду docker, я проверяю журналы, чтобы найти это psql: error: could not connect to server: FATAL: password authentication failed for user “myUser”.

Есть идеи, как заставить это работать? Я также пробовал

docker run --name pg \
-e POSTGRES_PASSWORD=password \
-v $PWD/pg_hba.conf:/etc/postgresql/pg_hba.conf \
-v $PWD/postgresql.conf:/etc/postgresql/postgresql.conf \
--network data-talk \
-d postgres \
-c config_file=/etc/postgresql/postgresql.conf \
-c hba_file=/etc/postgresql/pg_hba.conf

, который работает до завершения, но при попытке войти локально возникают ошибки:

$ docker exec -it pg sh
psql -U postgres
Password for user postgres:
psql: error: could not connect to server: FATAL:  password authentication failed for user "postgres"

Ответы [ 2 ]

2 голосов
/ 17 июня 2020

Следуя здесь https://github.com/docker-library/postgres/blob/master/12/docker-entrypoint.sh#L202 Я предполагаю, что при первом запуске и настройке базы данных метод аутентификации будет md5, а когда это будет сделано, файл pg_hba.conf устанавливает его на scram-sha-256 что делает невозможным аутентификацию.

Установив POSTGRES_INITDB_ARGS и передав параметры, чтобы установить начальный метод аутентификации на scram-sha-256, пароль устанавливается с scram-sha-256 для инициализации базы данных и просто работает.

docker run --name pg \
-e POSTGRES_USER=myUser \
-e POSTGRES_PASSWORD=myPassword \
-e POSTGRES_DB=myDb \
-e POSTGRES_INITDB_ARGS="--auth-host=scram-sha-256 --auth-local=scram-sha-256" \
-v $PWD/pg_hba.conf:/etc/postgresql/pg_hba.conf \
-v $PWD/postgresql.conf:/etc/postgresql/postgresql.conf \
--network data-talk \
-d postgres \
-c config_file=/etc/postgresql/postgresql.conf \
-c hba_file=/etc/postgresql/pg_hba.conf

POSTGRES_INITDB_ARGS

Эту необязательную переменную среды можно использовать для отправки аргументов в postgres initdb. Значение представляет собой строку аргументов, разделенных пробелами, поскольку postgres initdb их ожидает. Это полезно для добавления таких функций, как контрольные суммы страницы данных: -e POSTGRES_INITDB_ARGS = "- контрольные суммы данных"

Ключ здесь initdb

0 голосов
/ 17 июня 2020

Чего не хватает, так это того, что изначально для пользователей не установлены пароли, поэтому вы заблокировали себя с помощью этого pg_hba.conf.

Вам нужно запустить сервер PostgreSQL и установить пароль для суперпользователь postgres. Если вы хотите жить в безопасности, вам также необходимо создать хотя бы одного пользователя без прав суперпользователя с паролем.

Самый простой способ сделать это, вероятно, - запустить PostgreSQL в однопользовательском режиме с опция --single (подробности см. в документации). Это имеет то преимущество, что pg_hba.conf игнорируется, и вы автоматически подключаетесь как суперпользователь bootstrap.

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