サーバが稼動中、悪意のあるユーザが通常のデータベースサーバに取って代わることはできません。
しかし、サーバが停止している時、ローカルユーザに対し、独自のサーバを起動させることで正常なサーバになりすますことは可能です。
なりすましたサーバで、クライアントから送信されたパスワードを読み取ることも問い合わせを読み取ることも可能です。
しかし、PGDATA
ディレクトリの安全性はディレクトリの権限により維持されていますので、データを返すことはできません。
誰もがデータベースサーバを起動させることができるため、なりすましは可能です。
特殊な設定がなされていなければ、クライアントは無効なサーバであることを識別できません。
local
接続に対してなりすましを防ぐ、ひとつの方法は、信頼できるローカルユーザのみに書き込み権限を付与したUnixドメインソケットディレクトリ(unix_socket_directories)を使用することです。
これにより、悪意のあるユーザがそのディレクトリに独自のソケットを作成することを防ぐことができます。
一部のアプリケーションがソケットファイルのために/tmp
を参照し、なりすましに対して脆弱であるかもしれないと気にするならば、オペレーティングシステムの起動時に、再割り当てされたソケットファイルを指し示す/tmp/.s.PGSQL.5432
というシンボリックリンクを作成してください。
また、このシンボリックリンクが削除されることを防ぐために、/tmp
を整理するスクリプトを変更する必要があるかもしれません。
local
接続についての別の選択肢は、クライアントがrequirepeer
を使用して、ソケットに接続しているサーバプロセスの必要な所有者を指定することです。
TCP接続のなりすましを防ぐためには、SSL証明書を使用してクライアントにサーバの証明書を確実に検査させるか、GSSAPI暗号化を使用します。 (あるいはそれらが別々の接続上にあるなら、その両方を使います。)
SSLでなりすましを防ぐためには、サーバはhostssl
接続(21.1)のみを受け付け、SSLキーと証明書ファイル(19.9)を持つ必要があります。
TCPクライアントはsslmode=verify-ca
もしくはverify-full
を使用して接続し、また、適切なルート証明書ファイルをインストールしなければなりません(34.19.1)。
GSSAPIでなりすましを防ぐためには、サーバはhostgssenc
接続(21.1)のみを受け付け、gss
認証をその接続で使います。
TCPクライアントはgssencmode=require
を使用して接続しなければなりません。