【SQL実践|実務向け】PostgreSQL: 不要になった権限を安全かつ効率的に削除する `REVOKE` コマンド活用術

データベースのセキュリティと管理において、ロール(ユーザー)に付与された権限を適切に管理することは非常に重要です。不要になった権限を削除することで、意図しないデータへのアクセスを防ぎ、セキュリティリスクを低減することができます。PostgreSQL では、`GRANT` コマンドで付与した権限を `REVOKE` コマンドで削除します。本記事では、`REVOKE` コマンドの基本的な使い方から、より実践的な応用、そして注意点までを、実務で役立つ情報と具体的なサンプルコードを交えて解説します。

基礎知識:権限管理の基本と `REVOKE` コマンドの役割

PostgreSQL では、データベース内のオブジェクト(テーブル、シーケンス、関数など)に対する操作権限をロール(ユーザー)に付与・削除することで、アクセス制御を行います。`GRANT` コマンドは権限を付与するために使用され、`REVOKE` コマンドはその逆で、付与された権限を取り消すために使用されます。

`REVOKE` コマンドの基本的な構文は以下のようになります。

REVOKE [ GRANT OPTION FOR ] { { privilege [, …] | ALL [ PRIVILEGES ] }
ON object_type object_name [, …]
FROM { role_name | PUBLIC } [, …];

  • `GRANT OPTION FOR`: このオプションを指定すると、他のロールに権限を付与する権限のみが削除されます。指定しない場合は、権限そのものと、それを他のロールに付与する権限の両方が削除されます。
  • `privilege`: 削除したい権限の種類(例: `SELECT`, `INSERT`, `UPDATE`, `DELETE` など)。
  • `ALL [ PRIVILEGES ]`: 全ての権限を削除します。
  • `ON object_type object_name`: 権限を削除する対象のオブジェクト(例: `TABLE my_table`, `SEQUENCE my_sequence`, `FUNCTION my_function()`)。
  • `FROM role_name`: 権限を削除するロール名。
  • `PUBLIC`: 全てのロールから権限を削除します。

また、`REVOKE` コマンドの最後には `CASCADE` または `RESTRICT` を指定できます。

  • `RESTRICT` (デフォルト): 削除しようとしている権限が、他のロールにさらに付与されている場合、権限の削除は失敗します。
  • `CASCADE`: 削除しようとしている権限が他のロールに付与されている場合、それらの権限も連鎖的に削除します。

実装/解決策:具体的な `REVOKE` コマンドの使い方

ここでは、テーブルに対する権限を削除する例を中心に見ていきましょう。

テーブルに対する権限の削除

特定のロールから、特定のテーブルに対する権限を削除する場合の例です。

例えば、`user_a` ロールから `products` テーブルに対する `SELECT` および `UPDATE` 権限を削除するには、以下のコマンドを実行します。

REVOKE SELECT, UPDATE ON TABLE products FROM user_a;

`user_a` ロールから `products` テーブルに対する全ての権限を削除したい場合は、`ALL PRIVILEGES` を使用します。

REVOKE ALL PRIVILEGES ON TABLE products FROM user_a;

`GRANT OPTION` のみの削除

`user_a` ロールが `products` テーブルに対する `INSERT` 権限を他のロールに付与する権限だけを削除したい場合は、`GRANT OPTION FOR` を指定します。

REVOKE GRANT OPTION FOR INSERT ON TABLE products FROM user_a;

`CASCADE` を使用した連鎖削除

`user_a` ロールが `products` テーブルに対する `SELECT` 権限を持っており、さらにその権限を `user_b` ロールにも付与していたとします。この状態で `user_a` から `SELECT` 権限を削除しようとすると、デフォルトの `RESTRICT` ではエラーになります。

しかし、`CASCADE` を指定することで、`user_a` からの権限削除と同時に、`user_a` が `user_b` に付与した `SELECT` 権限も削除されます。

REVOKE SELECT ON TABLE products FROM user_a CASCADE;

サンプルプログラム:実践的な `REVOKE` コマンドの例

ここでは、`app_user` というロールから `orders` テーブルへの `INSERT` 権限を削除するシナリオを想定したサンプルコードを示します。

まず、事前に `app_user` に `orders` テーブルへの `INSERT` 権限が付与されていると仮定します。

— 事前準備:app_user ロールを作成し、 orders テーブルへの INSERT 権限を付与
— CREATE ROLE app_user LOGIN PASSWORD ‘password’;
— CREATE TABLE orders (order_id SERIAL PRIMARY KEY, item_name VARCHAR(100), quantity INT);
— GRANT INSERT ON TABLE orders TO app_user;

— 権限削除の実行
— app_user ロールから orders テーブルに対する INSERT 権限を削除します。
— ここでは CASCADE は指定していませんが、必要に応じて追加してください。
REVOKE INSERT ON TABLE orders FROM app_user;

— 削除後の確認(psql などで \dp orders; を実行すると権限が確認できます)
— 例えば、以下のような出力から INSERT 権限がなくなっていることを確認します。
— Access privileges
— Schema | Name | Type | Access privileges
— ——–+——–+——-+——————-
— public | orders | table |
— (1 row)
— ※ もし他の権限が付与されていれば、それらは表示されます。INSERT だけが削除された状態です。

このコードは、`app_user` から `orders` テーブルへの `INSERT` 権限を削除するものです。コメントで各ステップの目的を説明しています。実際に実行する際は、事前にロールやテーブルが存在すること、そして権限が付与されていることを確認してください。

応用・注意点:現場で役立つ補足情報

  • 実行権限: `REVOKE` コマンドを実行できるのは、原則としてオブジェクトの所有者、またはスーパーユーザーです。ただし、`WITH GRANT OPTION` で権限を付与されているロールは、自身が他のロールに付与した権限のみを削除できます。
  • 依存関係の確認: `CASCADE` オプションは強力ですが、意図しない権限まで削除してしまうリスクも伴います。`CASCADE` を使用する前には、`pg_depend` などのシステムカタログを調査し、権限の依存関係を把握することが重要です。
  • `PUBLIC` への権限削除: `PUBLIC` は全てのロールに共通する権限設定です。ここから権限を削除すると、全てのロールに影響するため、慎重に実行してください。
  • 権限の確認方法: `psql` クライアントを使用している場合、`\dp <テーブル名>` コマンドでテーブルに対するアクセス権限を確認できます。これにより、権限が正しく削除されたかを確認できます。
  • 最小権限の原則: 常に「必要最小限の権限」を付与する原則(Principle of Least Privilege)を意識し、定期的に権限の見直しと不要な権限の削除を行うことが、データベースセキュリティの維持に不可欠です。

`REVOKE` コマンドを適切に活用することで、PostgreSQL データベースのセキュリティを強化し、より安全で効率的な運用を実現しましょう。

コメント

タイトルとURLをコピーしました