第 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という名前の設定ファイルで管理されています。 (HBA とは、host-based authentication:ホストベース認証の略です。) デフォルトの pg_hba.conf ファイルはデータディレクトリが initdb でデータディレクトリが初期化される時にインストールされます。 しかし、この認証設定ファイルを他の場所に設置することができます。 hba_file設定パラメータを参照してください。

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

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

レコードは7つの書式のうちの1つの形式を取ります。

local      database  user  authentication-method  [authentication-option]
host       database  user  CIDR-address  authentication-method  [authentication-option]
hostssl    database  user  CIDR-address  authentication-method  [authentication-option]
hostnossl  database	user  CIDR-address  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]

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

local

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

host

このレコードは、TCP/IPを使用した接続に対応します。 hostレコードは、SSLもしくは非SSL接続のいずれかに対応します。

注意: サーバのデフォルトの動作は、ローカルループバックアドレスであるlocalhostのみ TCP/IP 接続を監視しています。 よってサーバにおいてlisten_addressesパラメータが適切な値に設定された状態で起動されていない限り、リモートのTCP/IP接続は出来ません。

hostssl

このレコードは、接続がSSLで暗号化されている場合にのみ TCP/IP ネットワークを使用する接続に対応します。

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

hostnossl

このレコードは、hostsslと反対の動作で、SSLを使用していないTCP/IPの接続のみに対応します。

database

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

user

このレコードで対応する PostgreSQL ユーザを指定します。 all という値は、すべてのユーザが対応することを指定します。 それ以外の場合には特定の PostgreSQL ユーザの名前になります。 ユーザの名前はカンマで区切ることで複数指定できます。 グループ名は、そのグループ名の前に + を付けることで指定できます。 ユーザ名を含むファイルを、そのファイル名の前に @ を付けることで指定できます。

CIDR-address

このレコードに対応しているクライアントマシンの IP アドレスの範囲。 これは標準のドット区切り10進表記でのIPアドレスとCIDRマスクの長さを含んでいます (IPアドレスは数値でのみ表され、ドメイン名やホスト名では表されません)。 CIDRマスク長とは、クライアントIPアドレスが一致しなければならない、高位のビット数を表すものです。 指定するIPアドレスのこれより右側のビットには、0を指定しなければなりません。 IPアドレスと/、および、CIDRマスク長の間には空白を入れてはいけません。

典型的なCIDR-addressは、単一のホストでは172.20.143.89/32、ネットワークでは172.20.143.0/24のようなものです。 単一ホストを指定するには、IPv4では32というCIDRマスクを、IPv6では128を使用してください。

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

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

IP-address
IP-mask

このフィールドはCIDR-address表記の代替として使用可能です。 マスク長を指定する代わりに、実際のマスクを分離した列で指定します。 例えば255.0.0.0はIPv4のCIDRマスク長8を意味し、255.255.255.255はCIDRマスク長32を意味しています。

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

authentication-method

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

trust

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

reject

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

md5

クライアントに対して認証時に MD5 暗号化パスワードを要求します。 詳細は 項19.2.2 を参照してください。

crypt

クライアントに対して認証時にcrypt()暗号化パスワードを要求します。 7.2以降のクライアントではmd5の方が良いのですが、7.2より前のクライアントではcryptしかサポートしていません。 詳細は 項19.2.2 を参照してください。

password

クライアントに対して認証時に平文のパスワードを要求します。 パスワードはネットワークを通じて普通のテキスト形式で送られますので、信頼されていないネットワークでは使用しないでください。 詳細は 項19.2.2 を参照してください。

krb4

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

krb5

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

ident

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

pam

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

authentication-option

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

@式により含められるファイルは、空白文字あるいはカンマのどちらかで区切られた名前の列挙として読み込まれます。 コメントは、pg_hba.confと同様に#から始まります。 また、@式を入れ子にすることもできます。 @の後のファイル名が絶対パスでない限り、参照元ファイいるが存在するディレクトリからみた相対パスであるとみなされます。

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

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        CIDR-ADDRESS          METHOD
local   all         all                               trust

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

# 分割したネットマスク列を使用していることを除いて上記に同じ
#
# 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        CIDR-ADDRESS          METHOD
host    template1   all         192.168.93.0/24       ident sameuser

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

# 先行する「host」行がなければ、これら 2 行によって192.168.54.1 からの接続
# の試みをすべて拒否。(この項目が最初に照合されるためです。)
# ただし、インターネット上の他のすべての場所からの Kerberos 5接続は許可。
# ゼロマスクは、ホスト IP アドレスのビットを考慮せずに
# どのホストでも照合できることを意味する。
# 
# TYPE  DATABASE    USER        CIDR-ADDRESS          METHOD
host    all         all         192.168.54.1/32       reject
host    all         all         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        CIDR-ADDRESS          METHOD
host    all         all         192.168.0.0/16        ident omicron

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