PostgreSQLでの認証の設定

(2011.5.29更新)
(2012.1 ページを分割) (2013.7.17加筆。)

PostgreSQLの認証 (authentication) 方法を決めるグローバルな設定ファイルについて。

# pg_hba.confファイル

PostgreSQLでは, どのデータベースユーザがどのデータベースにアクセスできるかという認証は、$(PGDATA)/pg_hba.confファイルで設定します。

Note.

データベースユーザがデータベースをどのように操作する権限を持つか, という認可 (アクセス権限) は, GRANT SQL文などで設定します。PostgreSQLのユーザ管理

pg_hba.confファイルは、initdb コマンドを行ったときに, データベースクラスタのディレクトリ (PGDATA) にインストールされます。

Fedora 15 Linux (PostgreSQL 9.0) では、初期設定で、PGDATAは /var/lib/pgsql/data です。

Fedora 19 Linux (PostgreSQL 9.2) では、pg_hba.conf ファイルの初期設定は、次のようになっています。

# 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            ident
# IPv6 local connections:
host    all             all             ::1/128                 ident

#で始まる行はコメントです。

これらの各行はパターンで, 最初にマッチするパターンに基づいて認証が行われます。パターンにマッチして, かつ認証に失敗した場合は, その時点で打ち切られます (以降のパターンを調べる訳ではない)。

どのパターンにもマッチしない場合は, 認証に失敗します。

これを、例えば、次のように修正します。trustをmd5に変更します。

# TYPE  DATABASE        USER    ADDRESS        METHOD
# UNIXドメインソケットはpostgresユーザのみ
local   all         postgres                    peer
# local   all         all                         md5

host    all         all         127.0.0.1/32    md5

pg_hba.conf ファイルを修正したら, systemctl restart postgresql で, PostgreSQLサーバを再起動します。

以降, 順に説明していきます。

# フォーマット

認証パターンのTYPE列は, local, host, hostssl, hostnossl のいずれかです。

DATABASE列は, all, sameuser, samerole, replication, またはデータベース名。これらをカンマで区切ったリストとすることもできます。

TYPEそれぞれの書き方は, 次のようになります。

(1) local

local    データベース名  ユーザ名              認証方法   [ 認証オプション ]

"local" typeは, UNIXドメインソケットで接続します。クライアントのプログラムがUNIXドメインソケットを使えて, 同じ機械で動くのなら, これにします。

クライアント側のたいていのライブラリはTCP/IP接続しかサポートしていないので, あまり使いません。

データベースサーバのシェルからpsqlコマンドを使ってデータベースを保守する場合のために, "postgres"ユーザについてだけ, 有効にするといいかもしれません。

(2) host

host     データベース名  ユーザ名  アドレス    認証方法   [ 認証オプション ]

"host" は, IPv4またはIPv6で接続します。アドレス列はIPアドレスかホスト名で, 例えば, 次のように書きます。

  • 192.168.0.0/24
  • ::1/128
  • 0.0.0.0/0 # どこからでも受け付ける
  • localhost
  • 127.0.0.1 255.255.255.255 # IPアドレスとマスクを指定してもいい

アプリケーションサーバ (PostgreSQLサーバから見てクライアント) のIPアドレスかホスト名を書きます。

(3) hostssl

hostssl  データベース名  ユーザ名  アドレス    認証方法   [ 認証オプション ]

hostのSSL版。

# 認証方法

METHOD列は次から選びます。

trust
認証方式trustにマッチするときは、パスワードチェックなしにサーバへの接続を許可します。
reject
md5
パスワードで認証されます。通常はこれを選びます。
password
gss
sspi
krb5
ident
認証方式identは、パスワードでの認証は行いません。UNIXユーザ名がそのままPostgreSQLユーザとして扱われます。

createuserコマンドなどに -Uオプション(データベースユーザを指定)、-Wオプション(パスワードを問い合わせ)を付けても、単に無視されます。

例えばpostgresデータベースユーザで接続するには、su postgresして、UNIXユーザとしてのpostgresになってから接続しなければなりません。

通常は、アプリケーションは別のUNIXユーザで動いているので、アプリケーション接続用のデータベースユーザについては、この認証方式は使いません。

ldap
radius
cert
pam