SQL Server执行模拟

问题描述 投票:8回答:3

...之间的区别是什么

execute as user = 'testuser'

AND

execute as login = 'testuser'

我正在这些登录名下执行跨数据库过程,它与exececute作为登录名一起工作,而不与以用户身份执行时一起工作。就是说服务器主体“ testuser”在安全性上下文下不能访问数据库“ xxx”。

[当我在两个命令后都输入SELECT SYSTEM_USER时,我看到它都设置为'testuser'

sql sql-server-2008 sql-server-2005 impersonation
3个回答
11
投票
execute as login为整个服务器提供模拟,因为登录名是在服务器级别上。由于用户是按数据库定义的,因此execute as user模拟仅适用于特定数据库,这就是为什么您在跨数据库时看到错误的原因。

3
投票
可以将EXECUTE AS添加到存储的proc,函数,触发器等

示例执行为:

CREATE PROCEDURE dbo.MyProcedure WITH EXECUTE AS OWNER

在这种情况下,您正在模拟被调用模块的

所有者。

您也可以模拟

SELF

,或USER创建或更改模块,或者...模拟CALLER,这将使模块能够获得当前用户的权限,或者...模仿OWNER,它将获得被称为OR的过程所有者的许可。模拟'user_name',它将模拟特定用户或...模拟'login_name'与将模拟特定的登录名。对存储过程之类的对象设置权限可以使用

GRANT EXECUTE ON <schema>.<procedurename> to <username>;

但是,您可能还希望在登录和用户级别上授予安全权限。 

您将要确定并授予

ONLY必要的权利用于需要访问(例如执行)的对象。考虑使用"EXECUTE AS"功能,该功能可启用另一个用户的模拟验证执行代码WITHOUT所必需的权限,该代码必须授予所有基础对象(例如表)所有必要的权限。

有时,您只需要向存储的proc授予EXECUTE权限,然后将权限授予在存储的proc中引用的所有对象。

这样,您无需授予隐式权限(例如:更新数据或调用其他proc)。

所有权链接为您处理。这对于动态sql尤其有用,或者如果您需要创建更高的安全性任务,例如CREATE TABLE. EXECUTE AS是考虑这些的便捷工具。

此示例可能有助于阐明所有这些:

--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

  
Msg 229,级别14,状态5,第1行,SELECT权限被拒绝 对象'MyTable',数据库'DBAdb',模式'dbo'。

这是可以预期的,因为您仅在以NoPrivUser身份登录时才在Owner的安全上下文中运行该过程。NoPrivUser作为没有权利实际读取表,只是执行创建和插入行的过程。

使用EXECUTE AS子句,存储过程在对象所有者的上下文中运行。此代码成功创建了dbo.MyTable,并且已成功插入行。

在此示例中,用户“ NoPrivUser”绝对没有授予修改表,读取或修改此表中任何数据的权限。它仅具有完成此过程内编码的此特定任务所需的权限。

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


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

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

© www.soinside.com 2019 - 2024. All rights reserved.