标签: impersonation

在 SQL Server 中使用 IMPERSONATE 权限?

在一些阅读中,了解了 Impersonate 权限。从我读过的内容来看,这更像是创建一个用户的副本,该用户的所有权限级别都使用不同的名称。我知道这可用于在不同的登录名下执行任何查询,但最终它的用途是什么?

为什么要引入这个功能?

sql-server permissions impersonation

5
推荐指数
1
解决办法
1万
查看次数

具有执行方式、跨数据库查询和模块签名的存储过程安全性

我有一种情况,虽然我能够解决它(如重现所示),但我不明白。以下是重点

  • 两个数据库,ChainingSource 和 ChainDestination,两者都将跨数据库链接设置为 true
  • ChainingSource 中的存储过程通过EXEC(@sql)访问 ChainingDestination 中的表
  • 存储过程是用execute as子句定义的
  • 如果我尝试按原样执行该过程,它会说执行上下文的服务器主体无法访问 ChainingDestination
  • 所以我添加了一个证书和代码签名。也就是说,我将证书映射登录添加到服务器,将用户映射到每个数据库,并相应地向证书映射用户授予权限
  • 如果我保留该execute as条款,我会得到同样的错误。
  • 如果我删除该execute as条款,一切都很好。

这是我感到困惑的倒数第二点。或者,具体地,为什么一个不工作,最后一个


/******************************

            Setup

******************************/
USE [master];
go
IF EXISTS (SELECT 1 FROM [sys].[databases] WHERE [name] = 'ChainingSource')
BEGIN
    ALTER DATABASE [ChainingSource] SET OFFLINE WITH ROLLBACK IMMEDIATE;
    ALTER DATABASE [ChainingSource] SET ONLINE;
    DROP DATABASE [ChainingSource];
END
IF EXISTS (SELECT 1 FROM [sys].[databases] WHERE [name] = 'ChainingDestination')
BEGIN
    ALTER DATABASE [ChainingDestination] SET OFFLINE WITH …
Run Code Online (Sandbox Code Playgroud)

security sql-server signature certificate impersonation

5
推荐指数
1
解决办法
4287
查看次数

模拟用户或登录映射到证书

假设在数据库中创建了一个证书

create certificate certName
    with subject = 'subj';
GO
Run Code Online (Sandbox Code Playgroud)

和映射到此证书的用户

create user userName
    from certificate certName;
GO
Run Code Online (Sandbox Code Playgroud)

试图直接冒充此用户

execute as user = 'userName';
GO
Run Code Online (Sandbox Code Playgroud)

execute as在模块的子句中指定用户

create procedure procName
with execute as 'userName'
as
    set nocount on;
GO
Run Code Online (Sandbox Code Playgroud)

返回错误

消息 15517,级别 16,状态 1 ...
无法作为数据库主体执行,因为主体“userName”不存在、无法模拟此类主体或您没有权限。

但是,我找不到文档中提到的这个限制(这里这里),唯一相关的声明似乎是

user_name 必须存在于当前数据库中并且必须是单例帐户。user_name 不能是组、角色、证书、密钥或内置帐户,例如 NT AUTHORITY\LocalService、NT AUTHORITY\NetworkService 或 NT AUTHORITY\LocalSystem。

是否可以模拟映射到证书的用户(或登录)?

security sql-server signature certificate impersonation

4
推荐指数
1
解决办法
1963
查看次数

创建数据库的存储过程的执行权限

我有一个存储过程,它为需要由我们的一位数据分析师每个月运行的特定项目创建一个数据库。问题是我如何构建它以使分析师能够在不授予他们创建数据库权限的情况下运行此存储过程。

我试过用 EXECUTE 作为 OWNER/USER_NAME

分析人员仍然收到以下错误:消息 262,级别 14,状态 1,第 67 行 CREATE DATABASE 权限在数据库“master”中被拒绝。

有什么建议吗?

security sql-server stored-procedures permissions impersonation

4
推荐指数
1
解决办法
396
查看次数

SQL Server 模拟

这个问题是关于 Microsoft SQL Server 中的模拟。我想知道,如果我对特定登录拥有模拟权限,那么我可以随时轻松地模拟该登录,并且不需要使用EXECUTE AS OWNER?的存储过程。如果是这样,那么存储过程的目的是什么EXECUTE AS

security sql-server permissions impersonation

4
推荐指数
1
解决办法
5366
查看次数

如何使用 securityadmin 服务器角色模拟登录名

在 MSSQL 2008R2 上,我在不同的服务器上有两个实例,我需要同步所有登录的密码更改。我认为我可以创建一个存储过程,其中具有 securityadmin 服务器角色的用户(模拟)更改密码。

Obs:CHANGE_PASSWORD 是具有 securityadmin 服务器角色的用户。

ALTER PROCEDURE SPU_CAMBIO_PASSWORD
(
    @USER VARCHAR(50),
    @PASSWORD VARCHAR(100)
)
WITH EXECUTE AS 'CHANGE_PASSWORD'
AS
    DECLARE @STATEMENT VARCHAR(200)
    SET @STATEMENT= 'ALTER LOGIN '+ @USER+ ' WITH PASSWORD = '''+@PASSWORD+''', CHECK_POLICY =OFF'
    EXEC(@STATEMENT)
GO
Run Code Online (Sandbox Code Playgroud)

错误:无法作为服务器主体执行,因为主体“CAMBIO_PASSWORD”不存在,无法模拟此类主体,或者您没有权限。

sql-server permissions t-sql sql-server-2008-r2 impersonation

2
推荐指数
1
解决办法
561
查看次数

存储过程作为所有者执行关闭数据库连接不起作用

我创建了一个存储过程,允许用户在 QA 环境中关闭所有数据库连接。我是 SA 并创建了程序。

当我修改 SP 时,在没有“以所有者身份执行”的情况下运行它,我得到了结果。当我添加“以所有者身份执行”时,我没有收到任何结果。

试图理解为什么。

create procedure [dbo].[DatabaseConnectionClose]
    @DatabaseName varchar(255)
with execute as owner
as


DECLARE @kill varchar(8000) = '';  
SELECT @kill = @kill + 'kill ' + CONVERT(varchar(5), session_id) + ';'  
FROM sys.dm_exec_sessions
WHERE database_id  = db_id(@DatabaseName)

select @kill as CloseConnectionScript

EXEC(@kill);
Run Code Online (Sandbox Code Playgroud)

sql-server permissions sql-server-2012 connections impersonation

2
推荐指数
1
解决办法
350
查看次数