默认情况下,SQL用户的证书权限

时间:2018-08-21 19:44:22

标签: sql-server tsql permissions certificate signing

我对以下行为感到困惑:我有一个MS SQL Server实例,其中有两个数据库DB_ADB_B和登录名own_dbaown_dbb,分别是用户和成员各自数据库的db_owner角色中的位置。他们对其他各自的数据库没有任何权限。

现在,出于测试原因,我希望own_dba通过执行存储过程DB_B来调用sp_dba上的视图。我希望通过使用模块签名来实现。我基本上遵循了以下说明:https://dba.stackexchange.com/questions/86424/sql-server-chain-permission/86437#86437tsql

我所做的(通过使用SysAdmin帐户)是

USE DB_B

CREATE CERTIFICATE Acc_DBB_Cert   
   ENCRYPTION BY PASSWORD = 'MySuperPwd!'  
   WITH SUBJECT = 'Certificate to access DB_B.',   
   EXPIRY_DATE = '20201031';  
GO

CREATE USER Acc_Dbb
    FROM CERTIFICATE Acc_DBB_Cert
GO

BACKUP CERTIFICATE Acc_DBB_Cert TO FILE = 'd:\MyCertFolder\Acc_DBB_Cert'
    WITH PRIVATE KEY ( FILE = 'd:\MyCertFolder\Acc_DBB_Cert_Key' ,   
    DECRYPTION BY PASSWORD = 'MySuperPwd!',
    ENCRYPTION BY PASSWORD = 'MySuperPwd!' );  
GO

USE DB_A

CREATE CERTIFICATE Acc_DBA_Cert FROM FILE = 'd:\MyCertFolder\Acc_DBB_Cert'  
    WITH PRIVATE KEY ( FILE = 'd:\MyCertFolder\Acc_DBB_Cert_Key' ,   
                       DECRYPTION BY PASSWORD = 'MySuperPwd!',
                       ENCRYPTION BY PASSWORD = 'MySuperPwd!');
GO

ADD SIGNATURE TO [dbo].[sp_dba]
    BY CERTIFICATE Acc_DBB_Cert WITH PASSWORD = 'MySuperPwd!'
GO

我要说的是,它非常有效。我可以以own_dba的身份登录,执行sp_dba(在SELECT中的某些视图上基本上只是一个DB_B语句),它向我显示了视图的内容。

让我感到奇怪的是,在上面的代码中,我根本忘记授予用户Acc_Dbb任何权限,但是效果很好。到目前为止,据我在互联网上找到的信息,我应该向用户授予足够的权限。证书(带私钥)是否为用户提供默认权限?

我认为,系统中可能存在错误。在我的第一次尝试中,我已经创建了用户Acc_Dbb,并使其成为db_owners的成员。但是我在第一次尝试后就删除了该用户。另外,在我这里提到的第二次尝试中,未将用户标记为db_owners的成员(或db_owners的所有者)...

感谢您对此事提出任何想法! 最好的问候!

1 个答案:

答案 0 :(得分:0)

好吧,答案很简单:默认情况下,public角色对数据库的所有对象都具有SELECT权限(我认为这是一个奇怪的默认设置)。因此,用户Acc_DBB(是public的成员)被允许在视图上执行SELECT,但不允许执行UPDATEINSERT