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

Область применения:SQL Server

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

RBS входит в установочный носитель SQL Server, но не устанавливается программой установки SQL Server. Ищите RBS.msi на установочном носителе, чтобы найти файл установки.

Если у вас нет установочного носителя SQL Server, можно скачать RBS в одном из следующих расположений:

Версия SQL Server Расположение загрузки RBS
SQL Server 2016 (13.x) Пакет дополнительных компонентов SQL Server 2016 (13.x) SP2
SQL Server 2017 (14.x) Пакет дополнительных компонентов SQL Server 2017 (14.x)
SQL Server 2019 (15.x) Страница скачивания RBS SQL Server 2019 (15.x)

Для чего используется RBS?

Оптимизация хранилища базы данных и производительности

Хранение BLOB-объектов в базе данных может занимать большой объём дискового пространства и потреблять дорогостоящие серверные ресурсы. RBS передает BLOB-объекты в выделенное хранилище, которое вы выбираете, и сохраняет ссылки на BLOB-объекты в базе данных. Благодаря этому на сервере освобождается место для хранения структурированных данных, а также высвобождаются ресурсы для выполнения операций над базами данных.

Эффективное управление BLOB

Некоторые функции RBS поддерживают управление хранимыми BLOB-объектами:

  • BLOB-объекты обрабатываются с использованием транзакций ACID (атомарность, согласованность, изоляция, долговечность).

  • BLOB-объекты объединены в коллекции.

  • Включены функции сбора мусора, проверки согласованности и другие функции обслуживания.

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

RBS определяет набор API, которые предоставляют стандартизованную модель программирования, позволяющую приложениям получать доступ к любому BLOB-хранилищу и изменять его. Каждое хранилище больших двоичных объектов может иметь собственную библиотеку поставщика, которая подключается к библиотеке клиента удаленного хранилища больших двоичных объектов и указывает способы хранения больших двоичных объектов и доступа к ним.

Ряд сторонних поставщиков решений для хранения данных разработали поставщиков RBS, которые соответствуют этим стандартным API и поддерживают хранение BLOB-объектов на различных платформах хранения.

Требования к RBS

  • RBS требует SQL Server Enterprise для основного сервера базы данных, в котором хранятся метаданные BLOB. Однако, если вы используете входящий в комплект поставщик FILESTREAM, вы можете хранить сами объекты BLOB в SQL Server Standard. Для подключения к SQL Server RBS требуется по крайней мере драйвер ODBC версии 11 для SQL Server 2014 (12.x) и ODBC Driver версии 13 для SQL Server 2016 (13.x). Драйверы можно найти на странице скачивания драйвера ODBC для SQL Server.

В состав RBS входит поставщик FILESTREAM, который позволяет использовать RBS для хранения объектов BLOB в экземпляре SQL Server. Если вы хотите использовать RBS для хранения BLOB-объектов в другом решении для хранения данных, необходимо использовать сторонний провайдер RBS, разработанный для этого решения, или разработать собственный провайдер RBS с использованием API RBS.

Безопасность RBS

Хорошим источником информации об этой возможности является блог группы разработчиков удаленного хранилища BLOB-объектов SQL. Модель безопасности RBS описана в записи блога Модель безопасности RBS.

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

При использовании настраиваемого поставщика для хранения BLOB-объектов за пределами SQL Server убедитесь, что вы защищаете сохраненные BLOB-объекты с разрешениями и параметрами шифрования, подходящими для носителя хранилища, используемого настраиваемым поставщиком.

Симметричный ключ хранилища учетных данных

Если поставщик требует установки и использования секретов, хранимых в хранилище учетных данных, RBS использует симметричный ключ для шифрования секрета поставщика, который клиент может использовать для авторизации в хранилище больших двоичных объектов этого поставщика.

  • RBS 2016 использует симметричный ключ AES_128 . SQL Server 2016 (13.x) не позволяет создавать новые ключи TRIPLE_DES , за исключением причин обратной совместимости. Дополнительные сведения см. в разделе CREATE SYMMETRIC KEY (Transact-SQL).

  • RBS 2014 и более ранние версии используют хранилище учетных данных, которое содержит секретные данные, зашифрованные с помощью устаревшего алгоритма симметричного ключа TRIPLE_DES. Если вы используете TRIPLE_DES, корпорация Майкрософт рекомендует повысить безопасность, выполнив действия, описанные в этом разделе, чтобы повернуть ключ на более надежный метод шифрования.

Вы можете определить свойства симметричного ключа хранилища учетных данных RBS, выполнив следующую инструкцию Transact-SQL в базе данных RBS:
SELECT * FROM sys.symmetric_keys WHERE name = 'mssqlrbs_encryption_skey'; Если выходные данные подтвердят, что TRIPLE_DES все еще используется, смените этот ключ.

Ротация симметричного ключа

При использовании RBS следует периодически менять симметричный ключ хранилища учетных данных. Это стандартная рекомендация для соблюдения политик организационной безопасности. Например, для смены симметричного ключа хранилища учетных данных RBS можно использовать приведенный ниже сценарий базы данных RBS. Этот сценарий также можно использовать для повышения уровня надежности шифрования, например для смены алгоритма или увеличения длины ключа. Перед сменой ключей обязательно создайте резервную копию базы данных. В конце этого сценария предусмотрены несколько шагов проверки.
Если ваша политика безопасности требует другие параметры шифрования (например, другой алгоритм или длину ключа), вы можете использовать этот скрипт как шаблон. Свойства ключа нужно изменить при создании временного ключа и при создании постоянного ключа.

Ресурсы RBS

Блог об RBS
В блоге по удаленному хранилищу больших двоичных объектов содержатся дополнительные сведения, которые помогут лучше понять принципы работы, развертывания и обслуживания удаленных хранилищ больших двоичных объектов.

Сценарий смены ключа

Сценарий из этого примера создает хранимую процедуру с именем sp_rotate_rbs_symmetric_credential_key , которая заменяет используемый симметричный ключ хранилища учетных данных RBS на новый симметричный ключ
с одним из выбранных вами вариантов. Возможно, вам стоит сделать это, если политика безопасности требует
периодической смены ключей или если есть конкретные требования к алгоритму.
Эта хранимая процедура заменяет текущий симметричный ключ на ключ с алгоритмом AES_256 . В результате замены симметричного ключа секреты необходимо повторно шифровать с помощью нового ключа. Эта хранимая процедура также повторно зашифрует секреты. Перед сменой ключей следует создать резервную копию базы данных.

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 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, а секреты останутся теми же, что и до смены ключей.

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';  

См. также

Удалённое хранилище BLOB-объектов и группы доступности Always On (SQL Server)
CREATE SYMMETRIC KEY (Transact-SQL)