EXECUTE ASは、ストアドプロシージャ、関数、トリガーなどに追加できます。
実行例:
CREATE PROCEDURE dbo.MyProcedure
WITH EXECUTE AS OWNER
この場合、呼び出されているモジュールの所有者になりすましています。
また、 SELFになりすます、またはモジュールを作成または変更するユーザーになりすます、または... CALLERになりすまして、モジュールが現在のユーザーの権限を取得できるようにする、または... OWNERになりすまして、呼び出されているプロシージャの所有者'user_name'
OR...偽装。特定のユーザーに偽装'login_name'
します。または...偽装すると特定のログインに偽装します。
ストアドプロシージャなどのオブジェクトに権限を設定するには、
GRANT EXECUTE ON <schema>.<procedurename> to <username>;
ただし、ログインレベルとユーザーレベルの両方でセキュリティ権限を付与することもできます。
アクセスが必要なオブジェクト(実行など)に必要な権限のみを決定して付与する必要があります。基になるすべてのオブジェクト(テーブルなど)に必要なすべての権限を付与することなく、コードを実行するために必要なアクセス許可を検証するために、別のユーザーのなりすまし"EXECUTE AS"
を可能にする機能の使用を検討してください。
ほとんどの場合、ストアドプロシージャにEXECUTE権限を付与するだけで、ストアドプロシージャ内で参照されるすべてのオブジェクトに権限が付与されます。
このように、暗黙の権限を与える必要はありません(例:データを更新したり、追加のプロシージャを呼び出したりするため)。 所有権の連鎖がこれを処理します。CREATE TABLE. EXECUTE AS
これは、動的SQLの場合、またはこれらを考慮するための便利なツールなどの高度なセキュリティタスクを作成する必要がある場合に特に役立ちます。
この例は、これらすべてを明確にするのに役立つ場合があります。
--Create a user called NoPrivUser with public access to a database (e.g. dbadb)
USE [master]
GO
CREATE LOGIN [NoPrivUser] WITH PASSWORD=N'ABC5%', DEFAULT_DATABASE=[dbadb], CHECK_EXPIRATION=ON, CHECK_POLICY=ON
GO
USE [DBAdb]
GO
CREATE USER [NoPrivUser] FOR LOGIN [NoPrivUser]
GO
注:この手順の作成者または所有者は、ターゲットデータベース内にテーブル権限を作成する必要があります。
use DBAdb
go
CREATE PROCEDURE dbo.MyProcedure
WITH EXECUTE AS OWNER
AS
IF NOT EXISTS (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N'[dbo].MyTable') AND type in (N'U'))
CREATE TABLE MyTable (PKid int, column1 char(10))
INSERT INTO MyTable
VALUES (1,'ABCDEF')
GO
GRANT EXEC ON dbo.MyProcedure TO NoPrivUser;
GO
--ここで、NoPrivUserとしてデータベースサーバーにログインし、以下を実行します。
use dbadb
go
EXEC dbo.MyProcedure
--(1 row(s) affected)
次に、NoPrivuserとしてログオンしているときに、新しいテーブルから選択してみます。
次のようになります。
select * from MyTable
go
メッセージ229、レベル14、状態5、行1オブジェクト「MyTable」、データベース「DBAdb」、スキーマ「dbo」に対するSELECT権限が拒否されました。
NoPrivUserとしてログオンしている間は、Ownerのセキュリティコンテキストでのみプロシージャを実行したため、これは予想されることです。
NoPrivUserは、実際にテーブルを読み取る権限がないため、行を作成して挿入するプロシージャを実行するだけです。
EXECUTE AS句を使用すると、ストアドプロシージャはオブジェクト所有者のコンテキストで実行されます。このコードはdbo.MyTableを正常に作成し、行は正常に挿入されます。
この例では、ユーザー「NoPrivUser」には、テーブルを変更したり、このテーブルのデータを読み取ったり変更したりする権限がまったく付与されていません。
この手順のコンテキスト内でコーディングされたこの特定のタスクを完了するために必要な権限のみを引き受けます。
高度なセキュリティ権限を永続的に割り当てることなくそれらの権限を必要とするタスクを実行できるストアドプロシージャを作成するこの方法は、非常に便利です。