リモート BLOB ストア (RBS) [SQL Server]Remote Blob Store (RBS) (SQL Server)

適用対象: ○SQL Server XAzure SQL Database XAzure SQL Data Warehouse XParallel Data WarehouseAPPLIES TO: yesSQL Server noAzure SQL Database noAzure SQL Data Warehouse noParallel Data Warehouse

SQL ServerSQL Server のリモート BLOB ストア (RBS) はオプションのアドオン コンポーネントです。これを使用すると、データベース管理者は、バイナリ ラージ オブジェクトを、主なデータベース サーバーに直接格納するのではなく、汎用的なストレージ ソリューションに格納できます。Remote BLOB Store (RBS) is an optional add-on component that lets database administrators store binary large objects in commodity storage solutions instead of directly on the main database server.

RBS は、 SQL Server 2017SQL Server 2017 インストール メディアに含まれていますが、 SQL ServerSQL Server セットアップ プログラムではインストールされません。RBS is included on the SQL Server 2017SQL Server 2017 installation media, but is not installed by the SQL ServerSQL Server Setup program.

RBS の利点Why RBS?

最適化されたデータベース ストレージとパフォーマンスOptimized database storage and performance

BLOB をデータベースに格納する場合は、大量のファイル領域と高コストのサーバー リソースが消費されることがあります。Storing BLOBs in the database can consume large amounts of file space and expensive server resources. RBS は、BLOB を選択した専用ストレージ ソリューションに転送し、データベースにその BLOB への参照を格納します。RBS transfers the BLOBs to a dedicated storage solution you choose and stores references to the BLOBs in the database. これにより、構造化データ用のサーバー ストレージが解放され、データベース操作用のサーバー リソースが解放されます。This frees server storage for structured data, and frees server resources for database operations.

BLOB の効率的な管理Efficient BLOB management

複数の RBS 機能が、格納された BLOB の管理をサポートします。Several RBS features support stored BLOBs management:

  • BLOB は、ACID (原子性、一貫性、分離性、持続性) を備えたトランザクションで管理します。BLOBS are managed with ACID (atomic, consistent, isolatable, durable) transactions.

  • BLOB は、いくつかのコレクションで構成されています。BLOBs are organized into collections.

  • ガベージ コレクション、一貫性チェック、およびその他のメンテナンス機能が含まれています。Garbage collection, consistency checking, and other maintenance functions are included.

標準化された APIStandardized API

RBS では、アプリケーションから BLOB ストアにアクセスして変更するための標準化されたプログラミング モデルを提供する一連の API が定義されています。RBS defines a set of APIs that provide a standardized programming model for applications to access and modify any BLOB store. 各 BLOB ストアでは、独自のプロバイダー ライブラリを指定できます。このライブラリは、RBS クライアント ライブラリに接続して、BLOB の格納方法やアクセス方法を指定します。Each BLOB store can specify its own provider library which plugs into the RBS client library and specifies how BLOBs are stored and accessed.

多数のサード パーティのストレージ ソリューション ベンダーが、これらの標準 API に準拠し、さまざまなストレージ プラットフォームで BLOB ストレージをサポートする RBS プロバイダーを開発しています。A number of third-party storage solution vendors have developed RBS providers that conform to these standard APIs and support BLOB storage on various storage platforms.

RBS 要件RBS Requirements

  • RBS では、BLOB メタデータが格納されている主なデータベース サーバー用の SQL ServerSQL Server Enterprise が必要です。RBS requires SQL ServerSQL Server Enterprise for the main database server in which the BLOB metadata is stored. ただし、指定された FILESTREAM プロバイダーを使用する場合は、BLOB 自体を SQL ServerSQL Server Standard に格納できます。However, if you use the supplied FILESTREAM provider, you can store the BLOBs themselves on SQL ServerSQL Server Standard. RBS が SQL ServerSQL Serverに接続するには、 SQL Server 2014 (12.x)SQL Server 2014 (12.x) の場合は ODBC ドライバー バージョン 11 以上、 SQL Server 2016 (13.x)SQL Server 2016 (13.x)の場合は ODBC ドライバー バージョン 13 以上が必要です。To connect to SQL ServerSQL Server, RBS requires at least ODBC driver version 11 for SQL Server 2014 (12.x)SQL Server 2014 (12.x) and ODBC Driver version 13 for SQL Server 2016 (13.x)SQL Server 2016 (13.x). ドライバーは、「 Download ODBC Driver for SQL Server」(SQL Server 用の ODBC ドライバーをダウンロードする) で入手できます。Drivers are available at Download ODBC Driver for SQL Server.

