Поделиться через


Удаленное хранилище больших двоичных объектов (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) с пакетом обновления 2 (SP2)
SQL Server 2017 (14.x) Пакет дополнительных компонентов SQL Server 2017 (14.x)
SQL Server 2019 (15.x) Страница скачивания RBS SQL Server 2019 (15.x)

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

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

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

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

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

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

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

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

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

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

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

Требования к удаленным хранилищам больших двоичных объектов

  • RBS требует SQL Server Enterprise для основного сервера базы данных, в котором хранятся метаданные BLOB. Однако если вы используете предоставленный поставщик FILESTREAM, вы можете хранить большие двоичные объекты в 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 для хранения больших двоичных объектов в другом хранилище, необходимо использовать сторонний поставщик RBS, разработанный для этого хранилища, или разработать пользовательский поставщик RBS с помощью API-интерфейса 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';  

См. также

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