Client Authentication/ja
だれにデータベースへの接続を許可するかは、データベースディレクトリのルートにあるpg_hba.confで制御されます。 initdbを実行してデータベースクラスタを作成した時にデフォルトのファイルが作成されます。
initdbの呼び出し方法に依存してデフォルトで存在する権限は変わります。デフォルトではすべてのローカルユーザはデータベースに接続可能であるという、'trust'スキーマ内に新しいクラスタは作成されます。 しかし一部のPostgreSQLのパッケージ作成者はこれを変更しているかもしれません。たとえばRedHatの'service initdb'をクラスタ作成のために使用する場合は、以下のようなinitdbが呼び出されます。
initdb --pgdata='$PGDATA' --auth='ident sameuser'
これは、接続許可するユーザかどうかを見つけ出すためにあまり人気のないidentスキーマを使用します。慣れていないと挫折することになります。
データベースに対するネットワークアクセスに関する典型的な推奨設定は、ローカルなLANアドレスを指定し、かつ、安全なMD5パスワードを使用して認証したクライアントのみに許可するようにすることです。pg_hba.confの項目は以下のようになります。
# TYPE DATABASE USER CIDR-ADDRESS METHOD
host all all 192.168.1.0/24 md5
これにより、192.168.1.0-192.168.1.255内のIPアドレスを持つクライアントからのアクセスであり、かつ、ユーザのパスワードが正しく提供された場合のみ許可されます。 このようなネットワークアクセスは、postgresql.confの設定でlisten_addressesを許可している場合のみに許されることに注意してください。
CREATE ROLEを使用してユーザを作成した時にデータベースユーザのパスワードは設定されます。また、ALTER ROLEを使用して変更することができます。createuserはこの操作を補助するための有用なラッパースクリプトです。
ちょっとした落とし穴があります。 新しいロールを作成するためにはスーパーユーザロールでデータベースに接続する必要があります。 一番最初はどうしたらよいのでしょう? 一般的な方法のひとつはサーバ上で接続するユーザのみを信頼するようなpg_hba.confから始めることです。
# "local" はUnixドメインソケット接続専用
local all all trust
# IPv4 ローカル接続:
host all all 127.0.0.1/32 trust
データベースがこのように設定されている場合、システムにログインできる全員が自由にサーバに接続できるようになります。このためこの設定のままにしようとは思わないでしょう。ここでできることはALTER ROLEを使用してpostgresスーパーユーザに強いパスワードを付与することです。この後、サーバを停止させ、pg_hba.confですべての"trust"を"md5"設定に変更し、ネットワークブロック全体を追加、ならびにlisten_addressesを設定することができます。 次に起動しなおした時には、パスワードが分かっているスーパーユーザアカウントがありますので、これを使用してユーザ向けの通常のすべてのアカウントを作成することができます。
LDAP認証
LDAP認証を実現するためには、'md5'を以下のように置き換えなければなりません。
:ldap "ldap://server/dc=domain,dc=local;DOMAIN\"
ここでserverとdomainはどちらも名前だけでわかるかと思います。 これにより、この機能におけるユーザ報告はすべてLDAP認証を行わなければならなくなります。 バックアップ用にLDAP上に存在しないユーザ名を使用できるように、192.168.x.x範囲内のネットワークアドレスすべてにおいてこの方法を使用し、ローカルホストではmd5を使用します。 これによりサーバ自身がスーパーユーザアカウントでバックアップを始めることができるようになります。
関連記事
- PostgreSQL and pam_ldap by Adrian Nida
- NSS Authentication with libnss_pgsql by David Ford
- Authenticating PostgreSQL Clients by SecurityProNews (2002-05-21)
- LDAP Authentication against AD by Joey Wang (2007-04-13)