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)