PostgreSQLの、 pg_hba.conf
についてまとめていきます。
クライアント認証はデータベースクラスタのデータディレクトリ内の、伝統的にpg_hba.confという名前の設定ファイルで管理されています (HBAとは、host-based authentication: ホストベース認証の略です)。 デフォルトのpg_hba.confファイルは、データディレクトリがinitdbで初期化される時にインストールされます。
公式ドキュメントのページです。
環境情報
- CentOS 7.6
- PostgreSQL 10.7
ファイル場所
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.
DBサーバ上でidentdのデーモンを起動しておけば利用できるのか、と思ったのですが、公式ドキュメントに以下の記述がありました。
いくつかの身元特定サーバ(つまりidentサーバ)は、ユーザ名を(マシンの管理者のみが知っているキーで)暗号化して返すような非標準のオプションを持っています。 このオプションは、身元特定サーバと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_hba.conf
だけではなく、 postgresql.conf
にも存在します。デフォルトパスは /var/lib/pgsql/10/data/postgresql.conf
。
listen_addresses
というパラメータがそれにあたり、デフォルトではコメントアウトされています。
#listen_addresses = 'localhost'
listen_addresses (string)
クライアントアプリケーションからの接続をサーバが監視する TCP/IP アドレスを指定します。 この値は、ホスト名をコンマで区切ったリスト、そして/もしくは、数値によるIPアドレスです。 *という特別なエントリは利用可能な全てのIPインタフェースに対応します。
以下と設定することで、全IPからの接続を可能とします。
listen_addresses = '*'
このパラメータ変更後には、サーバ再起動が必要となります。