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 

本当にマスターのデータベースが必要かどうかはわかりません。これは、その後、ストアドプロシージャの作成まで、すべて成功している:

メッセージ15517、レベル16、状態1、プロシージャReports_DC_Project_sp、校長「TestReportUser」は存在しないため、データベースプリンシパルとして実行できませんライン47
、このタイプのプリンシパルを偽装することはできません。または、あなたはパーミッションを持っていません。

また、EXECUTE AS 'dbo'を使用してストアドプロシージャを作成しようとしました。それは正常に動作します...その後、署名をストアドプロシージャに追加し、最後にストアドプロシージャを変更してcertユーザとして実行します。最後のステップで同じエラーが発生しました。

設定/手順がありますか?私は当社のサーバー上で使用されていた再作成期限切れの証明書にしようとしています

+0

こんにちは。これを動作させることができましたか?私は、なぜこれが起こっているのか、それを修正する方法を説明する[回答](http://stackoverflow.com/a/41421145/577765)を投稿しました。 –

答えて

0

使用[データベース名]

GO

EXEC sp_changedbownerを 'SA'

GO

0

原則を作成する...

ええと、いいえ。証明書有効期限は、プリンシパルの作成時にチェック/検証されません。ADD SIGNATUREを使用してモジュールに署名する場合でも、有効期限はチェックされません。

これらの原則は、ストアドプロシージャを実行するためになりすましで使用されていました。

間違いなく。これは技術的に不可能であるため起こっていませんでした。証明書と非対称キーベースのプリンシパルを偽装に使用することはできません。

本当にマスターDB部分が必要かどうかわかりません。

いいえ、そうではありません。この使い方では何もしません。サーバー(つまりインスタンス)レベルのアクセス権(sysadminロールのメンバーでも)を証明書とそれによって署名されたすべてのモジュールに関連付ける場合は、証明書をmasterに復元しますが、その証明書からログインし、適切な権限を与えます。 masterでユーザーを作成しても、ユーザーが対話する必要があるデータベースに固有のものがない限り、何も行われません。しかし、あなたのテストに関する限り、それは全く無関係です。証明書ベースのAUTHENTICATEを付与する。また

は、証明書と非対称キーベースのプリンシパルを認証することができませんので、完全に無関係と役に立たないです。まったく。これまで

次に署名をストアドプロシージャに追加し、最後にストアドプロシージャを変更してcertユーザーとして実行します。

それは証明書または非対称キーベースのプリンシパルとして実行することが可能だったとしても、そのALTER文が自動的に無効になるので、EXECUTE AS句でストアドプロシージャを変更する前に署名を追加することは無意味だろう署名。モジュールの定義、またはEXECUTE AS節が変更されると、シグニチャは自動的に削除されます。 ALTERステートメントの後でモジュールに再署名する必要があるため、事前にシグネチャを追加する必要はありません。

設定/手順がありますか?

この作業を行う方法がないため、手順がありません。しかし、あなたはここの概念を誤解しています。偽装(EXECUTE AS経由)とモジュール署名(ADD SIGNATURE経由)は互いに排他的です。実際、モジュール署名は、偽装を置き換える/偽装します。

証明書ベースおよび非対称キーベースプリンシパル(ログインおよびユーザー)は、偽装または認証することはできません。したがって、あなたは(強調追加)のエラーを取得:校長「TestReportUser」は存在しないため、

は、データベースプリンシパルとして実行できません、校長のこのタイプはを偽装することができないか、権限がありません。

これは、モジュールの署名が偽装よりも安全なフレームワークになる理由の一部です。

は、したがって、次のを取り除く:文の

  1. GRANT AUTHENTICATE
  2. すべては
  3. EXECUTE AS

masterで実行されている、あなたは罰金になります。

関連する問題