Oracleユーザーと権限管理の完全ガイド【GRANT・REVOKE・ROLE徹底解説】

当ページのリンクには広告が含まれています。

「このユーザーに何の権限を与えればいいんだっけ?」「誰がどの権限を持ってるか把握できていない」——Oracleの権限管理は種類が多くて複雑ですが、体系的に理解すれば怖くありません。本記事で完全制覇しましょう。

目次

1. ユーザー作成・削除・変更 {#user-management}

ユーザーを作成する

-- 基本のユーザー作成
CREATE USER アプリユーザー
    IDENTIFIED BY パスワード
    DEFAULT TABLESPACE USERS      -- デフォルトTBS
    TEMPORARY TABLESPACE TEMP     -- 一時TBS
    QUOTA 2048M ON USERS;         -- USERS TBSの使用上限(UNLIMITEDも可)

-- 作成直後は接続権限もないのでCONNECTを付与
GRANT CREATE SESSION TO アプリユーザー;

ユーザーのパスワード・設定を変更する

-- パスワード変更
ALTER USER アプリユーザー IDENTIFIED BY 新しいパスワード;

-- アカウントのロック / ロック解除
ALTER USER アプリユーザー ACCOUNT LOCK;
ALTER USER アプリユーザー ACCOUNT UNLOCK;

-- パスワードの期限を無期限に設定
ALTER USER アプリユーザー PASSWORD EXPIRE;   -- 次回ログイン時に変更を強制

-- TBSのクォータを変更
ALTER USER アプリユーザー QUOTA UNLIMITED ON USERS;
ALTER USER アプリユーザー QUOTA 0 ON USERS;  -- テーブル作成不可にする

ユーザーを削除する

-- ユーザーのオブジェクトも含めて完全削除
DROP USER アプリユーザー CASCADE;

-- オブジェクトがない場合のみ(CASCADEなし)
DROP USER アプリユーザー;

⚠️ CASCADEは取り消せません。本番環境では事前にオブジェクト一覧を確認してください。


2. システム権限とオブジェクト権限の違い {#privileges}

システム権限(System Privileges)

データベース全体に関わる操作を許可する権限です。

権限名できること
CREATE SESSIONDBへの接続(最低限必要)
CREATE TABLEテーブル作成
CREATE VIEWビュー作成
CREATE PROCEDUREプロシージャ・ファンクション作成
CREATE SEQUENCEシーケンス作成
CREATE INDEXインデックス作成
CREATE TRIGGERトリガー作成
CREATE USERユーザー作成(DBA向け)
DROP ANY TABLE任意テーブルの削除(危険!)

オブジェクト権限(Object Privileges)

特定のテーブル・ビュー・プロシージャなどへのアクセスを許可する権限です。

権限名対象できること
SELECTテーブル/ビューデータの読み取り
INSERTテーブル行の追加
UPDATEテーブル行の更新
DELETEテーブル行の削除
EXECUTEプロシージャ/ファンクション実行
REFERENCESテーブル外部キーの参照
INDEXテーブルインデックス作成

3. GRANT・REVOKE の使い方 {#grant-revoke}

システム権限を付与する

-- 単一権限を付与
GRANT CREATE SESSION TO アプリユーザー;
GRANT CREATE TABLE TO アプリユーザー;

-- 複数権限を一括付与
GRANT CREATE SESSION, CREATE TABLE, CREATE VIEW TO アプリユーザー;

-- WITH ADMIN OPTION:付与された権限をさらに他ユーザーに付与できる
GRANT CREATE TABLE TO アプリユーザー WITH ADMIN OPTION;

オブジェクト権限を付与する

-- 特定テーブルのSELECT権限を付与
GRANT SELECT ON SCOTT.EMP TO アプリユーザー;

-- INSERT・UPDATE・DELETEも付与
GRANT SELECT, INSERT, UPDATE, DELETE ON SCOTT.EMP TO アプリユーザー;

-- 全ユーザーに公開(PUBLICへの付与は慎重に)
GRANT SELECT ON SCOTT.EMP TO PUBLIC;

-- WITH GRANT OPTION:さらに他ユーザーへ付与可能にする
GRANT SELECT ON SCOTT.EMP TO アプリユーザー WITH GRANT OPTION;

-- 特定カラムだけUPDATEを許可
GRANT UPDATE(SAL, COMM) ON SCOTT.EMP TO アプリユーザー;

権限を取り消す(REVOKE)

-- システム権限の取り消し
REVOKE CREATE TABLE FROM アプリユーザー;

-- オブジェクト権限の取り消し
REVOKE SELECT ON SCOTT.EMP FROM アプリユーザー;

-- WITH GRANT OPTIONで付与した場合、連鎖的に取り消される
-- (Bに付与→BがCに付与の状態でAがBからREVOKE → CからもREVOKEされる)

4. ロール(ROLE)を使った権限管理 {#roles}

複数の権限をまとめてロールとして定義し、ユーザーに割り当てることができます。個別管理より圧倒的に楽です。

よく使う組み込みロール

ロール名含まれる主な権限用途
CONNECTCREATE SESSION等接続のみ(古いバージョン用)
RESOURCECREATE TABLE, PROCEDURE等開発者向け
DBAほぼ全権限管理者(本番での付与は最小限に)
SELECT_CATALOG_ROLEデータディクショナリのSELECT監視ツール用途

⚠️ DBAロールを安易に付与するのはセキュリティリスクです。必要な権限だけを付与してください。

カスタムロールを作成する

-- ロールを作成
CREATE ROLE アプリ読み取りROLE;

-- ロールに権限を付与
GRANT SELECT ON SCOTT.EMP TO アプリ読み取りROLE;
GRANT SELECT ON SCOTT.DEPT TO アプリ読み取りROLE;
GRANT SELECT ON SCOTT.SALGRADE TO アプリ読み取りROLE;

-- ユーザーにロールを割り当て
GRANT アプリ読み取りROLE TO アプリユーザー;
GRANT アプリ読み取りROLE TO 別のユーザー;

-- 一括変更が簡単!(ロールの権限を変えれば全員に反映)
GRANT SELECT ON SCOTT.BONUS TO アプリ読み取りROLE;

ロールを確認・削除する

-- 定義済みロールの一覧
SELECT ROLE FROM DBA_ROLES ORDER BY ROLE;

-- ロールを削除(付与したユーザーからも自動削除)
DROP ROLE アプリ読み取りROLE;

5. 現在の権限状況を確認するSQL {#check-privs}

自分の権限を確認する

-- 自分のシステム権限
SELECT PRIVILEGE FROM USER_SYS_PRIVS ORDER BY PRIVILEGE;

-- 自分に付与されているロール
SELECT GRANTED_ROLE, DEFAULT_ROLE FROM USER_ROLE_PRIVS ORDER BY GRANTED_ROLE;

-- 自分が持つオブジェクト権限(もらっている側)
SELECT OWNER, TABLE_NAME, PRIVILEGE, GRANTABLE
FROM USER_TAB_PRIVS
ORDER BY OWNER, TABLE_NAME, PRIVILEGE;

特定ユーザーの権限をDBAとして確認する

-- 対象ユーザーのシステム権限
SELECT GRANTEE, PRIVILEGE, ADMIN_OPTION
FROM DBA_SYS_PRIVS
WHERE GRANTEE = 'アプリユーザー'
ORDER BY PRIVILEGE;

-- 対象ユーザーのロール
SELECT GRANTEE, GRANTED_ROLE, DEFAULT_ROLE
FROM DBA_ROLE_PRIVS
WHERE GRANTEE = 'アプリユーザー';

-- 対象ユーザーのオブジェクト権限
SELECT GRANTEE, OWNER, TABLE_NAME, PRIVILEGE, GRANTABLE
FROM DBA_TAB_PRIVS
WHERE GRANTEE = 'アプリユーザー'
ORDER BY OWNER, TABLE_NAME;

ロールが持つ権限を確認する

-- ロールに含まれるシステム権限
SELECT ROLE, PRIVILEGE FROM ROLE_SYS_PRIVS
WHERE ROLE = 'アプリ読み取りROLE';

-- ロールに含まれるオブジェクト権限
SELECT ROLE, OWNER, TABLE_NAME, PRIVILEGE
FROM ROLE_TAB_PRIVS
WHERE ROLE = 'アプリ読み取りROLE';

6. よくある権限設定パターン {#patterns}

パターン①:アプリケーション専用ユーザー(読み書き)

-- ユーザー作成
CREATE USER app_user IDENTIFIED BY パスワード
    DEFAULT TABLESPACE USERS TEMPORARY TABLESPACE TEMP
    QUOTA UNLIMITED ON USERS;

-- 接続+テーブル作成+プロシージャ作成
GRANT CREATE SESSION, CREATE TABLE, CREATE VIEW,
      CREATE PROCEDURE, CREATE SEQUENCE TO app_user;

パターン②:参照専用ユーザー(バッチ・レポート用)

CREATE USER report_user IDENTIFIED BY パスワード
    DEFAULT TABLESPACE USERS TEMPORARY TABLESPACE TEMP;

-- 接続のみ + 必要なテーブルのSELECTのみ
GRANT CREATE SESSION TO report_user;
GRANT SELECT ON APP_OWNER.ORDERS TO report_user;
GRANT SELECT ON APP_OWNER.CUSTOMERS TO report_user;

パターン③:監視ツール用ユーザー(DBAビュー参照)

CREATE USER monitor_user IDENTIFIED BY パスワード;

GRANT CREATE SESSION TO monitor_user;
GRANT SELECT_CATALOG_ROLE TO monitor_user;
GRANT SELECT ON V_$SESSION TO monitor_user;
GRANT SELECT ON V_$SQL TO monitor_user;
GRANT SELECT ON V_$LOCK TO monitor_user;

7. 権限管理のアンチパターン {#antipatterns}

❌ アンチパターン①:DBAを安易に付与する

-- 危険!全権限を付与してしまう
GRANT DBA TO アプリユーザー;

→ 最小権限の原則に違反。本番では絶対NG。

❌ アンチパターン②:PUBLICに権限を付与する

-- 全ユーザーに公開してしまう
GRANT SELECT ON 機密テーブル TO PUBLIC;

→ 新規ユーザー全員が自動的に参照可能になります。

❌ アンチパターン③:WITH ADMIN OPTIONを使いすぎる

-- 付与された権限をさらに他人に付与できてしまう
GRANT CREATE TABLE TO ユーザーA WITH ADMIN OPTION;

→ ユーザーAが意図しないユーザーに権限を付与するリスクがあります。

❌ アンチパターン④:権限の棚卸しをしない

定期的に不要な権限を確認・削除しないと、退職したユーザーや不要なアカウントが残り続けます。


8. まとめ:権限管理チェックリスト {#summary}

チェック項目確認コマンド
ユーザーの一覧・ステータス確認DBA_USERS
ユーザーのシステム権限確認DBA_SYS_PRIVS
ユーザーのロール確認DBA_ROLE_PRIVS
ユーザーのオブジェクト権限確認DBA_TAB_PRIVS
ロールの権限内容確認ROLE_SYS_PRIVS, ROLE_TAB_PRIVS
DBAロール保有者の確認(危険)SELECT * FROM DBA_ROLE_PRIVS WHERE GRANTED_ROLE = 'DBA'
PUBLICへの付与確認(危険)SELECT * FROM DBA_TAB_PRIVS WHERE GRANTEE = 'PUBLIC'

権限設計の3原則:

  1. 最小権限の原則 — 必要最低限の権限だけ付与する
  2. ロールで管理 — 個別ユーザーへの直接付与より、ロールでグルーピング
  3. 定期棚卸し — 不要ユーザー・権限を定期削除(四半期推奨)

関連記事:

よかったらシェアしてね!
  • URLをコピーしました!
  • URLをコピーしました!

この記事を書いた人

ITの事や自分の経験談など綴っていきたいと思っています。

コメント

コメントする

CAPTCHA


目次