SQL Server上执行模拟(SQL Server Execute Impersonation)

2019-07-28 19:54发布

什么是差异性之探源...

execute as user = 'testuser'

execute as login = 'testuser'

我这些登录下执行一个跨数据库的程序,并将它与exececute作为登录工作,但不执行的用户。 跟它服务器主体“testuser的”是NT能够在securty环境下访问数据库“XXX”。

当我SELECT SYSTEM_USER这两个命令后,我看到它被设置为'testuser'

Answer 1:

execute as login提供模拟到整个服务器中,由于登录是在服务器级别。 由于用户是每个数据库定义, execute as user模拟只适用于特定的数据库,这就是为什么你当你穿越数据库看到错误。



Answer 2:

实施例为执行如:

CREATE PROCEDURE dbo.MyProcedure WITH EXECUTE AS OWNER

在这种情况下,你要模拟模块的所有者被调用。 您还可以模拟SELF,或者用户创建或更改模块或... imperonate来电,这将使到模块采取对permissionsof当前用户,还是......冒充业主,将采取的权限该过程的所有者被称为OR ...冒充“USER_NAME”,这将模拟特定用户或者......冒充“LOGIN_NAME”与将模拟特定的登录。

像存储过程对象设置权限可与“GRANT完成上执行到。
但是,您可能还需要在登录和用户级别都授予安全权限。 您将要确定并授予那些需要访问(如执行)的对象只有必要的权利。 考虑使用“EXECUTE AS”的能力使另一个用户的模拟,以验证所需要的,而无需对所有的必要的权利授予的所有物件(例如表)的执行代码的权限。 的EXECUTE AS可以被添加到存储的特效,函数,触发器等。

大多数时候,你只需要授予执行权,存储的特效,然后权限授予存储过程中引用的所有对象。 通过这种方式,你不需要给隐含的权利(例如:要更新数据或调用额外的特效)。 所有权链接为您处理此。 这是动态SQL特别有用,或者如果你需要创建提升的安全任务,例如CREATE TABLE。 EXECUTE AS是考虑这些的方便工具。

这个例子可能有助于澄清了这一切:

创建一个名为NoPrivUser用户与公众访问数据库(例如dbadb)

USE [主] 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

注:CREATOR或所有者此过程将需要在目标数据库中CREATE TABLE权利。

使用DBAdb去CREATE PROCEDURE dbo.MyProcedure WITH EXECUTE AS OWNER AS IF NOT EXISTS(SELECT * FROM sys.objects中WHERE的object_id = OBJECT_ID(N '[DBO] .MyTable')和类型中(N'U'))CREATE TABLE MyTable的(PKID INT,COLUMN1 CHAR(10))INSERT INTO MyTable的值(1, 'ABCDEF')

GRANT EXEC ON dbo.MyProcedure TO NoPrivUser; 走

- 现在登录到你的数据库服务器作为NoPrivUser并运行以下。

使用dbadb去

EXEC dbo.MyProcedure

(1行(一个或多个)受影响)

现在尝试登录时为NoPrivuser从新表中选择。

您将获得以下内容:

SELECT * FROM MyTable的去

消息229,级别14,状态5,第1行的SELECT权限被拒绝的对象 'MyTable的' 数据库 'DBAdb',架构 'DBO'。

因为你只跑了业主的安全环境下的程序登录时为NoPrivUser,预计。
NoPrivUser因为没有权利来实际读取表。 只是为了执行它创建并插入行的过程。

与EXECUTE AS子句存储过程对象所有者的上下文中运行。 此代码创建成功dbo.MyTable和行成功插入。 在这个例子中,用户“NoPrivUser”已absolutey没有授予的权利修改表,或读取或修改任何数据在此表中。
只需要在完成这一特定任务编码在这个过程的上下文所需的权限。

创建存储过程的这种方法,可以执行需要提升的安全权限,而不是永久性分配这些权利来是非常有用的任务。



Answer 3:

登录范围是在服务器级别,而用户范围是在当前数据库级别

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



文章来源: SQL Server Execute Impersonation