RBS には、RBS を使用して BLOB を SQL ServerSQL Serverのインスタンスで格納できる FILESTREAM プロバイダーが含まれています。RBS includes a FILESTREAM provider that lets you use RBS to store BLOBs on an instance of SQL ServerSQL Server. RBS を使用して BLOB を別のストレージ ソリューションに格納する場合は、そのストレージ ソリューション用に開発されたサード パーティの RBS プロバイダーを使用するか、RBS API を使用してカスタム RBS プロバイダーを開発する必要があります。If you want use RBS to store BLOBs in a different storage solution, you have to use a third party RBS provider developed for that storage solution, or develop a custom RBS provider using the RBS API. Codeplexには、NTFS ファイル システムに BLOB を格納するサンプル プロバイダーが学習用リソースとして用意されています。A sample provider that stores BLOBs in the NTFS file system is available as a learning resource on Codeplex.

RBS セキュリティRBS Security

SQL リモート BLOB ストレージ チームのブログはこの機能に関する適切な情報源です。The SQL Remote Blob Storage Team Blog is a good source of information about this feature. RBS Security Model (RBS セキュリティ モデル)」で、RBS セキュリティ モデルに関する投稿を参照してください。The RBS security model is described in the post at RBS Security Model.

カスタム プロバイダーCustom providers

カスタム プロバイダーを使用して BLOB を SQL ServerSQL Serverの外部に格納する場合は、カスタム プロバイダーが使用するストレージ メディアに適した権限と暗号化オプションで格納された BLOB が保護されていることを確認してください。When you use a custom provider to store BLOBs outside of SQL ServerSQL Server, make sure that you protect the stored BLOBs with permissions and encryption options that are appropriate to the storage medium used by the custom provider.

資格情報ストアの対称キーCredential store symmetric key

プロバイダーが資格情報ストア内に格納されているシークレットをセットアップして使用する必要がある場合、RBS では対称キーを使用して、プロバイダーのシークレットを暗号化します。このシークレットは、クライアントがプロバイダーの BLOB ストアに対する許可を得るために使用する場合があります。If a provider requires the setup and use of a secret stored within the credential store, RBS uses a symmetric key to encrypt the provider secrets which a client may use to gain authorization to the provider's blob store.

  • RBS 2016 では AES_128 対称キーを使用します。RBS 2016 uses an AES_128 symmetric key. SQL Server 2016 (13.x)SQL Server 2016 (13.x) では、後方互換性を確保する場合を除き、新しい TRIPLE_DES キーを作成することはできません。does not allow the creation of new TRIPLE_DES keys except for backwards compatibility reasons. 詳細については、「CREATE SYMMETRIC KEY (Transact-SQL)」を参照してください。For more information, see CREATE SYMMETRIC KEY (Transact-SQL).

  • RBS 2014 以前のバージョンでは、古い TRIPLE_DES 対称キー アルゴリズムを使用して暗号化されたシークレットを保持する資格情報ストアを使用します。RBS 2014 and prior versions use a credential store which holds secrets encrypted using the TRIPLE_DES symmetric key algorithm which is outdated. 現在、TRIPLE_DES を使用している場合、MicrosoftMicrosoft では、より強力な暗号化方式を適用するためにこのトピックの手順に従ってキーをローテーションし、セキュリティを強化することをお勧めします。If you are currently using TRIPLE_DESMicrosoftMicrosoft recommends that you enhance your security by following the steps in this topic to rotate your key to a stronger encryption method.

RBS 資格情報ストアの対称キー プロパティは、RBS データベースで次の Transact-SQLTransact-SQL ステートメントを実行して判別できます。You can determine the RBS credential store symmetric key properties by executing the following Transact-SQLTransact-SQL statement in the RBS database:
SELECT * FROM sys.symmetric_keys WHERE name = 'mssqlrbs_encryption_skey'; このステートメントからの出力で、 TRIPLE_DES がまだ使用されていることが分かった場合は、このキーのローテーションが必要です。SELECT * FROM sys.symmetric_keys WHERE name = 'mssqlrbs_encryption_skey'; If the output from that statement shows that TRIPLE_DES is still used, then you should rotate this key.

対称キーのローテーションRotating the symmetric key

RBS を使用する場合、資格情報ストアの対称キーを定期的にローテーションする必要があります。When using RBS, you should periodically rotate the credential store symmetric key. これは、組織のセキュリティ ポリシーを満たすための一般的なセキュリティに関するベスト プラクティスです。This is a common security best practice to meet organizational security policies. RBS 資格情報ストアの対称キーをローテーションする 1 つの方法は、RBS データベースで 後述のスクリプト を使用することです。One way to rotate the RBS credential store symmetric key, is to use the script below in the RBS database. このスクリプトを使用して、アルゴリズムやキーの長さなど、より強力な暗号化強度プロパティに移行することもできます。You can also use this script to migrate to stronger encryption strength properties, such as algorithm or key length. キー ローテーションを行う前に、データベースをバックアップしておいてください。Backup your database prior to key rotation. スクリプトの最後に、確認手順がいくつかあります。At the script's conclusion, it has some verification steps.
セキュリティ ポリシーで指定されたものとは異なるキー プロパティ (アルゴリズムやキーの長さなど) が求められている場合、スクリプトをテンプレートとして使用できます。If your security policies require different key properties (e.g., algorithm or key length) from the ones provided, then the script may be used as a template. 次の 2 つの場所でキー プロパティを変更します。1) 一時キーの作成 2) 永続キーの作成。Modify the key properties in two places: 1) the creation of the temporary key 2) the creation of the permanent key.

