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

En este tema se aplica a: SíSQL Servernobase de datos de SQL Azurenoalmacenamiento de datos de SQL Azure ningún Almacenamiento de datos paralelosTHIS TOPIC APPLIES TO: yesSQL ServernoAzure SQL DatabasenoAzure SQL Data Warehouse noParallel Data Warehouse

El almacén remoto de blobs RBS de SQL ServerSQL Server es un componente complementario opcional que permite a los administradores de bases de datos almacenar directamente objetos binarios grandes en soluciones de almacenamiento de artículos en lugar de en el servidor de base de datos principal. 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 se incluye en el disco de instalación de SQL Server 2017SQL Server 2017 y pero no lo instala el programa de instalación de 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.

¿Por qué elegir RBS?Why RBS?

Rendimiento y almacenamiento de base de datos optimizadosOptimized database storage and performance

Si se almacenan los blobs en la base de datos, puede usarse una gran cantidad de espacio en los archivos y caros recursos del servidor.Storing BLOBs in the database can consume large amounts of file space and expensive server resources. RBS transfiere los blobs a la solución de almacenamiento especializada que prefiera y almacena las referencias a los mismos en la base de datos.RBS transfers the BLOBs to a dedicated storage solution you choose and stores references to thr BLOBs in the database. Esto libera almacenamiento en el servidor para los datos estructurados y también recursos del servidor para las operaciones de base de datos.This frees server storage for structured data, and frees server resources for database operations.

Administración eficaz de blobsEfficient BLOB management

Varias características de RBS permiten la administración de blobs almacenados:Several RBS features support stored BLOBs management:

  • Los blobs se administran con transacciones ACID (atomicidad, coherencia, aislamiento, durabilidad).BLOBS are managed with ACID (atomic, consistent, isolatable, durable) transactions.

  • Los blobs se organizan en colecciones.BLOBs are organized into collections.

  • Se incluyen la recolección de elementos no utilizados, la comprobación de la coherencia y otras funciones de mantenimiento.Garbage collection, consistency checking, and other maintenance functions are included.

API normalizadaStandardized API

RBS define un conjunto de API que proporcionan un modelo de programación normalizado para que las aplicaciones obtengan acceso y modifiquen almacenes de blobs.RBS defines a set of APIs that provide a standardized programming model for applications to access and modify any BLOB store. Cada almacén de blobs puede especificar su propia biblioteca de proveedores, que se conecta a la biblioteca cliente de RBS y especifica cómo se almacenan los blobs y cómo se obtiene acceso a ellos.Each BLOB store can specify its own provider library which plugs into the RBS client library and specifies how BLOBs are stored and accessed.

Varios proveedores de soluciones de almacenamiento han desarrollado proveedores RBS que se ajustan a estas API estándar y son compatibles con el almacenamiento de blobs en varias plataformas de almacenamiento.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.

Requisitos de RBSRBS Requirements

  • RBS requiere SQL ServerSQL Server Enterprise para el servidor de base de datos principal en el que se almacenan los metadatos de los blobs.RBS requires SQL ServerSQL Server Enterprise for the main database server in which the BLOB metadata is stored. Sin embargo, si usa el proveedor FILESTREAM suministrado, puede almacenar los propios blobs en SQL ServerSQL Server Standard.However, if you use the supplied FILESTREAM provider, you can store the BLOBs themselves on SQL ServerSQL Server Standard. Para conectarse a SQL ServerSQL Server, RBS requiere al menos la versión 11 del controlador de ODBC para SQL Server 2014 (12.x)SQL Server 2014 (12.x) y la versión 13 del controlador ODBC para 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). Los controladores están disponibles en Descarga del controlador ODBC para SQL Server.Drivers are available at Download ODBC Driver for SQL Server.

    RBS incluye un proveedor FILESTREAM que permite usar RBS para almacenar los blobs en una instancia de SQL ServerSQL Server.RBS includes a FILESTREAM provider that lets you use RBS to store BLOBs on an instance of SQL ServerSQL Server. Si desea usar RBS para almacenar los blobs en una solución de almacenamiento diferente, tiene que usar un proveedor RBS de terceros desarrollado para dicha solución de almacenamiento o desarrollar un proveedor RBS personalizado con la 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. En Codeplexhay disponible como recurso de aprendizaje un ejemplo de proveedor que almacena los blobs en el sistema de archivos NTFS.A sample provider that stores BLOBs in the NTFS file system is available as a learning resource on Codeplex.

Seguridad de RBSRBS Security

El blog del equipo del almacenamiento remoto de blobs de SQL es una estupenda fuente de información sobre esta característica.The SQL Remote Blob Storage Team Blog is a good source of information about this feature. El modelo de seguridad de RBS se describe en la entrada RBS Security Model(Modelo de seguridad de RBS).The RBS security model is described in the post at RBS Security Model.

Proveedores personalizadosCustom providers

Cuando use un proveedor personalizado para almacenar blobs fuera de SQL ServerSQL Server, asegúrese de que protege los blobs almacenados con opciones de cifrado y permisos apropiados para el medio de almacenamiento que use el proveedor personalizado.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.

Clave simétrica de almacén de credencialesCredential store symmetric key

