PostgreSQL | PostgreSQL 設定ファイル | pg_hba.conf ファイルの設定方法

pg_hba.conf ファイルは、PostgreSQL に接続するクライアントに対する認証設定を記述するファイルである。ここでは、pg_hba.conf ファイルの設定方法について説明する。

pg_hba.conf ファイルの場所

pg_hba.confpostgresql.conf と同様に、基本的に PostgreSQL をインストールした data ディレクトリに保存されている。

C:\Program Files\PostgreSQL\12\data>dir
 C 드라이브의 볼륨에는 이름이 없습니다.
 볼륨 일련 번호: XXXX-XXXX

 C:\Program Files\PostgreSQL\12\data 디렉터리

2020-07-08  오전 12:00    <DIR>          .
2020-07-08  오전 12:00    <DIR>          ..
2020-07-08  오전 12:28    <DIR>          base
2020-07-08  오전 12:00                45 current_logfiles
2020-07-08  오전 12:20    <DIR>          global
2020-07-08  오전 12:00    <DIR>          log
2020-03-10  오전 12:24    <DIR>          pg_commit_ts
2020-03-10  오전 12:24    <DIR>          pg_dynshmem
2020-03-10  오전 12:24             4,156 pg_hba.conf <------------- ここに保存されている。
2020-03-10  오전 12:24             1,678 pg_ident.conf
2020-07-08  오전 12:38    <DIR>          pg_logical
2020-03-10  오전 12:24    <DIR>          pg_multixact
2020-07-07  오후 11:20    <DIR>          pg_notify
2020-03-10  오전 12:24    <DIR>          pg_replslot
2020-03-10  오전 12:24    <DIR>          pg_serial
2020-03-10  오전 12:24    <DIR>          pg_snapshots
2020-07-07  오후 11:20    <DIR>          pg_stat
2020-07-08  오후 11:35    <DIR>          pg_stat_tmp
2020-03-10  오전 12:24    <DIR>          pg_subtrans
2020-03-10  오전 12:24    <DIR>          pg_tblspc
2020-03-10  오전 12:24    <DIR>          pg_twophase
2020-03-10  오전 12:24                 3 PG_VERSION
2020-03-10  오전 12:24    <DIR>          pg_wal
2020-03-10  오전 12:24    <DIR>          pg_xact
2020-03-10  오전 12:24                90 postgresql.auto.conf
2020-03-10  오전 12:24            27,377 postgresql.conf
2020-07-07  오후 11:20                91 postmaster.opts
2020-07-07  오후 11:20                70 postmaster.pid
               8개 파일              33,510 바이트
              20개 디렉터리  424,537,530,368 바이트 남음

C:\Program Files\PostgreSQL\12\data>

pg_hba.conf ファイルはテキストファイルなので、内容を確認したり編集したりするにはテキストエディタで開くことができる。

# PostgreSQL Client Authentication Configuration File
# ===================================================
#
# Refer to the "Client Authentication" section in the PostgreSQL
# documentation for a complete description of this file.  A short
# synopsis follows.
#
# This file controls: which hosts are allowed to connect, how clients
# are authenticated, which PostgreSQL user names they can use, which
# databases they can access.  Records take one of these forms:
#
# local      DATABASE  USER  METHOD  [OPTIONS]
# host       DATABASE  USER  ADDRESS  METHOD  [OPTIONS]
# hostssl    DATABASE  USER  ADDRESS  METHOD  [OPTIONS]
# hostnossl  DATABASE  USER  ADDRESS  METHOD  [OPTIONS]
#
# (The uppercase items must be replaced by actual values.)
#
# The first field is the connection type: "local" is a Unix-domain
# socket, "host" is either a plain or SSL-encrypted TCP/IP socket,
# "hostssl" is an SSL-encrypted TCP/IP socket, and "hostnossl" is a
# plain TCP/IP socket.
#
# DATABASE can be "all", "sameuser", "samerole", "replication", a
# database name, or a comma-separated list thereof. The "all"

... 以下省略 ...

pg_hba.conf の設定

pg_hba.conf ファイルは、クライアントのアドレスとロール名を指定し、データベースへの接続を許可するかどうかを設定するために使用する。現在 pg_hba.conf に設定されている内容を確認すると次のようになっている。

# TYPE  DATABASE        USER            ADDRESS                 METHOD

# IPv4 local connections:
host    all             all             127.0.0.1/32            md5
# IPv6 local connections:
host    all             all             ::1/128                 md5
# Allow replication connections from localhost, by a user with the
# replication privilege.
host    replication     all             127.0.0.1/32            md5
host    replication     all             ::1/128                 md5

1 行が 1 つの設定である。たとえば、次の設定は、クライアントの IP アドレスが 127.0.0.1/32 であるすべてのロールに対して、レプリケーションを除くすべてのデータベースへの接続を、認証方式 md5 で許可するという意味である。

# IPv4 local connections:
host    all             all             127.0.0.1/32            md5

注: 127.0.0.1/32 はローカルループバックアドレスと呼ばれる、自分自身を表す IP アドレスである。この場合は PostgreSQL が実行されているサーバーの IP アドレスである。localhost も同じ意味で使われる。また、IPv6 のローカルループバックアドレスは ::1/128 である。

それでは、設定する項目を 1 つずつ見ていく。

