Remote Blob Store (RBS) (SQL Server)Remote Blob Store (RBS) (SQL Server)

DIESES THEMA GILT FÜR:jaSQL Server (ab 2008)neinAzure SQL-DatenbankneinAzure SQL Data Warehouse neinParallel Data Warehouse THIS TOPIC APPLIES TO:yesSQL Server (starting with 2008)noAzure SQL DatabasenoAzure SQL Data Warehouse noParallel Data Warehouse

SQL ServerSQL Server Remote BLOB-Speicher (RBS) ist eine optionale Add-On-Komponente, mit der Datenbankadministratoren Binary Large Objects in Speicherlösungen statt direkt auf dem Hauptdatenbankserver speichern können. 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 ist nicht auf den SQL Server 2016SQL Server 2016 -Installationsmedien enthalten. Er wird auch nicht über das SQL ServerSQL Server -Setupprogram installiert.RBS is included on the SQL Server 2016SQL Server 2016 installation media, but is not installed by the SQL ServerSQL Server Setup program.

Gründe für RBSWhy RBS?

Optimierte Datenbankspeicher und optimierte DatenbankleistungOptimized database storage and performance

Durch das Speichern von BLOBs in der Datenbank können große Mengen an Dateispeicherplatz sowie teure Serverressourcen belegt werden.Storing BLOBs in the database can consume large amounts of file space and expensive server resources. RBS überträgt BLOBs in eine dedizierte Speicherlösung Ihrer Wahl und speichert Verweise auf diese BLOBs in der Datenbank.RBS transfers the BLOBs to a dedicated storage solution you choose and stores references to thr BLOBs in the database. Dadurch werden Serverspeicher für strukturierte Daten und Serverressourcen für Datenbankoperationen freigegeben.This frees server storage for structured data, and frees server resources for database operations.

Effiziente Verwaltung von BLOBsEfficient BLOB management

Mehrere RBS-Funktionen unterstützen die Verwaltung gespeicherter BLOBs:Several RBS features support stored BLOBs management:

  • BLOBs werden mithilfe von ACID-Transaktionen (atomic consistency isolation durable; Unteilbarkeit, Konsistenz, Isolation, Dauerhaftigkeit) verwaltet.BLOBS are managed with ACID (atomic consistency isolation durable) transactions.

  • BLOBs sind in Auflistungen unterteilt.BLOBs are organized into collections.

  • Automatische Speicherbereinigung, Konsistenzüberprüfung und andere Wartungsfunktionen sind enthalten.Garbage collection, consistency checking, and other maintenance functions are included.

Standardisierte APIStandardized API

RBS definiert einen Satz von APIs, die ein standardisiertes Programmiermodell für Anwendungen bereitstellen, um auf BLOB-Speicher zuzugreifen und zu ändern.RBS defines a set of APIs that provide a standardized programming model for applications to access and modify any BLOB store. Jeder BLOB-Speicher kann seine eigene Anbieterbibliothek angeben, die in die RBS-Clientbibliothek eingebunden wird und angibt, wie BLOBs gespeichert werden und auf sie zugegriffen wird.Each BLOB store can specify its own provider library which plugs into the RBS client library and specifies how BLOBs are stored and accessed.

Eine Reihe von Speicherlösungen von Drittanbietern haben RBS-Anbieter entwickelt, die diesen Standard-APIs entsprechen und BLOB-Speicherung auf verschiedenen Speicherplattformen unterstützen.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.

RSB-AnforderungenRBS Requirements

RSB erfordert SQL ServerSQL Server Enterprise für den Hauptdatenbankserver, in dem die BLOB-Metadaten gespeichert werden.RBS requires SQL ServerSQL Server Enterprise for the main database server in which the BLOB metadata is stored. Wenn Sie jedoch den bereitgestellten FILESTREAM-Anbieter verwenden, können Sie die BLOBs selbst auf SQL ServerSQL Server Standard speichern.However, if you use the supplied FILESTREAM provider, you can store the BLOBs themselves on SQL ServerSQL Server Standard. RBS erfordert mindestens ODBC-Treiberversion 11 für SQL ServerSQL Serverund ODBC-Treiber, Version 13 für SQL Server 2014SQL Server 2014 , um eine Verbindung mit SQL Server 2016SQL Server 2016herzustellen.To connect to SQL ServerSQL Server, RBS requires at least ODBC driver version 11 for SQL Server 2014SQL Server 2014 and ODBC Driver version 13 for SQL Server 2016SQL Server 2016. Treiber stehen unter Herunterladen von ODBC-Treibern für SQL Serverzur Verfügung.Drivers are available at Download ODBC Driver for SQL Server.

