CodeGym /コース /SQL SELF /IPによるアクセス制限と pg_hba.confの設定

IPによるアクセス制限と pg_hba.confの設定

SQL SELF
レベル 47 , レッスン 4
使用可能

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.xx.x.x.x/y/yはサブネットマスク、例:/24)。
  • IPv6は::/y形式。
  • allは全てのIPアドレスを意味する。

認証方法:どの認証方式を使うかを指定。

例:

  • trust: パスワードなしで接続許可(安全じゃないのでテスト用だけ)。
  • md5: パスワード(ハッシュ化)を使う。
  • scram-sha-256: SHA-256を使ったより安全な認証。
  • reject: アクセス拒否。

pg_hba.confの行の例

設定は柔軟にできるよ。いくつか例を見てみよう:

  1. Unixソケット経由のローカル接続を許可

    local   all             all                                     trust
    

    ローカルサーバー上の全ユーザーが全データベースにパスワードなしで接続できる。

  2. 特定のIPアドレスからの接続を許可

    host    my_database     my_user        192.168.1.100/32         md5
    

    my_usermy_database192.168.1.100からだけパスワードで接続できる。

  3. サブネット全体からのアクセスを許可

    host    my_database     all            192.168.1.0/24           scram-sha-256
    

    192.168.1.0/24サブネット内の誰でもmy_databaseにSHA-256認証で接続できる。

  4. 特定サブネットからの接続を拒否

    host    all             all            192.168.2.0/24           reject
    

    192.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_user203.0.113.10からだけ接続できる。

設定のリロード

pg_hba.confを編集したら、PostgreSQLに反映させる必要がある。コマンドはこれ:

sudo systemctl reload postgresql

リロードは安全で、サーバーが落ちることはないよ。

もしpg_hba.confの場所を忘れたら、SQLでパスを調べられる:

SHOW hba_file;

pg_hba.confでよくあるミス

pg_hba.confの扱いはシンプルだけど、初心者の管理者がやりがちなミスもある。例えば:

  1. サーバーのリロードを忘れる。 pg_hba.confの変更は設定リロード後にだけ有効になる。
  2. ルールの競合。 PostgreSQLは上から順にルールを見て、最初にマッチしたものだけ適用する。より一般的なルールは下に書こう。
  3. サブネットマスクの間違い。 例えば/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セキュリティの超重要ツールの一つ。設定はちゃんと論理的で、テスト済み、ビジネスのニーズに合ってるか確認しよう。データがハッカーから守られてる世界に住みたいよね? まあ、ハッカーが自分なら別だけど :)

1
アンケート/クイズ
アクセス管理とセキュリティ、レベル 47、レッスン 4
使用不可
アクセス管理とセキュリティ
アクセス管理とセキュリティ
コメント
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION