Vzdálené úložiště objektů blob (RBS) (SQL Server)

platí pro:SQL Server

Sql Server Remote Blob Store (RBS) je volitelná doplňková komponenta, která správcům databází umožňuje ukládat binární velké objekty v řešeních komoditního úložiště místo přímo na hlavním databázovém serveru.

RBS je součástí instalačního média SYSTÉMU SQL Server, ale není nainstalován instalačním programem SYSTÉMU SQL Server. Vyhledejte RBS.msi na instalačním médiu a vyhledejte instalační soubor.

Pokud nemáte instalační médium SQL Serveru, můžete stáhnout RBS na jednom z následujících umístění:

Verze SQL Serveru Umístění stahování 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) Stránka pro stažení RBS sql Serveru 2019 (15.x)

Proč RBS?

Optimalizované úložiště a výkon databáze

Ukládání bloků blob v databázi může spotřebovávat velké objemy místa na souborech a nákladné prostředky serveru. RBS přenese bloby do vyhrazeného řešení úložiště, které zvolíte, a uloží odkazy na bloby v databázi. Tím se uvolní serverové úložiště pro strukturovaná data a uvolní prostředky serveru pro databázové operace.

Efektivní správa BLOBů

Správa uložených objektů blob podporuje několik funkcí RBS:

  • Objekty blob se spravují pomocí transakcí ACID (atomické, konzistentní, izolovatelné, trvanlivé).

  • Objekty BLOB jsou uspořádané do kolekcí.

  • Součástí je uvolňování paměti, kontrola konzistence a další funkce údržby.

Standardizované rozhraní API

RBS definuje sadu rozhraní API, která poskytují standardizovaný programovací model pro aplikace pro přístup k libovolnému úložišti objektů blob a jejich úpravu. Každé úložiště objektů blob může zadat vlastní knihovnu poskytovatele, která se připojí k klientské knihovně RBS, a určuje, jak jsou objekty BLOB uložené a přístupné.

Řada dodavatelů řešení úložiště třetích stran vyvinula poskytovatele RBS, kteří vyhovují těmto standardním rozhraním API a podporují úložiště objektů blob na různých platformách úložiště.

Požadavky na RBS

  • RBS vyžaduje SQL Server Enterprise pro hlavní databázový server, ve kterém jsou uložena metadata objektů blob. Pokud však použijete dodaného zprostředkovatele FILESTREAM, můžete uložit samotné bloby na SQL Server Standard. Pro připojení k SQL Serveru vyžaduje RBS alespoň ovladač ODBC verze 11 pro SQL Server 2014 (12.x) a ovladač ODBC verze 13 pro SQL Server 2016 (13.x). Ovladače jsou k dispozici na webu Download ODBC Driver for SQL Server.

RBS obsahuje zprostředkovatele FILESTREAM, který umožňuje používat RBS k ukládání blob na instanci SQL Serveru. Pokud chcete používat RBS k ukládání objektů BLOB v jiném řešení úložiště, musíte použít poskytovatele RBS třetí strany vyvinutého pro toto řešení úložiště nebo vytvořit vlastního poskytovatele RBS pomocí rozhraní RBS API.

Zabezpečení RBS

Blog týmu služby SQL Remote Blob Storage je dobrým zdrojem informací o této funkci. Model zabezpečení RBS je popsán v příspěvku na webu RBS Security Model.

Vlastní poskytovatelé

Pokud k ukládání bloků blob mimo SQL Server používáte vlastního poskytovatele, ujistěte se, že chráníte uložené bloby s oprávněními a možnostmi šifrování, které jsou vhodné pro médium úložiště používaného vlastním poskytovatelem.

Úložiště přihlašovacích údajů symetrický klíč

Pokud poskytovatel vyžaduje nastavení a použití tajného kódu uloženého v úložišti přihlašovacích údajů, RBS používá symetrický klíč k šifrování tajných kódů zprostředkovatele, které může klient použít k získání autorizace pro úložiště objektů blob poskytovatele.

  • RBS 2016 používá AES_128 symetrický klíč. SQL Server 2016 (13.x) neumožňuje vytváření nových TRIPLE_DES klíčů, kromě důvodů zpětné kompatibility. Další informace najdete v tématu CREATE SYMMETRIC KEY (Transact-SQL).

  • RBS 2014 a starší verze používají úložiště přihlašovacích údajů, které obsahuje tajné kódy šifrované pomocí algoritmu TRIPLE_DES symetrického klíče, který je zastaralý. Pokud aktuálně používáte TRIPLE_DES, Společnost Microsoft doporučuje zvýšit zabezpečení pomocí kroků v tomto tématu a otočit klíč na silnější metodu šifrování.

Vlastnosti symetrického klíče úložiště přihlašovacích údajů RBS můžete určit spuštěním následujícího příkazu Transact-SQL v databázi RBS:
SELECT * FROM sys.symmetric_keys WHERE name = 'mssqlrbs_encryption_skey'; Pokud výstup z tohoto příkazu ukazuje, že TRIPLE_DES se stále používá, měli byste tento klíč otočit.

Otočení symetrického klíče

Při použití RBS byste měli pravidelně otáčet symetrický klíč úložiště přihlašovacích údajů. Toto je běžný osvědčený postup zabezpečení pro splnění zásad zabezpečení organizace. Jedním ze způsobů, jak otočit symetrický klíč úložiště přihlašovacích údajů RBS, je použít následující skript v databázi RBS. Tento skript můžete použít také k migraci na silnější vlastnosti síly šifrování, jako je algoritmus nebo délka klíče. Zálohujte databázi před obměnou klíčem. Na závěr skriptu má několik ověřovacích kroků.
Pokud zásady zabezpečení vyžadují jiné vlastnosti klíče (např. algoritmus nebo délku klíče) od zadaných zásad zabezpečení, může se skript použít jako šablona. Upravte vlastnosti klíče na dvou místech: 1) vytvoření dočasného klíče 2) vytvoření trvalého klíče.

Prostředky RBS

Blog o RBS
Blog RBS obsahuje další informace, které vám pomůžou pochopit, nasadit a udržovat RBS.

Skript pro otáčení klíčů

Tento příklad vytvoří uloženou proceduru s názvem sp_rotate_rbs_symmetric_credential_key pro nahrazení aktuálně používaného úložiště přihlašovacích údajů RBS symetrickým klíčem.
jeden z těch, které si vyberete. Můžete to udělat v případě, že se vyžaduje zásada zabezpečení.
pravidelné obměně klíčů nebo pokud existují specifické požadavky na algoritmus.
V této uložené proceduře bude současný symetrický klíč nahrazen klíčem používajícím AES_256. V důsledku nahrazení symetrického klíče je potřeba znovu zašifrovat tajné kódy novým klíčem. Tato uložená procedura také znovu zašifruje tajné kódy. Databáze by se měla zálohovat před obměnou klíčem.

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  

Teď můžete pomocí sp_rotate_rbs_symmetric_credential_key uložené procedury otočit symetrický klíč úložiště přihlašovacích údajů RBS a tajné kódy zůstanou stejné před a po obměně klíčů.

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