Magasin d'objets blob distants (RBS) (SQL Server)

S’applique à :SQL Server

Le magasin d’objets blob distants SQL Server est un composant additionnel facultatif qui permet aux administrateurs de base de données de stocker des objets blob dans des solutions de stockage de marchandises au lieu de les stocker directement sur le serveur de base de données principal.

RBS est inclus sur le support d’installation de SQL Server, mais n’est pas installé par le programme d’installation de SQL Server. Recherchez RBS.msi sur le support d’installation pour localiser le fichier d’installation.

Si vous n’avez pas de support d’installation DE SQL Server, vous pouvez télécharger RBS à l’un des emplacements suivants :

Version de SQL Server Emplacement de téléchargement de RBS
SQL Server 2016 (13.x) Pack de fonctionnalités SQL Server 2016 (13.x) SP2
SQL Server 2017 (14.x) SQL Server 2017 (14.x) Feature Pack
SQL Server 2019 (15.x) Page de téléchargement DE SQL Server 2019 (15.x) RBS

Pourquoi RBS ?

Performances et stockage de base de données optimisés

Le stockage d'objets blob dans la base de données peut consommer une grande quantité d'espace de fichiers et se révéler coûteuse du point de vue des ressources de serveur. RBS transmet les objets blob à la solution de stockage de votre choix, et en stocke les références dans la base de données. Cela permet de libérer de l'espace de stockage serveur pour les données structurées, ainsi que des ressources serveur pour les opérations de base de données.

Gestion efficace des objets blob

Plusieurs fonctionnalités de RBS prennent en charge la gestion des objets blob stockés :

  • Les objets blob sont gérés à l’aide des transactions ACID (Atomicité, Cohérence, Isolation et Durabilité).

  • Les objets blob sont organisés en collections.

  • Le nettoyage de la mémoire, la vérification de la cohérence et les autres fonctions de maintenance y sont inclus.

API standardisée

RBS définit un ensemble d'API qui fournit un modèle de programmation standardisé permettant aux applications d'accéder à tous les magasins d'objets blob et de les modifier. Chaque magasin d’objets blob peut spécifier sa propre bibliothèque de fournisseurs qui se connecte à la bibliothèque cliente RBS et indique comment les objets blob sont stockés et accessibles.

Certains fournisseurs de solutions de stockage tiers ont développé des fournisseurs RBS qui sont conformes à ces API standard et qui prennent en charge le stockage d'objets blob sur différentes plateformes de stockage.

Conditions requises du magasin d'objets blob distants (RBS)

  • RBS nécessite SQL Server Enterprise pour le serveur de base de données principal dans lequel les métadonnées BLOB sont stockées. Toutefois, si vous utilisez le fournisseur FILESTREAM fourni, vous pouvez stocker les objets blob eux-mêmes sur SQL Server Standard. Pour vous connecter à SQL Server, RBS nécessite au moins le pilote ODBC version 11 pour SQL Server 2014 (12.x) et ODBC Driver version 13 pour SQL Server 2016 (13.x). Les pilotes sont disponibles à la page Download ODBC Driver for SQL Server (Télécharger le pilote ODBC pour SQL Server).

RBS inclut un fournisseur FILESTREAM qui vous permet d’utiliser RBS pour stocker des objets blob sur une instance de SQL Server. Si vous souhaitez utiliser le magasin d'objets blob distants pour stocker des objets blob dans une solution de stockage différente, vous devez utiliser un fournisseur RBS tiers, qui aura été développé pour cette solution de stockage particulière, ou bien développer un fournisseur RBS personnalisé à l'aide de l'API RBS.

Sécurité relative au magasin d'objets blob distants (RBS)

Le blog de l'équipe de stockage d’objets blob distants SQL est une bonne source d'informations sur cette fonctionnalité. Le modèle de sécurité RBS est décrit dans la partie Modèle de sécurité RBSde la publication.

Fournisseurs personnalisés

