CodeGym /コース /SQL SELF /GRANTとREVOKEでアクセス権限を設定する

GRANTとREVOKEでアクセス権限を設定する

SQL SELF
レベル 47 , レッスン 2
使用可能

データってまるでお城みたいなもので、住人それぞれに権限があるんだ。誰かは中庭を歩くだけ、誰かは宝物庫の鍵を持ってるし、誰かは玉座の間で全体を管理してる。データベースでは、この役割をGRANTREVOKEコマンドが担ってる。つまり「誰がどこに何のために行けるか」を決めるやつだね。

GRANTコマンドは、普通のgrant(助成金)みたいに、特定のロールにリソース(例えばデータベース、テーブル、スキーマなど)へのアクセスを与えるもの。いわば「パーティーへの招待状」みたいなもので、誰が読む・書く・家具を壊す(?)かを決める感じ。

REVOKEコマンドは逆に、前に与えた権限を取り上げるやつ。「おい、パーティーは君には終わりだよ、鍵は出口に置いてって」みたいな感じ。

GRANTで権限を与える

まずは一番上のレベル、データベースから始めよう。ユーザーがデータベースに接続できるようにするには、接続権限を与える必要がある。そのためにはこのコマンドを使う:

GRANT CONNECT ON DATABASE database_name TO role_name;

例えば、universityというデータベースとstudentというロールがあるとする。学生たちに接続を許可するには、次のクエリを実行する:

GRANT CONNECT ON DATABASE university TO student;

でも、接続できるだけじゃ何でもできるわけじゃない。ユーザーがデータベース内でオブジェクトを作れるようにするには、さらにCREATE権限が必要:

GRANT CREATE ON DATABASE university TO student;

データベースの権限はこのコマンドで確認できるよ:

\l+ university

REVOKEで権限を取り消す

もし学生が怪しい動きをし始めたら(例えば、想定以上にテーブルを作ろうとしたり)、CREATE権限を取り消すことができる:

REVOKE CREATE ON DATABASE university FROM student;

これで学生は接続だけできて、もう「クリエイティブな暴走」はできなくなる。

スキーマレベルでの権限設定

スキーマは、データベースの中の「部屋」みたいなもので、テーブルやビュー、他のオブジェクトが入ってる。ユーザーがスキーマ内のオブジェクトを扱うには、読み取り・書き込み・作成の権限を設定できる。

スキーマへの権限付与

例えば、publicスキーマ(これはどのデータベースにもデフォルトであるやつ)があるとする。ユーザーにスキーマの中身を見せたい場合:

GRANT USAGE ON SCHEMA public TO student;

でもUSAGEだけじゃテーブル操作はできない。新しいオブジェクトを作れるようにするには:

GRANT CREATE ON SCHEMA public TO student;

これで学生はpublicスキーマ内でテーブルを読んだり作ったりできるようになる。

スキーマ権限の取り消し

もし学生がbad_idea_01みたいな変なテーブルを作り始めたら、権限を制限できる:

REVOKE CREATE ON SCHEMA public FROM student;

これで新しいテーブルは追加できなくなる。秩序復活!

テーブルレベルでの権限設定

テーブルはたぶんデータベースで一番人気のオブジェクト。テーブルへのアクセスをどう設定するか見てみよう。主に3つのアクションがある:読み取り、書き込み、変更。

読み取り権限

ユーザーにテーブルの中身を読ませたい場合はこのコマンド:

GRANT SELECT ON TABLE table_name TO role_name;

例えば、学生たちにcoursesテーブルのレコードを読ませたい場合:

GRANT SELECT ON TABLE courses TO student;

これでstudentユーザーはcoursesテーブルでSELECTクエリを実行できる。

書き込み権限

ユーザーにテーブルへ新しい行を追加させたい場合はこうする:

GRANT INSERT ON TABLE table_name TO role_name;

例:

GRANT INSERT ON TABLE courses TO student;

これで学生は新しいコースをテーブルに追加できる。でもちょっと待って…本当にそれでいいのかな?

変更・削除権限

ユーザーが既存の行を更新したり削除したりできるようにするには、UPDATEDELETE権限を与える必要がある。

GRANT UPDATE ON TABLE courses TO student;
GRANT DELETE ON TABLE courses TO student;

アドバイス:この権限は乱用しないようにしよう。学生に削除権限を与えると、うっかり(あるいはわざと)全部消しちゃうかも。

例:制限付き権限のロールを作る

例えば、先生用のロールを作りたいとする。先生は学生やコースのデータを読めるけど、削除はできないようにしたい。こうやってやる:

  1. ロールを作成:
CREATE ROLE teacher;
  1. studentscoursesテーブルの読み取り権限を与える:
GRANT SELECT ON TABLE students, courses TO teacher;
  1. 削除権限を制限:
REVOKE DELETE ON TABLE students, courses FROM teacher;

これで先生たちは必要な権限だけ持って、余計なことはできなくなる。

GRANTREVOKEを組み合わせて柔軟に設定する方法

例えば、internというロールがあって、これを制限したいとする。コースのデータだけアクセスできて、学生のデータには絶対アクセスさせたくない。こうやる:

  1. coursesテーブルだけアクセス許可:
GRANT SELECT, INSERT ON TABLE courses TO intern;
  1. internロールがstudentsテーブルに権限を持っていないことを確認:
REVOKE ALL ON TABLE students FROM intern;

この組み合わせで、アクセス権限をピンポイントで調整できる。

実際のプロジェクトでの利用例

このアクセス管理の仕組みは、実際のプロジェクトでもよく使われてる。例えば:

  1. ネットショップでは、ユーザーテーブルや注文テーブルの権限が「admin」「operator」「guest」などのロールごとに分かれてる。
  2. 大学システムでは、管理者はコースを追加・編集できて、学生は閲覧だけ。
  3. 銀行システムでは、顧客アカウントへのアクセスが部署ごとに分けられてる。
コメント
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION