PostgreSQL の Peer Authentication と 他の認証方法への変更についてのメモ書き.

Peer Authentication とは

Peer Authentication(以下Peer認証) とは postgresql に ローカルから接続する際に, 接続を試みるプロセスの実効ユーザ(OS側のユーザ)とデータベースへのログインユーザ(データベース側のユーザ)が一致している場合のみ接続を許可する認証方法である.

公式ドキュメント

以下の例では utsuhiiro (OSのユーザ)が postgres (データベースのユーザ)としてローカルから接続しようとして Peer 認証で弾かれている.

[utsushiiro@ubuntu_server ]$ psql -U postgres -h localhost -W
Password for user postgres:
psql: FATAL:  password authentication failed for user “postgres"

pg_hba.conf ファイルについて

pg_hba.conf ファイルはデータベース接続の際のクライアント認証の設定を記述するファイルである. これは initdb, つまりデータベースクラスタを作成した時に一緒に作成される.

例えば Ubuntu で postgresql を標準のリポジトリから apt-get install すると, データベースクラスタの作成(initdb)までやってくれて, その際にpg_hba.confが作成される(以下インストール時の出力から抜粋).

Creating new cluster 9.5/main ...
  config /etc/postgresql/9.5/main
  data   /var/lib/postgresql/9.5/main
  locale ja_JP.UTF-8
  socket /var/run/postgresql
  port   5432

この際に作成される, 認証に関するコンフィグファイルの pg_hba.conf はデフォルトでは ローカルからの接続は全てPeer認証になっている(以下に該当部分を示す).

# DO NOT DISABLE!
# If you change this first entry you will need to make sure that the
# database superuser can access the database using some other method.
# Noninteractive access to all databases is required during automatic
# maintenance (custom daily cronjobs, replication, and similar tasks).
#
# Database administrative login by Unix domain socket
local   all             postgres                                peer

# TYPE  DATABASE        USER            ADDRESS                 METHOD

# "local" is for Unix domain socket connections only
local   all             all                                     peer
# 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.
#local   replication     postgres                                peer
#host    replication     postgres        127.0.0.1/32            md5
#host    replication     postgres        ::1/128                 md5

例えば以下の一行は, ローカルからの全てのデータベースへの postgres ユーザによる接続には Peer 認証を用いることを設定している. その他の詳しい読み方については 公式ドキュメント を参照.

local   all             postgres                              peer

Peer 認証からパスワード認証に変更

パスワード認証に変更するには auth-method を peer から md5 にすればよい.

local   all             postgres                              peer ← ここが auth-method 

ただし, これを最初にやってしまうと postgresユーザ(データベース側)のパスワードは設定されていないため, ログインできない(パスワードがNULLなのでパスワード認証が必ず失敗する). このパスワードを設定するには以下の2つの方法がある.

一つ目は Peer 認証で postgresql に接続してpostgres ユーザ(データベース側)のパスワードを設定する方法. まず, Peer 認証で接続するために postgres ユーザ(OS側)でログインできる必要があるが, postgresql インストール時に作成される postgres ユーザ(OS側)はパスワードが設定されていないのでまずこれを設定する.

[utsushiiro@ubuntu_server ]$ sudo passwd postgres

その後, postgres になって postgresql に接続する.

[utsushiiro@ubuntu_server ]$ su - postgres
[postgres@ubuntu_server ]$ psql 
psql (9.5.9)
Type "help" for help.

postgres=# 

そして, 以下の SQL でパスワードを設定する.

ALTER USER postgres with encrypted password 'ここにパスワード';

二つ目の方法は trust 認証で postgresql に接続して postgres ユーザ(データベース側)のパスワードを設定する方法.

まず, 以下のように local all での postgres ユーザ(データベース側)の auth-method を peer から trust に変更する

local   all             postgres                              trust 

これでローカルからの接続では postgres ユーザ(データベース側) としてどのユーザ(OS側)からでも認証なしで接続できるようになったので先程と同じように postgres ユーザ(データベース側)のパスワードを変更する.

[utsushiiro@ubuntu_server ]$ psql -U postgres
psql (9.5.9)
Type "help" for help.

postgres=# ALTER USER postgres with encrypted password 'ここにパスワード';

そして, どちらかの方法でパスワードを設定後, auth-method を md5 にする.

local   all             postgres                              md5