Si un proveedor requiere que se instale y use un secreto almacenado en el almacén de credenciales, RBS usa una clave simétrica para cifrar los secretos de proveedor que un cliente puede usar para obtener autorización en el almacén de blobs del proveedor.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 usa una clave simétrica AES_128 .RBS 2016 uses an AES_128 symmetric key. SQL Server 2016 (13.x)SQL Server 2016 (13.x) no permite crear nuevas claves TRIPLE_DES, salvo por motivos de compatibilidad con versiones anteriores. does not allow the creation of new TRIPLE_DES keys except for backwards compatibility reasons. Para obtener más información, vea CREATE SYMMETRIC KEY (Transact-SQL).For more information, see CREATE SYMMETRIC KEY (Transact-SQL).

  • RBS 2014 y las versiones anteriores usan un almacén de credenciales que contiene secretos cifrados con el algoritmo de clave simétrica TRIPLE_DES, actualmente obsoleto.RBS 2014 and prior versions use a credential store which holds secrets encrypted using the TRIPLE_DES symmetric key algorithm which is outdated. Si a día de hoy usa TRIPLE_DES, MicrosoftMicrosoft le recomienda mejorar la seguridad con los pasos de este tema para rotar la clave a un método de cifrado más seguro.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.

    Puede determinar las propiedades de la clave simétrica de almacén de credenciales si ejecuta la siguiente instrucción Transact-SQLTransact-SQL en la base de datos 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'; Si el resultado de esa instrucción muestra que TRIPLE_DES todavía se usa, debería rotar esta clave.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.

Rotación de la clave simétricaRotating the symmetric key

Si usa RBS, conviene rotar la clave simétrica del almacén de credenciales cada cierto tiempo.When using RBS, you should periodically rotate the credential store symmetric key. Se trata de un procedimiento de seguridad recomendado muy habitual para cumplir las directivas de seguridad de una organización.This is a common security best practice to meet organizational security policies. Una manera de rotar la clave simétrica del almacén de credenciales de RBS consiste en usar este script en la base de datos de RBS.One way to rotate the RBS credential store symmetric key, is to use the script below in the RBS database. Este script también sirve para migrar a propiedades de intensidad de cifrado más seguras, como la longitud de clave o algoritmo.You can also use this script to migrate to stronger encryption strength properties, such as algorithm or key length. Haga una copia de seguridad de la base de datos antes de realizar la rotación.Backup your database prior to key rotation. Cuando el script finalice, es necesario realizar algunos pasos de comprobación.At the script’s conclusion, it has some verification steps.
Si las directivas de seguridad requieren propiedades de clave (por ejemplo, longitud de clave o algoritmo) diferentes de las provistas, el script se puede usar como plantilla.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. Modifique las propiedades de clave en dos sitios: (1) en la creación de la clave temporal y (2) en la creación de la clave permanente.Modify the key properties in two places: 1) the creation of the temporary key 2) the creation of the permanent key.

Recursos de RBSRBS resources

Ejemplos de RBSRBS samples
Los ejemplos de RBS disponibles en Codeplex demuestran cómo desarrollar una aplicación de RBS y cómo desarrollar e instalar un proveedor de RBS personalizado.The RBS samples available on Codeplex demonstrate how to develop an RBS application, and how to develop and install a custom RBS provider.

Blog de RBSRBS blog
En el blog de RBS se proporciona información adicional para ayudarle a entender, implementar y mantener RBS.The RBS blog provides additional information to help you understand, deploy, and maintain RBS.

Script de rotación de claveKey rotation script

En este ejemplo se crea un procedimiento almacenado denominado sp_rotate_rbs_symmetric_credential_key para reemplazar la clave simétrica de almacén de credenciales de RBS usada actualmenteThis example creates a stored procedure named sp_rotate_rbs_symmetric_credential_key to replace the currently used RBS credential store symmetric key
por una de su elección.with one of your choosing. Es posible que quiera hacerlo si hay una directiva de seguridad que exigeYou may want to do this if there is a security policy requiring
la rotación de claves periódica o si hay requisitos de algoritmo concretos.periodic key rotation or if there are specific algorithm requirements.
En este procedimiento almacenado se sustituirá la clave actual por una clave simétrica que usa AES_256 .In this stored procedure, a symmetric key using AES_256 will replace the current one. Como resultado deAs a result of
la sustitución de la clave simétrica, es necesario volver a cifrar los secretos con la nueva clave.the symmetric key replacement, secrets need to be re-encrypted with the new key. Este procedimiento almacenadoThis stored
también volverá a cifrar los secretos.procedure will also re-encrypt the secrets. Antes de rotar la clave, haga una copia de seguridad de la base de datos.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  

Ya puede usar el procedimiento almacenado sp_rotate_rbs_symmetric_credential_key para rotar la clave simétrica del almacén de credenciales de RBS. Los secretos seguirán siendo los mismos antes y después de la rotación de clave.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';  

Ver tambiénSee Also

Almacén remoto de blobs y grupos de disponibilidad AlwaysOn (SQL Server) Remote Blob Store and Always On Availability Groups (SQL Server)
CREATE SYMMETRIC KEY (Transact-SQL)CREATE SYMMETRIC KEY (Transact-SQL)