各設定は次のいずれかの形式である。

local      DATABASE  USER  METHOD  [OPTIONS]
host       DATABASE  USER  ADDRESS  METHOD  [OPTIONS]
hostssl    DATABASE  USER  ADDRESS  METHOD  [OPTIONS]
hostnossl  DATABASE  USER  ADDRESS  METHOD  [OPTIONS]

TYPE には localhosthostsslhostnossl のいずれかを設定する。local は Unix ドメインソケットを使用する場合に使うもので、今回は Windows 環境なので使用しない。hosthostsslhostnossl はすべて TCP/IP を使用して接続する場合に使用し、host を指定した場合は SSL または非 SSL での接続を許可し、hostssl は SSL 接続を許可し、hostnossl は非 SSL 接続を許可する。

DATABASE には接続できるデータベース名を指定する。複数指定する場合はカンマ (,) で区切って記述する。また、特殊な値として all を指定した場合はレプリケーションを除くすべてのデータベースを意味し、sameuser を指定した場合はユーザー名と同じ名前のデータベースを意味する。さらに samerole を指定した場合、接続するユーザーは接続先データベースと同じ名前のロールのメンバーである必要がある。別ファイルにデータベース名の一覧を記述する場合は、@ファイル名 の形式で指定することもできる。

USER には接続できるロール名を指定する。複数指定する場合はカンマ (,) で区切って記述する。また、特殊な値 all を指定するとすべてのロールを意味する。ロール名の前に + を付けると、グループとして使用されているロール名を意味し、そのグループロールのメンバーに接続が許可される。別ファイルにロール名の一覧を記述する場合は、@ファイル名 の形式で指定することもできる。

ADDRESS には接続できるホスト名または IP アドレス範囲を指定する。IPv4 では 172.20.143.0/24 のような形式で指定し、IPv6 では fe80::7a31:c1ff:0000:0000/96 のような形式で指定する。特殊な値 all はすべての IP アドレスを意味し、samehost は PostgreSQL が実行されているサーバーと同じ IP アドレスを意味する。samenet はサーバーと同じネットワークを意味する。

ADDRESS にホスト名を指定する場合は、blog.devkuma.com のように個別のホスト名を指定する。また、.devkuma.com のように指定した場合は、blog.example.com など devkuma.com 配下のすべてのホストを意味する。

METHOD には認証方法を指定する。設定値と認証方式は次のとおりである。

設定値 説明
trust すべてのロール名でパスワードなしに接続可能
reject 接続を拒否
scram-sha-256 パスワード認証。最も安全だが、一部のクライアントではサポートされない
md5 パスワード認証
password パスワード認証。パスワードを平文で送信
gss GSSAPI を使用したシングルサインオン
sspi SSPI を使用したシングルサインオン
ident Ident 認証
peer Peer 認証
ldap LDAP 認証
radius RADIUS 認証
cert SSL クライアント証明書を使用した認証
pam PAM 認証
bsd BSD 認証

たとえば、192.168.1.0/24 ネットワークからデータベース mydb への接続を、ユーザー devkuma に対して認証方式 md5 で許可する場合は、次のように記述する。

host mydb devkuma 192.168.1.0/24 md5

また、pg_hba.conf ファイルの設定内容に関係なく、postgresql.conf ファイルの listen_addresses パラメータでクライアントの IP アドレスまたはホストから PostgreSQL への接続が許可されていなければ接続できない。「postgresql.conf の設定」を参照する。

それでは実習してみる。現在のクライアントの IP アドレスがサーバーと同じ IP アドレスである状況で、postgres ロールに対して mydb データベースへのアクセスを許可してみる。pg_hba.conf に設定されている既存の内容はコメントにし、次の行を追加した。設定ファイルの保存が終わったら、いったん PostgreSQL を再起動する。

# TYPE  DATABASE        USER            ADDRESS                 METHOD

# IPv4 local connections:
# host    all             all             127.0.0.1/32            md5
# IPv6 local connections:
# host    all             all             ::1/128                 md5
# Allow replication connections from localhost, by a user with the
# replication privilege.
# host    replication     all             127.0.0.1/32            md5
# host    replication     all             ::1/128                 md5

host    mydb            postgres        ::1/128            md5

まず、接続を許可するよう設定した mydb データベースに接続してみる。コマンドプロンプトを起動し、次のように実行する。

psql -U postgres -d mydb

ユーザーパスワードの入力を求められ、postgres ロールのパスワードを入力すると接続される。

C:\>psql -U postgres -d mydb
postgres ユーザーのパスワード:
psql (12.2)
ヘルプを表示するには "help" と入力してください。

mydb=#

いったん PostgreSQL への接続を終了し、今度は postgres データベースに接続を試みるため、次のように実行する。

psql -U postgres -d postgres

次のようなエラーが表示され、接続に失敗する。

C:\>psql -U postgres -d postgres
psql: エラー: サーバーへの接続に失敗しました: 致命的エラー: ホスト "::1"、ユーザー "postgres"、データベース "postgres"、SSL 無効の接続に対する設定が pg_hba.conf ファイルにありません。

C:\>

したがって、pg_hba.conf ファイルで接続を許可したデータベースには接続できるが、許可していないデータベースに接続しようとするとエラーが発生する。

pg_hba.conf の設定方法について説明した。