【问题标题】:Confused by default permissions of SQL User for Certificate对证书的 SQL 用户的默认权限感到困惑
【发布时间】:2018-08-21 19:44:22
【问题描述】:

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

现在,出于测试原因,我希望own_dba 通过执行存储过程sp_dba 来调用DB_B 上的视图。我希望通过使用模块签名来实现这一点。我基本上遵循了这里的说明: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(基本上只是DB_B 中某个视图上的SELECT 语句),它会显示视图的内容。

让我感到奇怪的是,在上面的代码中,我根本忘记向用户 Acc_Dbb 授予任何权限,但它工作正常。就我在互联网上找到的信息而言,我应该向用户授予足够的权限。证书中的用户是否有默认权限(使用私钥)?

我想,系统中可能存在错误。在我的第一次尝试中,我已经创建了用户 Acc_Dbb 并使他成为 db_owners 的成员。但是我在第一次尝试后放弃了这个用户。另外,在我这里提到的第二次尝试中,用户没有被标记为db_owners 的成员(或db_owners 的所有者)......

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

【问题讨论】:

  • 可能是所有权链接。 SELECT SUSER_SNAME(owner_sid), name, is_db_chaining_on, is_trustworthy_on FROM sys.databases WHERE name IN(N'DB_A', N'DB_B');的结果是什么。
  • 嗨,丹,感谢您的回答。不,既没有激活 tustworhtyness 也没有激活所有权链接。事实上,我找到了答案;)

标签: sql-server tsql permissions certificate signing


【解决方案1】:

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

【讨论】:

  • public 角色默认没有所有对象的SELECT 权限。如果没有在对象级别授予SELECT 权限,则在更高级别授予权限。
  • 是的,我认为应该是这样。我将深入研究服务器的安全设置。
猜你喜欢
  • 2022-01-03
  • 2016-05-16
  • 2020-08-04
  • 1970-01-01
  • 1970-01-01
  • 2015-11-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多