jam*_*mes 6 sql-server t-sql signature certificate
我有一个证书,用于对 SQL Server 中的存储过程进行 DB 间访问,并且能够通过使用以下方法在数据库中创建新用户来提供对存储过程的访问:
CREATE CERTIFICATE testCertificate
FROM FILE = 'test_certificate6.cer';
CREATE USER testCertificateUser
FROM CERTIFICATE testCertificate;
GRANT AUTHENTICATE TO testCertificateUser;
GRANT EXECUTE ON storedProc1 TO testCertificateUser;
Run Code Online (Sandbox Code Playgroud)
但需要能够将跨数据库访问添加到现有数据库角色(为了与现有系统兼容)。我该怎么做呢?
不,无法从登录名和用户创建角色CERTIFICATE
或ASYMMETRIC KEY
像您一样创建角色。也没有必要这样做,这样做甚至没有意义。将角色与证书或非对称密钥相关联是没有意义的原因是这种安全方式与授予权限的标准方式不同。
在授予权限的典型/常见方式中,您授予用户/登录/角色执行特定操作(身份验证/插入/创建/更新/选择/执行/等)的权限,通常针对特定对象(即架构/表/视图/函数/等)。在这里,您允许某人(或某个进程)执行(或不执行)他们要求执行的操作。
但是基于证书/非对称密钥的安全性不关心是谁发出请求,而是什么代码发出请求。这就是ADD SIGNATURE 的用武之地,因为它在发出请求的代码和该代码的权限之间建立了关联已。但是代码(即存储过程、标量 T-SQL 函数、多语句 T-SQL 函数、触发器和通过程序集的 SQLCLR 对象)不能被直接授予(或拒绝)任何权限。因此,您需要从证书或非对称密钥创建登录名和/或用户以接收这些权限,并充当这些权限的代理,以获取具有用于创建登录名和/或用户的相同证书或非对称密钥的任何代码. 并且从证书和非对称密钥创建的登录名和用户无法登录,因为它们只是这些代理权限的容器;他们不会像他们自己一样提出要求。
因此,如果您希望存储过程访问一个需要 的特定 DMV VIEW SERVER STATE
,但您不想:
IMPERSONATE
他们需要“执行为”的任何用户/登录名的权限。这让大门敞开着,可以EXECUTE AS
用来做超出此所需动作的其他事情,或者EXECUTE AS
子句的其他细微差别会导致问题,那么你会:
创建SELECT
来自该 DMV的存储过程
创建证书或非对称密钥
从该证书或非对称密钥创建登录
授予登录VIEW SERVER STATE
权限
ADD SIGNATURE
在步骤 1 中创建的存储过程上使用相同的证书或非对称密钥。
这最后一步将登录(具有正确的权限)与该存储过程联系起来。现在,存储过程本身,而不是执行该存储过程的任何登录名或用户,具有授予具有相同证书或非对称密钥的登录名的任何权限。
因此,如果您有一个角色用于授予特定数据库的对象权限,那么您只需要将基于证书的用户添加到该角色,就像您将任何其他用户添加到该角色以授予他们一样分配给该角色的权限。这类似于您EXECUTE
将存储过程授予基于证书的用户的方式,就像您授予其他用户/角色一样。