我有一个大型报表SharePoint网站,其中包含大约十二个不同的共享数据源连接,每个连接都指向一个不同的SQL服务器,该服务器由站点上托管的SSRS报告使用。每个数据源都有一个缓存帐户,用于在报表运行时检索数据,以便报表读者不必具有对所有SQL数据库的读访问权。
当具有报表构建权限的人创建报表时,他们可以选择网站上托管的其中一个共享数据源,但必须先通过身份验证弹出窗口,然后才能真正针对数据库编写查询:{{ 3}}
目前使用的策略是我们的作者确实具有对SQL数据库的读访问权并使用该身份验证(使用当前的Windows用户)来创建报告,然后当他们保存报告时,读者使用存储在共享数据源。然后,我们通过SharePoint安全性管理对报表中数据的访问,只允许应该看到该数据的人员访问该报表。
这似乎对我来说非常标准......但是
我可以通过以下步骤查询任何共享数据源有权访问的任何数据库,无论我自己的权限是否有一些rdl定义操作:
1)当前帐户需要访问报表生成器和对至少一个SQL数据源的AD访问权限(以简化操作)
2)将共享数据源添加到我有权访问
的报告中3)添加一个数据集,其查询遵循此格式SELECT''作为Field1 FROM DBNAME
4)在报表中添加一个表格,只显示查询中的Field1
5)添加一个我无权访问的共享数据源(没有阻止我将共享连接添加到报表中,我根本无法使用报表生成器来使用该数据源创建数据集)
6)在SharePoint网站上保存报告,然后将副本下载到本地计算机
7)打开rdl定义。将SQL查询的数据源替换为“未授权”数据源的名称(可以删除原始数据源)。将SQL查询替换为查询数据库以获取表名列表的SQL查询(SELECT名称为Field1 FROM sys.Tables)
8)将报告定义上传回SharePoint并运行报告
报告现在使用缓存帐户,我绕过了使用报告生成器提供的好的授权窗口。通过使用sys查询,我可以找到数据库,表,列以及最终的数据,而无需了解有关数据库的任何信息。我可以通过阻止访问master数据库来减慢这个方法的速度,这样就无法检索数据库列表,但这很小,而不是一个完整的解决方案。
选项: - 可以在数据库级别强制执行安全性,但是我不希望报表读者拥有对任何源数据库的权限。虽然每个报告都可以从视图中提取,然后单独控制以防止访问超出报告显示的任何内容,但这将是无法控制的 - 强制每个报告使用嵌入式连接而不是共享连接。移动服务器或当我们需要知道哪些报告正在使用特定连接时,这将很难管理(数据源下拉菜单中有相关项目)
我觉得我在这里遗漏了一些明显的东西,因为这似乎完全打败了托管的共享数据源的目的。
答案 0 :(得分:0)
共享数据源的优点是管理性的,因为它们可以减少更改数据源连接详细信息(如密码和服务器名称)的开销。正如您所指出的,使用共享数据源还可以轻松识别相关报告。
但是,共享数据源不是保护数据库等数据源的机制。确实需要在数据库级别解决安全问题,以确保只有授权人员才能访问。如果凭据存储在报表数据源中,那么任何能够访问该数据源或在报表中引用它的人都将能够在连接上执行查询。
我认为问题出在这一步:
5)添加一个我无权访问的共享数据源 (没有阻止我添加共享连接到 报告,我只是无法使用报表生成器来创建数据集 使用该数据源)
应该有一些方法可以阻止报表设计人员看到他们没有权限的共享数据源。您可能需要为每个项目设置单独的权限,或者将它们放在不同的位置以允许使用正确的权限进行保护。我不是Sharepoint专家,所以这只是一个建议。