Partilhar via


Armazenamento Remoto de Blobs (RBS) (SQL Server)

Aplica-se a:SQL Server

SQL Server Remote BLOB Store (RBS) é um componente adicional opcional que permite aos administradores de bases de dados armazenar objetos binários grandes em soluções de armazenamento comuns, em vez de diretamente no servidor principal da base de dados.

O RBS está incluído na mídia de instalação do SQL Server, mas não é instalado pelo assistente de configuração do SQL Server. Procure RBS.msi no meio de instalação para localizar o ficheiro de configuração.

Se não tiver suporte de instalação SQL Server, pode descarregar o RBS numa das seguintes localizações:

Versão do SQL Server Local de download do RBS
SQL Server 2016 (13.x) SQL Server 2016 (13.x) Pacote de Funcionalidades SP2
SQL Server 2017 (14.x) SQL Server 2017 (14.x) Pacote de Funcionalidades
SQL Server 2019 (15.x) Página de download do SQL Server 2019 (15.x) RBS

Porquê RBS?

Armazenamento e desempenho otimizados na base de dados

Armazenar BLOBs na base de dados pode consumir grandes quantidades de espaço em ficheiros e recursos valiosos do servidor. RBS realiza a transferência dos BLOBs para uma solução de armazenamento dedicada que venha a escolher e armazena referências aos BLOBs na base de dados. Isto liberta armazenamento do servidor para dados estruturados e recursos do servidor para operações na base de dados.

Gestão eficiente do BLOB

Várias funcionalidades do RBS suportam a gestão de BLOBs armazenados:

  • Os BLOBS são geridos com transações ACID (atómicas, consistentes, isoláveis, duradouras).

  • Os BLOBs estão organizados em coleções.

  • Estão incluídas funções de recolha de lixo, verificação de consistência e outras manutenções.

API padronizada

O RBS define um conjunto de APIs que fornecem um modelo de programação padronizado para que as aplicações acedam e modifiquem qualquer armazenamento BLOB. Cada loja BLOB pode especificar a sua própria biblioteca de fornecedor, que se liga à biblioteca cliente RBS e especifica como os BLOBs são armazenados e acedidos.

Vários fornecedores de soluções de armazenamento de terceiros desenvolveram fornecedores RBS que cumprem estas APIs padrão e suportam armazenamento BLOB em várias plataformas de armazenamento.

Requisitos RBS

  • O RBS requer SQL Server Enterprise para o servidor principal de base de dados onde os metadados BLOB são armazenados. No entanto, se utilizar o fornecedor FILESTREAM fornecido, pode armazenar os próprios BLOBs no SQL Server Standard. Para se ligar ao SQL Server, o RBS requer pelo menos o driver ODBC versão 11 para SQL Server 2014 (12.x) e o driver ODBC versão 13 para SQL Server 2016 (13.x). Os drivers estão disponíveis em Download ODBC Driver for SQL Server.

O RBS inclui um fornecedor FILESTREAM que permite usar o RBS para armazenar BLOBs numa instância do SQL Server. Se quiseres usar RBS para armazenar BLOBs numa solução de armazenamento diferente, tens de usar um fornecedor RBS de terceiros desenvolvido para essa solução de armazenamento, ou desenvolver um fornecedor RBS personalizado usando a API RBS.

RBS Security

O blogue da equipa SQL Remote Blob Storage é uma boa fonte de informação sobre esta funcionalidade. O modelo de segurança RBS é descrito no artigo do RBS Security Model.

Fornecedores personalizados

Quando usar um fornecedor personalizado para armazenar BLOBs fora do SQL Server, certifique-se de que protege os BLOBs armazenados com permissões e opções de encriptação apropriadas ao meio de armazenamento utilizado pelo fornecedor personalizado.

Chave simétrica de armazenamento de credenciais

Se um fornecedor exigir a configuração e utilização de um segredo armazenado no armazenamento de credenciais, o RBS utiliza uma chave simétrica para encriptar os segredos do fornecedor, que um cliente pode usar para obter autorização para o armazenamento de blobs do fornecedor.

  • O RBS 2016 utiliza uma chave simétrica AES_128 . O SQL Server 2016 (13.x) não permite a criação de novas chaves TRIPLE_DES , exceto por razões de compatibilidade retroativa. Para mais informações, veja CRIAR CHAVE SIMÉTRICA (Transact-SQL).

  • O RBS 2014 e versões anteriores utilizam um armazenamento de credenciais que guarda segredos encriptados usando o algoritmo TRIPLE_DES chave simétrica, que está desatualizado. Se está atualmente a usar TRIPLE_DES, a Microsoft recomenda que aumente a sua segurança seguindo os passos deste tópico para rodar a sua chave para um método de encriptação mais forte.

Pode determinar as propriedades da chave simétrica de armazenamento de credenciais RBS executando a seguinte instrução Transact-SQL na base de dados RBS:
SELECT * FROM sys.symmetric_keys WHERE name = 'mssqlrbs_encryption_skey'; Se a saída desta instrução mostrar que TRIPLE_DES ainda é utilizada, então deve rotacionar esta chave.

Rodar a chave simétrica

Ao usar o RBS, deve rodar periodicamente a chave simétrica do armazenamento de credenciais. Esta é uma prática comum de segurança para cumprir as políticas de segurança da organização. Uma forma de rodar a chave simétrica do armazenamento de credenciais RBS é usar o script abaixo na base de dados RBS. Também pode usar este script para migrar para propriedades de encriptação mais fortes, como algoritmos ou comprimento de chave. Faça backup da sua base de dados antes da rotação das chaves. No final do guião, são incluídos alguns passos de verificação.
Se as suas políticas de segurança exigirem propriedades de chave diferentes (por exemplo, algoritmo ou comprimento de chave) das fornecidas, então o script pode ser usado como modelo. Modificar as propriedades da chave em dois lugares: 1) a criação da chave temporária 2) a criação da chave permanente.

Recursos do RBS

Blogue RBS
O blogue do RBS fornece informações adicionais para o ajudar a compreender, implementar e manter o RBS.

Script de rotação de chaves

Este exemplo cria um procedimento armazenado nomeado sp_rotate_rbs_symmetric_credential_key para substituir a chave simétrica de armazenamento de credenciais RBS atualmente usada
Com um à tua escolha. Pode querer fazer isto se existir uma política de segurança que exija
rotação periódica de chaves ou caso existam requisitos específicos do algoritmo.
Neste procedimento armazenado, uma chave simétrica usando AES_256 substituirá a atual. Como resultado da substituição da chave simétrica, os segredos precisam de ser encriptados novamente com a nova chave. Este procedimento armazenado também re-encriptará os segredos. A base de dados deve ser guardada antes da rotação das chaves.

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  

Agora podes usar o sp_rotate_rbs_symmetric_credential_key procedimento armazenado para rodar a chave simétrica de armazenamento das credenciais RBS, e os segredos mantêm-se iguais antes e depois da rotação da chave.

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

Ver também

Armazenamento remoto de blobs e grupos de disponibilidade sempre ativos (SQL Server)
CRIAR CHAVE SIMÉTRICA (Transact-SQL)