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

QUESTO ARGOMENTO SI APPLICA A:sìSQL Server (a partire dalla versione 2008)noDatabase SQL di AzurenoAzure SQL Data Warehouse noParallel Data Warehouse THIS TOPIC APPLIES TO:yesSQL Server (starting with 2008)noAzure SQL DatabasenoAzure SQL Data Warehouse noParallel Data Warehouse

Archivio BLOB remoti (RBS) di SQL ServerSQL Server è un componente aggiuntivo facoltativo che consente agli amministratori di database di archiviare oggetti binari di grandi dimensioni in soluzioni di archiviazione apposite anziché direttamente nel server di database principale. 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.

Tale componente è incluso nei supporti di installazione di SQL Server 2017SQL Server 2017 ma non viene installato dal programma di installazione di 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.

Vantaggi di RBSWhy RBS?

Archiviazione e prestazioni ottimizzate del databaseOptimized database storage and performance

L'archiviazione di BLOB nel database può utilizzare grandi quantità di spazio file e risorse server costose.Storing BLOBs in the database can consume large amounts of file space and expensive server resources. RBS consente di trasferire BLOB in una soluzione di archiviazione dedicata selezionata e di archiviare i riferimenti ai relativi BLOB nel database.RBS transfers the BLOBs to a dedicated storage solution you choose and stores references to thr BLOBs in the database. In questo modo vengono liberate l'archiviazione su server per i dati strutturati e le risorse server per le operazioni del database.This frees server storage for structured data, and frees server resources for database operations.

Gestione efficiente di BLOBEfficient BLOB management

Diverse funzionalità di RBS supportano la gestione di BLOB archiviati:Several RBS features support stored BLOBs management:

  • BLOB gestiti con transazioni ACID (Atomic Consistency Isolation Durable).BLOBS are managed with ACID (atomic consistency isolation durable) transactions.

  • BLOB organizzati in raccolte.BLOBs are organized into collections.

  • Garbage Collection, verifica coerenza e altre funzioni di manutenzione.Garbage collection, consistency checking, and other maintenance functions are included.

API standardizzataStandardized API

RBS definisce un set di API che fornisce un modello di programmazione standardizzato affinché le applicazioni possano accedere e modificare gli archivi BLOB.RBS defines a set of APIs that provide a standardized programming model for applications to access and modify any BLOB store. Ogni archivio BLOB può specificare la propria libreria del provider che consente il collegamento alla libreria client di RBS e specifica la modalità di archiviazione e accesso ai BLOB.Each BLOB store can specify its own provider library which plugs into the RBS client library and specifies how BLOBs are stored and accessed.

Molti fornitori di soluzioni di archiviazione di terze parti hanno sviluppato provider RBS conformi a queste API standard e in grado di supportare l'archiviazione BLOB su varie piattaforme di archiviazione.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.

Requisiti di RBSRBS Requirements

  • Per RBS è necessaria l'edizione SQL ServerSQL Server Enterprise per il server di database principale in cui vengono archiviati i metadati BLOB.RBS requires SQL ServerSQL Server Enterprise for the main database server in which the BLOB metadata is stored. Tuttavia, se si utilizza il provider FILESTREAM fornito, è possibile archiviare BLOB nell'edizione SQL ServerSQL Server Standard.However, if you use the supplied FILESTREAM provider, you can store the BLOBs themselves on SQL ServerSQL Server Standard. Per connettersi a SQL ServerSQL Server, RBS richiede almeno la versione 11 del driver ODBC per SQL Server 2014SQL Server 2014 e la versione 13 del driver ODBC per SQL Server 2016SQL Server 2016.To connect to SQL ServerSQL Server, RBS requires at least ODBC driver version 11 for SQL Server 2014SQL Server 2014 and ODBC Driver version 13 for SQL Server 2016SQL Server 2016. I driver sono disponibili all'indirizzo Download di driver ODBC per SQL Server.Drivers are available at Download ODBC Driver for SQL Server.

    In RBS è incluso un provider FILESTREAM che consente di utilizzare tale componente per l'archiviazione di BLOB in un'istanza di SQL ServerSQL Server.RBS includes a FILESTREAM provider that lets you use RBS to store BLOBs on an instance of SQL ServerSQL Server. Se si desidera utilizzare RBS per l'archiviazione di BLOB in una soluzione di archiviazione diversa, è necessario utilizzare un provider RBS di terze parti sviluppato per tale soluzione di archiviazione o sviluppare un provider RBS personalizzato utilizzando l'API di 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. Un provider di esempio che consenta di archiviare BLOB nel file system NTFS è disponibile come risorsa per l'apprendimento in Codeplex.A sample provider that stores BLOBs in the NTFS file system is available as a learning resource on Codeplex.

Sicurezza relativa a RBSRBS Security

Il blog del team di Archiviazione BLOB remoti SQL è un'ottima fonte di informazioni su questa funzionalità.The SQL Remote Blob Storage Team Blog is a good source of information about this feature. Il modello di sicurezza per RBS è descritto nel post dedicato al modello di sicurezza di RBS.The RBS security model is described in the post at RBS Security Model.

Provider personalizzatiCustom providers

Quando si usa un provider personalizzato per archiviare BLOB all'esterno di SQL ServerSQL Server, verificare che i BLOB archiviati siano protetti con autorizzazioni e opzioni di crittografia adatte al supporto di archiviazione usato dal provider personalizzato.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.

Chiave simmetrica dell'archivio delle credenzialiCredential store symmetric key

