他のバージョンの文書 16 | 15 | 14 | 13 | 12 | 11 | 10 | 9.6 | 9.5 | 9.4 | 9.3 | 9.2 | 9.1 | 9.0 | 8.4 | 8.3 | 8.2 | 8.1 | 8.0 | 7.4 | 7.3 | 7.2

Chapter 6. クライアント認証

Table of Contents
6.1. pg_hba.conf ファイル
6.2. 認証方式
6.2.1. Trust 認証
6.2.2. パスワード認証
6.2.3. Kerberos 認証
6.2.4. Ident ベースの認証
6.2.5. PAM 認証
6.3. 認証における問題点

クライアントアプリケーションがデータベースサーバーに接続するときは、Unix コンピュータに特定のユーザーとしてログインするときと同じように、どの PostgreSQL ユーザー名で接続するかを指定します。 SQL 環境の中では存在するデータベースユーザー名でデータベースオブジェクトへのアクセス権限が決まります。 詳しい情報は Chapter 4 を参照してください。 ですから、どのデータベースユーザーがデータベースに接続できるかを制限することが根本的な要件となります。

認証はデータベースサーバーがクライアントの身元を識別し、その延長としてクライアントアプリケーション(もしくはクライアントアプリケーションを実行するユーザー)が要求されたユーザー名で接続することができるかどうかを決定する手順です。

PostgreSQL には異なったいくつかのクライアント認証方法があります。 特定のクライアント接続の認証に使用する方法は、(クライアントの) ホストアドレス、データベース、およびユーザーにしたがって選択できます。

PostgreSQL のユーザー名は稼働しているサーバーのオペレーティングシステムのユーザー名とは論理上関係が絶たれています。 もし特定のサーバーのすべてのユーザーがサーバーマシン上にもアカウントを持っている場合、そのペレーティングシステムのユーザー名に照合するデータベースユーザー名を割り当てることは理にかなっています。 とはいっても、リモート接続を受け入れるサーバーはそのコンピュータ上にアカウントを持たない多くのユーザーを抱えている場合もあって、そのような時にはデータベースユーザー名と Unix ユーザー名との間の関連性は必要ありません。

6.1. pg_hba.conf ファイル

クライアント認証はデータディレクトリ、例えば /usr/local/pgsql/data/pg_hba.conf にある pg_hba.conf ファイルで管理されています。 (HBA とは、host-based authentication:ホストベースの認証の略です。) デフォルトの pg_hba.conf ファイルはデータディレクトリが initdb で初期化される時にインストールされます。

pg_hba.conf ファイルの一般的なフォーマットは、1 行 につき 1 つのレコードの集まりです。 空行はコメント用の "#" 文字で始まる行と同じく無視されます。 レコードはスペースもしくはタブで区切られたいくつかのフィールドで構成されています。 フィールドは、フィールド値が引用符付きの場合はスペースを含むことができます。 レコードは行をまたいで続けることはできません。

それぞれのレコードは接続の形式、(接続形式にたいして意味を持つのであれば) クライアントの IP アドレス範囲、データベースの名前、ユーザー名および、これらのパラメータを照合する接続で使用される認証方法を指定します。 照合のための接続の形式、クライアントアドレス、要求されたデータベース、およびユーザー名を含む最初のレコードは、認証処理に使用されます。 "照合をずるずると継続"したり、 あるいは"バックアップ"を行うことはありません。 これは、もしあるレコードが選択されて認証に失敗した場合、後続のレコードは考慮されないということです。 どのレコードも一致しない時はアクセスが拒否されます。

レコードのフォーマットは次の 3 つのうちのどれかになります。

local   database  user  authentication-method  [authentication-option]
host    database  user  IP-address  IP-mask  authentication-method  [authentication-option]
hostssl  database  user  IP-address  IP-mask  authentication-method  [authentication-option]
    

フィールドの意味は以下のようになっています。

local

このレコードは Unix ドメインソケットを使用する接続に対応します。 この種類のレコードを使用しないと、Unix ドメインソケット経由の接続は拒否されます。

host

このレコードは TCP/IP ネットワークを使用する接続に対応します。 ただし、サーバーが -i オプション付で起動されているか、あるいは tcpip_socket postgresql.conf 設定パラメータが使用可能でない限り、TCP/IP 接続はできないことに注意してください。

hostssl

このレコードは TCP/IP 経由の SSL を使用する接続に対応します。 host レコードは SSL および非 SSL による接続試行のどちらにも対応しますが、hostssl レコードは SSL 接続を要求します。

このオプションを使用するためには、サーバーは SSL サポートができるように構築されていなければいけません。 また、postgresql.confssl オプションを有効にすることで SSL を使用可能にする必要があります (Section 3.4 を参照)。

