8

違いは何ですか...

execute as user = 'testuser'

execute as login = 'testuser'

これらのログインでクロス データベース プロシージャを実行していますが、execute as login では機能しますが、execute as user では機能しません。サーバープリンシパル「testuser」は、セキュリティコンテキストでデータベース「xxx」にアクセスできないと言っています。

両方のコマンドの後に iSELECT SYSTEM_USERが設定されていることがわかります'testuser'

4

3 に答える 3

13

execute as loginログインはサーバーレベルで行われるため、サーバー全体になりすましを提供します。ユーザーはデータベースごとに定義されるため、execute as user偽装は特定のデータベースにのみ適用されます。これが、データベース間でエラーが発生する理由です。

于 2012-04-06T15:40:53.423 に答える
3

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」には、テーブルを変更したり、このテーブルのデータを読み取ったり変更したりする権限がまったく付与されていません。
この手順のコンテキスト内でコーディングされたこの特定のタスクを完了するために必要な権限のみを引き受けます。

高度なセキュリティ権限を永続的に割り当てることなくそれらの権限を必要とするタスクを実行できるストアドプロシージャを作成するこの方法は、非常に便利です。

于 2012-06-23T00:02:35.293 に答える
2

ログインスコープはサーバーレベルであり、ユーザースコープは現在のデータベースレベルです

http://msdn.microsoft.com/en-us/library/ms181362.aspx

于 2012-04-06T15:41:38.587 に答える