Сокет домена unix Postgresql с аутентификацией по паролю

Сокет домена unix Postgresql с аутентификацией по паролю

Похоже, postgresql поддерживает любой из следующих вариантов:

  1. Используйте TCP (например, localhost:5432) с аутентификацией по паролю
  2. Используйте Unix domain scoket (например, /var/run/postgresql/.s.PGSQL.5432 ) с аутентификацией peer/trust

Возможно ли иметь пароль с сокетом домена unix?

Фон:

Я использую php-fpm для запуска нескольких приложений. Я хочу, чтобы разные приложения имели разные базы данных и пароли, но они будут запускаться от одного и того же пользователя (www-data). Поэтому аутентификация peer/trust не подходит, так как если одно приложение скомпрометировано, оно может прочитать данные и другого приложения. Я не могу использовать tcp auth, так как я запускаю службу php-fpm, чтобы PrivateNetwork=yesубедиться, что приложения не могут делать внешние запросы. Кроме того, сокеты домена unix имеют лучшую производительность, чем tcp.

решение1

  1. Используйте TCP (например, localhost:5432) с аутентификацией по паролю
  2. Используйте Unix domain scoket (например, /var/run/postgresql/.s.PGSQL.5432 ) с аутентификацией peer/trust

Это типичная конфигурация по умолчанию, но не жестко заданное поведение.

Это серверная частьpg_hba.confфайл конфигурации, который указывает, какой метод аутентификации будет использоваться в зависимости от типа и источника соединения, а также целевой базы данных и имени пользователя.

Часто в первых нескольких правилах есть эта строка, которая запускает аутентификацию peerдля локальных доменных сокетов Unix:

# "local" is for Unix domain socket connections only
local   all             all                                     peer

Чтобы запросить пароль, замените его на

# "local" is for Unix domain socket connections only
local   all             all                                     md5

(или более современный scram-sha-256вариант, md5если на сервере пароли хэшированы с помощью SCRAM, доступного с версии Postgres 10).

Часто в конфигурации выше есть еще более конкретное правило для пользователя postgres:

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

Вы можете оставить все как есть или изменить в зависимости от вашего случая. Правила интерпретируются в порядке появления, поэтому более конкретные правила идут сверху.

решение2

Я не знаком с php-fpm, но обычно в Postgres, если вы не указываете хост в строке подключения, но указываете имя пользователя, то он подключается как указанный пользователь. По крайней мере, это задокументированное поведение, например, в psql.

Так что это решает

если одно приложение скомпрометировано, оно может прочитать данные и другого приложения.

Например, вы можете настроить одну схему для каждого приложения, назначить одного пользователя для каждого приложения и разрешить пользователю доступ только к соответствующей схеме.

Вам необходимо убедиться в том, что в php-fm на выбор пользователя не может повлиять кто-либо с правами доступа www-data.

Однако он не выдает вам пароли. (Но пароли, хранящиеся в скриптах, в любом случае не безопаснее...)

Связанный контент