RBS リソースRBS resources

RBS サンプルRBS samples
Codeplex で入手できる RBS サンプルでは、RBS アプリケーションの開発方法とカスタム RBS プロバイダーの開発およびインストール方法を示します。The RBS samples available on Codeplex demonstrate how to develop an RBS application, and how to develop and install a custom RBS provider.

RBS ブログRBS blog
RBS ブログ には、RBS の理解、配置、および維持に役立つ追加情報が含まれています。The RBS blog provides additional information to help you understand, deploy, and maintain RBS.

キー ローテーションのスクリプトKey rotation script

この例では、 sp_rotate_rbs_symmetric_credential_key というストアド プロシージャを作成し、現在使用している RBS 資格情報ストアの対称キーを、This example creates a stored procedure named sp_rotate_rbs_symmetric_credential_key to replace the currently used RBS credential store symmetric key
任意の対称キーに置き換えます。with one of your choosing. セキュリティ ポリシーで定期的なキー ローテーションが求められている場合、または特定のアルゴリズム要件がある場合は、You may want to do this if there is a security policy requiring
この操作が必要になることがあります。periodic key rotation or if there are specific algorithm requirements.
このストアド プロシージャでは、 AES_256 を使用する対称キーで現在の対称キーが置き換えられます。In this stored procedure, a symmetric key using AES_256 will replace the current one. 対称キーが置き換えられたら、As a result of
シークレットを新しいキーで再暗号化する必要があります。the symmetric key replacement, secrets need to be re-encrypted with the new key. このストアド プロシージャではThis stored
シークレットの再暗号化も行います。procedure will also re-encrypt the secrets. キー ローテーションの前にデータベースをバックアップする必要があります。The database should be backed up prior to key rotation.

CREATE PROC sp_rotate_rbs_symmetric_credential_key  
AS  
BEGIN  
BEGIN TRANSACTION;  
BEGIN TRY  
CLOSE ALL SYMMETRIC KEYS;  
  
/* Prove that all secrets can be re-encrypted, by creating a   
temporary key (#mssqlrbs_encryption_skey) and create a   
temp table (#myTable) to hold the re-encrypted secrets.    
Check to see if all re-encryption worked before moving on.*/  
  
CREATE TABLE #myTable(sql_user_sid VARBINARY(85) NOT NULL,  
    blob_store_id SMALLINT NOT NULL,  
    credential_name NVARCHAR(256) COLLATE Latin1_General_BIN2 NOT NULL,  
    old_secret VARBINARY(MAX), -- holds secrets while existing symmetric key is deleted  
    credential_secret VARBINARY(MAX)); -- holds secrets with the new permanent symmetric key  
  
/* Create a new temporary symmetric key with which the credential store secrets   
can be re-encrypted. These will be used once the existing symmetric key is deleted.*/  
CREATE SYMMETRIC KEY #mssqlrbs_encryption_skey    
    WITH ALGORITHM = AES_256 ENCRYPTION BY   
    CERTIFICATE [cert_mssqlrbs_encryption];  
  
OPEN SYMMETRIC KEY #mssqlrbs_encryption_skey    
    DECRYPTION BY CERTIFICATE [cert_mssqlrbs_encryption];  
  
INSERT INTO #myTable   
    SELECT cred_store.sql_user_sid, cred_store.blob_store_id, cred_store.credential_name,   
    encryptbykey(  
        key_guid('#mssqlrbs_encryption_skey'),   
        decryptbykeyautocert(cert_id('cert_mssqlrbs_encryption'),   
            NULL, cred_store.credential_secret)  
        ),   
    NULL  
    FROM [mssqlrbs_resources].[rbs_internal_blob_store_credentials] AS cred_store;  
  
