【发布时间】:2015-11-07 02:27:56
【问题描述】:
我有一个大型报告 SharePoint 网站,其中包含大约十几个不同的共享数据源连接,每个连接都指向不同的 SQL 服务器,该服务器正在由网站上托管的 SSRS 报告使用。每个数据源都有一个缓存帐户,用于在报表运行时检索数据,这样报表读者就不必拥有对我们所有 SQL 数据库的读取权限。
当具有报表构建权限的人创建报表时,他们可以选择网站上托管的共享数据源之一,但必须通过身份验证弹出窗口才能真正针对数据库编写查询:@987654321 @
当前使用的策略是,我们的作者确实拥有对 SQL 数据库的读取权限并使用该身份验证(使用当前 Windows 用户)来创建报告,然后当他们保存报告时,读者使用存储在共享数据源。然后,我们通过 SharePoint 安全性管理对报表中数据的访问,只允许应该查看该数据的人访问报表。
这对我来说似乎都很标准......但是
我可以通过以下步骤查询任何共享数据源可以访问的任何数据库,而不管我自己的权限如何,只需执行一些 rdl 定义操作:
1) 当前帐户需要访问报表生成器和 AD 访问至少一个 SQL 数据源(以使事情变得更容易)
2) 将共享数据源添加到我有权访问的报表中
3) 添加一个数据集,其查询遵循此格式 SELECT '' as Field1 FROM DBNAME
4) 在报表中添加一个表格,只显示查询中的 Field1
5) 添加我应该无权访问的共享数据源之一(没有阻止我将共享连接添加到报表,我根本无法使用报表生成器使用该数据源创建数据集)
6) 在 SharePoint 网站上保存报告,然后将副本下载到本地计算机
7) 打开 rdl 定义。将 SQL 查询的数据源替换为“未授权”数据源的名称(可以删除原始数据源)。将 SQL 查询替换为查询数据库以获取表名列表的查询(SELECT name as Field1 FROM sys.Tables)
8) 将报表定义上传回 SharePoint 并运行报表
报告现在使用缓存帐户,我绕过了使用报告生成器提供的漂亮授权窗口。通过使用 sys 查询,我可以找到数据库、表、列以及最终的数据,而无需了解有关数据库的任何信息。我可以通过阻止对主数据库的访问来减慢此方法的速度,以便无法检索数据库列表,但这是次要的,不是一个完整的解决方案。
选项: - 可以在数据库级别强制执行安全性,但是我不希望报告读者有权访问我的任何源数据库。虽然每个报告都可以从一个视图中获取,然后单独控制以防止访问报告显示之外的任何内容,但这将是无法控制的 - 强制每个报告使用嵌入式连接而不是共享连接。这在将来移动服务器时或当我们需要知道哪些报告正在使用特定连接时将很难管理(数据源下拉菜单中提供了相关项)
我觉得我在这里遗漏了一些明显的东西,因为这似乎完全违背了托管、共享数据源的目的。
【问题讨论】:
标签: sql-server security sharepoint reporting-services