pg_hba.confはPostgreSQLの設定ファイルで、接続と認証を管理するためのものだよ。HBAはHost-Based Authentication(ホストベース認証)の略。ネットワークの「ゲートマン」みたいな役割で、次のことを決めてる:
- 誰がサーバーに接続できるか(IPアドレス、ロール、データベース)。
- 接続にどんな認証方法が必要か。
現実世界で例えると、pg_hba.confは建物の入り口にいる警備員みたいなもん。中に入れるかどうかを決めるとき、パスワード(身分証)だけじゃなくて、IPアドレス(住所)もチェックしてる感じだね。
pg_hba.confファイルの構造
pg_hba.confファイルは1行ごとにアクセスルールを書いていくよ。1行の構造はこんな感じ:
<接続タイプ> <データベース> <ユーザー> <アドレス> <認証方法>
各コンポーネントを見てみよう:
接続タイプ(connection type):クライアントがどうやって接続するかを決める。
local: Unixソケット経由の接続(Linuxサーバーのローカルユーザー用)。host: TCP/IP経由の接続。hostssl: TCP/IP経由だけどSSL必須。hostnossl: TCP/IP経由でSSLなし。
データベース:アクセスを許可するデータベースを指定。特定のDB名やカンマ区切りで複数指定、またはキーワード:
all: 全てのデータベースへのアクセスを許可。
ユーザー:どのユーザーが接続できるかを指定。
- 特定のユーザー名や
allで全員許可もできる。
アドレス(address):クライアントのIPアドレスや範囲を指定。
- IPv4は
x.x.x.xやx.x.x.x/y(/yはサブネットマスク、例:/24)。 - IPv6は
::/y形式。 allは全てのIPアドレスを意味する。
認証方法:どの認証方式を使うかを指定。
例:
trust: パスワードなしで接続許可(安全じゃないのでテスト用だけ)。md5: パスワード(ハッシュ化)を使う。scram-sha-256: SHA-256を使ったより安全な認証。reject: アクセス拒否。
pg_hba.confの行の例
設定は柔軟にできるよ。いくつか例を見てみよう:
Unixソケット経由のローカル接続を許可
local all all trustローカルサーバー上の全ユーザーが全データベースにパスワードなしで接続できる。
特定のIPアドレスからの接続を許可
host my_database my_user 192.168.1.100/32 md5my_userはmy_databaseに192.168.1.100からだけパスワードで接続できる。サブネット全体からのアクセスを許可
host my_database all 192.168.1.0/24 scram-sha-256192.168.1.0/24サブネット内の誰でもmy_databaseにSHA-256認証で接続できる。特定サブネットからの接続を拒否
host all all 192.168.2.0/24 reject192.168.2.0/24サブネットからの接続は完全に拒否。
IPアドレスによるアクセス設定
ファイルの構造が分かったところで、接続管理のやり方を見てみよう。
特定のIPアドレスだけサーバーにアクセスさせたい場合を考えよう。 例えば、PostgreSQLサーバーがあって、ローカルホスト(127.0.0.1)とオフィスのサブネット(192.168.10.0/24)だけアクセスOKにしたいときは、pg_hba.confにこう書く:
# ローカルアクセス
host all all 127.0.0.1/32 trust
# オフィスからのアクセス
host all all 192.168.10.0/24 md5
# その他は全部拒否
host all all 0.0.0.0/0 reject
ここで0.0.0.0/0は「全てのIPアドレス」って意味。他のアドレスからのアクセスは明示的に拒否してるよ。
リモートユーザー用のアクセス設定
もしPostgreSQLサーバーがクラウドやリモートサーバーで動いてるなら、特定の外部IPだけ接続許可したいこともあるよね。例えば:
# 管理者が自宅からアクセス
host all admin_user 203.0.113.10/32 md5
この例だと、admin_userが203.0.113.10からだけ接続できる。
設定のリロード
pg_hba.confを編集したら、PostgreSQLに反映させる必要がある。コマンドはこれ:
sudo systemctl reload postgresql
リロードは安全で、サーバーが落ちることはないよ。
もしpg_hba.confの場所を忘れたら、SQLでパスを調べられる:
SHOW hba_file;
pg_hba.confでよくあるミス
pg_hba.confの扱いはシンプルだけど、初心者の管理者がやりがちなミスもある。例えば:
- サーバーのリロードを忘れる。
pg_hba.confの変更は設定リロード後にだけ有効になる。 - ルールの競合。 PostgreSQLは上から順にルールを見て、最初にマッチしたものだけ適用する。より一般的なルールは下に書こう。
- サブネットマスクの間違い。 例えば
/0にすると全員に開放されて、超危険な状態になる。
実際のシナリオ例
ローカルサーバーでアプリをテストする場合。
ローカルホストだけアクセス許可:
local all all trust
リモートクライアントとのやりとり。
特定IPのクライアントだけアクセス許可:
host all client_user 203.0.113.42/32 scram-sha-256
パブリックネットワークでのアクセス制限。
インターネットからの接続を拒否(オフィスは許可):
host all all 0.0.0.0/0 reject
host all all 192.168.10.0/24 md5
ここまでで、pg_hba.confを使ってPostgreSQLへのアクセスをどう制限するか、だいぶ分かってきたはず。このファイルはDBセキュリティの超重要ツールの一つ。設定はちゃんと論理的で、テスト済み、ビジネスのニーズに合ってるか確認しよう。データがハッカーから守られてる世界に住みたいよね? まあ、ハッカーが自分なら別だけど :)
GO TO FULL VERSION