Удаленное хранилище больших двоичных объектов (SQL Server)Remote Blob Store (RBS) (SQL Server)

ОБЛАСТЬ ПРИМЕНЕНИЯ: даSQL Server нетБаза данных SQL AzureнетХранилище данных SQL AzureнетParallel Data WarehouseAPPLIES TO: yesSQL Server noAzure SQL Database noAzure SQL Data Warehouse noParallel Data Warehouse

Удаленное хранилище больших двоичных объектов (RBS) дляSQL ServerSQL Server — это дополнительный компонент, позволяющий администраторам баз данных хранить большие двоичные объекты в отдельных хранилищах вместо хранения непосредственно на основном сервере базы данных.SQL ServerSQL Server 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

Хранение больших двоичных объектов в базе данных подразумевает использование большого объема файлового пространства и дорогостоящих ресурсов серверного оборудования.Storing BLOBs in the database can consume large amounts of file space and expensive server resources. RBS передает большие двоичные объекты в выбранное пользователем выделенное хранилище. При этом в базе данных сохраняются только ссылки на них.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.

Эффективное управление большими двоичными объектамиEfficient BLOB management

Некоторые функции RBS позволяют управлять хранимыми большими двоичными объектами:Several RBS features support stored BLOBs management:

  • Управление большими двоичными объектами осуществляется с помощью ACID-транзакций (атомарность, согласованность, изолированность и устойчивость).BLOBS are managed with ACID (atomic, consistent, isolatable, durable) transactions.

  • Большие двоичные объекты организованы в виде коллекций.BLOBs are organized into collections.

  • Поддерживаются функции сборки мусора, проверки согласованности и другие обслуживающие функции.Garbage collection, consistency checking, and other maintenance functions are included.

Стандартизированный API-интерфейсStandardized API

Удаленное хранилище больших двоичных объектов определяет набор API, с помощью которых обеспечивается стандартная модель программирования, которая используется приложениями для доступа и изменения всех хранилищ больших двоичных объектов.RBS defines a set of APIs that provide a standardized programming model for applications to access and modify any BLOB store. Каждое хранилище больших двоичных объектов может иметь собственную библиотеку поставщика, которая подключается к библиотеке клиента удаленного хранилища больших двоичных объектов и указывает способы хранения больших двоичных объектов и доступа к ним.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-интерфейсам и поддерживают хранилища больших двоичных объектов на разных платформах.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 Requirements

  • При работе с удаленным хранилищем больших двоичных объектов необходим выпуск SQL ServerSQL Server Enterprise для главного сервера базы данных, на котором хранятся метаданные больших двоичных объектов.RBS requires SQL ServerSQL Server Enterprise for the main database server in which the BLOB metadata is stored. Однако, если используется предоставленный поставщик FILESTREAM, сами большие двоичные объекты можно хранить в SQL ServerSQL Server Standard.However, if you use the supplied FILESTREAM provider, you can store the BLOBs themselves on SQL ServerSQL Server Standard. Для подключения к SQL ServerSQL ServerRBS требуется по меньшей мере версия 11 драйвера ODBC для SQL Server 2014 (12.x)SQL Server 2014 (12.x) и версия 13 драйвера ODBC для SQL Server 2016 (13.x)SQL Server 2016 (13.x).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). Драйверы можно найти на странице скачивания драйвера ODBC для SQL Server.Drivers are available at Download ODBC Driver for SQL Server.

Удаленное хранилище больших двоичных объектов включает поставщик FILESTREAM, позволяющий использовать удаленное хранилище больших двоичных объектов для хранения больших двоичных объектов на экземпляре SQL ServerSQL Server.RBS includes a FILESTREAM provider that lets you use RBS to store BLOBs on an instance of SQL ServerSQL Server. Чтобы применять RBS для хранения больших двоичных объектов в другом хранилище, необходимо использовать сторонний поставщик 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. Образец поставщика, хранящего большие двоичные объекты в файловой системе NTFS, доступен в качестве обучающего ресурса на сайте Codeplex.A sample provider that stores BLOBs in the NTFS file system is available as a learning resource on Codeplex.

Безопасность удаленного хранилища больших двоичных объектовRBS Security

Хорошим источником информации об этой возможности является блог группы разработчиков удаленного хранилища BLOB-объектов SQL.The SQL Remote Blob Storage Team Blog is a good source of information about this feature. Модель безопасности RBS описана в записи блога Модель безопасности RBS.The RBS security model is described in the post at RBS Security Model.

Настраиваемые поставщикиCustom providers

Если вы используете настраиваемых поставщиков для хранения больших двоичных объектов вне SQL ServerSQL Server, обязательно защищайте сохраненные большие двоичные объекты с помощью разрешений и параметров шифрования, подходящих для среды хранения, которая используется настраиваемым поставщиком.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 использует симметричный ключ для шифрования секрета поставщика, который клиент может использовать для авторизации в хранилище больших двоичных объектов этого поставщика.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_DESMicrosoftMicrosoft , рекомендуется усилить безопасность и сменить ваш ключ на новый с более надежным методом шифрования, выполнив описанные в этом разделе действия.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, выполнив следующую инструкцию Transact-SQLTransact-SQL в базе данных RBS: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 можно использовать приведенный ниже сценарий базы данных 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. Измените ключевые свойства в двух местах: 1) при создании временного ключа и 2) при создании постоянного ключа.Modify the key properties in two places: 1) the creation of the temporary key 2) the creation of the permanent key.

Ресурсы RBSRBS resources

Образцы RBSRBS samples
Образцы RBS, доступные на сайте Codeplex , демонстрируют способ разработки приложения 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.

Блог об RBSRBS blog
В блоге по удаленному хранилищу больших двоичных объектов содержатся дополнительные сведения, которые помогут лучше понять принципы работы, развертывания и обслуживания удаленных хранилищ больших двоичных объектов.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

Удаленное хранилище больших двоичных объектов и группы доступности AlwaysOn (SQL Server) Remote Blob Store and Always On Availability Groups (SQL Server)
CREATE SYMMETRIC KEY (Transact-SQL)CREATE SYMMETRIC KEY (Transact-SQL)