2

Google 서버에서 원칙을 작성하는 데 사용 된 만료 된 인증서를 다시 작성하려고 시도하고 이러한 원칙이 가장하여 저장 프로 시저를 실행하는 중입니다.인증서 기반 교장을 사용하여 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 

정말 마스터 db 조각이 필요한지 확실하지 않습니다. 이 후, 저장 프로 시저를 만들 때까지 모든 성공 :

메시지 15517, 수준 16, 상태 1, 프로 시저 Reports_DC_Project_sp 교장 "TestReportUser"가 존재하지 않기 때문에 데이터베이스 사용자로 실행할 수 없습니다 라인 47
, 이 유형의 핵심부는 가장 할 수 없거나 권한이 없습니다.

또한 EXECUTE AS 'dbo'를 사용하여 저장 프로 시저를 만들려고했습니다. 그건 잘 작동 ... 다음 저장 프로 시저에 서명을 추가하고 내 cert 사용자로 실행되도록 저장 프로 시저를 마지막으로 변경. 마지막 단계에서 같은 오류가 발생했습니다.

설정/단계가 있습니까?

+0

안녕하세요. 이것을 작동시킬 수 있었습니까? 아래에 [answer] (http://stackoverflow.com/a/41421145/577765)를 게시하여 왜 이런 일이 일어나고 어떻게 해결할 수 있는지 설명합니다. –

답변

0

사용

는 GO [여기서 databaseName]

EXEC의 sp_changedbowner의 '사'

나는 우리의 서버에 사용되고 다시 만들 만료 된 인증서에 노력하고

0

를 GO 원칙을 세우기 위해 ...

음, 아니. 인증서 만료 날짜는 주체를 만들 때 확인/확인되지 않으며 ADD SIGNATURE을 사용하여 모듈에 서명하는 경우에도 마찬가지입니다.

그런 다음 이러한 원칙은 저장 프로 시저를 실행하기 위해 가장을 사용했습니다.

분명히 없습니다. 이것은 기술적으로 불가능하기 때문에 일어나지 않았습니다. 인증서 및 비대칭 키 기반 보안 주체는 가장 (impersonation)에 사용할 수 없습니다.

정말 마스터 db 조각이 필요한지 확실하지 않습니다.

아니요, 아닙니다. 이 용도에서는 아무 것도하지 않습니다. 서버 (예 : 인스턴스) 수준의 권한 (심지어 sysadmin 역할의 구성원)을 인증서 및 모든 서명 된 모듈에 연결하려면 표시된 것처럼 인증서를 master으로 복원하면됩니다. 해당 인증서에서 로그인하고 적절한 사용 권한을 부여하십시오. master에 사용자를 만들면 master 데이터베이스에 사용자가 상호 작용해야 할 특정 것이 없으면 아무 것도하지 않습니다. 그러나 귀하의 테스트에 관한 한 그것은 전적으로 관련이 없습니다.

또한 인증서 기반에 AUTHENTICATE을 부여하는 것은 인증서 및 비대칭 키 기반 보안 주체가 인증 할 수 없으므로 전혀 관련이 없으며 쓸모가 없습니다. 조금도. 이제까지.

그런 다음 서명을 저장 프로 시저에 추가하고 마지막으로 저장 프로 시저를 변경하여 내 cert 사용자로 실행합니다.

이 인증서 또는 비대칭 키 기반의 사용자로 실행할 수 있었다하더라도, 그 ALTER 문이 자동으로 무효화 것 때문에 EXECUTE AS 절과 저장 프로 시저를 변경 전에 서명 을 추가 무의미 서명. 모듈의 정의 또는 EXECUTE AS 절이 변경되면 서명이 자동으로 삭제됩니다. ALTER 문 다음에 모듈을 다시 서명해야하므로 미리 서명을 추가 할 필요가 없습니다.

설정/단계가 있습니까?

이 작업을 수행 할 방법이 없기 때문에 단계를 놓치지 않았습니다. 그러나 여기에있는 개념을 오해하고 있습니다. 가장 (EXECUTE AS을 통한)와 모듈 서명 (ADD SIGNATURE을 통한)은 상호 배타적입니다. 실제로, 서명하는 모듈은 가장 (impersonation)을 대체하거나 더 이상 사용하지 않습니다.

인증서 기반 및 비대칭 키 기반 보안 주체 (로그인 및 사용자)는 가장하거나 인증 할 수 없습니다.

교장 "TestReportUser"가 존재하지 않기 때문에 데이터베이스 사용자로 실행할 수 없습니다, 주체의 이 유형을 가장 할 수 없거나 권한이 없습니다 : 따라서 당신은 (추가 강조)의 오류가 발생합니다.

모듈 서명이 가장 (impersonation)보다 안전한 프레임 워크를 만드는 이유 중 일부입니다.

은 그래서 다음 제거 : 문장의

  1. GRANT AUTHENTICATE
  2. 모두
  3. EXECUTE AS

master에서 실행되는 당신은 잘 될 것입니다.