Lorsque vous utilisez un fournisseur personnalisé pour stocker des objets blob en dehors de SQL Server, veillez à protéger les objets blob stockés avec des autorisations et des options de chiffrement appropriées au support de stockage utilisé par le fournisseur personnalisé.

Clé symétrique du magasin d'informations d'identification

Si un fournisseur demande l’installation et l’utilisation d’un secret stocké dans le magasin d’informations d’identification, RBS utilise une clé symétrique pour chiffrer les secrets du fournisseur qu’un client peut utiliser pour obtenir l’autorisation d’accès au magasin d’objets blob du fournisseur.

  • RBS 2016 utilise une clé symétrique AES_128 . SQL Server 2016 (13.x) n’autorise pas la création de nouvelles clés TRIPLE_DES , sauf pour des raisons de compatibilité descendante. Pour plus d’informations, consultez CREATE SYMMETRIC KEY (Transact-SQL).

  • RBS 2014 et les versions antérieures utilisent un magasin d’informations d’identification qui maintient le chiffrement des clés secrètes à l’aide de l’algorithme de clé symétrique TRIPLE_DES , obsolète. Si vous utilisez actuellement TRIPLE_DES, Microsoft vous recommande d’améliorer votre sécurité en suivant les étapes décrites dans cette rubrique pour faire pivoter votre clé vers une méthode de chiffrement plus forte.

Vous pouvez déterminer les propriétés de clé symétrique du magasin d’informations d’identification RBS en exécutant l’instruction Transact-SQL suivante dans la base de données RBS :
SELECT * FROM sys.symmetric_keys WHERE name = 'mssqlrbs_encryption_skey'; Si la sortie de cette instruction indique que TRIPLE_DES est toujours utilisé, vous devez permuter cette clé.

Rotation de la clé symétrique

Lorsque vous utilisez RBS, la clé symétrique du magasin d'informations d'identification doit régulièrement faire l’objet d’une rotation. Il s'agit d’une meilleure pratique de sécurité courante permettant de suivre les stratégies de sécurité de l'organisation. Pour effectuer la rotation de la clé symétrique du magasin d’informations d'identification RBS, il est possible d’utiliser le script ci-dessous dans la base de données RBS. Vous pouvez également utiliser ce script pour migrer vers des propriétés de chiffrement plus fortes, notamment la longueur de l'algorithme ou de la clé. Sauvegardez votre base de données avant d’effectuer la rotation de la clé. Le script comprend à la fin quelques étapes de vérification.
Si vos stratégies de sécurité nécessitent d’autres propriétés de clé (par exemple, la longueur de l’algorithme ou de la clé) que celles qui sont fournies, le script peut être utilisé comme modèle. Modifiez les propriétés de la clé à deux endroits : 1) la création de la clé temporaire 2) la création de la clé permanente.

Ressources RBS

Blog RBS
Le blog du magasin d'objets blob distants (RBS) fournit des informations supplémentaires qui vous aideront à mieux comprendre, déployer et gérer les magasins d'objets blob distants.

Script de rotation des clés

Cet exemple crée une procédure stockée nommée sp_rotate_rbs_symmetric_credential_key pour remplacer la clé symétrique du magasin d’informations d’identification RBS actuellement utilisée
par celle de votre choix. Ce remplacement est préférable s’il existe une stratégie de sécurité qui exige
une permutation des clés régulière ou si des algorithmes spécifiques le précisent.
Dans cette procédure stockée, une clé symétrique utilisant AES_256 remplace l’actuelle. En raison du remplacement de clé symétrique, les secrets doivent être rechiffrés avec la nouvelle clé. Cette procédure stockée rechiffre également les secrets. La base de données doit être sauvegardée avant toute rotation de clé.

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  

Vous pouvez désormais utiliser la procédure stockée sp_rotate_rbs_symmetric_credential_key pour effectuer la rotation de la clé symétrique du magasin d’informations d’identification RBS ; les clés secrètes restent les mêmes avant et après la rotation de la clé.

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

Voir aussi

Magasin d’objets blob distants et groupes de disponibilité Always On (SQL Server)
CREATE SYMMETRIC KEY (Transact-SQL)