Bagikan melalui


Penyimpanan Blob Jarak Jauh (RBS) (SQL Server)

Berlaku untuk: SQL Server

SQL Server Remote BLOB Store (RBS) adalah komponen add-on opsional yang memungkinkan administrator database menyimpan objek besar biner dalam solusi penyimpanan komoditas alih-alih langsung di server database utama.

RBS disertakan pada media penginstalan SQL Server, tetapi tidak diinstal oleh program Penyiapan SQL Server. Cari RBS.msi pada media penginstalan untuk menemukan file penyetelan.

Jika Anda tidak memiliki media penginstalan SQL Server, Anda dapat mengunduh RBS di salah satu lokasi berikut:

Versi SQL Server Lokasi unduhan RBS
SQL Server 2016 (13.x) Paket Fitur SP2 SQL Server 2016 (13.x)
SQL Server 2017 (14.x) Paket Fitur SQL Server 2017 (14.x)
SQL Server 2019 (15.x) Halaman unduhan RBS SQL Server 2019 (15.x)

Mengapa RBS?

Penyimpanan dan performa database yang dioptimalkan

Menyimpan BLOB dalam database dapat menggunakan sejumlah besar ruang file dan sumber daya server yang mahal. RBS mentransfer BLOB ke solusi penyimpanan khusus yang Anda pilih dan menyimpan referensi ke BLOB dalam database. Ini membebaskan penyimpanan server untuk data terstruktur, dan membebaskan sumber daya server untuk operasi database.

Manajemen BLOB yang efisien

Beberapa fitur RBS mendukung manajemen BLOB tersimpan:

  • BLOBS dikelola dengan transaksi ACID (atom, konsisten, terisolasi, tahan lama).

  • BLOB diatur ke dalam koleksi.

  • Pengumpulan sampah, pemeriksaan konsistensi, dan fungsi pemeliharaan lainnya disertakan.

API standar

RBS mendefinisikan sekumpulan API yang menyediakan model pemrograman standar bagi aplikasi untuk mengakses dan memodifikasi penyimpanan BLOB apa pun. Setiap penyimpanan BLOB dapat menentukan pustaka penyedianya sendiri yang dicolokkan ke pustaka klien RBS dan menentukan bagaimana BLOB disimpan dan diakses.

Sejumlah vendor solusi penyimpanan pihak ketiga telah mengembangkan penyedia RBS yang sesuai dengan API standar ini dan mendukung penyimpanan BLOB di berbagai platform penyimpanan.

Persyaratan RBS

  • RBS memerlukan SQL Server Enterprise untuk server database utama tempat metadata BLOB disimpan. Namun, jika Anda menggunakan penyedia FILESTREAM yang disediakan, Anda dapat menyimpan BLOB itu sendiri di SQL Server Standard. Untuk menyambungkan ke SQL Server, RBS memerlukan setidaknya driver ODBC versi 11 untuk SQL Server 2014 (12.x) dan Driver ODBC versi 13 untuk SQL Server 2016 (13.x). Driver tersedia di Unduh Driver ODBC untuk SQL Server.

RBS menyertakan penyedia FILESTREAM yang memungkinkan Anda menggunakan RBS untuk menyimpan BLOB pada instans SQL Server. Jika Anda ingin menggunakan RBS untuk menyimpan BLOB dalam solusi penyimpanan yang berbeda, Anda harus menggunakan penyedia RBS pihak ketiga yang dikembangkan untuk solusi penyimpanan tersebut, atau mengembangkan penyedia RBS kustom menggunakan API RBS.

Keamanan RBS

Blog Tim Penyimpanan Blob Jarak Jauh SQL adalah sumber informasi yang baik tentang fitur ini. Model keamanan RBS dijelaskan dalam postingan di Model Keamanan RBS.

Penyedia kustom

Saat Anda menggunakan penyedia kustom untuk menyimpan BLOB di luar SQL Server, pastikan Anda melindungi BLOB yang disimpan dengan izin dan opsi enkripsi yang sesuai dengan media penyimpanan yang digunakan oleh penyedia kustom.

