我使用跨数据库证书(如 Erland Sommarskog 所述)来控制对我环境中某个数据库的访问(SQL Server 2008 R2)。
我在数据库 A 中存储了更新数据库 B 中表的存储过程。直到现在,这一直适用于 db A 中的各种存储过程和 db B 中的表。我正在尝试更新 db B 中的表,但该表上有一个触发器。此触发器在 db B 的另一个表中插入其他数据。我收到错误消息:
消息 916,级别 14,状态 1,过程 table_trigger,第 11 行 服务器主体“sql\login”在当前安全上下文下无法访问数据库“B”。
我尝试为与证书绑定的数据库 B 用户授予插入权限以插入其他表,但它没有解决错误。除了更改触发器以使其使用之外,我还有其他选择WITH EXECUTE AS OWNER
吗?
这是复制问题的 DDL:
CREATE LOGIN [GuggTest] WITH PASSWORD=N'abcd', DEFAULT_DATABASE=[master], CHECK_EXPIRATION=OFF, CHECK_POLICY=OFF
CREATE DATABASE A;
CREATE DATABASE B;
USE A;
CREATE TABLE dbo.SPtoUpdate
(
ID INT
, ILoveFishing VARCHAR(255)
);
INSERT INTO dbo.SPtoUpdate
( ID , ILoveFishing )
VALUES ( …
Run Code Online (Sandbox Code Playgroud) 我有一个要从数据库中删除的证书。
如果我发出命令
DROP CERTIFICATE <FooCert>
Run Code Online (Sandbox Code Playgroud)
我收到错误
The certificate cannot be dropped because one or more entities are either signed or encrypted using it
Run Code Online (Sandbox Code Playgroud)
根据 Jason Strate 的说法,我应该能够找出证书签名的内容。
以下查询返回 0 行:
SELECT OBJECT_SCHEMA_NAME(co.major_id) + '.' + OBJECT_NAME(co.major_id)
FROM sys.certificates c
INNER JOIN sys.crypt_properties co ON c.thumbprint = co.thumbprint
WHERE co.crypt_type_desc = 'SIGNATURE BY CERTIFICATE'
AND c.name = 'FooCert'
Run Code Online (Sandbox Code Playgroud)
我还尝试根据这个 SO 问题将实体解耦。 /sf/ask/3672231/
如何删除对这个证书的依赖,以便我可以删除它?
题:
我正在尝试创建一个(自签名)证书并跨多个数据库和实例进行部署。
我创建和备份证书:
USE MASTER
CREATE CERTIFICATE DavesCert ENCRYPTION BY PASSWORD ='S3creT!' WITH SUBJECT = 'The master cert'
BACKUP CERTIFICATE DavesCert TO FILE = 'd:\DavesCert.cer'
WITH PRIVATE KEY ( DECRYPTION BY PASSWORD = 'S3creT!' ,
FILE = 'd:\DavesCert.pvk' ,
ENCRYPTION BY PASSWORD = 'S3creT!' );
Run Code Online (Sandbox Code Playgroud)
我用
USE FOO
GO
CREATE CERTIFICATE ERecruitStatsGatheringCert
FROM FILE = 'd:\DavesCert.cer'
WITH PRIVATE KEY (FILE = 'd:\DavesCert.pvk',
DECRYPTION BY PASSWORD = 'S3creT!')
Run Code Online (Sandbox Code Playgroud)
并收到以下错误:“请在数据库中创建主密钥或在执行此操作之前在会话中打开主密钥。”
我不想创建数据库主密钥。我很高兴根据需要通过密码解密证书。
背景: SaaS 应用程序。数据库和实例之间的多对多关系。
我需要每个数据库都能够通过执行一个存储过程来查询它自己的统计信息,该存储过程包含对 DMV 的一些调用以返回统计信息。
应用程序在低权限帐户下运行。DMV 需要 VIEW SERVER STATE …
我有一个证书,用于对 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)
但需要能够将跨数据库访问添加到现有数据库角色(为了与现有系统兼容)。我该怎么做呢?
我有一种情况,虽然我能够解决它(如重现所示),但我不明白。以下是重点
EXEC(@sql)
访问 ChainingDestination 中的表execute as
子句定义的execute as
条款,我会得到同样的错误。execute as
条款,一切都很好。这是我感到困惑的倒数第二点。或者,具体地,为什么一个不工作,最后一个呢。
/******************************
Setup
******************************/
USE [master];
go
IF EXISTS (SELECT 1 FROM [sys].[databases] WHERE [name] = 'ChainingSource')
BEGIN
ALTER DATABASE [ChainingSource] SET OFFLINE WITH ROLLBACK IMMEDIATE;
ALTER DATABASE [ChainingSource] SET ONLINE;
DROP DATABASE [ChainingSource];
END
IF EXISTS (SELECT 1 FROM [sys].[databases] WHERE [name] = 'ChainingDestination')
BEGIN
ALTER DATABASE [ChainingDestination] SET OFFLINE WITH …
Run Code Online (Sandbox Code Playgroud) 我有一个TheNotificationProcedure
对 msdb.dbo.sp_send_dbmail 进行跨数据库调用的过程。
它从服务代理队列中(间接地)调用:
CREATE QUEUE [Blah].[TheQueue]
WITH ACTIVATION (STATUS = ON, PROCEDURE_NAME = [Blah].[TheQueueProcedure],
MAX_QUEUE_READERS = 1, EXECUTE AS N'TheUser');
Run Code Online (Sandbox Code Playgroud)
TheQueueProcedure
最终打电话 TheNotificationProcedure
如果我在 SSMS 中连接TheUser
并执行TheNotificationProcedure
,则一切正常,电子邮件会发送出去。
但是,当TheNotificationProcedure
由于消息到达队列而被调用时,由于无法访问 msdb 过程而失败。
我已经尝试了所有我能想到的方法,包括在 msdb 中创建我自己的程序来包装 sp_send_dbmail 并签署我的 dbmail 包装器和TheNotificationProcedure
相同的证书,并确保 msdb 中的证书用户是“DatabaseMailUserRole”的成员。
最后,在做了许多更详细的跟踪之后,我最终注意到了以下几点:
也就是说,即使服务经纪人下执行登录的TheUser
,由于某种原因,它是数据库下执行用户的guest
,我怀疑至少部分地解释了我的权限问题。
该登录 TheUser
也映射到一个用户在MSDB叫TheUser
-它肯定是不映射到来宾。
那么为什么它在通过服务代理时在 msdb 中作为来宾执行呢?
我需要避免将数据库标记为Trustworthy
. 我希望通过签署程序(例如http://www.sommarskog.se/grantperm.html)我可以获得跨数据库传输的权限 - 是否execute as …
sql-server permissions sql-server-2008-r2 service-broker signature
我正在尝试使用 Solomon Rutzky 在其后程序集部署中提供的指导来添加“System.Messaging.dll”,并使用非对称密钥使用 UNSAFE 或 EXTERNAL_ACCESS 权限,但我在第一个障碍上失败了。
脚本的第一部分是从程序集创建证书;
CREATE CERTIFICATE [MS.NETcer] FROM EXECUTABLE FILE = 'C:\Windows\Microsoft.NET\Framework\v2.0.50727\System.Messaging.dll';
GO
Run Code Online (Sandbox Code Playgroud)
但是,当我执行此操作时,我收到错误;
Msg 15208, Level 16, State 1, Line 1
The certificate, asymmetric key, or private key file does not exist or has invalid format.
Run Code Online (Sandbox Code Playgroud)
我用来执行命令的帐户具有“sysadmin”服务器角色。这是在 SQL Server 2008 实例上。
请问有人对为什么失败有任何想法吗?
---------- 更新 1 -----------
我采纳了所罗门的建议并修改了我的脚本,使其看起来像这样;
CREATE ASYMMETRIC KEY [Key.System.Messaging] FROM EXECUTABLE FILE = 'C:\Windows\Microsoft.NET\Framework\v2.0.50727\System.Messaging.dll';
GO
CREATE LOGIN [CLR.Login.System.Messaging] FROM ASYMMETRIC KEY [Key.System.Messaging];
GO
GRANT UNSAFE ASSEMBLY TO [CLR.Login.System.Messaging];
GO
Run Code Online (Sandbox Code Playgroud)
到目前为止一切都很好。我现在运行 …
我创建了一些证书(通过CREATE CERTIFICATE)和非对称密钥(通过CREATE ASYMMETRIC KEY)并使用它们来签署和会签各种存储过程、用户定义函数(UDF)、触发器和程序集(通过ADD SIGNATURE) . 但是现在我需要找到哪些证书和/或非对称密钥已用于对哪些特定模块进行签名。
假设在数据库中创建了一个证书
create certificate certName
with subject = 'subj';
GO
Run Code Online (Sandbox Code Playgroud)
和映射到此证书的用户
create user userName
from certificate certName;
GO
Run Code Online (Sandbox Code Playgroud)
试图直接冒充此用户
execute as user = 'userName';
GO
Run Code Online (Sandbox Code Playgroud)
或execute as
在模块的子句中指定用户
create procedure procName
with execute as 'userName'
as
set nocount on;
GO
Run Code Online (Sandbox Code Playgroud)
返回错误
消息 15517,级别 16,状态 1 ...
无法作为数据库主体执行,因为主体“userName”不存在、无法模拟此类主体或您没有权限。
但是,我找不到文档中提到的这个限制(这里和这里),唯一相关的声明似乎是
user_name 必须存在于当前数据库中并且必须是单例帐户。user_name 不能是组、角色、证书、密钥或内置帐户,例如 NT AUTHORITY\LocalService、NT AUTHORITY\NetworkService 或 NT AUTHORITY\LocalSystem。
是否可以模拟映射到证书的用户(或登录)?
我们有 2 个数据库。
有一些用户想要从 HR 数据库中提取数据。但我们不想直接访问该 HR 数据库。
因此,我们在 Reporting 数据库中创建了特殊视图,并且用户拥有该 Reporting 数据库的dbowner权限。
但是,当他们尝试运行查询时,错误消息显示...
The server principal "test" is not able to access the database "HR" under the current security context.
Run Code Online (Sandbox Code Playgroud)
当我授予他们作为HR 数据库的db_datareader阅读器时,一切都很好,他们可以运行查询。但它破坏了安全性,我们不希望他们直接访问 HR 数据库。这就是我们在报告数据库中制作特殊视图的原因。
如何让这些用户在不直接访问 HR 数据库的情况下运行视图/查询?
sql-server permissions access-control sql-server-2012 signature
signature ×10
sql-server ×10
certificate ×7
permissions ×4
security ×3
encryption ×1
sql-clr ×1
t-sql ×1
trigger ×1