database

このレコードで照合するデータベースを指定します。 all という値は、すべてのデータベースと照合することを指定します。 sameuser という値は、要求を受けるデータベースが要求ユーザーと同じ名前を持つ場合にレコードを照合することを指定します。 samegroup という値は、要求ユーザーが要求を受けるデータベースと同じ名前のグループのメンバーでなければならないことを指定します。 それ以外の場合には特定の PostgreSQL データベースの名前になります。 データベースの名前はカンマで区切ることで複数指定できます。 データベース名を含むファイルは、そのファイル名の前に @ を付けることで指定できます。 このファイルは pg_hba.conf と同じディレクトリに存在する必要があります。

user

このレコードで照合する PostgreSQL ユーザーを指定します。 all という値は、すべてのユーザーと照合することを指定します。 それ以外の場合には特定の PostgreSQL ユーザーの名前になります。 ユーザーの名前はカンマで区切ることで複数指定できます。 グループ名は、そのグループ名の前に + を付けることで指定できます。 ユーザー名を含むファイルは、そのファイル名の前に @ を付けることで指定できます。 このファイルは pg_hba.conf と同じディレクトリに存在する必要があります。

IP-address
IP-mask

この 2 つのフィールドには、標準のドット区切り 10 進表記で表された IP アドレス / マスクの値が入ります。 (IP アドレスはドメインやホスト名ではなく、数値によってのみ指定できます。) 両方のフィールドを使用して、このレコードが照合するクライアントマシンの IP アドレスを指定します。 詳細な考え方は以下のようになります。

(actual-IP-address xor IP-address-field) and IP-mask-field

