(2011.5.29更新)
(2012.1 ページを分割) (2013.7.17加筆。)
PostgreSQLの認証 (authentication) 方法を決めるグローバルな設定ファイルについて。
PostgreSQLでは, どのデータベースユーザがどのデータベースにアクセスできるかという認証は、$(PGDATA)/pg_hba.confファイルで設定します。
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 ファイルの初期設定は、次のようになっています。
#で始まる行はコメントです。
これらの各行はパターンで, 最初にマッチするパターンに基づいて認証が行われます。パターンにマッチして, かつ認証に失敗した場合は, その時点で打ち切られます (以降のパターンを調べる訳ではない)。
どのパターンにもマッチしない場合は, 認証に失敗します。
これを、例えば、次のように修正します。trustをmd5に変更します。
pg_hba.conf ファイルを修正したら, systemctl restart postgresql で, PostgreSQLサーバを再起動します。
以降, 順に説明していきます。
認証パターンのTYPE列は, local, host, hostssl, hostnossl のいずれかです。
DATABASE列は, all, sameuser, samerole, replication, またはデータベース名。これらをカンマで区切ったリストとすることもできます。
TYPEそれぞれの書き方は, 次のようになります。
"local" typeは, UNIXドメインソケットで接続します。クライアントのプログラムがUNIXドメインソケットを使えて, 同じ機械で動くのなら, これにします。
クライアント側のたいていのライブラリはTCP/IP接続しかサポートしていないので, あまり使いません。
データベースサーバのシェルからpsqlコマンドを使ってデータベースを保守する場合のために, "postgres"ユーザについてだけ, 有効にするといいかもしれません。
"host" は, IPv4またはIPv6で接続します。アドレス列はIPアドレスかホスト名で, 例えば, 次のように書きます。
アプリケーションサーバ (PostgreSQLサーバから見てクライアント) のIPアドレスかホスト名を書きます。
hostのSSL版。
METHOD列は次から選びます。
createuserコマンドなどに -Uオプション(データベースユーザを指定)、-Wオプション(パスワードを問い合わせ)を付けても、単に無視されます。
例えばpostgresデータベースユーザで接続するには、su postgresして、UNIXユーザとしてのpostgresになってから接続しなければなりません。
通常は、アプリケーションは別のUNIXユーザで動いているので、アプリケーション接続用のデータベースユーザについては、この認証方式は使いません。
# pg_hba.confファイル
Note.
データベースユーザがデータベースをどのように操作する権限を持つか, という認可 (アクセス権限) は, GRANT SQL文などで設定します。PostgreSQLのユーザ管理
# 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
# TYPE DATABASE USER ADDRESS METHOD
# UNIXドメインソケットはpostgresユーザのみ
local all postgres peer
# local all all md5
host all all 127.0.0.1/32 md5
# フォーマット
(1) local
local データベース名 ユーザ名 認証方法 [ 認証オプション ]
(2) host
host データベース名 ユーザ名 アドレス 認証方法 [ 認証オプション ]
(3) hostssl
hostssl データベース名 ユーザ名 アドレス 認証方法 [ 認証オプション ]
# 認証方法