Uzak Blob Deposu (RBS) (SQL Server)

Şunlar için geçerlidir: SQL Server

SQL Server Uzak BLOB Deposu (RBS), veritabanı yöneticilerinin ikili büyük nesneleri doğrudan ana veritabanı sunucusu yerine ticari depolama çözümlerinde depolamasına olanak tanıyan isteğe bağlı bir eklenti bileşenidir.

RBS, SQL Server yükleme medyaya eklenir, ancak SQL Server Kurulum programı tarafından yüklenmez. Kurulum dosyasını bulmak için yükleme medyası üzerinde RBS.msi arayın.

SQL Server yükleme medyanız yoksa, RBS'yi aşağıdaki konumlardan birinde indirebilirsiniz:

SQL Server sürümü RBS indirme konumu
SQL Server 2016 (13.x) SQL Server 2016 (13.x) SP2 Özellik Paketi
SQL Server 2017 (14.x) SQL Server 2017 (14.x) Özellik Paketi
SQL Server 2019 (15.x) SQL Server 2019 (15.x) RBS indirme sayfası

Neden RBS?

İyileştirilmiş veritabanı depolama alanı ve performansı

BLOB'ları veritabanında depolamak büyük miktarda dosya alanı ve pahalı sunucu kaynakları kullanabilir. RBS, BLOB'ları tercih ettiğiniz belirli bir depolama çözümüne aktarır ve bu BLOB'lara yapılan başvuruları veritabanında saklar. Bu, yapılandırılmış veriler için sunucu depolama alanını serbest bırakır ve veritabanı işlemleri için sunucu kaynaklarını özgürleştirir.

Verimli BLOB yönetimi

Çeşitli RBS özellikleri, depolanan BLOB'ların yönetimini destekler.

  • BLOB'lar ACID (atomik, tutarlı, izole edilebilir, dayanıklı) işlemlerle yönetilir.

  • BLOB'lar koleksiyonlar halinde düzenlenir.

  • Atık toplama, tutarlılık denetimi ve diğer bakım işlevleri dahil edilir.

Standartlaştırılmış API

RBS, uygulamaların herhangi bir BLOB deposuna erişip bunları değiştirmesi için standart bir programlama modeli sağlayan bir dizi API tanımlar. Her BLOB deposu, RBS istemci kitaplığına entegre edilen ve BLOB'ların nasıl depolanıp erişileceğini belirleyen kendi sağlayıcı kitaplığını belirtebilir.

Bir dizi üçüncü taraf depolama çözümü satıcısı, bu standart API'lere uyan ve çeşitli depolama platformlarında BLOB depolamayı destekleyen RBS sağlayıcıları geliştirmektedir.

RBS Gereksinimleri

  • RBS, BLOB meta verilerinin depolandığı ana veritabanı sunucusu için SQL Server Enterprise gerektirir. Ancak, sağlanan FILESTREAM sağlayıcısını kullanırsanız, BLOB'ları SQL Server Standard'da depolayabilirsiniz. SQL Server'a bağlanmak için RBS, SQL Server 2014 (12.x) için en az ODBC sürücüsü sürüm 11'i ve SQL Server 2016 (13.x) için ODBC Sürücüsü sürüm 13'i gerektirir. Sürücüler SQL Server için ODBC Sürücüsünü İndirme bağlantısında bulunabilir.

RBS, bir SQL Server örneğinde BLOB'ları depolamanıza olanak tanıyan bir FILESTREAM sağlayıcısı içerir. BLOB'ları farklı bir depolama çözümünde depolamak için RBS kullanmak istiyorsanız, bu depolama çözümü için geliştirilen bir üçüncü taraf KÇY sağlayıcısı kullanmanız veya RBS API'sini kullanarak özel bir ÇÇY sağlayıcısı geliştirmeniz gerekir.

RBS Güvenliği

SQL Uzak Blob Depolama Ekibi Blogu, bu özellik hakkında iyi bir bilgi kaynağıdır. RBS güvenlik modeli, RBS Güvenlik Modeli'ndeki gönderide açıklanmıştır.

Özel sağlayıcılar

SQL Server dışındaki BLOB'ları depolamak için özel bir sağlayıcı kullandığınızda, depolanan BLOB'ları özel sağlayıcı tarafından kullanılan depolama ortamına uygun izinler ve şifreleme seçenekleriyle koruduğunuzdan emin olun.

