PostgreSQLデータベースを保護するための重要な設定
PostgreSQLデータベースを保護することは、機密データを保護し、コンプライアンスを確保するために極めて重要です。高度なオープンソースのリレーショナルデータベースとして、PostgreSQLは、アクセスを制御し、通信を暗号化し、潜在的な脆弱性を最小限に抑えるための堅牢な設定メカニズムを提供します。このガイドでは、本番環境向けの強固なセキュリティ体制を確立するために必要な、重要な設定ファイルとパラメータについて詳しく説明します。
効果的なPostgreSQLのセキュリティは、「誰が」接続できるか、そして「どのように」接続するかという2つの主要な柱に基づいています。本稿では、postgresql.conf 内の重要な設定と、極めて重要なクライアント認証ファイルである pg_hba.conf、さらにSSL/TLSを使用した必須の暗号化の実装について探ります。
1. pg_hba.conf を用いたクライアント認証の強化
ホストベース認証ファイル (pg_hba.conf) は、どのホストが接続できるか、どのPostgreSQLユーザーとして接続できるか、どのデータベースにアクセスできるか、そして最も重要な点として、その接続に必要な認証メソッドを決定します。
pg_hba.conf の構造を理解する
pg_hba.conf の各行は特定の形式に従います:
TYPE DATABASE USER ADDRESS METHOD [OPTIONS]
- TYPE: 接続タイプ(例:
local,host,hostnossl,hostssl)。 - DATABASE: ターゲットデータベース名。
- USER: ターゲットデータベースロール。
- ADDRESS: クライアントIPアドレス範囲。
- METHOD: 認証メカニズム(例:
scram-sha-256,md5,reject,trust)。
認証メソッドのベストプラクティス
本番環境で trust メソッドを絶対に使用しないでください。これは、接続条件に一致する誰もがパスワードなしで接続することを許可するためです。推奨される現代的な認証メソッドは次のとおりです:
推奨: scram-sha-256
SCRAM (Salted Challenge Response Authentication Mechanism) は、より強力なハッシュ化を使用し、リプレイ攻撃を防ぐことで、md5 のような古いパスワードメソッドに比べて大幅な改善を提供します。これはリモート接続におけるデフォルトの選択肢とすべきです。
# ポート5432上のすべてのリモート接続にSCRAMを強制する
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を変更した後、変更を有効にするためには設定をリロードする必要があります(例:pg_ctl reloadまたは postmasterプロセスにSIGHUPシグナルを送る)。
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
SSLをサポートできないレガシーなクライアントがある場合、非SSL接続を明示的に許可し、非機密性の操作のみに制限することもできますが、全体的な拒否が推奨されます。
3. 攻撃対象領域の最小化
セキュリティとは、データベースサーバーを外部の脅威にさらす範囲を減らすことを意味します。これは主に、ネットワーク設定と不要な機能の無効化によって管理されます。
ネットワーク待機アドレスの制限
デフォルトでは、PostgreSQLはすべてのネットワークインターフェースで待機する可能性があります (listen_addresses = '*')。セキュリティを強化するため、外部アクセスが必要な特定のインターフェースのみで待機するように、またはローカルアプリケーションのみが接続する場合は 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!';
最小権限の原則を使用してください: アプリケーションユーザーは、スーパーユーザー権限ではなく、必要な特定のテーブルに対してのみ SELECT, INSERT, UPDATE, DELETE 権限を持つべきです。
4. 監査とロギング設定
厳密にはアクセス制御メカニズムではありませんが、堅牢なロギングはセキュリティインシデントの検出と調査のために不可欠です。関連するイベントを捕捉するために、postgresql.conf でロギングパラメータを設定してください。
セキュリティ監査のための主要な設定:
log_statement = 'ddl'または'all': すべてのデータ定義言語 (DDL) コマンド(CREATE TABLE、ALTER USERなど)をログに記録します。セキュリティレビュー中は一時的に'all'に設定しますが、パフォーマンスへの影響に注意してください。log_connections = on: すべての成功した接続試行をログに記録します。log_disconnections = on: クライアントが切断したときにログに記録します。log_duration = on: すべてのステートメントの実行時間をログに記録します。これは、異常なアクティビティパターンを明らかにすることがあります。
pg_hba.conf での厳格なアクセスルール、SSLを介した強制的な暗号化、制限された待機アドレス、および包括的なロギングを組み合わせることで、PostgreSQLデプロイメントを保護するための強固な基盤を確立できます。
重要なセキュリティ手順の要約
pg_hba.confを更新する: 認証メソッドとしてscram-sha-256またはpeerを使用します。- 暗号化を強制する:
postgresql.confでssl = onを設定し、pg_hba.confでhostsslエントリを使用します。 - 待機を制限する:
listen_addressesを必要なインターフェースのみに設定し、可能であればデフォルトの*を避けます。 - 最小権限を強制する: データベースロールを、その機能に絶対に必要な権限のみに制限します。
- 設定をリロードする: セキュリティファイルを変更した後、変更を適用するために常にPostgreSQLをリロードまたは再起動してください。