パスワード認証付き PostgreSQL UNIX ドメイン ソケット

パスワード認証付き PostgreSQL UNIX ドメイン ソケット

postgresqlは以下のいずれかをサポートしているようです

  1. パスワード認証でtcp(localhost:5432)を使用する
  2. Unixドメインscoket(つまり/var/run/postgresql/.s.PGSQL.5432)をピア/トラスト認証で使用する

Unix ドメイン ソケットでパスワードを設定することは可能ですか?

背景:

私は複数のアプリを実行するために php-fpm を使用しています。異なるアプリに異なるデータベースとパスワードを持たせたいのですが、それらは同じユーザー (www-data) として実行されます。したがって、ピア/信頼認証は適切ではありません。1 つのアプリが侵害された場合、他のアプリのデータも読み取ることができるためです。PrivateNetwork=yesアプリが外部リクエストを行えないことを確認するために php-fpm サービスを実行しているため、tcp 認証も使用できません。また、unix ドメイン ソケットは tcp よりもパフォーマンスが優れています。

答え1

  1. パスワード認証でtcp(localhost:5432)を使用する
  2. Unixドメインscoket(つまり/var/run/postgresql/.s.PGSQL.5432)をピア/トラスト認証で使用する

これは一般的なデフォルト構成ですが、固定された動作ではありません。

サーバー側ですpg_hba.conf接続の種類と送信元、およびターゲット データベースとユーザー名に応じて、どの認証方法が使用されるかを指定する構成ファイル。

多くの場合、最初のいくつかのルールには次の行があり、peerUnix ローカル ドメイン ソケットの認証をトリガーします。

# "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 でハッシュされている場合は、Postgres 10 以降で利用可能な、より新しい のscram-sha-256代わりに を使用します)。md5

多くの場合、postgres ユーザー向けの設定には、上記のより具体的なルールもあります。

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

そのままにしておくことも、状況に応じて変更することもできます。ルールは出現順に解釈されるため、より具体的なルールが上に表示されます。

答え2

私は php-fpm に詳しくありませんが、通常 Postgres では、接続文字列でホストを省略し、ユーザー名を指定すると、指定されたユーザーとして接続します。少なくとも、たとえば では、それが文書化された動作ですpsql

それで解決する

1 つのアプリが侵害された場合、他のアプリのデータも読み取ることができます。

たとえば、アプリごとに 1 つのスキーマを設定し、アプリごとに 1 人のユーザーを設定し、対応するスキーマへのユーザー アクセスのみを許可することができます。

php-fm では、ユーザーの選択が www-data 権限を持つユーザーによって影響されないようにする必要があります。

ただし、パスワードは提供されません。(ただし、スクリプトに保存されたパスワードは、いずれにしても安全ではありません...)

関連情報