IF( EXISTS(SELECT * FROM #myTable WHERE old_secret IS NULL))  
BEGIN  
    PRINT 'Abort. Failed to read some values';  
    SELECT * FROM #myTable;  
    ROLLBACK;  
END;  
ELSE  
BEGIN  
/* Re-encryption worked, so go ahead and drop the existing RBS credential store   
 symmetric key and replace it with a new symmetric key.*/  
DROP SYMMETRIC KEY [mssqlrbs_encryption_skey];  
  
CREATE SYMMETRIC KEY [mssqlrbs_encryption_skey]   
WITH ALGORITHM = AES_256   
ENCRYPTION BY CERTIFICATE [cert_mssqlrbs_encryption];  
  
OPEN SYMMETRIC KEY [mssqlrbs_encryption_skey]   
DECRYPTION BY CERTIFICATE [cert_mssqlrbs_encryption];  
  
/*Re-encrypt using the new permanent symmetric key.    
Verify if encryption provided a result*/  
UPDATE #myTable   
SET [credential_secret] =   
    encryptbykey(key_guid('mssqlrbs_encryption_skey'), decryptbykey(old_secret))  
  
IF( EXISTS(SELECT * FROM #myTable WHERE credential_secret IS NULL))  
BEGIN  
    PRINT 'Aborted. Failed to re-encrypt some values'  
    SELECT * FROM #myTable  
    ROLLBACK  
END  
ELSE  
BEGIN  
  
/* Replace the actual RBS credential store secrets with the newly   
encrypted secrets stored in the temp table #myTable.*/                
SET NOCOUNT ON;  
DECLARE @sql_user_sid varbinary(85);  
DECLARE @blob_store_id smallint;  
DECLARE @credential_name varchar(256);  
DECLARE @credential_secret varbinary(256);  
DECLARE curSecretValue CURSOR   
    FOR SELECT sql_user_sid, blob_store_id, credential_name, credential_secret   
FROM #myTable ORDER BY sql_user_sid, blob_store_id, credential_name;  
  
OPEN curSecretValue;  
FETCH NEXT FROM curSecretValue   
    INTO @sql_user_sid, @blob_store_id, @credential_name, @credential_secret  
WHILE @@FETCH_STATUS = 0  
BEGIN  
    UPDATE [mssqlrbs_resources].[rbs_internal_blob_store_credentials]   
        SET [credential_secret] = @credential_secret   
        FROM [mssqlrbs_resources].[rbs_internal_blob_store_credentials]   
        WHERE sql_user_sid = @sql_user_sid AND blob_store_id = @blob_store_id AND   
            credential_name = @credential_name  
FETCH NEXT FROM curSecretValue   
    INTO @sql_user_sid, @blob_store_id, @credential_name, @credential_secret  
END  
CLOSE curSecretValue  
DEALLOCATE curSecretValue  
  
DROP TABLE #myTable;  
CLOSE ALL SYMMETRIC KEYS;  
DROP SYMMETRIC KEY #mssqlrbs_encryption_skey;  
  
/* Verify that you can decrypt all encrypted credential store entries using the certificate.*/  
IF( EXISTS(SELECT * FROM [mssqlrbs_resources].[rbs_internal_blob_store_credentials]   
WHERE decryptbykeyautocert(cert_id('cert_mssqlrbs_encryption'),   
    NULL, credential_secret) IS NULL))  
BEGIN  
    print 'Aborted. Failed to verify key rotation'  
    ROLLBACK;  
END;  
ELSE  
    COMMIT;  
END;  
END;  
END TRY  
BEGIN CATCH  
     PRINT 'Exception caught: ' + cast(ERROR_NUMBER() as nvarchar) + ' ' + ERROR_MESSAGE();  
     ROLLBACK  
END CATCH  
END;  
GO  

これで、 sp_rotate_rbs_symmetric_credential_key ストアド プロシージャを使用して、RBS 資格情報ストアの対称キーをローテーションすることができます。キー ローテーション後もシークレットはそのままです。Now you can use the sp_rotate_rbs_symmetric_credential_key stored procedure to rotate the RBS credential store symmetric key, and the secrets remain the same before and after the key rotation.

SELECT *, decryptbykeyautocert(cert_id('cert_mssqlrbs_encryption'), NULL, credential_secret)   
FROM [mssqlrbs_resources].[rbs_internal_blob_store_credentials];  
  
EXEC sp_rotate_rbs_symmetric_credential_key;  
  
SELECT *, decryptbykeyautocert(cert_id('cert_mssqlrbs_encryption'), NULL, credential_secret)   
FROM [mssqlrbs_resources].[rbs_internal_blob_store_credentials];  
  
/* See that the RBS credential store symmetric key properties reflect the new changes*/  
SELECT * FROM sys.symmetric_keys WHERE name = 'mssqlrbs_encryption_skey';  

参照See Also

リモート BLOB ストアと AlwaysOn 可用性グループ (SQL Server) Remote Blob Store and Always On Availability Groups (SQL Server)
CREATE SYMMETRIC KEY (Transact-SQL)CREATE SYMMETRIC KEY (Transact-SQL)