カテゴリー別アーカイブ: PostgreSQL

アクセス権の設定

PostgreSQL のアクセス制御に関する設定は pg_hba.conf で行います。インストール直後の設定では local に対して trust 、つまり、データベースを動かしているホストにログインしているユーザなら、誰でもデータベースに接続できてしまいます。しかも、データベース上のどのユーザ(管理者を含む)にもなることができます。ちなみに、データベースのユーザとデータベースを動かしているホストのユーザとは直接の関係はありません。したがって UNIX 上のユーザ pgsql の権限で動いている PostgreSQL の、データベース上の管理者ユーザ pgsql とは名前が同じというに過ぎません。
とにかく、誰でもデータベースの管理者 pgsql として接続できるというのではセキュリティ上まずいので、接続できるユーザを制限しなければなりません。
すぐに思いつくのは、パスワードによる保護です。たとえば pg_hba.conf で method を md5 とすれば接続時にパスワードによる認証が行われます。このとき、MD5 によるパスワードのハッシュ値がデータベースに格納され、認証の際に利用されます。
しかし、この方法には欠点があります。データベース起動時にともなう管理作業や、データのバックアップはOSの起動時や cron などからバッチ的に行われることが一般的です。ところが、パスワードによる保護を行った場合、バッチ的に行うことが困難になってしまいます。なぜなら、OSのユーザとPostgreSQLのユーザとの間に関係がないので、OS上のユーザ pgsql の権限であろうと、root の権限であろうと、PostgreSQL の管理ユーザ pgsql として接続しようとしたときにはパスワードの入力を求められてしまうからです。
OS上のユーザ pgsql や root であれば、無条件に PostgreSQL 上のユーザ pgsql として振舞えることが必要です。もちろん、それ以外のユーザであれば、pgsql としての接続を拒否しなければなりません。
そのような場合には method を ident とする方法が利用できます。ident はその名称から identd(8) を動かさないといけないのでは、と思うかもしれませんが、ローカルで利用する際には不要です。identd sameuser とすると、OS上のユーザと同名の PostgreSQL であれば接続できるようになります。

local  all  all  ident sameuser

root 権限で pg_dump などが使用できるようにするには pg_ident.conf を使って root を pgsql にマップします。このとき、method には ident sameuser の代わりに ident mapname を使用します。ここでmapname は pg_ident.conf に記述したマップ名です。
root, pgsql が PostgreSQL ユーザ pgsql として接続できて、その他のユーザはOS上のユーザ名と一致する PostgreSQL ユーザ名で接続できるようにする設定は以下のようになります。ただし、root で接続する場合には明示的に pgsql ユーザを指定する必要があります。

pg_hba.conf:
local  all  pgsql  ident example_map
local  all  all      ident sameuser
pg_ident.conf:
example_map  pgsql  pgsql
example_map  root   pgsql