SQL Server:跨数据库查询;所有权链;存储过程签名/证书

时间:2019-01-29 12:09:39

标签: sql-server tsql security

我正在尝试使用已为SP签名的证书设置的权限,允许模拟的存储过程访问其他数据库中的视图。

设置(简体)

数据库A

  • 表1
  • ViewForeign:SELECT * FROM DatabaseB.ExposedView
  • ViewResult:SELECT * FROM Table1 AS t1内部联接ViewForeign VF ON t1.SomeKey = VF.SomeKey
  • 存储过程GetData-> SELECT * FROM ViewResult

数据库B:

  • 表格...
  • 查看ExposedView->选择* FROM SomeTables ...

我的DatabaseA有一些特权用户,这些用户可以做很多事情,我们称其中一个为“ SuperUser”。对于他们来说,一个用户也存在于DatabaseB中,因此他们访问DatabaseB中公开的视图没有问题。 现在,我创建了一个非常有限的用户,我们将其称为“ StupidUser”,该用户仅对DatabaseA.GetData SP具有执行权限。为了避免也授予SELECT或其他权限,我创建了SP WITH EXECUTE AS 'SuperUser' 在查询访问另一个数据库之前,一切都很好: The server principal "SuperUser" is not able to access the database "DatabaseB" under the current security context. Erland Sommarskog's blog对成为我的圣经进行了一些研究,发现所有权链接是罪魁祸首。 因此,我尝试使用DatabaseA中的证书对SP进行签名:

CREATE CERTIFICATE AccessResourcesReadOnly 
    ENCRYPTION BY PASSWORD = 'veryComplicatedPassword'
    WITH SUBJECT = 'AccessResourcesReadOnly', EXPIRY_DATE = '2029-01-31T00:00:00'
ADD SIGNATURE TO [dbo].[GetData]  BY  CERTIFICATE  AccessResourcesReadOnly WITH PASSWORD = 'veryComplicatedPassword'

卡在这里:

现在,我正在尝试为暴露的视图在DatabaseB中添加具有“连接/选择”权限的证书用户。正在运行

CREATE USER AccessResourcesFromCertificateReadOnly  
FROM CERTIFICATE AccessResourcesReadOnly;

“ DatabaseB”中的结果

Cannot find the certificate 'AccessResourcesReadOnly', because it does not exist or you do not have permission.

相反,在“ master”中创建证书没有帮助;我尝试过,然后在DatabaseA中找不到ADD SIGNATURE TO dbo.GetData或DatabaseB中找不到CREATE USER FROM CERTIFICATE的证书名称。 我究竟做错了什么?如何以允许SP访问DatabaseA.GetData的方式对DatabaseB.ExposedView进行签名?

1 个答案:

答案 0 :(得分:1)

您应该将其export certificateimport放入DatabaseB,您的证书应该同时存在于两个数据库中,因为现在您仅在DatabaseA中拥有它,这就是为什么您得到< / p>

  

找不到证书“ AccessResourcesReadOnly”,因为它确实   不存在

引用博客的完整解决方案是:

  1. 在目标数据库中创建证书,即PlaySign in 这个例子。
  2. 从证书创建用户。
  3. 向用户授予所需的权限。
  4. 导出证书。
  5. 将证书导入原始数据库。
  6. 签署相关程序。
  7. 可选:删除私钥。

P.S。对于您来说,简单的cross database chaining也可以。