我正在为即将推出的大型解决方案开发原型,并希望使用 Always Encrypted 来加密某些敏感数据库列。
我的设置如下: 数据库服务器:已安装SQL Server 2016 应用程序服务器:安装的 Reporting Server 2016 指向数据库服务器引擎。 IIS、.Net 4.6.2 等也全部设置完毕。
环境的设置方式还使得 DBA 无法读取加密数据,即使他从 Management Studio 在连接中添加“列加密设置 = 已启用”。因此,我的证书安装在应用程序服务器上,而 CMK 和 CEK 安装在数据库服务器数据库上。
我可以毫无问题地从安装在应用程序服务器上的 Web 应用程序中查看加密数据,并且 DBA 无法直接从数据库读取加密数据,因此我假设我的环境已设置良好。
正如所解释的,我在应用程序服务器上安装了 SSRS 2016,但指向数据库服务器上具有加密列的数据库。当然,我已经使用报告生成器完成了基本转储报告(用于测试目的),并且一切正常,除了未显示加密数据 - 它在 SSRS 表中保持空白!加密列只是一个基本的 nvarchar(200)
在数据源连接字符串中,我添加了“列加密设置=已启用”。如果没有它,报告将按预期显示#Error。所以我假设这也是需要的。
我还注意到,从查询设计器中我可以读取加密列。如果我从数据源中删除“列加密设置 = 已启用”,如果我没记错的话,查询设计器将显示 VarBinary。当然,我直接在应用程序服务器上使用报表生成器和查询设计器。
我尝试搜索有关如何将 SSRS 与 Always Encrypted 结合使用的任何教程,但我找不到任何内容。我发现的只是一篇帖子中的评论,SSRS 支持始终加密。
有人可以告诉我我做错了什么或我错过了什么吗?
提前致谢。
免责声明:我是 Microsoft 的项目经理。
要解决您的问题,请尝试在同一台计算机(您从中运行报表生成器)上的 SQL Server Management Studio 中以同一用户身份通过连接运行有问题的查询(在报表生成器中不返回任何数据的查询)使用“列加密设置 = 已启用”并查看是否收到任何错误消息。
我发现,如果证书未部署在托管报表生成器的计算机上,或者用户没有访问证书的权限,则在报表生成器中针对加密列的查询不会返回任何结果。您是否将证书(用作列主密钥)存储在当前用户或本地计算机存储中?如果它位于本地计算机存储中,您需要确保您(运行报表生成器的用户)有权访问该证书(您可以使用管理控制台配置证书的权限)。
运行 SSRS 服务的帐户需要对本地计算机存储中的 Always Encrypted 证书具有读取权限。右键单击证书,选择“所有任务 - 管理私钥”,然后提供 SSRS 服务帐户对该证书的读取权限。
我们面临着同样的问题,只不过错误似乎是在使用 HSM 密钥而不是证书时发生的。有人对此有深入了解吗?