PostgreSQLのユーザ管理

(2012.1) ページを括りなおし。

(2013.2.12 更新.)

# ユーザとロール

標準SQL (SQL/Foundation) では, データベースユーザというのは決められていなくて,「ロール」という名前になっています。

例えば, SQLの次のような構文でロールを作ったりできます。

CREATE ROLE  [ WITH ADMIN  ]

PostgreSQLでは, 「(データベース) ユーザ」と「ロール」は同じものです。

TODO: ロールのネスト

# データベースユーザ

PostgreSQLでは、データベースに接続するためのユーザ名とOSのユーザ名は、リンクさせることもできるし、別にすることもできるようになっています。

コマンドラインでデータベースユーザ名を省略した場合は、OSのログインユーザ名でデータベースに接続しようとします。

通常は、アプリケーションからTCP/IPなどでデータベースサーバにアクセスし、これらのサーバを別のホスト(機械)にすることもありますから、このユーザ名は別にします。

データベースユーザは, PostgreSQLに登録しなければなりません。

データベースユーザの登録

コマンドライン (シェル) から登録するには createuser コマンドを、GUIだと pgAdmin III などを用います。

ユーザの作成は、postmasterが動いている状態でないとできません。また、postgresデータベースユーザか、ユーザ生成権限のあるデータベースユーザで接続しなければいけません。

createuser コマンドは、追加するデータベースユーザ名、データベース作成許可、ユーザ追加許可を聞いてくるので、順次、答えていきます。

例えば, 次のようにします。

$ /usr/local/pgsql/bin/createuser -P
Enter name of user to add: hori
Enter password for user "hori": パスワード
Enter it again: 上で入力したパスワード
Shall the new user be allowed to create databases? (y/n) y
Shall the new user be allowed to create more new users? (y/n) n
CREATE USER

データベースユーザ horiを追加し、このユーザが新しいデータベースを作成できるようにしました。

ユーザの一覧

データベースユーザの一覧は、psql コマンドでコンソールに入って、\du です。次のように表示されます。

postgres=# \du
                             List of roles
 Role name |                   Attributes                   | Member of 
-----------+------------------------------------------------+-----------
 postgres  | Superuser, Create role, Create DB, Replication | {}
 hogeuser  |                                                | {}

ユーザの削除

データベースユーザを削除するには、dropuserコマンドを実行します。

$ dropuser ユーザ名

# パスワードの設定・変更

データベースユーザのパスワードを変更するには、次のように psql コマンドのオプションでデータベース template1 を指定するか、

# psql -U postgres template1

psql でPostgreSQLサーバに接続したのちに、template1 データベースに接続しなおします。

postgres=# \connect template1
You are now connected to database "template1" as user "postgres".

"ALTER USER" SQL文でパスワードを変更します。背後に注意。

template1=# ALTER USER ユーザ名 WITH PASSWORD '新しいパスワード';
ALTER ROLE

# データベースへのアクセス権限

データベースユーザがどのデータベースに接続できるか, という認証と, データベースユーザがデータベースをどのように操作できるか, というアクセス権限は, 別です。

pg_hba.conf ファイルで database列が all 以外になっているデータベースユーザは, そのpg_hba.conf で指定されたデータベースにしか接続できません。

逆に, pg_hba.conf ファイルで database列が all のユーザは, 認証さえ通れば, どのデータベースにも接続できます。

通常は, アプリケーションサーバからデータベースサーバへ接続するので, pg_hba.conf で行う認証の設定だけで十分です。

ただ, そういつでもあるわけではありませんが, 例えばエンドユーザコンピューティングのために, 特定のテーブルに限定し, かつSELECT だけはできるようにしたいことがあります。

GRANT文を使えば, あるユーザに特定のテーブルの特定の操作だけを許可できます。

GRANT文は, 次のようになります。

GRANT 権限, ... ON テーブル名, ... TO ロール名, ...;

権限は, SELECT, INSERT, UPDATE, DELETE, REFERENCES, TRIGGER をカンマで繋げるか, ALL と書きます。

テーブルやカラムごとのアクセス権は, psql の\dp コマンドで確認できます。