第 19章クライアント認証

目次
19.1. pg_hba.conf ファイル
19.2. 認証方式
19.2.1. Trust 認証
19.2.2. パスワード認証
19.2.3. Kerberos 認証
19.2.4. Ident ベースの認証
19.2.5. PAM 認証
19.3. 認証における問題点

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

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

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

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

19.1. pg_hba.conf ファイル

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

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

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

レコードの書式は次の 7 つのうちのどれかになります。

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]
hostnossl  database  user  IP-address  IP-mask  authentication-method  [authentication-option]
host       database  user  IP-address/IP-masklen  authentication-method  [authentication-option]
hostssl    database  user  IP-address/IP-masklen  authentication-method  [authentication-option]
hostnossl  database  user  IP-address/IP-masklen  authentication-method  [authentication-option]

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

local

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

host

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

hostssl

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

このオプションを使用するためには、サーバは SSL サポートができるように構築されていなければいけません。 また、ssl 設定パラメータを有効にすることで SSL を使用可能にする必要があります (より詳細は項16.4 を参照してください)。

hostnossl

このレコードはhostssl と似ていますが、反対の動作をします。 これは、SSLを使用しない、通常の接続のみに対応します。

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

レコードと一致するには、この演算がゼロにならなければなりません。

IPv4書式で与えられたIPアドレスは、対応するアドレスを持つIPv6接続に対しても対応します。 例えば、127.0.0.1::ffff:127.0.0.1 IPv6アドレスに対応します。 IPv6書式で与えられた項目は、たとえそのアドレスがIPv6内のIPv4の範囲内であったとしてもIPv6接続のみに対応します。 IPv6書式の項目は、システムのCライブラリがIPv6アドレスをサポートしていない場合拒絶されることに注意してください。

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

IP-masklen

このフィールドは、IP-maskの記述の代替として使用可能です。 マスクで設定された有意なビット桁数を指定する整数です。 この値は0から32までの間(IPv4アドレスの場合)、もしくは128までの間(IPv6アドレスの場合)のどちらかです。 0はすべてのアドレスに一致することになり、32(もしくはアドレス体系によっては 128)は指定された正確なホストのみに一致することになります。 ドット記法IP-maskと同様の照合処理が行なわれます。

IP-address/、および/IP-masklenの間には空白文字を入れてはなりません。 さもないと、正しく解析されません。

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

authentication-method

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

trust

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

reject

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

md5

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

crypt

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

password

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

krb4

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

krb5

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

ident

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

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

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

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

pam

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

authentication-option

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

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

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

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

pg_hba.confファイルの一例を 例19-1に示します。 各種認証方式の詳細についてはその後で説明します。

例 19-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     

# CIDRマスクを使用している点を除き、前の行と同じ。
#
# TYPE  DATABASE    USER        IP-ADDRESS/CIDR-mask  METHOD
host    all         all         127.0.0.1/32          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

# CIDRマスクを使用している点を除き、前の行と同じ。
#
# TYPE  DATABASE    USER        IP-ADDRESS/CIDR-mask  METHOD
host    template1   all         192.168.93.0/24       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