
postgresqlは以下のいずれかをサポートしているようです
- パスワード認証でtcp(localhost:5432)を使用する
- Unixドメインscoket(つまり/var/run/postgresql/.s.PGSQL.5432)をピア/トラスト認証で使用する
Unix ドメイン ソケットでパスワードを設定することは可能ですか?
背景:
私は複数のアプリを実行するために php-fpm を使用しています。異なるアプリに異なるデータベースとパスワードを持たせたいのですが、それらは同じユーザー (www-data) として実行されます。したがって、ピア/信頼認証は適切ではありません。1 つのアプリが侵害された場合、他のアプリのデータも読み取ることができるためです。PrivateNetwork=yes
アプリが外部リクエストを行えないことを確認するために php-fpm サービスを実行しているため、tcp 認証も使用できません。また、unix ドメイン ソケットは tcp よりもパフォーマンスが優れています。
答え1
- パスワード認証でtcp(localhost:5432)を使用する
- Unixドメインscoket(つまり/var/run/postgresql/.s.PGSQL.5432)をピア/トラスト認証で使用する
これは一般的なデフォルト構成ですが、固定された動作ではありません。
サーバー側です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 でハッシュされている場合は、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 権限を持つユーザーによって影響されないようにする必要があります。
ただし、パスワードは提供されません。(ただし、スクリプトに保存されたパスワードは、いずれにしても安全ではありません...)