RBS beinhaltet einen FILESTREAM-Anbieter, mit dem Sie BLOBs mithilfe von RBS auf einer Instanz von SQL ServerSQL Serverspeichern können.RBS includes a FILESTREAM provider that lets you use RBS to store BLOBs on an instance of SQL ServerSQL Server. Wenn Sie BLOBs mithilfe von RBS in einer anderen Speicherlösung speichern möchten, müssen Sie einen für diese Speicherlösung entwickelten RSB-Anbieter eines Drittanbieters verwenden oder einen benutzerdefinierten RBS-Anbieter mithilfe der RBS-API entwickeln.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. Ein Beispielanbieter, der BLOBs im NTFS-Dateisystem speichert, steht als Lernressource auf Codeplexzur Verfügung.A sample provider that stores BLOBs in the NTFS file system is available as a learning resource on Codeplex.

RSB-SicherheitRBS Security

Der SQL Remote Blob Storage-Teamblog ist eine gute Informationsquelle für diese Funktion.The SQL Remote Blob Storage Team Blog is a good source of information about this feature. Das RBS-Sicherheitsmodell wird in dem Beitrag unter RBS Security Model(RBS-Sicherheitsmodell) beschrieben.The RBS security model is described in the post at RBS Security Model.

Benutzerdefinierte AnbieterCustom providers

Wenn Sie einen benutzerdefinierten Anbieter zum Speichern von Blobs außerhalb von SQL ServerSQL Serververwenden, stellen Sie sicher, dass die gespeicherten Blobs anhand von Berechtigungen und Verschlüsselungsoptionen geschützt sind, die für das vom benutzerdefinierten Anbieter verwendete Speichermedium geeignet sind.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.

Symmetrischer Schlüssel des AnmeldeinformationsspeichersCredential store symmetric key

Wenn für einen Anbieter das Setup und die Verwendung eines Schlüssels im Anmeldeinformationsspeicher gespeichert werden muss, verwendet RBS einen symmetrischen Schlüssel um die Anbieterschlüssel zu verschlüsseln, die der Client möglicherweise benötigt, um die Autorisierung für den Blobspeicher des Anbieters zu erhalten.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 verwendet einen mit AES_128 erstellten symmetrischen Schlüssel.RBS 2016 uses an AES_128 symmetric key. SQL Server 2016SQL Server 2016 lässt die Erstellung neuer TRIPLE_DES-Schlüssel nur zu Zwecken der Abwärtskompatibilität zu. does not allow the creation of new TRIPLE_DES keys except for backwards compatibility reasons. Weitere Informationen finden Sie unter CREATE SYMMETRIC KEY (Transact-SQL).For more information, see CREATE SYMMETRIC KEY (Transact-SQL).

  • RBS 2014 und frühere Versionen verwenden einen Anmeldeinformationsspeicher mit geheimen Schlüsseln, die mithilfe des veralteten symmetrischen TRIPLE_DES-Schlüsselalgorithmus verschlüsselt werden.RBS 2014 and prior versions use a credential store which holds secrets encrypted using the TRIPLE_DES symmetric key algorithm which is outdated. Wenn Sie derzeit TRIPLE_DES verwenden, empfiehlt MicrosoftMicrosoft, dass Sie ihre Sicherheit erhöhen, indem Sie folgende Schritte in diesem Thema ausführen, um beim Rotieren des Schlüssels auf eine sicherere Verschlüsselungsmethode wechseln.If you are currently using TRIPLE_DES MicrosoftMicrosoft recommends that you enhance your security by following the steps in this topic to rotate your key to a stronger encryption method.

    Sie können die Eigenschaften der symmetrischen Schlüssel für den RBS-Anmeldeinformationsspeicher bestimmen, indem Sie die folgende Transact-SQLTransact-SQL-Anweisung in der RBS-Datenbank ausführen: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'; Wenn die Ausgabe von dieser Anweisung zeigt, dass TRIPLE_DES weiterhin verwendet wird, sollten Sie diesen Schlüssel rotieren.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.

Rotieren des symmetrischen SchlüsselsRotating the symmetric key

