从具有不同用户权限的存储过程中执行SSIS程序包


14

由于所需的特权级别不同,我在允许我的用户以合理的方式执行SSIS包时遇到问题。

场景:我们创建了一个数据仓库,其中有两个不同的SSIS软件包负责向其中加载数据,一个要自动运行(通过SQL Agent作业,并且运行良好),另一个必须在以下位置运行:一旦上游数据完成并清理等,用户的需求。

该程序包执行非常特权的操作,包括在运行开始时备份数据库(当然),删除和重新创建计算表等。

我已经编写了一个存储过程,以通过[SSISDB]。[catalog]。[create_execution]和[SSISDB]。[catalog]。[start_execution]存储过程来执行此作业。 (我是系统管理员)。

由于SSISDB和MSDB要求执行排队的高级权限,存储过程在由普通用户运行时失败,并且程序包本身由于在其(较低)安全性上下文下运行而失败。

我已经试过

我试图在存储过程中使用“ Execute As”解决问题,但是由于跨数据库链接问题,Trustworthy标志等而失败。

我还尝试通过让Agent作业运行程序包并仅从存储过程运行Agent作业来解决该问题,但是我很快陷入了一个痛苦的世界,涉及到:

  • 无法按工作设置执行权限
  • 希望通过中央服务器角色配置此访问权限,以适应随时间推移而变化的员工,并且作业只能由一个用户作为所有者
  • 代理帐户,凭据与sql-auth登录等结合使用的黑暗世界

计划C和D

我能想到的唯一的选择就是创建具有提升权限的专用SQL Server登录名,并相信用户不要传递凭据,也不会丢失计划导入的人员的可审核性(在其他方面解决此问题的方法)组织)或自定义构建Web前端,纯粹是为了允许用户认证为“服务器角色”帐户,然后让Web应用在第二个(特权)连接下运行存储过程。

所以....

是否有关于如何进行以下操作的建议:

  • 让SSIS包执行特权操作
  • 特权较低的用户(使用AD Windows帐户)执行
  • 最好是通过中央服务器角色来管理运行作业的访问权限(我不容易为它们创建新的Windows组)
  • 并且任何新的中级/代理帐户都是SQL Server Auth帐户(同样,对AD进行更改的能力非常有限)

我知道这里有很多活动部件(有些感觉就像是旋转的刀片),所以请让我知道您是否还想念其他信息。

蒂姆,干杯

编辑....

因此,今天我创建了一个具有ssis_admin权限的专用SQL Server登录,创建了该用户拥有的三个SQL Server Agent作业,并将最终用户调用的存储过程更新execute as为该用户。由于无法调用create executionSQL Server登录名而失败,它需要Windows帐户。

我将用户存储过程更新为execute asWindows帐户,SQL Server以(AD服务帐户)身份运行,并且授予该证书ssis_admin,但失败并显示错误

当前的安全上下文无法还原。请切换到调用“ Execute As”的原始数据库,然后重试。

这并不能很快实现:(


1)他们是否必须通过启动程序包,create_execution 他们是否需要在执行时为其“数据准备就绪的情况”指定参数?2)可以肯定地认为您不希望将它们放在ssis_admin角色中吗?
billinkc

1)我正在使用,create_execution因为我确实需要将一个参数(三个值之一)从存储过程传递到作业。如果能够解决问题,我很高兴拥有三个存储库/作业等。2)如果ssis_admin是让我到达那里的最低特权角色,那么我很乐意……至少比sysadmin更好,并且可以解决它们意外删除/伪装通用仓库表的问题。
Wokket

ssis_admin角色将允许他们运行SSIS包(procs检查sysadmin或ssis_admin角色的成员身份),但我认为它将像它们一样运行,因此无法进行备份等。(我必须对此进行测试,以至于永远无法记住它是否以它们或SQL Server服务帐户的身份运行)。但是,成为ssis_admin的成员可以使他们部署程序包并混淆配置,这可能不是好事。2016年给了我们更精细的角色,但在这里显然没有多用
billinkc

我认为风险最小的将是拥有3个硬编码的作业,这些作业使用经过认证的用户/帐户的正确组合来实现最低特权状态。然后,我将考虑授予这些用户运行作业的能力,或者禁止这些用户创建三个proc,EXECUTE AS以使他们可以通过来运行特定的作业sp_start_job。说安全性
很差

@billinkc我认为ssis_operator可以
Tom V-试试topanswers.xyz

Answers:


2

为了后代,我通过以下方式进行了此工作:

  • 更改用户(Admin.RunImport)调用的存储过程,以“执行为” SQL服务所使用的帐户
  • 修改了SQL Server服务帐户(AD托管服务帐户)以具有执行Admin程序的权限,从而允许使用execute as上述命令
  • 将SQL Server服务帐户修改为具有ssisdb.ssis_admin和msdb.SQlAgentOperator角色。
  • Admin.RunImport存储过程sp_start_job根据所传递的参数 使3个代理作业之一排队
    • 需要通过SQL Agent进行此重定向才能绕过上述ssis安全上下文错误
    • 代理作业由“ sa”拥有,并且只需执行一个基础存储过程(Raw.hp_Execute_Import_Impl),并为每个作业传递不同的参数。
    • 这意味着,sa由于上面的ssis_admin privelege ,代理作业将按计划的作业运行
  • Raw.hp_Execute_Import_Impl存储过程队列SSIS包的sa一样正常。

为了能够为此目的创建专用的Windows帐户,我认为这与我现在要达到的效果一样好。

感谢您的帮助!


2
感谢您回来并发布解决方案。现在,当您再次遇到此问题而忘记了所做的事情时,您可以在网上搜索,然后找到自己的解决方案!
Nick.McDermaid
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.