PostgreSQLデータベースを保護するための必須設定

pg_hba.confルール、SCRAM認証、TLS強制、リスナー制限、最小権限、監査ログでPostgreSQLを保護します。

PostgreSQLデータベースを保護するための必須設定

PostgreSQLのセキュリティは、誰が、どこから、どの認証方法で接続を許可するかという単純な質問から始まります。pg_hba.confが広すぎたり、サーバーが必要以上に多くのインターフェースでリッスンしている場合、データベースの攻撃対象領域は必要以上に大きくなります。

このガイドでは、最初に確認すべきPostgreSQLのセキュリティ設定について説明します:pg_hba.conf、SCRAMパスワード認証、TLS、ネットワークリスナー、ロール権限、ログです。

1. pg_hba.confによるクライアント認証の強化

ホストベース認証ファイル(pg_hba.conf)は、どのホストが接続できるか、どのPostgreSQLユーザーとして接続できるか、どのデータベースにアクセスできるか、そして最も重要なのは、その接続に必要な認証方法を指定します。

pg_hba.confの構造を理解する

pg_hba.confの各行は特定の形式に従います:

TYPE DATABASE USER ADDRESS METHOD [OPTIONS]

  • TYPE: 接続タイプ(例:localhosthostnosslhostssl)。
  • DATABASE: 対象データベース名。
  • USER: 対象データベースロール。
  • ADDRESS: クライアントIPアドレス範囲。
  • METHOD: 認証メカニズム(例:scram-sha-256md5rejecttrust)。

認証方法のベストプラクティス

本番環境ではtrustメソッドを決して使用しないでください。接続条件に一致する誰でもパスワードなしで接続できるようになります。推奨される最新の認証方法は以下の通りです:

推奨:scram-sha-256

SCRAM(Salted Challenge Response Authentication Mechanism)は、より強力なハッシュ化とリプレイ攻撃の防止により、md5のような古いパスワード方式に比べて大幅な改善を提供します。これはリモート接続のデフォルトの選択肢とすべきです。

# アプリケーションサブネットからのリモート接続にSCRAMを強制
host    appdb   app_user 10.20.30.0/24  scram-sha-256

パスワードを作成またはローテーションする前に、postgresql.confpassword_encryption = 'scram-sha-256'を設定してください。古いハッシュで保存された既存のパスワードは自動的に変換されません。SCRAMを有効にした後、パスワードをリセットしてください。

password_encryption = 'scram-sha-256'

別のネットワーク制御がすでにアクセスを制限していない限り、以下のような広範なルールは避けてください:

host    all     all     0.0.0.0/0       scram-sha-256

ローカル接続

サーバー自体からの接続(例:同じマシンで動作するアプリケーション)には、ローカルソケットを使用します。最も安全な設定は、多くの場合peer(Unixドメインソケットの場合)または、ソケットが無効化または制限されている場合はscram-sha-256です。

# Unixソケット経由のローカル接続にピア認証を使用
local   all     all             peer

接続を明示的に拒否する

rejectメソッドを使用して、危険または信頼できないネットワークからの接続を明示的にブロックします。

# 既知の安全でないIP範囲からのすべての接続をブロック
host    all     all     192.168.1.0/24  reject

実践的なヒント: pg_hba.confを変更した後、変更を有効にするためにPostgreSQLをリロードします。例:sudo systemctl reload postgresqlまたはSELECT pg_reload_conf();

2. SSL/TLS暗号化の実装

ネットワーク経由で機密データ(パスワードを含む)が傍受されるのを防ぐために、すべてのリモート接続にSSL/TLS暗号化を強制することは必須です。

postgresql.confでの設定

プライマリ設定ファイルで以下のパラメータが正しく設定されていることを確認してください:

  • ssl = on:グローバルにSSLサポートを有効にします。
  • ssl_cert_file:サーバー証明書ファイルへのパス(例:server.crt)。
  • ssl_key_file:サーバー秘密鍵ファイルへのパス(例:server.key)。

pg_hba.confでのSSLの強制