Wenn Sie RBS verwenden, sollten Sie in regelmäßigen Abständen den symmetrischen Schlüssel des Anmeldeinformationsspeichers drehen.When using RBS, you should periodically rotate the credential store symmetric key. Dies ist eine allgemeine bewährte Sicherheitsmethode, um organisationsweite Sicherheitsrichtlinien zu erfüllen.This is a common security best practice to meet organizational security policies. Eine Möglichkeit, den symmetrischen Schlüssel des RBS-Anmeldeinformationsspeichers zu rotieren, ist die Verwendung des unten aufgeführten Skripts in der RBS-Datenbank.One way to rotate the RBS credential store symmetric key, is to use the script below in the RBS database. Mit diesem Skript können Sie auch zu stärkeren Verschlüsselungsstärkeeigenschaften migrieren, z.B. Algorithmus oder Schlüssellänge.You can also use this script to migrate to stronger encryption strength properties, such as algorithm or key length. Sichern Sie Ihre Datenbank vor der Schlüsselrotation.Backup your database prior to key rotation. Am Ende des Skripts finden Sie einige Überprüfungsschritte.At the script’s conclusion, it has some verification steps.
Wenn Ihre Sicherheitsrichtlinien verschiedene Schlüsseleigenschaften (z.B. Algorithmus oder Schlüssellänge) aus den angebotenen benötigen, kann das Skript als Vorlage verwendet werden.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. Ändern Sie die Schlüsseleigenschaften an zwei Stellen: 1) die Erstellung des temporären Schlüssels, 2) die Erstellung des permanenten Schlüssels.Modify the key properties in two places: 1) the creation of the temporary key 2) the creation of the permanent key.

RBS resources RBS resources

RSB-BeispieleRBS samples
In den auf CodePlex verfügbaren RSB-Beispielen wird veranschaulicht, wie Sie eine RBS-Anwendung entwickeln und einen benutzerdefinierten RBS-Anbieter installieren.The RBS samples available on Codeplex demonstrate how to develop an RBS application, and how to develop and install a custom RBS provider.

RBS-BlogRBS blog
Der RBS-Blog bietet zusätzliche Informationen, durch die Sie RBS besser verstehen, bereitstellen und verwalten können.The RBS blog provides additional information to help you understand, deploy, and maintain RBS.

Key rotation script Key rotation script

In diesem Beispiel wird eine gespeicherte Prozedur namens sp_rotate_rbs_symmetric_credential_key erstellt, um den aktuell verwendeten symmetrischen Schlüssel des RBS-AnmeldeinformationsspeichersThis example creates a stored procedure named sp_rotate_rbs_symmetric_credential_key to replace the currently used RBS credential store symmetric key
durch einen Schlüssel Ihrer Wahl zu ersetzen.with one of your choosing. Sie sollten dies tun, wenn eine SicherheitsrichtlinieYou may want to do this if there is a security policy requiring
die regelmäßige Rotation von Schlüsseln erfordert oder der Algorithmus besondere Anforderungen hat.periodic key rotation or if there are specific algorithm requirements.
In dieser gespeicherten Prozedur wird ein symmetrischer Schlüssel, der AES_256 verwendet, den aktuellen ersetzten.In this stored procedure, a symmetric key using AES_256 will replace the current one. AufgrundAs a result of
des Austauschs des symmetrischen Schlüssels müssen geheime Schlüssel mit dem neuen Schlüssel erneut verschlüsselt werden.the symmetric key replacement, secrets need to be re-encrypted with the new key. Diese gespeicherteThis stored
Prozedur wird auch die geheimen Schlüssel erneut verschlüsseln.procedure will also re-encrypt the secrets. Die Datenbank sollte vor der Schlüsselrotation gesichert werden.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  

Nun können Sie die gespeicherte sp_rotate_rbs_symmetric_credential_key -Prozedur verwenden, um den symmetrischen Schlüssel des RBS-Anmeldeinformationsspeichers zu rotieren. Die geheimen Schlüssel bleiben dabei vor und nach der Schlüsselrotation dieselben.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';  

Siehe auchSee Also

Remoteblobspeicher und Always On-Verfügbarkeitsgruppen (SQL Server) Remote Blob Store and Always On Availability Groups (SQL Server)
CREATE SYMMETRIC KEY (Transact-SQL) CREATE SYMMETRIC KEY (Transact-SQL)