2

Я пытаюсь воссоздать сертификат с истекшим сроком действия, который использовался на наших серверах для создания принципов, а затем эти принципы использовались с олицетворением для выполнения хранимых процедур.Невозможно создать хранимые процедуры с помощью 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'. Это отлично работает ... затем добавляет подпись к хранимой процедуре и, наконец, изменяет хранимую процедуру для выполнения в качестве моего пользователя сертификата. Такая же ошибка на последнем шаге.

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

+0

Привет. Вы смогли заставить это работать? Я опубликовал [ответ] (http://stackoverflow.com/a/41421145/577765) ниже, объясняющий, почему это происходит и как его исправить. –

ответ

0

использование [имя_базы_данных]

GO

EXEC sp_changedbowner 'са'

GO

0

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

Um, no. Даты истечения сертификата не проверяются/не проверяются при создании принципов из них, даже при их использовании с ADD SIGNATURE для подписи модуля.

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

Определенно нет. Этого не происходило, потому что это технически невозможно; Сертификаты и Assymetric Key-основанные принципы не могут использоваться для олицетворения.

Не уверен, действительно ли мне нужен мастер-дБ.

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

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

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

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

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

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

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

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

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

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

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

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