SSLを要求し、SELinuxをオンにし、ログを監視し、現在のPostgreSQLバージョンを使用します。
サーバ側
SSLが必要
postgresql.conf
セットssl=on
し、(ドキュメントとのコメントを参照してくださいあなたのキーファイルとcertfileには適切にインストールされていることを確認してくださいpostgresql.conf
)。
クライアントで特別な設定をせずに、クライアントに証明書を信頼してもらいたい場合は、CAから証明書を購入する必要があります。
pg_hba.conf
ような使用何か:
hostssl theuser thedatabase 1.2.3.4/32 md5
...おそらくユーザーおよび/またはデータベースの「すべて」を使用し、おそらくより広いソースIPアドレスフィルターを使用します。
ログインできるユーザーを制限し、リモートスーパーユーザーのログインを拒否する
可能であれば、ユーザーに「すべて」を許可しないでください。スーパーユーザーのログインの必要性を避けることができれば、リモートでのログインを許可したくありません。
ユーザーの権利を制限する
ログインできるユーザーの権利を制限します。ユーザーCREATEDB
またはCREATEUSER
権利を与えないでください。
REVOKE
すべてのデータベースのCONNECT
権限を取得してからPUBLIC
、そのデータベースにアクセスできるはずのユーザー/ロールのみに戻します。(ユーザーをロールにグループ化し、個々のユーザーに直接ではなく、ロールに権限を付与します)。
リモートアクセスを持つユーザーは、必要なDBにのみ接続でき、実際に必要なスキーマ、テーブル、および列に対する権限のみを持つようにしてください。これはローカルユーザーにとっても良い習慣であり、賢明なセキュリティです。
クライアントのセットアップ
PgJDBCで、パラメーターを渡しますssl=true
。
JDBCドライバーにSSL接続を試行して確立するよう指示するには、接続URLパラメーターssl = trueを追加する必要があります。
...サーバー証明書をクライアントのトラストストアにインストールするか、ユーザーに証明書をインストールさせたくない場合は、Javaの組み込みトラストストアにあるCAのいずれかによって信頼されているサーバー証明書を使用します。
進行中のアクション
今、あなたが最新のPostgreSQLを維持することを確認してください。PostgreSQLには事前認証セキュリティホールが2つしかありませんでしたが、それはゼロ以上であるため、最新の状態を維持してください。とにかく、バグ修正は素晴らしいものです。
アクセスする必要がないことがわかっている大きなネットブロック/リージョンがある場合は、前にファイアウォールを追加します。
接続と切断をログに記録します(を参照postgresql.conf
)。実用的な場合はクエリをログに記録します。実用的な場合は、侵入検知システムまたはfail2banなどを前に実行します。postgresを使用したfail2banについては、ここに便利な方法があります
ログファイルを監視します。
ボーナスパラノイア
考慮すべき追加手順...
クライアント証明書が必要
必要に応じpg_hba.conf
て、サーバーが信頼するX.509クライアント証明書の提示をクライアントに要求するために使用することもできます。サーバー証明書と同じCAを使用する必要はありません。homebrewopenssl CAでこれを行うことができます。JDBCユーザーは、クライアント証明書をJavaキーストアにインポートする必要がkeytool
あり、場合によってはJavaをキーストアでポイントするようにいくつかのJSSEシステムプロパティを構成する必要があるため、完全に透過的ではありません。
インスタンスを隔離する
本当に妄想的になりたい場合は、別のコンテナ/ VMで、または少なくとも別のユーザーアカウントで、必要なデータベースだけで、クライアントのインスタンスを実行します。
そうすれば、PostgreSQLインスタンスが危険にさらされても、それ以上進むことはありません。
SELinuxを使用する
私はこれを言う必要はありませんが、...
RHEL 6または7などのSELinuxをサポートするマシンを実行します。SELinuxをオフにしたり、permissiveモードに設定したりしないでください。強制モードのままにします。
デフォルト以外のポートを使用する
あいまいさだけによるセキュリティは愚かです。賢明なことをやったら、少しあいまいなセキュリティを使用しても、おそらく問題はありません。
デフォルト以外のポートでPgを実行して、自動化された攻撃者の生活を少し難しくします。
前にプロキシを配置する
PostgreSQLの前でPgBouncerまたはPgPool-IIを実行して、接続プールおよびプロキシとして動作させることもできます。そうすれば、実際のデータベースホストではなく、プロキシにSSLを処理させることができます。プロキシは、別のVMまたはマシン上に配置できます。
通常、接続プーリングプロキシの使用は、クライアントアプリケーションに既にプールが組み込まれていない限り、PostgreSQLでは一般的に良いアイデアです。ほとんどのJavaアプリケーションサーバー、Railsなどには、組み込みのプーリングがあります。それでも、サーバー側のプーリングプロキシは最悪の場合無害です。