pg_hba.confの書き方

PostgreSQLの、 pg_hba.conf についてまとめていきます。

クライアント認証はデータベースクラスタのデータディレクトリ内の、伝統的にpg_hba.confという名前の設定ファイルで管理されています (HBAとは、host-based authentication: ホストベース認証の略です)。 デフォルトのpg_hba.confファイルは、データディレクトリがinitdbで初期化される時にインストールされます。

公式ドキュメントのページです。

PostgreSQL - pg_hba.conf

環境情報

ファイル場所

pg_hba.confファイルは、データベースクラスタdata 配下(通常は /var/lib/pgsql/10/data/pg_hba.conf )にあります。

フォーマット

以下のフォーマットで記述することになります。

local      database  user  auth-method  [auth-options]
host       database  user  address  auth-method  [auth-options]
hostssl    database  user  address  auth-method  [auth-options]
hostnossl  database  user  address  auth-method  [auth-options]
host       database  user  IP-address  IP-mask  auth-method  [auth-options]
hostssl    database  user  IP-address  IP-mask  auth-method  [auth-options]
hostnossl  database  user  IP-address  IP-mask  auth-method  [auth-options]

どの接続方法 で、 どのデータベース に対して、 どのデータベースユーザ を利用して、 どのClinetIP(どのCIDR) から、 どの認証方式 を利用して、接続可能であるかを指定することになります。各項目で指定できる値については、公式のドキュメントを参照。

デフォルト設定

デフォルトの設定は下記となっています。

# "local" is for Unix domain socket connections only
local   all             all                                     peer  ...1
# IPv4 local connections:
host    all             all             127.0.0.1/32            ident  ...2
# IPv6 local connections:
host    all             all             ::1/128                 ident  ...2
# Allow replication connections from localhost, by a user with the
# replication privilege.
local   replication     all                                     peer  ...3
host    replication     all             127.0.0.1/32            ident  ...3
host    replication     all             ::1/128                 ident  ...3

1...

local(Unixドメインソケットを利用する接続) にて、すべてのデータベースに、すべてのユーザにて、 peer(接続するOSユーザと同一名のDBユーザを利用して) 接続を許可する設定。

2...

host(TCP/IPを利用する接続) にて、すべてのデータベースに、ローカルホストのIPアドレスより、 ident認証 による接続を許可する設定。

ident認証 って何だよ、と調べたのですが、ユーザー認証用のプロコトルなのですね。

The Ident Protocol (Identification Protocol, Ident), specified in RFC 1413, is an Internet protocol that helps identify the user of a particular TCP connection. One popular daemon program for providing the ident service is identd.

Wikipedia - Ident protocol

DBサーバ上でidentdのデーモンを起動しておけば利用できるのか、と思ったのですが、公式ドキュメントに以下の記述がありました。

いくつかの身元特定サーバ(つまりidentサーバ)は、ユーザ名を(マシンの管理者のみが知っているキーで)暗号化して返すような非標準のオプションを持っています。 このオプションは、身元特定サーバとPostgreSQLとを一緒に使用する場合には、使用してはいけません。 理由はPostgreSQLは、返された文字列を復号化して本当のユーザを決定するための手段を持っていないためです。

PostgreSQL - クライアント認証

わざわざこの接続認証のためだけに、DBサーバの他、identサーバを用意するのは現実的でないでしょうから、この認証を利用するケースは相当に少ないと思いました。

3...

レプリケーション処理用の認証。デフォルト設定では、ローカルホストからのレプリケーションしか許可していないですね。

サンプル

以下の設定は、192.168.0.0/16のCIDRから、TCP/IP接続で、MG5のアルゴリズムを用いたチャレンジ・レスポンス認証を許可しています。

# TYPE  DATABASE        USER            IP-ADDRESS      IP-MASK         METHOD
host    all             all             192.168.0.0     255.255.0.0     md5

以下の設定では、192.168.10.0/24のCIDRからの接続を reject して、それ以外となる192.168.0.0/16のCIDRからの接続を許可しています。制御ルールは昇順で評価されるので、こんな書き方ができます。

# TYPE  DATABASE        USER            IP-ADDRESS      IP-MASK            METHOD
host    all             all             192.168.10.0    255.255.255.0      reject
host    all             all             192.168.0.0     255.255.0.0        md5

設定反映

変更した pg_hba.conf を反映させるには、postmasterプロセスの再起動(つまりPostgresの再起動)、または pg_ctl reload コマンドを実行する必要があります。

postmasterプロセスの実行ユーザ(通常はpostgresユーザ)で実行する必要があります。

$ pg_ctl reload

reloadモードは、単にpostgresサーバプロセスにSIGHUPシグナルを送り、(postgresql.conf、pg_hba.confなどの)設定ファイルの再読み込みを実行させます。 これにより、設定ファイルのオプションで完全なサーバ再起動を必要としないものについて、変更を反映させることができます。

PostgreSQL - pg_ctl

その他メモ

PostgreSQLで、アクセス制限を設けているコンフィグは pg_hba.conf だけではなく、 postgresql.conf にも存在します。デフォルトパスは /var/lib/pgsql/10/data/postgresql.conf

listen_addresses というパラメータがそれにあたり、デフォルトではコメントアウトされています。

#listen_addresses = 'localhost'

listen_addresses (string)
クライアントアプリケーションからの接続をサーバが監視する TCP/IP アドレスを指定します。 この値は、ホスト名をコンマで区切ったリスト、そして/もしくは、数値によるIPアドレスです。 *という特別なエントリは利用可能な全てのIPインタフェースに対応します。

PostgreSQL - 接続と認証

以下と設定することで、全IPからの接続を可能とします。

listen_addresses = '*'

このパラメータ変更後には、サーバ再起動が必要となります。