この演算がゼロでないとレコードと照合されません。 (もちろん IP アドレスを偽ることができますが、このテーマを考慮するのは PostgreSQL の守備範囲外です。

これらのフィールドは host および hostssl レコードにのみ適用されます。

認証方式

このレコードを利用して接続する際に使用する認証方式を指定します。 使用できる選択肢は下記のとおりですが、詳しくは Section 6.2 を参照してください。

trust

接続は無条件で許可されます。 この方式は、PostgreSQL データベースに接続できるすべてのユーザーが、任意の PostgreSQL ユーザーとしてパスワードなしでログインすることを許可します。 詳細は Section 6.2.1 を参照してください。

reject

接続は無条件に拒否されます。 特定のホストをグループから"除外"するために便利です。

md5

クライアントに対して認証で使用する MD5 暗号化パスワードを要求します。 これは暗号化パスワードを pg_shadow に保管することができる唯一の方式です。 詳細は Section 6.2.2 を参照してください。

crypt

md5 方式と似ていますが 7.2 以前のクライアントが必要とする旧式の crypt 暗号化方式を使用します。 7.2 以降のクライアントでは md5 の方が良いでしょう。 詳細は Section 6.2.2 を参照してください。

password

「md5」方式と同じですが、パスワードはネットワークを通じて普通のテキスト形式で送られます。 信頼されていないネットワークでは使用しないでください。 詳細は Section 6.2.2 を参照してください。

krb4

ユーザー認証に Kerberos V4 を使用します。 TCP/IP 接続の時のみ有効です。 詳細は Section 6.2.3 を参照してください。

krb5

ユーザー認証に Kerberos V5 を使用します。 TCP/IP 接続の時のみ有効です。 詳細は Section 6.2.3 を参照してください。

ident

クライアントのオペレーティングシステムのユーザー名を (TCP/IP 接続ではクライアント上の ident サーバーに尋ねることで、ローカル接続ではオペレーティングシステムから) 取得し、ident キーワードに続けて指定されたマップを調べることで、そのユーザーが要求されたデータベースのユーザーとして接続を許可されているかどうかを検査します。

マップに sameuser を使用している場合、オペレーティングシステムのユーザー名とデータベースのユーザー名は同一であるとみなされます。 そうでない場合は、マップの名前は pg_hba.conf と同じディレクトリにある pg_ident.conf ファイルから検索されます。 ident で得られたユーザー名と要求された PostgreSQL のユーザー名を持つマップ名の項目がこのファイルに含まれている場合、接続は許可されます。

ローカル接続の場合は、Unix ドメインソケットの信用情報 (クリデンシャル) をサポートしているマシン (現時点では LinuxFreeBSDNetBSD、および BSD/OS) でのみ機能します。

詳細は以下の Section 6.2.4 を参照してください。

pam

オペレーティングシステムによって提供される PAM(Pluggable Authentication Modules) サービスを使用した認証です。 詳細は Section 6.2.5 を参照してください。

認証のオプション

このオプションフィールドの意味は、選択された認証方式によって異なります。次の節で説明します。

pg_hba.conf レコードは接続が試みられる度に逐次的に検査されます。レコードの順序はとても大切です。 典型的には、始めのほうのレコードには厳しい接続照合パラメータと緩い照合方式があるのに対し、終りのほうのレコードにはより緩い照合パラメータとより厳しい認証方式があります。 例えば、ローカル TCP 接続ではtrust 認証方式、リモート TCP 接続に対してはパスワードを要求したいとします。 この場合、広範囲にわたって許可されるクライアントの IP アドレスに対するパスワード認証を指定するレコードの前に 127.0.0.1 からの接続に対する trust 認証指定のレコードが置かれなければなりません。

Important: スーパーユーザーが template1 データベースにアクセスすることを妨げないでください。 さまざまなユーティリティコマンドで template1 へのアクセスが必要です。

pg_hba.conf ファイルは起動時と、postmasterSIGHUP 信号を受け取ったときに読み込まれます。 稼働中のシステムでファイルを編集した場合は、(pg_ctl reload あるいは kill -HUP を使用して)postmaster にファイルをもう一度読み込むように信号を出さなければなりません。

pg_hba.confファイルの一例を Example 6-1に示します。 異なる認証メソッドの詳細についてはその後で説明します。

Example 6-1. pg_hba.conf ファイルの例

# ローカルシステム上のすべてのユーザーが、任意のデータベースに
# 任意のユーザー名で Unix ドメインソケットを使用して接続することを許可
# (ローカル接続ではデフォルト)。
#
# TYPE  DATABASE    USER        IP-ADDRESS        IP-MASK           METHOD
local   all         all                                             trust

# ローカルループバックの TCP/IP 接続であることを除いて上記に同じ。
#
# TYPE  DATABASE    USER        IP-ADDRESS        IP-MASK           METHOD
host    all         all         127.0.0.1         255.255.255.255   trust     

# IP アドレス 192.168.93.x を持つすべてのホストのすべてのユーザーが、
# ident がその接続について報告するのと同じユーザー名 (典型的には Unix ユーザー名) で
# データベース「template1」へ接続することを許可。
# 
# TYPE  DATABASE    USER        IP-ADDRESS        IP-MASK           METHOD
host    template1   all         192.168.93.0      255.255.255.0     ident sameuser

# ユーザーのパスワードが正しく入力された場合、
# ホスト 192.168.12.10 からのユーザーがデータベース「template1」へ接続することを許可。
# 
# TYPE  DATABASE    USER        IP-ADDRESS        IP-MASK           METHOD
host    template1   all         192.168.12.10     255.255.255.255   md5

# 先行する「host」行がなければ、これら 2 行によって
# (この項目が最初に照合されることから) 192.168.54.1 からの接続の試みをすべて拒否。
# 但し、インターネット上の他のすべての場所からの Kerberos V 接続は許可。
# ゼロマスクは、ホスト IP アドレスのビットを考慮せずに
# どのホストでも照合できることを意味する。
# 
# TYPE  DATABASE    USER        IP-ADDRESS        IP-MASK           METHOD
host    all         all         192.168.54.1      255.255.255.255   reject
host    all         all         0.0.0.0           0.0.0.0           krb5

# 192.168.x.x ホストからのユーザーが、ident チェックに通る場合、
# どのデータベースにでも接続を許可。もし、ident が「bryanh」と認定し
# 「bryanh」が PostgreSQL のユーザー「guest1」として
# 接続要求を出す場合、「bryanh」は「guest1」として接続が許可されますという
# マップ「omicron」に対する記載事項が pg_ident.conf にあれば接続を許可。
#
# TYPE  DATABASE    USER        IP-ADDRESS        IP-MASK           METHOD
host    all         all         192.168.0.0       255.255.0.0       ident omicron

# ローカル接続に対してたった 3 行しか記載がない場合、ローカルユーザーは 
# 自分のデータベース (ユーザー名と同じ名前のデータベース) にのみ接続許可。
# 但し管理者とグループ「support」のメンバーは
# すべてのデータベースに接続可能。
# $PGDATA/admins ファイルはユーザー名のリストを含む。  
# すべての場合にパスワードが必要。

#
# TYPE  DATABASE    USER        IP-ADDRESS        IP-MASK           METHOD
local   sameuser    all                                             md5
local   all         @admins                                         md5
local   all         +support                                        md5

# 上記の最後の 2 行は 1 つの行にまとめることが可能。
local   all         @admins,+support                                md5

# データベースの列にはリストやファイル名も使用できるが、グループは使用できない。
local   db1,db2,@demodbs  all                                       md5