クライアントにSSLの使用を強制するには、pg_hba.confの接続タイプをhostからhostsslに変更します:

# SSL/TLS経由の接続のみを許可
hostssl all     all     0.0.0.0/0       scram-sha-256

hostsslはSSL接続のみに一致します。同じユーザーがTLSなしで接続できる後続または先行のhostルールがないことを確認してください。ポリシーを明確にするために、非SSL接続の拒否ルールを追加します:

hostnossl all    all     0.0.0.0/0       reject

3. 攻撃対象領域の最小化

セキュリティには、データベースサーバーの外部脅威への露出を減らすことが含まれます。これは主にネットワーク設定と不要な機能の無効化を通じて管理されます。

ネットワークリッスンアドレスの制限

PostgreSQLは一般的にlocalhostでリッスンするようにデフォルト設定されていますが、パッケージ化されたデプロイメントや管理イメージは異なる場合があります。アクセスが必要な特定のインターフェースのみでリッスンするように明示的に設定するか、ローカルアプリケーションのみが接続する場合はlocalhostのままにします。

postgresql.confで:

# 可能であればlocalhost(127.0.0.1)のみでリッスン
listen_addresses = 'localhost'

# または、特定のプライベートネットワークインターフェースのみでリッスン
# listen_addresses = '192.168.1.10'

セキュリティ警告: listen_addresses*に設定されている場合、すべてのインターフェースが使用されます。pg_hba.confが接続可能なIP範囲を厳密に制御していることを確認してください。

不要な拡張機能と機能の無効化

有効化されたすべての拡張機能は、潜在的な複雑さと攻撃ベクトルを追加します。インストールされている拡張機能を定期的に監査し、本番ワークロードで積極的に使用されていないものを削除してください。これにより、全体的な攻撃対象領域が最小限に抑えられます。

パスワードセキュリティとロール

すべての管理ロール(デフォルトのpostgresユーザーなど)に、ALTER USERを使用して強力で複雑なパスワードが設定されていることを確認してください:

ALTER USER postgres WITH PASSWORD 'YourStrongAndComplexPassword123!';

最小権限の原則を使用してください:アプリケーションユーザーは、スーパーユーザーステータスではなく、必要な特定のテーブルに対してのみSELECTINSERTUPDATEDELETE権限を持つべきです。

4. 監査とログ設定

厳密にはアクセス制御メカニズムではありませんが、堅牢なログはセキュリティインシデントの検出と調査に不可欠です。postgresql.confでログパラメータを設定して、関連するイベントをキャプチャします。

セキュリティ監査のための主要な設定:

  • log_statement = 'ddl' または 'all'CREATE TABLEALTER USERなどのすべてのデータ定義言語(DDL)コマンドをログに記録します。'all'はログボリュームが大きくなり、機密性の高いクエリテキストをキャプチャする可能性があるため、注意して使用してください。
  • log_connections = on:すべての成功した接続試行をログに記録します。
  • log_disconnections = on:クライアントが切断したときにログに記録します。
  • log_duration = on:すべてのステートメントの実行時間をログに記録します。これにより、異常なアクティビティパターンが明らかになることがあります。

pg_hba.confの厳格なアクセスルール、SSLによる暗号化の強制、制限されたリッスンアドレス、包括的なログを組み合わせることで、PostgreSQLデプロイメントを保護するための強固な基盤を確立できます。

必須のセキュリティ手順

  1. pg_hba.confを更新:認証方法にscram-sha-256またはpeerを使用します。
  2. 暗号化を強制postgresql.confssl = onを設定し、pg_hba.confhostsslエントリを使用します。
  3. リッスンを制限listen_addressesを必要なインターフェースのみに設定し、可能であればデフォルトの*を避けます。
  4. 最小権限を強制:データベースロールを、その機能に絶対に必要な権限のみに制限します。
  5. 設定をリロード:セキュリティファイルを変更した後は、常にPostgreSQLをリロードまたは再起動して変更を適用します。

これらの設定が基本です。適用後、許可されたクライアントからテストし、ブロックされたクライアントからテストし、ログに期待した接続動作が表示されることを確認してください。