概要
PostgreSQLにおけるアクセス制御の心臓部、それが「pg_hba.conf」です。HBAは「Host-Based Authentication(ホストベース認証)」の略であり、クライアントがどのホストから、どのデータベースに、どのユーザー名で、どのような認証方式を用いて接続を許可するかを定義する最重要ファイルです。多くのDBAがこの設定を誤り、セキュリティリスクを招いたり、逆に正当なアクセスを拒否して業務を停滞させたりしています。本稿では、pg_hba.confの構造を解剖し、実務で遭遇する複雑なケースを安全に解決するための設計指針を伝授します。
pg_hba.confの基本構造とレコードの評価順序
pg_hba.confは、1行ごとに接続ルールを定義します。重要なのは「上から順に評価される」という点です。最初に一致したルールが適用され、それ以降のルールは評価されません。つまり、最も制限の強いルールを上に、緩やかなルールを下に配置するのがセオリーです。
各レコードは以下の7つのフィールドで構成されます。
1. TYPE: 接続タイプ(local, host, hostssl, hostnossl)
2. DATABASE: 対象データベース名(all, 特定のDB名)
3. USER: 対象ユーザー名(all, 特定のロール名)
4. ADDRESS: 接続元IPアドレス(CIDR形式)
5. METHOD: 認証方式(trust, reject, md5, scram-sha-256, peer等)
6. [オプション]: METHODに応じた追加設定
各フィールドの詳細解説とベストプラクティス
TYPEフィールドにおいて、ローカル通信には「local」、ネットワーク経由には「host」系を使用します。セキュリティを考慮すれば、外部通信には必ず「hostssl」を使用し、SSL/TLSによる暗号化を強制すべきです。
ADDRESSフィールドの設定は非常に重要です。特定のサーバーからの接続のみを許可するよう、IPアドレスは可能な限り狭い範囲(/32など)で指定してください。また、PostgreSQL 14以降では、デフォルトで「scram-sha-256」が推奨されています。古い「md5」は脆弱性が指摘されているため、可能な限り移行を推奨します。
設定例と構成のサンプル
以下に、セキュアな環境を想定したpg_hba.confのサンプルを提示します。
# TYPE DATABASE USER ADDRESS METHOD
# 1. ローカルのUnixドメインソケット経由の接続(管理者用)
local all postgres peer
# 2. 信頼できる社内ネットワークからのSSL接続(暗号化を強制)
# 192.168.1.0/24のサブネットからのみ、SCRAM-SHA-256認証を許可
hostssl all app_user 192.168.1.0/24 scram-sha-256
# 3. 特定のアプリケーションサーバーからの接続(個別のIP指定)
hostssl my_db web_svc 10.0.5.20/32 scram-sha-256
# 4. 明示的な拒否ルール(特定のサブネットからの不正アクセスを遮断)
host all all 192.168.2.0/24 reject
# 5. 上記以外はすべて拒否(デフォルトのセキュリティポリシー)
host all all 0.0.0.0/0 reject
実務アドバイス:トラブルシューティングと運用
pg_hba.confを編集した後は、設定を反映させるためにリロードが必要です。`pg_ctl reload`コマンドや、SQLから`SELECT pg_reload_conf();`を実行することで再読み込みが可能です。
DBAとして最も注意すべきは「ロックアウト」です。自分自身の接続が拒否される設定を適用してしまうと、再修正ができなくなります。設定変更前には必ずバックアップを作成し、テスト環境でシミュレーションを行ってください。
また、ログ設定との併用も不可欠です。接続拒否が発生した場合、PostgreSQLのログ(postgresql.log)には「no pg_hba.conf entry for host…」というエラーが記録されます。このエラーログを監視することで、未許可の接続試行や設定ミスを即座に検知できます。
セキュリティ向上のための高度な設定
近年では、単なるIP制限だけでなく、クライアント証明書を使用した「cert」認証の導入も一般的です。これにより、IPアドレスが偽装された場合でも、有効な証明書を提示できない限り接続を拒否できるため、セキュリティ強度が飛躍的に高まります。また、認証時の失敗回数を制限する機能や、pg_hba.confの設定値を外部の構成管理ツール(AnsibleやTerraform)で管理することで、設定の属人化を防ぎ、監査可能な状態に保つことがプロフェッショナルなDBAの責務です。
まとめ
pg_hba.confはPostgreSQLのセキュリティを守る最後の砦です。以下のポイントを常に意識してください。
– 評価順序は「上から下」である。
– 必要最小限のアクセス権(Least Privilege)を付与する。
– 可能な限り暗号化通信(hostssl)を強制する。
– 変更時は必ずリロードを行い、ログを確認する。
この設定を疎かにすることは、玄関の鍵を開けっ放しにして金庫を守ろうとするようなものです。適切な設定を施し、堅牢なデータベース運用を実現してください。

コメント