-1

要求:
我有一个 SSIS 项目,它将在 SQL Server 中的数据上运行,可能使用集成身份验证登录到 SQL Server。该项目包括一个部分,允许最终用户添加选择查询作为一个数据流的源。(该产品允许用户在配置文件中添加数据分类和过滤类型规则)。
我希望用户提供的那些查询在具有只读访问权限的受限上下文中运行。一定不可能有人通过在他们的查询中 添加DELETE或来破坏数据库。DROP

第一遍解决方案:
在数据库上创建一个只读用户,用于EXECUTE AS ... WITH NO REVERT将查询的上下文限制为只读用户。不幸的是,这并不完全有效。SSIS 在数据源组件中使用预准备语句,WITH NO REVERTSQL Server 不允许在预准备语句中使用。

问题:
有没有办法强制 SSIS 使用临时查询来代替 OLEDB 数据源组件中的准备好的语句?
或...是否有另一种方法可以强制 SSIS 更改数据源组件的执行上下文?

我还有另一个解决方案:使用脚本组件源。脚本组件可以通过多种方式设置用户上下文。

4

3 回答 3

1

stackoverflow 上有一些答案建议将其包装在 BEGIN TRAN / ROLLBACK TRAN 中。这可以在单独的 SQL 任务中,消除通过偷偷注入禁用它们的能力。但是他们仍然可以将 DROP DATABASE 注入您的数据流中。没有办法回滚那个。

您是否检查过 DML 是否甚至在数据流源中运行?

我确实质疑这个架构......在 SSIS 中运行用户定义的查询?

于 2013-04-19T03:03:19.683 回答
0

您可以通过使用选项来使用ad-hoc查询。您可以创建一个变量并输入您的 sql 查询并在 OLEDB 源组件中使用它。使用 XML 配置并将变量添加到其中。因此,如果您更改将反映的 XML在 SSIS 期间。但是 SSIS 严重依赖。即使在执行之前,SSIS 也会验证元数据。如果您更改 XML 中的查询(例如更改列名),那么 SSIS 将发现元数据不匹配,并且包将OLEDB sourceSQL Command from VariablequeryruntimeMetadatafail

于 2013-04-18T10:41:22.000 回答
0

我为此确定的最终解决方案是拥有一个脚本源组件,该组件将用户提供SELECTEXECUTE AS user WITH NO REVERT. 我确信使用权限结构来防止未授权的操作比使用事务更好。

我创建了两个连接管理器。一个(称为 connection_RO)是一个 ADO.NET 连接管理器,它只由执行用户提供的查询的组件使用。另一个 (connection_RW) 用于其他一切,包括转换来自用户提供的查询的数据并将其写回。

有一个脚本源组件执行用户提供的查询。它在查询前加上 EXECUTE AS ... 子句,以将用户锁定在只读上下文中。

下一个要解决的问题是默认情况下所有连接都是池化的,当您选择以前在池中使用过的连接时,框架会发送一个sp_reset_connection. 这会引发异常,因为 SQL Server 将其视为提升权限的尝试。因此,connection_RO 连接管理器必须配置为没有池。

最终结果是我可以运行用户提供的查询,确信用户不会恶意或意外造成损害。

于 2013-04-23T09:14:28.940 回答