SQL Server:存储过程的 EXECUTE AS 子句未授予 sysadmin 权限

2024-01-21

我开发了一个存储过程,以便从备份文件恢复数据库并向其中添加应用程序用户。该存储过程属于master 数据库。

问题是我的 IT 部门不允许我使用管理员用户,只能使用 sysadmin 用户的 EXECUTE AS 语句。

我可以恢复数据库,但找不到在过程结束时添加用户的方法。

我使用的代码:

CREATE PROCEDURE [dbo].[myProc] 
@database VARCHAR(50)
WITH EXECUTE AS 'aSysAdminUser' 
AS
BEGIN
    --Restore the database (working)
    --Add the application user    (not working)                  
    SET @sqlScript = 'USE '+@database +';
    CREATE USER [myApplicationUser] FROM LOGIN [myApplicationUser];
    EXEC sp_addrolemember ''db_owner'', ''myApplicationUser'''
    EXEC(@sqlScript)
END

当我运行它时,出现以下错误消息:

服务器主体“aSysAdminUser”无法 访问当前安全上下文下的数据库“database”。

知道如何使用 EXECUTE AS 语句从主数据库上的存储过程在动态参数数据库名称中创建用户吗?

Thanks


您面临的问题是模拟的限制(即通过切换安全上下文EXECUTE AS)。对于数据库范围的对象,例如您指定数据库级别的存储过程user in the EXECUTE AS子句,不是服务器级别的login。因此,这个程序并不能真正起到sysadmin。但是,有一种方法可以安全地授予只是这一个存储过程 true sysadmin允许它执行动态 SQL 中的步骤的权限,即:

  1. 连接到数据库
  2. 创建用户
  3. 改变角色

执行此操作的方法是使用证书对存储过程进行签名。然后,该证书还将用于创建服务器级登录名,该登录名将添加到sysadmin服务器角色。然后,当任何用户/登录(具有EXECUTE对此存储过程的权限)执行此过程,只需由同一证书签名即可获得基于证书的登录的权限。

Step 1:在中设置证书[master]数据库:

USE [master];
GO

CREATE CERTIFICATE [BackupRestoreCert]
    ENCRYPTION BY PASSWORD = N'MyPassword'
    WITH SUBJECT = N'Certificate for Managing Backup/Restore Operation Permissions';
GO

Step 2:创建登录名并添加到sysadmin role:

CREATE LOGIN [BackupRestoreOps] FROM CERTIFICATE [BackupRestoreCert];

ALTER SERVER ROLE [sysadmin] ADD MEMBER [BackupRestoreOps];

Step 3:使用该证书签署存储过程,创建指向新登录名的链接:

ADD SIGNATURE
    TO [dbo].[myProc]
    BY CERTIFICATE [BackupRestoreCert]
    WITH PASSWORD = 'MyPassword';

以上所有内容实际上都是在[master]数据库,尽管将其分解的解释似乎更具可读性。但是,实际上,IT 人员只运行一次单个脚本。当然,如果你曾经ALTER该存储过程,他们将必须运行ADD SIGNATURE再次命令(即步骤 3),因为它会在过程定义发生任何更改时丢失。

就是这样。我已经使用问题中显示的存储过程对此进行了测试,一旦我添加了签名和sysadmin角色,创建用户并将其添加到db_owner role.

第 4 步(也许):你也许可以删除EXECUTE AS存储过程中的子句。如果它确实传递了允许初始恢复操作工作的任何权限,那么现在应该通过基于证书的登录来假定这些权限,因为它被标记为sysadmin.

免责声明
我只想/需要明确指出,据了解,鉴于问题中指定的存储过程,如其所写,will一旦授予此权限,就允许 SQL 注入。当然,这已经是IT人员决定使用该技术的初衷的结果。EXECUTE AS授予条款sysadmin对此存储过程的权限。我现在只是指出,上述步骤实际上将使他们的预期行为成为现实。如果动态 SQL 之上的步骤在传入数据库名称以外的任何内容时会出错,那就太好了,但这仍然需要为其他可能想要复制此内容并且只是复制/粘贴而不理解完整内容的人说明。语境。

有两件事应该做:

  1. 虽然是次要的一点,但输入参数的数据类型应该是sysname(别名为NVARCHAR(128))就像这样[name]定义于[sys].[databases].
  2. 要做的主要事情是验证传入的值是否是现有的数据库名称,大致如下:

    IF (DB_NAME(@database) IS NULL)
    BEGIN
       RAISERROR(N'Invalid Database Name', 16, 1);
       RETURN;
    END;
    

EDIT:
我尝试寻找另一个服务器角色来实现这一点,但不是sysadmin希望不使用这样的特权角色。我努力了dbcreator, securityadmin, serveradmin, and setupadmin,但不幸的是它们都不起作用:(。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

SQL Server:存储过程的 EXECUTE AS 子句未授予 sysadmin 权限 的相关文章

随机推荐

  • 未处理的异常:绑定尚未初始化

    i am facing this error for 3 days i have just used firebase db for authentication and i don t know how to solve it 根据他们的
  • 多个消费者从单个 kafka 分区消费

    我读到以下内容卡夫卡文档 https kafka apache org intro intro consumers Kafka 中实现消费的方式是将日志中的分区划分到消费者实例上 以便每个实例在任何时间点都是 公平份额 分区的独占消费者 K
  • 如何从 docker-compose 命令运行 2 个不同的命令:

    我想从 docker compose 为我的服务运行 2 个不同的命令 bash脚本 sh 配置 etc config yaml 目前 我的 docker compose 如下所示 我希望 bash 脚本在配置命令之后运行 docker c
  • 维基百科Python API

    我正在尝试使用 Python 的维基百科 API 查看维基百科页面中的目录 这是我的代码 gt gt gt import wikipedia gt gt gt ny wikipedia page New York gt gt gt ny s
  • Browser.ReadyState 上的致命执行错误[重复]

    这个问题在这里已经有答案了 可能的重复 NET 致命执行引擎错误 故障排除 https stackoverflow com questions 2823440 troubleshooting net fatal execution engi
  • VB.NET 的表达式主体成员?

    VB NET 支持表达式主体成员吗 到目前为止 它似乎拥有 C 中的所有内容 例如 null 条件 nameof 内插字符串 只能通过 ctor 访问的无实体自动属性等 在 C 中 语法为 string FullName gt FirstN
  • 单击鼠标获取鼠标坐标

    我正在使用下面的代码 但它并不像我想要的那样工作 而且我不知道如何实际制作它 我想要它做的是获取鼠标坐标onClick 但这发生在用户确认消息框之后 消息框 gt 用户单击确定 gt 用户单击屏幕上的任意位置 gt 获取坐标 我应该在 确定
  • Axios 请求失败,状态代码 429,但它正在与 Postman 一起使用

    我正在尝试使用访问此 APIaxios但我收到错误 状态 429 请求太多 我只发送一个请求 但仍然出现错误 但是当我尝试使用邮递员访问此网址时 它正在工作 axios post https www expedia com Hotel Se
  • Objective-C - 将图像转换为 icns

    我正在尝试为 Mac OS X 创建一个应用程序 它将图像类型转换为 icns 文件 我想知道如何开始这样做 任何建议都会很好 Thanks Kevin 使用 CGImageSource API 例如 CGImageSourceCreate
  • 无法使用 ISTIO 网关和虚拟服务连接到 HTTPS 服务

    由于我和我的所有团队成员都是 Istio 的新手 如果我们能在这里获得一些帮助 我们将不胜感激 Problem我已按照以下文档使用应用程序证书和密钥在 k8s 中创建证书并创建机密 https istio io docs tasks tra
  • 缩放单例

    在花了几个小时思考基于服务器的应用程序的一些架构问题之后 我觉得我将不得不使用单例来实现我的目标 纯粹出于以下原因 证明我的气味是合理的 我不需要将昂贵的对象传递到调用堆栈深处 我可以在任何上下文中对单例管理对象执行功能 很多代码已经存在
  • Swagger 标头定义

    我似乎找不到是否可以声明标头对象以便在响应标头中重用它 有为响应模式定义对象的示例 但它不会转置为响应标头 我只设法制作了一个可重用的响应对象 如下所示 responses DownloadOk description Dowload Ok
  • OS X clang -pthread

    在 OS X 中使用 pthread 库和 clang 的编译器 链接器要求是什么 对于 GCC 我知道使用 pthread 设置适当的编译器 链接器选项 但我不确定 OS X 与 clang 的情况 air jose clang c te
  • Symfony2 和 Doctrine2:没有为实体“X”指定标识符/主键。每个实体必须有一个标识符/主键

    我正在使用 Symfony2 创建一些虚拟项目 我遵循 Symfony2 Book 文档来使用 Doctrine 命令行创建实体 http symfony com doc current book doctrine html add map
  • 与 apache Web 服务器和 tomcat 服务器的粘性会话

    我使用 apache Web 服务器作为 apache 后面的两个 tomcat 实例的负载平衡器 当第一个请求发送到节点 A 而来自同一客户端的第二个请求发送到节点 B 时 我无法访问节点 A 内的会话变量 这是显而易见的 我在互联网上冲
  • 如何创建适合移动和桌面浏览器的平面图?

    想要创建一个办公室的动态平面图 以显示占用情况并链接到会议等 我手头有一些 AutoCAD 文件 并且一直在研究在浏览器上制作此文件的方法 在我看来 SVG 将是一个很好的竞争者 它支持大多数移动和桌面浏览器 请不要使用旧版本的 IE 但我
  • Rust 似乎在内存中为布尔数组分配与 8 位整数数组相同的空间

    Running fn main println std mem size of lt u8 1024 gt println std mem size of lt bool 1024 gt 1024 1024 这不是我所期望的 所以我编译并在
  • 找不到 Alamofire 框架

    我正在尝试将 alamofire 安装到我的项目中 以便我可以将图像上传到我的服务器 但是我似乎找不到alamofire framework文件 我已经下载了两次 git 完成了安装说明https github com Alamofire
  • SQL NOT IN 子句

    我有一个查询未按预期工作 Q1 SELECT id name FROM vw x WHERE id NOT IN select pid from table x GROUP BY id name Having max c date gt G
  • SQL Server:存储过程的 EXECUTE AS 子句未授予 sysadmin 权限

    我开发了一个存储过程 以便从备份文件恢复数据库并向其中添加应用程序用户 该存储过程属于master 数据库 问题是我的 IT 部门不允许我使用管理员用户 只能使用 sysadmin 用户的 EXECUTE AS 语句 我可以恢复数据库 但找