Se il provider richiede la configurazione e l'uso di un segreto archiviato nell'archivio delle credenziali, RBS usa una chiave simmetrica per crittografare i segreti del provider, utilizzabile da un client per ottenere l'autorizzazione per l'archivio BLOB del provider.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 chiave simmetrica AES_128 .RBS 2016 uses an AES_128 symmetric key. SQL Server 2016SQL Server 2016 non consente la creazione di nuove chiavi TRIPLE_DES, se non per motivi di compatibilità con le versioni precedenti. does not allow the creation of new TRIPLE_DES keys except for backwards compatibility reasons. Per altre informazioni, vedere CREATE SYMMETRIC KEY (Transact-SQL).For more information, see CREATE SYMMETRIC KEY (Transact-SQL).

  • RBS 2014 e le versioni precedenti usano un archivio di credenziali che contiene i segreti crittografati con l'algoritmo per chiavi simmetriche TRIPLE_DES, ora obsoleto.RBS 2014 and prior versions use a credential store which holds secrets encrypted using the TRIPLE_DES symmetric key algorithm which is outdated. Se si usa ancora TRIPLE_DES, MicrosoftMicrosoft consiglia di migliorare la sicurezza seguendo i passaggi descritti in questo argomento per adottare un metodo di crittografia più sicuro per la chiave.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.

    È possibile determinare le proprietà della chiave simmetrica dell'archivio delle credenziali di RBS eseguendo l'istruzione Transact-SQLTransact-SQL seguente nel database di 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'; Se l'output generato dall'istruzione indica che TRIPLE_DES è ancora in uso, è necessaria la rotazione della chiave.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.

Rotazione della chiave simmetricaRotating the symmetric key

Durante l'uso di RBS è consigliabile ruotare periodicamente la chiave simmetrica dell'archivio delle credenziali.When using RBS, you should periodically rotate the credential store symmetric key. Si tratta di una comune procedura consigliata di sicurezza per soddisfare i criteri di sicurezza dell'organizzazione.This is a common security best practice to meet organizational security policies. Un modo per eseguire la rotazione della chiave simmetrica dell'archivio delle credenziali di RBS consiste nell'usare lo script riportato di seguito nel database di RBS.One way to rotate the RBS credential store symmetric key, is to use the script below in the RBS database. È anche possibile usare questo script per eseguire la migrazione a proprietà per aumentare la sicurezza della crittografia, come l'algoritmo o la lunghezza della chiave.You can also use this script to migrate to stronger encryption strength properties, such as algorithm or key length. Eseguire il backup del database prima della rotazione della chiave.Backup your database prior to key rotation. Al termine dello script sono previsti alcuni passaggi di verifica.At the script’s conclusion, it has some verification steps.
Se i criteri di sicurezza in uso richiedono proprietà diverse per la chiave (ad esempio, algoritmo o lunghezza della chiave) da quelle specificate, lo script può essere usato come modello.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. È possibile modificare le proprietà della chiave in due posizioni: 1) creazione della chiave temporanea 2) creazione della chiave permanente.Modify the key properties in two places: 1) the creation of the temporary key 2) the creation of the permanent key.

Risorse di RBS RBS resources

Esempi di RBSRBS samples
Negli esempi di RBS disponibili in Codeplex viene illustrato come sviluppare un'applicazione RBS e come sviluppare e installare un provider RBS personalizzato.The RBS samples available on Codeplex demonstrate how to develop an RBS application, and how to develop and install a custom RBS provider.

Blog di RBSRBS blog
Nel blog di RBS sono disponibili informazioni aggiuntive sulla distribuzione e gestione di RBS.The RBS blog provides additional information to help you understand, deploy, and maintain RBS.

Script di rotazione della chiave Key rotation script

In questo esempio viene creata una stored procedure denominata sp_rotate_rbs_symmetric_credential_key per sostituire la chiave simmetrica dell'archivio delle credenziali di RBS in usoThis example creates a stored procedure named sp_rotate_rbs_symmetric_credential_key to replace the currently used RBS credential store symmetric key
con una di propria scelta.with one of your choosing. Si consiglia di eseguire questa operazione se esiste un criterio di sicurezza che richiedeYou may want to do this if there is a security policy requiring
la rotazione periodica della chiave o se sono presenti requisiti specifici per gli algoritmi.periodic key rotation or if there are specific algorithm requirements.
In questa stored procedure la chiave corrente verrà sostituita con una chiave simmetrica che usa AES_256 .In this stored procedure, a symmetric key using AES_256 will replace the current one. In seguito allaAs a result of
sostituzione della chiave simmetrica, sarà necessario crittografare nuovamente i secreti con la nuova chiave.the symmetric key replacement, secrets need to be re-encrypted with the new key. Questa storedThis stored
procedure eseguirà anche una nuova crittografia dei segreti.procedure will also re-encrypt the secrets. È consigliabile eseguire un backup del database prima della rotazione della chiave.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  

È ora possibile usare la stored procedure sp_rotate_rbs_symmetric_credential_key per la rotazione della chiave simmetrica dell'archivio delle credenziali di RBS e i segreti rimangono invariati prima e dopo la rotazione della chiave.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';  

Vedere ancheSee Also

Archivio BLOB remoti (RBS) e gruppi di disponibilità AlwaysOn (SQL Server) Remote Blob Store and Always On Availability Groups (SQL Server)
CREATE SYMMETRIC KEY (Transact-SQL)CREATE SYMMETRIC KEY (Transact-SQL)