Kunci simetris penyimpanan kredensial

Jika penyedia memerlukan penyiapan dan penggunaan rahasia yang disimpan dalam penyimpanan kredensial, RBS menggunakan kunci konten untuk mengenkripsi rahasia penyedia yang dapat digunakan klien untuk mendapatkan otorisasi ke penyimpanan blob penyedia.

  • RBS 2016 menggunakan kunci simetris AES_128 . SQL Server 2016 (13.x) tidak mengizinkan pembuatan kunci TRIPLE_DES baru kecuali untuk alasan kompatibilitas mundur. Untuk informasi selengkapnya, lihat MEMBUAT KUNCI SIMETRIS (Transact-SQL).

  • RBS 2014 dan versi sebelumnya menggunakan penyimpanan kredensial yang menyimpan rahasia yang dienkripsi menggunakan algoritma kunci simetris TRIPLE_DES yang kedaluarsa. Jika saat ini Anda menggunakan TRIPLE_DES, Microsoft menyarankan agar Anda meningkatkan keamanan dengan mengikuti langkah-langkah dalam topik ini untuk memutar kunci Anda ke metode enkripsi yang lebih kuat.

Anda dapat menentukan properti kunci konten penyimpanan kredensial RBS dengan menjalankan pernyataan Transact-SQL berikut dalam database RBS:
SELECT * FROM sys.symmetric_keys WHERE name = 'mssqlrbs_encryption_skey'; Jika output dari pernyataan tersebut menunjukkan bahwa TRIPLE_DES masih digunakan, maka Anda harus memutar kunci ini.

Memutar kunci konten

Saat menggunakan RBS, Anda harus memutar kunci konten penyimpanan info masuk secara berkala. Ini adalah praktik terbaik keamanan umum untuk memenuhi kebijakan keamanan organisasi. Salah satu cara untuk memutar kunci konten penyimpanan kredensial RBS, adalah dengan menggunakan skrip di bawah ini dalam database RBS. Anda juga dapat menggunakan skrip ini untuk bermigrasi ke properti kekuatan enkripsi yang lebih kuat, seperti algoritma atau panjang kunci. Cadangkan database Anda sebelum rotasi kunci. Pada kesimpulan skrip, skrip memiliki beberapa langkah verifikasi.
Jika kebijakan keamanan Anda memerlukan properti kunci yang berbeda (misalnya, algoritma atau panjang kunci) dari yang disediakan, skrip dapat digunakan sebagai templat. Ubah properti kunci di dua tempat: 1) pembuatan kunci sementara 2) pembuatan kunci permanen.

Sumber daya RBS

Blog RBS
Blog RBS menyediakan informasi tambahan untuk membantu Anda memahami, menyebarkan, dan memelihara RBS.

Skrip rotasi kunci

Contoh ini membuat prosedur tersimpan bernama sp_rotate_rbs_symmetric_credential_key untuk mengganti kunci simetris penyimpanan kredensial RBS yang saat ini digunakan
dengan salah satu pilihan Anda. Anda mungkin ingin melakukan ini jika ada kebijakan keamanan yang memerlukan
rotasi kunci berkala atau jika ada persyaratan algoritma tertentu.
Dalam prosedur tersimpan ini, kunci konten yang menggunakan AES_256 akan menggantikan yang saat ini. Sebagai hasil dari penggantian kunci konten, rahasia perlu dienkripsi ulang dengan kunci baru. Prosedur tersimpan ini juga akan mengenkripsi ulang rahasia. Database harus dicadangkan sebelum rotasi kunci.

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  

Sekarang Anda dapat menggunakan sp_rotate_rbs_symmetric_credential_key prosedur tersimpan untuk memutar kunci konten penyimpanan kredensial RBS, dan rahasia tetap sama sebelum dan sesudah rotasi kunci.

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

Lihat Juga

Penyimpanan Blob Jarak Jauh dan Grup Ketersediaan AlwaysOn (SQL Server)
MEMBUAT KUNCI SIMETRIS (Transact-SQL)