Невозможно создать хранимые процедуры с EXECUTE AS с использованием принципала на основе сертификата

Я пытаюсь воссоздать сертификат с истекшим сроком действия, который использовался на наших серверах для создания принципов, а затем эти принципы использовались с олицетворением для выполнения хранимых процедур.

Это то, что я делаю (конечно, намного сложнее в продакшене, но этот точный тест также не проходит).

Use ReportingDb
GO

CREATE CERTIFICATE MyCertTest ENCRYPTION BY PASSWORD = 'acrazygoodpassword'
   WITH SUBJECT = 'Stored procedure signing for Reports'
      ,EXPIRY_DATE = '11/18/2019';
GO

BACKUP CERTIFICATE MyCertTest TO FILE = 'D:\MyCertTest.CER';
GO

CREATE USER TestReportUser
FROM CERTIFICATE MyCertTest;
GO

EXEC sp_addrolemember 'db_datareader','TestReportUser';

GRANT AUTHENTICATE
   TO TestReportUser;
GO

GRANT EXECUTE
   TO TestReportUser;
GO


USE Master;
GO

CREATE CERTIFICATE MyCertTest
FROM FILE = 'D:\MyCertTest.CER';
GO
CREATE USER TestReportUser
FROM CERTIFICATE MyCertTest;
GO
EXEC sp_addrolemember 'db_datareader','TestReportUser';

GRANT AUTHENTICATE
   TO TestReportUser;

GRANT EXECUTE
   TO TestReportUser;
GO


use ReportingDb
GO

CREATE PROCEDURE dbo.Reports_DC_Project_sp
WITH EXECUTE AS 'TestReportUser'
AS
SELECT 1
GO

Не уверен, действительно ли мне нужна мастер-часть базы данных. Все это успешно до создания хранимой процедуры, затем:

Msg 15517, уровень 16, состояние 1, процедура Reports_DC_Project_sp, строка 47
Невозможно выполнить в качестве участника базы данных, потому что участник «TestReportUser» не существует, этот тип участника не может быть олицетворен или у вас нет разрешения.

Я также пробовал создать хранимую процедуру с EXECUTE AS 'dbo'. Это отлично работает ... затем добавление подписи к хранимой процедуре и, наконец, изменение хранимой процедуры для выполнения от имени моего пользователя сертификата. Та же ошибка на последнем шаге.

Есть ли параметр / шаг, который мне не хватает?


person maplemale    schedule 18.11.2016    source источник
comment
Всем привет. Удалось ли вам заставить это работать? Я опубликовал ответ ниже, в котором объясняется, почему это происходит и как это исправить.   -  person Solomon Rutzky    schedule 19.01.2017


Ответы (2)


используйте [имя базы данных]

GO

EXEC sp_changedbowner 'sa'

GO

person arnav    schedule 02.01.2017

Я пытаюсь воссоздать сертификат с истекшим сроком действия, который использовался на наших серверах для создания принципов ...

Гм, нет. Даты истечения срока действия сертификата не проверяются / не проверяются ни при создании из них принципалов, ни даже при их использовании с ДОБАВИТЬ ПОДПИСЬ, чтобы подписать модуль.

а затем эти принципы использовались с олицетворением для выполнения хранимых процедур.

Определенно нет. Этого не произошло, потому что это технически невозможно; Принципы на основе сертификатов и ассиметричных ключей не могут использоваться для олицетворения.

Не уверен, действительно ли мне нужна мастер-часть базы данных.

Нет это не так. В этом использовании он ничего не делает. Если вы хотите связать разрешения на уровне сервера (т. Е. Экземпляра) (даже членство в роли sysadmin) для сертификата и каждого модуля, подписанного им, вы должны восстановить сертификат в master, как вы показали, но затем вы должны создать Войдите в систему с помощью этого сертификата и предоставьте ему соответствующие разрешения. Создание пользователя в master ничего не делает, если в базе данных master нет чего-то особенного, с которым пользователю необходимо взаимодействовать. Но что касается вашего теста, это совершенно неважно.

Кроме того, предоставление AUTHENTICATE на основе сертификата совершенно неуместно и бесполезно, поскольку участники на основе сертификата и асимметричного ключа не могут пройти аутентификацию. Вообще. Всегда.

затем добавление подписи к хранимой процедуре и, наконец, изменение хранимой процедуры для выполнения от имени моего пользователя сертификата.

Даже если бы было возможно ВЫПОЛНИТЬ КАК принципал на основе сертификата или асимметричного ключа, было бы бессмысленно добавлять подпись перед изменением хранимой процедуры с помощью предложения EXECUTE AS, поскольку этот оператор ALTER автоматически аннулирует подпись . Подписи автоматически удаляются при изменении определения модуля или предложения EXECUTE AS. Вам придется повторно подписать модуль после оператора ALTER, поэтому нет смысла добавлять подпись заранее.

Есть ли параметр / шаг, который мне не хватает?

Вы не пропустите ни одного шага, потому что нет никакого способа заставить эту работу работать. Однако вы неправильно понимаете концепции. Олицетворение (через EXECUTE AS) и подписание модуля (через ADD SIGNATURE) являются взаимоисключающими. Фактически, подписывание модуля в значительной степени заменяет / отменяет олицетворение.

Принципы на основе сертификатов и асимметричных ключей (логины и пользователи) не могут быть олицетворены или аутентифицированы. Следовательно, вы получаете сообщение об ошибке (выделено мной):

Невозможно выполнить в качестве участника базы данных, поскольку участник TestReportUser не существует, этот тип участника не может быть олицетворен или у вас нет разрешения.

Это часть того, что делает подписывание модулей более безопасным фреймворком, чем олицетворение.

Так что избавьтесь от следующего:

  1. GRANT AUTHENTICATE
  2. все операторы, выполняемые в master
  3. пункт EXECUTE AS

и все будет хорошо.

person Solomon Rutzky    schedule 02.01.2017