定義者権限のプロシージャ
人事システムの表 給与 とストアドプロシージャ 給与改定 の所有者は,DB 管理者ロールである。給与改定 は,改定額が上限を超えていないこと及び改定が承認済みであることを検査したうえで表 給与 を更新する。人事部員ロールの利用者には 給与改定 の検査を経た更新だけを行わせ,表 給与 を直接更新させず,人事部員ロール以外の利用者には給与を改定させないようにしたい。権限の設定として,最も適切なものはどれか。
- ア給与改定 を呼出し者の権限で実行するように定義し,人事部員ロールだけに 給与改定 の EXECUTE 権限を付与して,表 給与 の権限は付与しない。
- イ給与改定 を定義者の権限で実行するように定義し,人事部員ロールだけに 給与改定 の EXECUTE 権限を付与して,表 給与 の権限は付与しない。
- ウ給与改定 を定義者の権限で実行するように定義し,給与改定 の EXECUTE 権限を PUBLIC に付与して,表 給与 の権限は付与しない。
- エ給与改定 を呼出し者の権限で実行するように定義し,人事部員ロールだけに 給与改定 の EXECUTE 権限と表 給与 の UPDATE 権限を付与する。
正解と解説を見る
正解 イ
この問題の基礎知識
- ストアドプロシージャには,呼び出した利用者の権限で処理する方式(呼出し者権限,SECURITY INVOKER)と,定義者(所有者)の権限で処理する方式(定義者権限,SECURITY DEFINER)がある。
- 定義者の権限で実行するプロシージャを使うと,利用者に表への直接の権限を与えずに,プロシージャの検査を経た操作だけを許可できる。その代わり,EXECUTE 権限を与える相手を限定する必要がある。
- PUBLIC は全ての利用者(ロール)を表す。最小権限の原則に従い,権限は必要な利用者やロールにだけ付与する。
呼出し者の権限で実行するプロシージャは,呼び出した利用者の権限で表にアクセスする。人事部員ロールは表 給与 の UPDATE 権限をもたないので,給与改定 の中の更新が権限不足で失敗し,給与を改定できない。
定義者の権限で実行するので,給与改定 の中の更新は所有者である DB 管理者ロールの権限で行われ,人事部員ロールは表の権限なしに検査を経た更新だけができる。表 給与 の権限は与えないので直接の更新はできない。EXECUTE 権限を既定で PUBLIC に与える DBMS では,PUBLIC から取り消しておく。
表 給与 を直接更新できない点はよいが,EXECUTE 権限を PUBLIC に付与すると全ての利用者が 給与改定 を実行できる。所有者の権限で実行されるので,人事部員ロール以外の利用者も給与を改定できてしまう。
給与改定 による更新はできるが,人事部員ロールに表 給与 の UPDATE 権限を付与しているので,利用者はプロシージャを使わずに UPDATE 文を直接実行でき,上限額や承認状態の検査を回避できてしまう。
照合の根拠(4 件)
- イ(正解): 定義者権限なら所有者(DB 管理者ロール)の権限で表を更新できる。ア(誤り): 呼出し者権限では表の UPDATE 権限をもたない人事部員ロールの更新は失敗する(製品ドキュメント)
SECURITY INVOKER indicates that the function is to be executed with the privileges of the user that calls it. That is the default. SECURITY DEFINER specifies that the function is to be executed with the privileges of the user that owns it.
PostgreSQL Documentation: CREATE FUNCTION · SECURITY INVOKER / SECURITY DEFINER(ref/create_function.sgml)(新しいタブで開きます) - イ(正解): 定義者権限の関数は PUBLIC の既定権限を取り消し,必要な利用者だけに EXECUTE を付与する(製品ドキュメント)
Frequently you will wish to restrict use of a security definer function to only some users. To do that, you must revoke the default PUBLIC privileges and then grant execute privilege selectively.
PostgreSQL Documentation: CREATE FUNCTION · Writing SECURITY DEFINER Functions Safely(ref/create_function.sgml)(新しいタブで開きます) - ウ(誤り): PUBLIC に付与すると全てのロールが実行でき,人事部員ロール以外も給与を改定できる(製品ドキュメント)
The key word PUBLIC indicates that the privileges are to be granted to all roles, including those that might be created later.
PostgreSQL Documentation: GRANT · Description(ref/grant.sgml)(新しいタブで開きます) - エ(誤り): 表 給与 の UPDATE 権限を付与すると,プロシージャを経由せずに UPDATE 文で直接更新でき検査を回避できる(製品ドキュメント)
Allows UPDATE of any column, or specific column(s), of a table, view, etc.
PostgreSQL Documentation: Privileges · UPDATE(ddl.sgml)(新しいタブで開きます)
ISO/IEC 9075 本文は有償で読めないため PostgreSQL の文書で裏付けた(PostgreSQL ではストアドプロシージャ相当の関数に SECURITY DEFINER を指定する)。