STEP 3. アカウント管理と ビューによるセキュリティ強化
3.8 オブジェクト権限の状態(GRANT/DENY/REVOKE)
オブジェクト権限の状態
オブジェクト権限の設定時は、「許可」(GRANT)と「拒否」(DENY)、「取り消し」(REVOKE)の 3種類の状態があります。
許可がチェックされている場合は「許可」(GRANT)、拒否がチェックされている場合は「拒否」
(DENY)、どちらもチェックされていない場合は「取り消し」(REVOKE)状態です。それぞれの 違いは、後ほど試します。
ロールへ権限が与えられている場合の動作
前述したように public ロールは、すべてのデータベース ユーザーが含まれる特殊なデータベー ス ロールです。したがって、public ロールに対して、オブジェクト権限が許可(GRANT)され ている場合は、すべてのデータベース ユーザーが許可されることになります。
たとえば、次のように public ロールへ選択(SELECT)権限が許可(GRANT)され、sqlUser01 ユーザーには取り消し(REVOKE)が設定されている場合があるとします。
この場合は、sqlUser01 ユーザーは、選択権限を許可された状態と同じになります。
拒否が優先
許可(GRANT)と拒否(DENY)の両方が設定されている場合は、拒否が優先されます。たとえば、
次のように public ロールへ選択(SELECT)権限が許可(GRANT)され、sqlUser01 ユーザー には拒否(DENY)が設定されている場合があるとします。
許可(GRANT)
拒否(DENY)
どちらもチェックされていない 場合は、取り消し(REVOKE)
public
sqlUser01ユーザー
public
sqlUser01ユーザー
この場合は、拒否が優先されて、sqlUser01 ユーザーは、選択権限が拒否された状態になります。
Let's Try
それでは、オブジェクト権限を試してみましょう。
1. まずは、「社員」テーブルを右クリックして[プロパティ]をクリックし、[テーブルのプロパ ティ]ダイアログの[権限]ページを開きます。
現在は、sqlUser01 ユーザーに対して、「選択」権限が「許可」(GRANT)されていること を確認できます(Step 2 で設定しました)。
2. 続いて、public ロールに対して、オブジェクト権限を設定するために、次のように[ユーザ ーまたはロール]の[検索]ボタンをクリックします。
3. [ユーザーまたはロールの選択]ダイアログが表示されたら、[参照]ボタンをクリックしま
1
2
sqlUser01ユーザーに対して、SELECT(選択)
権限が「許可」(GRANT)されている 4
3
1
す。
[オブジェクトの参照]ダイアログでは、「public」ロールをチェックして、[OK]ボタンを クリックします。
[ユーザーまたはロールの選択]ダイアログへ戻ったら、[OK]ボタンをクリックしてダイア ログを閉じます。
4. [テーブルのプロパティ]ダイアログへ戻ったら、public ロールを選択した状態で、「更新」
と「挿入」の「許可」をそれぞれチェックします。
5. 続いて、sqlUser01 ユーザーへ権限を設定するために、「sqlUser01」ユーザーを選択して、
「選択」の「許可」がチェックされていることを確認し、「更新」の「拒否」をチェックしま す。
1
2
3
↓
1
3 2
設定後、[OK]ボタンをクリックしてダイアログを閉じます。
設定した権限をまとめると、次のようになります。
sqlUser01 でのログイン
次に、sqlUser01 ログイン アカウントでログインして、オブジェクト権限の設定を確認してみま しょう。
6. まずは、ツールバーの[データベース エンジン クエリ]ボタンをクリックします。
4 sqlUser01ユーザー
を選択 1
「選択」の「許可」がチェック されていることを確認 2
「更新」の「拒否」を チェックする 3
public
sqlUser01ユーザー
[データベース エンジンへの接続]ダイアログでは、[認証]で「SQL Server 認証」を選 択して、[ログイン]へ「sqlUser01」、[パスワード]へ「P@ssword」と入力し、[接続]
ボタンをクリックします。
7. クエリ エディターが表示されたら、「sampleDB」データベースへ接続して、「社員」テーブ ルを参照する SELECT ステートメントを実行してみましょう。
USE sampleDB SELECT * FROM 社員 WHERE 社員番号 = 2
この操作は成功し、sqlUser01 ユーザーが、社員テーブルに対して「選択」権限を持ってい ることを確認できます。
8. 次に、INSERT ステートメントを実行して、データを追加してみましょう。
INSERT INTO 社員
VALUES (7, '山田 花江', 700000, '1985/04/01')
この操作も成功し、sqlUser01 ユーザーが、社員テーブルに対して「挿入」権限を持ってい ることを確認できます。sqlUser01 ユーザーには、直接、挿入権限は許可されていませんが、
2
3 1
public ロールに対しては挿入権限が許可されているためです。
9. 次に、UPDATE ステートメントを実行してみましょう。
UPDATE 社員
SET 給与 = 400000 WHERE 社員番号 = 3
この操作は失敗し、sqlUser01 ユーザーは、「更新」権限が拒否されていることを確認できま す。オブジェクト権限は、次のように設定していました。
public ロールに対しては、更新権限を「許可」していますが、sqlUser01 ユーザーに対し ては「拒否」しています。「拒否」は、「許可」よりも優先されるので、sqlUser01 ユーザー は、UPDATE ステートメントに失敗しています。
Note: publicロールで拒否を設定した場合は、すべてのユーザーが拒否される
public ロールに対して権限を拒否した場合は、すべてのデータベース ユーザーが拒否されることに注意する必要
があります。これは次のような状況です。
public ロールに対しては、選択権限を「拒否」して、sqlUser01 ユーザーに対しては「許可」していますが、こ
の場合、sqlUser01 ユーザーは SELECT ステートメントを実行することができません(拒否が優先されます)。
また、その他のすべてのユーザーも SELECT ステートメントを実行することができなくなります。public ロール に対して権限を設定する場合は、すべてのユーザーへ影響があることに注意するようにしてください。
なお、管理者アカウント(sysdamin ロールのメンバーや dbo ユーザー)の場合は例外で、public ロールに対 して「拒否」が設定されていても、関係なくオブジェクトを参照することができます。管理者アカウントは、オブ ジェクト権限に関しても、まったく関係なくすべてのオブジェクトを操作することが可能です。
public
sqlUser01ユーザー
public
sqlUser01ユーザー