あるサーバーから別のサーバーにデータベースを復元するシナリオがあります。ソースサーバーでは、データベースマスターキー(DMK)は、パスワードとサービスマスターキー(SMK)の両方で暗号化されます。新しいサーバーに復元しようとすると、sys.key_encryptions
の行に、SMKによって暗号化されていると表示されます。ただし、SMKが2つのサーバー間で一致しないため、これは当てはまりません。 DMKが実際にこのサーバーの SMKで暗号化されていることを確認するプログラム的な方法はありますか?
現在のSMKがDMKの保護に使用されたかどうかをプログラムで判断するには、DMKを必要とする操作を簡単に試行できる必要があります。このような操作では、DMKを使用するために、まずDMKを復号化する必要があります。 (作成時に提供されたパスワードを使用して)DMKを明示的に開いていない場合、DMKを復号化するにはSMKが必要です。現在のSMKがcorrectSMKでない場合、DMKは自動的に復号化されず、操作は失敗します。そう:
復元するデータベースに存在することが保証されている証明書がある場合は、それを使用してみてください。
SELECT SIGNBYCERT( CERT_ID( '{certificate_name}' ), 'test' );
これにより、NULL
VARBINARY以外の値が返されます。戻り値がNULL
の場合、DMKを再生成する必要があります(以下の手順に従って)。
復元するデータベースに証明書が存在することが保証されていない場合は、作成してみてください。 SMKを使用してDMKを自動的に復号化できる場合、証明書が作成されます。それ以外の場合、操作は失敗します。
BEGIN TRY
CREATE CERTIFICATE [TestCert] WITH SUBJECT = 'yadda yadda yadda';
DROP CERTIFICATE [TestCert];
PRINT 'All good, yo!';
END TRY
BEGIN CATCH
PRINT ERROR_MESSAGE();
END CATCH;
ただし、別のインスタンスからデータベースを復元しただけなので、andは、他のインスタンスのSMKを新しいインスタンスに復元しなかったため、答えは「いいえ、DMKはnotthisサーバーのSMKで暗号化されています。 "
これは予想されるシナリオであり、修正するには次の手順が必要です。
USE [newly_restored_db];
OPEN MASTER KEY DECRYPTION BY PASSWORD = '{password}'; -- password used to protect DMK
ALTER MASTER KEY REGENERATE WITH ENCRYPTION BY PASSWORD = '{password}';
CLOSE MASTER KEY;
CREATE MASTER KEY
のMSDNページには、次のように記載されています(強調が追加されています):
SQL ServerおよびParallel Data Warehouseの場合、マスターキーは通常、サービスマスターキーと少なくとも1つのパスワードによって保護されます。データベースが物理的に別のサーバーに移動された場合(ログ配布、バックアップの復元など)、データベースには元のサーバーのサービスマスターキーによって暗号化されたマスターキーのコピーが含まれます(この暗号化がALTERを使用して明示的に削除された場合を除く) MASTER KEY DDL)、およびCREATE MASTER KEYまたは後続のALTER MASTER KEY DDL操作中に指定された各パスワードによって暗号化されたそのコピー。マスターキーと、データベースの移動後にキー階層のルートとしてマスターキーを使用して暗号化されたすべてのデータを回復するには、ユーザーはuse [のいずれかを使用します。 the] OPEN MASTER KEYステートメントを使用して、マスターキーの保護、マスターキーのバックアップの復元、または新しいサーバーでの元のサービスマスターキーのバックアップの復元に使用されたパスワードのいずれかを使用します。
OPEN MASTER KEY
のMSDNページには、次のように記載されています。
データベースが最初にSQL Serverの新しいインスタンスに接続または復元されたとき、データベースマスターキー(サービスマスターキーで暗号化されたもの)のコピーはまだサーバーに保存されていません。 OPEN MASTER KEYステートメントを使用して、データベースマスターキー(DMK)を復号化する必要があります。 DMKが復号化されると、サービスマスターキーで暗号化されたDMKのコピーをサーバーにプロビジョニングするALTER MASTER KEY REGENERATEステートメントを使用して、将来的に自動復号化を有効にすることができます。 (SMK)。データベースが以前のバージョンからアップグレードされている場合、新しいAESアルゴリズムを使用するようにDMKを再生成する必要があります。 DMKの再生成の詳細については、「 ALTER MASTER KEY(Transact-SQL) 」を参照してください。 AESにアップグレードするためにDMKキーを再生成するのに必要な時間は、DMKによって保護されているオブジェクトの数によって異なります。 AESにアップグレードするためにDMKキーを再生成する必要があるのは1回だけであり、キーローテーション戦略の一部として将来の再生成に影響を与えることはありません。
ALTER MASTER KEY のMSDNページには、次のように記載されています。
REGENERATEオプションは、データベースマスターキーとそれが保護するすべてのキーを再作成します。鍵は最初に古いマスター鍵で復号化され、次に新しいマスター鍵で暗号化されます。このリソース集中型の操作は、マスターキーが危険にさらされていない限り、需要の少ない時間帯にスケジュールする必要があります。