Archivio Blob remoto (RBS) (SQL Server)

Si applica a: SQL Server

Archivio BLOB remoto di SQL 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.

Tale componente è incluso nei supporti di installazione di SQL Server ma non viene installato dal programma di installazione di quest’ultimo Cercare RBS.msi nel supporto di installazione per individuare il file di installazione.

Se non è disponibile il supporto di installazione di SQL Server, puoi scaricare RBS in una delle posizioni seguenti:

Versione di SQL Server Percorso download RBS
SQL Server 2016 (13.x) SQL Server 2016 (13.x) SP2 Feature Pack
SQL Server 2017 (14.x) SQL Server 2017 (14.x) Feature Pack
SQL Server 2019 (15.x) Pagina di download di SQL Server 2019 (15.x) RBS

Vantaggi di RBS

Archiviazione e prestazioni ottimizzate del database

L'archiviazione di BLOB nel database può utilizzare grandi quantità di spazio file e risorse server costose. Archivio BLOB remoto consente di trasferire BLOB in una soluzione di archiviazione dedicata selezionata e di archiviare i riferimenti ai BLOB nel database. In questo modo vengono liberate l'archiviazione su server per i dati strutturati e le risorse server per le operazioni del database.

Gestione efficiente di BLOB

Diverse funzionalità di RBS supportano la gestione di BLOB archiviati:

  • BLOB gestiti con transazioni ACID (Atomic, Consistent, Isolatable, Durable).

  • BLOB organizzati in raccolte.

  • Garbage Collection, verifica coerenza e altre funzioni di manutenzione.

API standardizzata

RBS definisce un set di API che fornisce un modello di programmazione standardizzato affinché le applicazioni possano accedere e modificare gli archivi BLOB. 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.

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.

Requisiti di RBS

  • Per RBS è necessario SQL Server Enterprise per il server database principale in cui vengono archiviati i metadati BLOB. Tuttavia, se usi l’operatore FILESTREAM fornito, puoi archiviare BLOB in SQL Server Standard. Per connettersi a SQL Server, RBS richiede almeno un driver ODBC versione 11 per SQL Server 2014 (12.x) e un driver ODBC versione 13 per SQL Server 2016 (13.x). I driver sono disponibili all'indirizzo Download di driver ODBC per SQL Server.

In RBS è incluso un operatore FILESTREAM che consente di usare tale componente per l'archiviazione di BLOB in un'istanza di SQL 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.

Sicurezza relativa a RBS

Il blog del team di Archiviazione BLOB remoti SQL è un'ottima fonte di informazioni su questa funzionalità. Il modello di sicurezza per RBS è descritto nel post dedicato al modello di sicurezza di RBS.

Provider personalizzati

Quando usi un operatore personalizzato per archiviare BLOB all'esterno di SQL Server, verifica che i BLOB archiviati siano protetti con autorizzazioni e opzioni di crittografia adatte al supporto di archiviazione usato dall’operatore personalizzato.

Chiave simmetrica dell'archivio delle credenziali

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.

  • RBS 2016 usa una chiave simmetrica AES_128 . SQL Server 2016 (13.x) non consente la creazione di nuove chiavi TRIPLE_DES, se non per motivi di compatibilità con le versioni precedenti. Per altre informazioni, vedere 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. Se usi ancora TRIPLE_DES, Microsoft consiglia di migliorare la sicurezza seguendo i passaggi descritti in questo argomento per adottare un metodo di crittografia più sicuro per la chiave.

È possibile determinare le proprietà della chiave simmetrica del Credential Store di RBS eseguendo l'istruzione Transact-SQL seguente nel database di RBS:
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.

Rotazione della chiave simmetrica

Durante l'uso di RBS è consigliabile ruotare periodicamente la chiave simmetrica dell'archivio delle credenziali. Si tratta di una comune procedura consigliata di sicurezza per soddisfare i criteri di sicurezza dell'organizzazione. 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. È 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. Eseguire il backup del database prima della rotazione della chiave. Al termine dello script sono previsti alcuni passaggi di verifica.
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. È possibile modificare le proprietà della chiave in due posizioni: 1) creazione della chiave temporanea 2) creazione della chiave permanente.

Risorse di RBS

Blog di RBS
Nel blog di RBS sono disponibili informazioni aggiuntive sulla distribuzione e gestione di RBS.

Script di rotazione della chiave

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 uso
con una di propria scelta. Si consiglia di eseguire questa operazione se esiste un criterio di sicurezza che richiede
la rotazione periodica della chiave o se sono presenti requisiti specifici per gli algoritmi.
In questa stored procedure la chiave corrente verrà sostituita con una chiave simmetrica che usa AES_256 . Come conseguenza della sostituzione della chiave simmetrica, sarà necessario crittografare nuovamente i secreti con la nuova chiave. Questa stored procedure eseguirà anche una nuova crittografia dei segreti. È consigliabile eseguire un backup del database prima della rotazione della chiave.

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  

È 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.

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

Vedi anche

Archivio BLOB remoti (RBS) e gruppi di disponibilità AlwaysOn (SQL Server)
CREATE SYMMETRIC KEY (Transact-SQL)