Kimlik bilgisi deposu simetrik anahtarı

Bir sağlayıcı, kimlik bilgisi deposunda depolanan bir gizli diziyi ayarlamayı ve kullanmayı gerektiriyorsa, RBS sağlayıcı gizli dizilerini şifrelemek için bir istemcinin sağlayıcının blob deposuna yetkilendirmek için kullanabileceği bir simetrik anahtar kullanır.

  • RBS 2016 , AES_128 simetrik anahtar kullanır. SQL Server 2016 (13.x), geriye dönük uyumluluk nedenleri dışında yeni TRIPLE_DES anahtarlarının oluşturulmasına izin vermez. Daha fazla bilgi için bkz . CREATE SYMMETRIC KEY (Transact-SQL).

  • RBS 2014 ve önceki sürümler, eski TRIPLE_DES simetrik anahtar algoritması kullanılarak şifrelenen gizli dizileri tutan bir kimlik bilgisi deposu kullanır. Şu anda TRIPLE_DES kullanıyorsanız Microsoft, anahtarınızı daha güçlü bir şifreleme yöntemine döndürmek için bu konudaki adımları izleyerek güvenliğinizi geliştirmenizi önerir.

RBS veritabanında aşağıdaki Transact-SQL deyimini yürüterek RBS kimlik bilgisi deposu simetrik anahtar özelliklerini belirleyebilirsiniz:
SELECT * FROM sys.symmetric_keys WHERE name = 'mssqlrbs_encryption_skey'; Bu deyimin çıktısı TRIPLE_DES hala kullanıldığını gösteriyorsa, bu anahtarı döndürmeniz gerekir.

Simetrik anahtarı döndürme

RBS kullanırken kimlik bilgisi deposu simetrik anahtarını düzenli aralıklarla döndürmeniz gerekir. Bu, kurumsal güvenlik ilkelerini karşılamak için yaygın bir güvenlik en iyi uygulamasıdır. RBS kimlik bilgisi deposu simetrik anahtarını döndürmenin bir yolu, RBS veritabanında aşağıdaki betiği kullanmaktır. Algoritma veya anahtar uzunluğu gibi daha güçlü şifreleme gücü özelliklerine geçiş yapmak için de bu betiği kullanabilirsiniz. Anahtar döndürmeden önce veritabanınızı yedekleyin. Betiğin sonunda bazı doğrulama adımları bulunur.
Güvenlik politikalarınız sağlananlardan farklı anahtar özellikleri (örneğin, algoritma veya anahtar uzunluğu) gerektiriyorsa, bu durumda betiği bir şablon olarak kullanabilirsiniz. Anahtar özelliklerini iki yerde değiştirin: 1) geçici anahtarın oluşturulması 2) kalıcı anahtarın oluşturulması.

RBS kaynakları

RBS blogu
RBS blogu, RBS'i anlamanıza, dağıtmanıza ve sürdürmenize yardımcı olacak ek bilgiler sağlar.

Anahtar rotasyon betiği

Bu örnek, şu anda kullanılan RBS kimlik bilgisi deposu simetrik anahtarını değiştirmek için adlı sp_rotate_rbs_symmetric_credential_key bir saklı yordam oluşturur
seçimini kendin yapabileceğin birini seç. Gerekli bir güvenlik ilkesi varsa bunu yapmak isteyebilirsiniz
periyodik anahtar döndürme veya belirli algoritma gereksinimleri olup olmadığı.
Bu saklı yordamda, AES_256 kullanan bir simetrik anahtar geçerli anahtarın yerini alır. Simetrik anahtar değişiminin bir sonucu olarak, gizli dizilerin yeni anahtarla yeniden şifrelenmeleri gerekir. Bu saklı prosedür gizli anahtarları da yeniden şifreler. Veritabanı anahtar döndürmeden önce yedeklenmelidir.

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  

Artık RBS kimlik bilgisi deposu simetrik anahtarını döndürmek için saklı yordamı sp_rotate_rbs_symmetric_credential_key kullanabilirsiniz ve gizli bilgiler anahtar döndürülmeden önce ve sonra aynı kalır.

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

Ayrıca Bkz.

Uzak Blob Deposu ve Her Zaman Açık Kullanılabilirlik Grupları (SQL Server)
SIMETRİK ANAHTAR OLUŞTUR (Transact-SQL)