画像出典:https://bigcatfacts.net/tiger/
PostgreSQLで複数のユーザーやグループがデータベースを利用するにあたり、そのアクセス権限を取り決めて設定する必要がある。その際に設定するロールというものについて紹介する。
目次
PostgreSQLのロールとは
PostgreSQLのロールとは、ユーザやグループがデータベースへアクセスすることを管理するための仕組みだ。ロールには名前が付けられ、データベース・オブジェクト(テーブルや関数など)を所有し、他のロールからのアクセスを制限する権限を持つ。オペレーティング・システムのユーザとは完全に独立したものだ。
最初にPostgreSQL が立ち上がるとpostgresという名前のロールが作成されている。このロールは何でもできるスーパーユーザだ。それで、postgresという名前のロールから他のロールに与える権限の管理が始まる。
例えば、postgresが作成したデータベースに別のロール:Aがアクセスしようとすると、データベースへのアクセスは拒否される。
しかし、データベースを作成して所有者となったpostgresからアクセス権限がAに与えられると、Aはデータベースへのアクセスが可能になる。
では、新たにロールを作成するところから見てみよう。
ロールの作成
新しくロールを作成するためには、CREATE ROLE SQLコマンドを使って、
CREATE ROLE 名前;
とコマンドを叩けばOKだ。
以下の例はスーパーユーザpostgresがuser01という名前のロールを作成しているところだ。
別の方法として、コマンドプロンプトからcreateuserプログラムを使って、
createuser 名前;
とコマンドを叩けば同じだ。
ロールの属性
ロールの属性とは、ロールの権限を決めたり認証を行なうためのデータを設定したりするための属性のことだ。
いくつかの属性があるので、ログイン権限から見ていこう。
ログイン権限
ログイン権限とはデータベースに接続することを可能にする権限のことだ。ログイン権限を持つロールの名前を使ってデータベースに接続する。
この権限を持つロールを作成するためのSQLコマンドの書き方は簡単だ。
CREATE ROLE 名前 LOGIN;
又は、
CREATE USER 名前;
とコマンドを叩く。
CREATE ROLEとCREATE USERはほぼ同じだ。しかし、CREATE USERで作成されたロールはログイン属性を持つが、CREATE ROLEだけではログイン属性は付かないので注意が必要だ。
また、ロールの属性を変更したい時は、ALTER ROLE SQLコマンドを使用する。
権限を与えるなら、
ALTER ROLE 名前 LOGIN;
一方、権限を取り去るには、
ALTER ROLE 名前 NOLOGIN;
とコマンドを叩けばOKだ。
スーパーユーザ状態
スーパーユーザ状態はログイン以外に何でもできる権限をロールに与える。便利だが危険な場合もあるので、通常の操作ではスーパーユーザではない目的に応じたロールを使用することが進められている。
この権限を持つロールを作成するためのSQLコマンドの書き方は簡単だ。
CREATE ROLE 名前 SUPERUSER;
とコマンドを叩く。
また、ロールの属性を変更したい時は、ALTER ROLE SQLコマンドを使用する。
権限を与えるなら、
ALTER ROLE 名前 SUPERUSER;
一方、権限を取り去るには、
ALTER ROLE 名前 NOSUPERUSER;
とコマンドを叩けばOKだ。
データベース作成
データベース作成はデータベースを作成する権限をロールに与える。
この権限を持つロールを作成するためのSQLコマンドの書き方は簡単だ。
CREATE ROLE 名前 CREATEDB;
とコマンドを叩く。
また、ロールの属性を変更したい時は、ALTER ROLE SQLコマンドを使用する。
権限を与えるなら、
ALTER ROLE 名前 CREATEDB;
一方、権限を取り去るには、
ALTER ROLE 名前 NOCREATEDB;
とコマンドを叩けばOKだ。
ロール作成
ロール作成はロールを作成する権限をロールに与える。
この権限を持つロールを作成するためのSQLコマンドの書き方は簡単だ。
CREATE ROLE 名前 CREATEROLE;
とコマンドを叩く。
また、ロールの属性を変更したい時は、ALTER ROLE SQLコマンドを使用する。
権限を与えるSQLコマンドの書き方は簡単だ。
ALTER ROLE 名前 CREATEROLE;
一方、権限を取り去るには
ALTER ROLE 名前 NOCREATEROLE;
とコマンドを叩けばOKだ。
注意しなければならない点もある。ロール作成の権限ではロールを変更したり削除したりすることはできない。これらはスーパーユーザでなければできないのだ。
パスワード
パスワードはロールがデータベースに接続する時に要求される場合に必要な属性だ。
この権限を持つロールを作成するためのSQLコマンドの書き方は簡単だ。
CREATE ROLE 名前 PASSWORD 'パスワード';
とコマンドを叩く。
また、ロールの属性を変更したい時は、ALTER ROLE SQLコマンドを使用する。
権限を与えるなら、
ALTER ROLE 名前 PASSWORD 'パスワード';
一方、権限を取り去るには、
ALTER ROLE 名前PASSWORD NULL;
とコマンドを叩けばOKだ。
権限
権限とは、ユーザがテーブルや関数などデータベースのオブジェクトを使用するためにロールに与えられるものだ。オブジェクトが作成されると、そのオブジェクトの所有者が決まる。その所有者はオブジェクトを作成したロールだ。また、その所有者はオブジェクトに対してほとんどの権限を持つことになる。しかし、他のロールがオブジェクトにアクセスしようとすると、アクセスを可能にする権限が必要になる。もし、権限がなければアクセスは拒否される。
権限を与える
権限には、SELECT、 INSERT、UPDATE、DELETE、TRUNCATE、REFERENCES、TRIGGER、CREATE、CONNECT、TEMPORARY、 EXECUTE、USAGEがある。これらの権限をロールに割り当てるために、GRANT SQLコマンドを使う。
SQLコマンドの書き方は簡単だ。
GRANT 特権 ON テーブル名 TO ロール名;
とコマンドを叩く。
テーブルに対する権限の主なものについて次に説明しておく。
権限 |
内容 |
SELECT |
テーブル、ビュー、シーケンスの任意の列のデータを読み取ることを許可する。 |
INSERT |
テーブルに行を追加することを許可する。 |
UPDATE |
テーブルに対する更新を許可する。 |
DELETE |
テーブルから行を削除することを許可する。 |
まとめて権限を与える
権限を沢山のロールにひとつひとつ与えることを考えると気が遠くなる。そこで、権限をまとめてシステム内のすべてのロールに与えることができる。
GRANT SQLコマンドでPUBLICを使って、
GRANT 特権 ON テーブル名 TO PUBLIC;
とコマンドを叩けばOKだ。
また、まとめてすべての権限をロールに与える場合はGRANT SQLコマンドでALLを使う。
この場合は、
GRANT ALL ON テーブル名 TO ロール名;
とコマンドを叩く。
権限を取り去る
与えられた権限を取り去るためにGRANT SQLコマンドを使う。
SQLコマンドの書き方は簡単だ。
REVOKE 特権 ON テーブル名 FROM ロール名;
とコマンドを叩く。
ロールの削除
既に作成されたロールを削除するためには、DROP ROLE SQLコマンドを使って、
DROP ROLE 名前;
とコマンドを叩けばOKだ。
以下の例はコマンドを実行してuser01というロールを削除しているところだ。
別の方法として、コマンドプロンプトからdropuserプログラムを使って、
dropuser 名前;
とコマンドを叩いて削除することも可能だ。
ロールを確認する
既に作成されたロールはpg_rolesシステムカタログに登録されているので、その情報を表示すればよい。
登録済みのロールを確認するにはSELECT SQLコマンドを使って、
SELECT ROLNAME FROM pg_roles;
とコマンドを叩けばOKだ。
別の方法として、psqlの\duコマンドを使って、
\du
とコマンドを叩けばロール属性と共に表示される。
テーブルにアクセスするサンプル
実際にSQLコマンドを実行してロールを作成してデータベースにアクセスするところを見てみよう。
権限を持つロールを作成する
最初にスーパーユーザpostgresでpsqlを起動してログインする。
データベースにアクセスできる権限を持ったuser01という名前のロールを作成するためにCREATE ROLE user01とコマンドを叩く。
\duコマンドを使って、正しくロールが作成されたか、ロールの属性は正しいかを確認する。
実行結果としてuser01が一覧の中に表示されれば正しくロールが作成されたことになる。しかし、属性の欄を見ると、「ログインできない」としか表示されていない。これは、何も属性が与えられていないことを示している。
権限をロールに与える
データベースにアクセスするためにはロールの属性として、ログイン権限、パスワードが設定されなければならない。既に作成されたロールにこれらの属性を持たせるためにはALTER ROLE SQLコマンドを使用する。
先のセクションで作成したuser01にログイン権限を与えるためにALTER ROLE user01 LOGINとコマンドを叩く。
パスワードを設定するためにALTER ROLE user01 PASSWORD ‘1234’とコマンドを叩く。
ロールuser01がテーブルsampleの内容をSELECT SQLコマンドで見るために、SELECTを許可する権限を与える。
では、次にSELECT SQLコマンドでデータベースにアクセスしてみよう。
データベースにアクセスする
一度ログアウトし、今度はuser01でデータベースpostgresにログインする。
データベースpostgresのテーブルsampleをSELECT SQLコマンドを使ってデータを表示する。
データベースにアクセスするために必要な権限が与えられたので、テーブルのデータが表示されている。もし、権限が与えられていなければSELECTによるテーブルへのアクセスが拒否されることになる。
まとめ
このページではPostgreSQLのロールについて簡単にご紹介した。参考にしていただければと思う。
コメント