SQL Server 2016 Her Zaman Şifreli: Uygulaması Kolay, Kırması Zor
Yayınlanan: 2022-03-11Veriler, özellikle finansal veya sağlık kayıtları gibi ticari sırları tutan işlem verileri olmak üzere herhangi bir şirketin önemli bir varlığıdır. Veriler, onu depolayan sunucu ile onu isteyen istemci arasındaki aktarım sırasında en savunmasızdır.
Güvenliği sağlamaya yönelik standart yaklaşım, sunucudaki verileri şifrelemek ve aktarım sırasında verilerin güvenliğini sağlamak için SSL etkin HTTPS protokolünü kullanmaktır. Ancak, yalnızca geçerli sertifikalara sahip istemcilerdeki verilerin şifresini çözmek için HTTPS kullanarak ve iletişim hattı üzerinden şifreli bir biçimde veri göndererek güvenlik düzeyini daha da artırabilseydik ne olurdu? Bu yaklaşım, geleneksel bir ortadaki adam (MITM) saldırısını çok daha zor hale getirecektir.
Microsoft'un bu soruna çözümü, boru hattı üzerinden şifreli veri göndermenin ve yalnızca geçerli sertifikalara erişimi olan kullanıcılar tarafından şifresini çözmenin bir yolu olan Always Encrypted'dir. Bu nedenle, saldırgan verileri istemci makinesinde depolanan uygun bir sertifika olmadan alsa bile, veriler işe yaramaz olacaktır.
Bu makale, Always Encrypted'in nasıl kurulacağını ve kullanılacağını açıklar ve SSL ile güvence altına alınmış olsalar bile, genel iletişim hatları üzerinden önemli veriler gönderen herkesin okuması önerilir.
Daima Şifreli Arkasındaki Konsept
Always Encrypted, Microsoft'un SQL Server 2016 ile sunduğu bir istemci tarafı şifreleme teknolojisidir. Always Encrypted, verileri yalnızca yazıldığında değil, aynı zamanda onaylanmış bir uygulama tarafından okunduğunda da otomatik olarak şifrelenmiş halde tutar. Diskteki verileri ve günlük dosyalarını gerçek zamanlı olarak şifreleyen ancak verilerin, verileri sorgulayan herhangi bir uygulama tarafından okunmasına izin veren Şeffaf Veri Şifreleme'nin aksine, Always Encrypted, istemci uygulamanızın iletişim kurmak için Always Encrypted özellikli bir sürücü kullanmasını gerektirir. veri tabanı. Uygulama, bu sürücüyü kullanarak, daha sonra yalnızca şifreleme anahtarına erişimi olan bir uygulama tarafından şifresi çözülebilecek olan şifrelenmiş verileri veritabanına güvenli bir şekilde aktarır. Verileri sorgulayan başka herhangi bir uygulama da şifrelenmiş değerleri alabilir, ancak bu uygulama verileri şifreleme anahtarı olmadan kullanamaz, dolayısıyla verileri işe yaramaz hale getirir. Bu şifreleme mimarisi nedeniyle, SQL Server örneği, verilerin şifrelenmemiş sürümünü hiçbir zaman görmez.
Şu anda, Always Encrypted etkin sürücüler, istemci bilgisayarda .NET Framework sürüm 4.6'nın ve JDBC 6.0 sürücüsünün yüklenmesini gerektiren SQL Server için .NET Framework Veri Sağlayıcısıdır. Bu muhtemelen zamanla değişecektir, ancak bunlar Nisan 2017 itibariyle resmi Always Encrypted gereksinimleridir.
Ama neden bu teknolojiye ihtiyacımız var? Always Encrypted'ın kullanılmasının birkaç iyi nedeni vardır:
- Güvenlik — Verilerin her zaman güvende olması gerekiyordu. Artık SSL'nin güvenliği ihlal edildiğinden Always Encrypted, boşluğu başka bir aktarım hattı koruması katmanıyla dolduruyor.
- Düzenleyici destek — Verilerin şifrelenmesi ve başta finans ve telekom sektörlerinde olmak üzere giderek daha fazla sektör düzenlemesi tarafından DBA'nın meraklı gözlerinden saklanması gerekir. Bu, kredi kartı numaraları, sosyal güvenlik numaraları, isimler ve adresler gibi şeylerin korunması gerektiğini veya veri sahibinin ciddi şekilde cezalandırılabileceğini belirten PII standardında (“Kişisel Olarak Tanımlanabilir Bilgiler”) açıklanmıştır.
Always Encrypted Nasıl Kullanılır
Always Encrypted kullanmak, şifrelenmiş tabloları depolayan veritabanı sunucusunda az miktarda hazırlık gerektirir. Hazırlık iki aşamalı bir süreçtir:
- Sütun ana anahtar tanımını oluşturun
- Sütun şifreleme anahtarını oluşturun
Sütun Ana Anahtarı
Peki sütun ana anahtarı nedir?
Sütun ana anahtarı, bir Windows sertifika deposunda (bir sertifika depolama seçeneği olarak demo kullanılır), bir üçüncü taraf donanım güvenlik modülünde (kurulum, yönetim ve kullanım için üçüncü taraf çözümler için genel bir ad) depolanan bir sertifikadır. sertifikalar ) veya Azure Key Vault (Microsoft'un sertifika yönetimi için bulut tabanlı çözümü).
Verileri şifreleyen uygulama, bir veritabanı tablosunun sütunları içindeki verilerin şifrelenmesini işleyen çeşitli sütun şifreleme anahtarlarını korumak için sütun ana anahtarını kullanır. Bazen Enterprise Key Manager olarak da adlandırılan SQL Server'dan sertifika depolarının kullanılması, SQL Server Enterprise Edition'ın kullanılmasını gerektirir.
Bu yazıda, Windows işletim sisteminin Microsoft Sertifika Deposunda sakladığınız kendinden imzalı bir sertifikanın kullanımını anlatıyoruz. Bu yaklaşım en uygun yapılandırma olmasa da Always Encrypted kavramını gösterir - ancak bu yaklaşımın sertifika yönetiminin ayrı, güvenli kullanıcı hesapları ile yapılması gereken üretim ortamları için kabul edilebilir olmadığı ve tercihen , ayrı sunucularda.
SQL Server Management Studio (SSMS) içindeki grafik arabirimi kullanarak veya T-SQL kullanarak bir sütun ana anahtar tanımı oluşturabilirsiniz. SSMS'de, bir veritabanı tablosunu korumak için Always Encrypted kullanmak istediğiniz SQL Server 2016 veritabanı örneğine bağlanın.
Sütun Ana Anahtarlarını Oluşturma ve Kullanma
Nesne Gezgini'nde, önce veritabanına, ardından Güvenlik'e gidin ve ardından aşağıdaki şekillerde gösterildiği gibi iki alt klasörünü görüntülemek için Always Encrypted Keys klasörünü genişletin:
Sütun ana anahtarını oluşturmak için Column Master Keys
klasörüne sağ tıklayın ve New Column Master Key
öğesini seçin. New Column Master Key
iletişim kutusunda, sütun ana anahtarı için bir ad yazın, anahtarın geçerli kullanıcının mı yoksa yerel makinenin sertifika deposunda mı yoksa Azure Anahtar Kasasında mı depolanacağını belirtin ve ardından listeden bir sertifika seçin. Sertifika yoksa veya kendinden imzalı yeni bir sertifika kullanmak istiyorsanız, Generate Certificate
düğmesini ve ardından OK
tıklayın. Bu adım, kendinden imzalı bir sertifika oluşturur ve bunu SSMS çalıştıran geçerli kullanıcı hesabının sertifika deposuna yükler.
Not: Bu adımları, SQL Server örneğinizi barındıran bilgisayarda değil, güvenilir bir makinede gerçekleştirmelisiniz. Bu şekilde, ana bilgisayar tehlikeye girse bile veriler SQL Server'da korunur.
Bu nedenle, sertifikayı oluşturup bir sütun ana anahtarı olarak yapılandırdıktan sonra, onu verilere erişim gerektiren istemcileri barındıran tüm bilgisayarlara dışa aktarmalı ve dağıtmalısınız. İstemci uygulaması web tabanlıysa, sertifikayı web sunucusuna yüklemeniz gerekir. Kullanıcıların bilgisayarlarında yüklü bir uygulamaysa, sertifikayı her kullanıcının bilgisayarına ayrı ayrı dağıtmanız gerekir.
İşletim sisteminiz için sertifikaları dışa ve içe aktarmaya ilişkin geçerli talimatları aşağıdaki URL'lerde bulabilirsiniz:
- Sertifikaları dışa aktarma
- Windows 7 ve Windows Server 2008 R2
- Windows 8 ve Windows Server 2012
- Windows 8.1 ve Windows Server 2012 R2
- Windows 10 ve Windows Server 2016
- Sertifikaları içe aktarma
- Windows 7 ve Windows Server 2008 R2
- Windows 8 ve Windows Server 2012
- Windows 8.1 ve Windows Server 2012 R2
- Windows 10 ve Windows Server 2016
Verileri şifreleyen ve şifresini çözen bir uygulamaya sahip bilgisayarlarda sertifika deposuna sertifikaları içe aktardığınızda, sertifikaları ya makine sertifika deposuna ya da uygulamayı çalıştıran etki alanı hesabının sertifika deposuna içe aktarmalısınız.
Sütun Şifreleme Anahtarı
Bir sütun ana anahtarı oluşturduktan sonra, belirli sütunlar için şifreleme anahtarları oluşturmaya hazırsınız. SQL Server 2016 ADO.NET sürücüsü, verileri SQL Server'a göndermeden önce şifrelemek ve SQL Server 2016 örneğinden aldıktan sonra verilerin şifresini çözmek için sütun şifreleme anahtarlarını kullanır. Sütun ana anahtarında olduğu gibi, T-SQL veya SSMS kullanarak sütun şifreleme anahtarları oluşturabilirsiniz. Sütun ana anahtarlarını T-SQL kullanarak oluşturmak daha kolayken, sütun şifreleme anahtarlarını SSMS kullanarak oluşturmak daha kolaydır.
Bir sütun şifreleme anahtarı oluşturmak için, veritabanı örneğine bağlanmak için Object Explorer
kullanın, veritabanına, ardından Security
gidin ve Always Encrypted Keys
klasörünü genişletin. Column Encryption Keys
öğesine sağ tıklayın ve ardından New Column Encryption Key
öğesini seçin. New Column Encryption Key
iletişim kutusunda, yeni şifreleme anahtarı için bir ad yazın, açılır listeden bir Column Master Key Definition
seçin ve ardından OK
tıklayın. Artık yeni bir tablonun tanımında sütun şifreleme anahtarını kullanabilirsiniz.

Şifrelenmiş Değerlerle Tablo Oluşturma
Sütun ana anahtar tanımını ve sütun şifreleme anahtarlarını oluşturduktan sonra, şifrelenmiş değerlerin tutulacağı bir tablo oluşturabilirsiniz.
Bunu yapmadan önce, ne tür şifreleme kullanacağınıza, hangi sütunları şifreleyeceğinize ve bu sütunları indeksleyip indeksleyemeyeceğinize karar vermelisiniz. Always Encrypted özelliğiyle, sütun boyutlarını normal olarak tanımlarsınız ve SQL Server, şifreleme ayarlarına göre sütunun depolama boyutunu ayarlar. Tablonuzu oluşturduktan sonra, Always Encrypted kullanarak bu tablodaki komutları yürütmek için uygulamanızı değiştirmeniz gerekebilir.
SQL Server 2016 Şifreleme Türleri
Şifrelenmiş değerleri içerecek bir tablo oluşturmadan önce, her sütunun şifrelenip şifrelenmeyeceğine karar vermelisiniz.
İlk olarak, bu sütun değerleri aramak için mi yoksa sadece bu değerleri döndürmek için mi kullanılacak?
Sütun aramalar için kullanılacaksa, sütunun eşitlik işlemlerine izin veren deterministik bir şifreleme türü kullanması gerekir. Ancak, Always Encrypted özelliği kullanılarak şifrelenmiş verileri arama konusunda sınırlamalar vardır. SQL Server 2016, yalnızca equal to
, not equal to
, joins
(eşitlik kullanan) ve GROUP BY
yan tümcesindeki değeri kullanan eşitlik işlemlerini destekler. LIKE
kullanan herhangi bir arama desteklenmez. Ayrıca, SQL Server, şifresi çözülen değer yerine şifrelenmiş değere göre sıralayacağından, Always Encrypted kullanılarak şifrelenen verileri sıralama uygulama düzeyinde yapılmalıdır.
Sütun kayıtları bulmak için kullanılmayacaksa, sütun rastgele şifreleme türünü kullanmalıdır. Bu şifreleme türü daha güvenlidir ancak arama, birleştirme veya gruplama işlemlerini desteklemez.
Şifreli Sütunlarla Tablo Oluşturma
Tabloları oluştururken, sütun tanımı içinde bazı ek parametrelerle birlikte normal CREATE TABLE
sözdizimini kullanırsınız. CREATE TABLE
deyimi için ENCRYPTED WITH
sözdizimi içinde üç parametre kullanılır.
Bunlardan ilki, RANDOMIZED
veya DETERMINISTIC
değerini kabul eden ENCRYPTION_TYPE
parametresidir. İkincisi, yalnızca RAEAD_AES_256_CBC_HMAC_SHA_256
ALGORITHM
Üçüncü parametre, değeri şifrelemek için kullandığınız şifreleme anahtarı olan COLUMN_ENCRYPTION_KEY
'dir.
CREATE TABLE [dbo].[Customers] ( [CustomerId] [int] IDENTITY(1,1), [TaxId] [varchar](11) COLLATE Latin1_General_BIN2 ENCRYPTED WITH (ENCRYPTION_TYPE = DETERMINISTIC, ALGORITHM = 'AEAD_AES_256_CBC_HMAC_SHA_256', COLUMN_ENCRYPTION_KEY = YOUR_COLUMN_ENCRYPTION_KEY) NOT NULL, [FirstName] [nvarchar](50) NULL, [LastName] [nvarchar](50) NULL, [MiddleName] [nvarchar](50) NULL, [Address1] [nvarchar](50) NULL, [Address2] [nvarchar](50) NULL, [Address3] [nvarchar](50) NULL, [City] [nvarchar](50) NULL, [PostalCode] [nvarchar](10) NULL, [State] [char](2) NULL, [BirthDate] [date] ENCRYPTED WITH (ENCRYPTION_TYPE = RANDOMIZED, ALGORITHM = 'AEAD_AES_256_CBC_HMAC_SHA_256', COLUMN_ENCRYPTION_KEY = YOUR_COLUMN_ENCRYPTION_KEY) NOT NULL PRIMARY KEY CLUSTERED ([CustomerId] ASC) ON [PRIMARY] ); GO
Always Encrypted ile İndeksleme
Şifrelenmiş veriler içeren sütunlar, DETERMINISTIC
şifreleme türü kullanılarak şifrelenmiş olması koşuluyla, dizinler içinde anahtar sütunlar olarak kullanılabilir. RANDOMIZED
şifreleme türü kullanılarak şifrelenen sütunlar, bu sütunlarda bir dizin oluşturmaya çalıştığınızda bir hata mesajı verir. Her iki şifreleme türü kullanılarak şifrelenen sütunlar, kümelenmemiş dizinler içinde INCLUDE
sütunları olarak kullanılabilir.
Şifrelenmiş değerler dizin olabileceğinden, Always Encrypted ile şifrelenmiş değerler için normalde gerçekleştirdiğiniz dizin oluşturma ve ayarlamanın ötesinde ek performans ayarlama önlemi gerekmez. Ek ağ bant genişliği ve daha yüksek G/Ç, döndürülen değerlerin artan boyutundan kaynaklanan yan etkilerdir.
Her Zaman Şifreli Performans
Performans, özellikle bu durumda, olağan veritabanı trafiğine şifreleme ek yükü eklediğimizde her zaman önemli bir faktördür. Performansı test etmek için en iyi site, çeşitli senaryolar altında sorgu yürütme ve disk kullanımını test eden SQL Performance'dır:
Şifreleme ve şifre çözme işlemleri ile yapılması gereken CPU ve sabit disk çalışmaları olduğundan, kullanılan depolama alanı miktarı ve sorguların süresi üzerinde bariz bir etkisi vardır. Bu, ortamınızı (CPU, RAM ve disk özellikleri) etkileyeceğinden, bunun üretimde bir sorun oluşturup oluşturmayacağını test etmelisiniz.
Not: Microsoft SQL Sever performans optimizasyonu hakkında daha fazla bilgi edinmek isterseniz, lütfen Microsoft SQL Server'ı Performans için Ayarlama başlıklı önceki makalelerimizden birine bakın.
Uygulama Değişiklikleri
Eski kodda Always Encrypted'i düzgün bir şekilde uygulamak için ne yapmanız gerekiyor?
SQL Server 2016'nın Always Encrypted özelliğiyle ilgili güzel şeylerden biri, zaten saklı yordamlar, ORM'ler veya parametreli T-SQL komutları kullanan uygulamaların, eşitlik dışı işlemler zaten kullanılmadığı sürece Always Encrypted kullanmak için hiçbir uygulama değişikliği gerektirmemesidir. SQL ifadelerini uygulama içinde dinamik SQL olarak oluşturan ve bu komutları doğrudan veritabanına karşı yürüten uygulamaların, Always Encrypted özelliğinden yararlanabilmeleri için, tüm uygulamalar için önerilen bir güvenlik en iyi uygulaması olan sorgularının parametreleştirilmesini kullanacak şekilde değiştirilmesi gerekir.
Always Encrypted çalışması için gereken bir diğer değişiklik, veritabanına bağlanan uygulamanın bağlantı dizesine bir bağlantı dizesi özniteliğinin eklenmesidir: Column Encryption Setting=enabled
.
Bağlantı dizesine bu ayar eklendiğinde, ADO.NET sürücüsü SQL Server'a yürütülen komutun şifrelenmiş sütunlar içerip içermediğini ve varsa hangi sütunların şifrelendiğini sorar. Yüksek yüklü uygulamalar için, özellikle de yürütme komutlarının büyük bir yüzdesi şifreli değerler içermiyorsa, bu ayarın kullanılması en iyi uygulama olmayabilir.
Sonuç olarak, .NET Framework, SqlConnection nesnesi üzerinde SqlCommandColumnEncryptionSetting
adında üç olası değere sahip yeni bir yöntem sağlar:
-
Disabled
— Bu bağlantı nesnesi kullanılarak yürütülen sorgular için kullanılacak Always Encrypted sütunları veya parametreleri yoktur. -
Enabled
— Bu bağlantı nesnesi kullanılarak yürütülen sorgular için kullanılan Always Encrypted sütunları ve/veya parametreler vardır. -
ResultSet
— Always Encrypted parametresi yoktur. Ancak, bu bağlantı nesnesini kullanarak sorguları yürütmek, Always Encrypted kullanılarak şifrelenmiş sütunları döndürür.
Not: Bu yöntemin kullanımının potansiyel olarak uygulama kodunuzda önemli miktarda değişiklik gerektirebileceğini unutmayın. Alternatif bir yaklaşım, uygulamanızı farklı bağlantılar kullanacak şekilde yeniden düzenlemektir.
SQL Server'ın en iyi performansı için, Always Encrypted kullanan sorgular için yalnızca Always Encrypted ile ilgili meta verileri istemek akıllıca olacaktır. Bu, sorguların büyük bir yüzdesinin Always Encrypted kullandığı uygulamalarda, bağlantı dizesinin etkinleştirilmesi ve uygulama içindeki belirli sorguların SqlCommandColumnEncryptionSetting
olarak Disabled
olarak belirtilmesi gerektiği anlamına gelir. Çoğu sorgunun Always Encrypted değerlerini kullanmadığı uygulamalar için, bağlantı dizesi etkinleştirilmemelidir ve Always Encrypted sütunlarını kullanan sorgular için gerektiği gibi SqlCommandColumnEncryptionSetting
Enabled
veya ResultSet
olarak ayarlanmalıdır. Çoğu durumda, uygulamalar bağlantı dizesi özniteliğini etkinleştirebilir ve şifrelenmiş veriler kullanılırken uygulama performansı değişmeden kalır.
Her Zaman Şifrelenmiş Çabaya Değer mi?
Kısa cevap? Evet kesinlikle!
Yalnızca birçok olası güvenlik sorununu önlemeye yardımcı olmakla kalmaz ve SQL geliştiricilerine ek güvenlik özellikleri sağlar, aynı zamanda telekomdan bankacılık ve sigortaya kadar birçok sektörde hayati önem taşıyan sisteminizi daha uyumlu hale getirir. Ayrıca, Always Encrypted makalesinde belirtilen teknik önkoşulların mevcut sistemlerde minimum uygulama değişikliği ile uygulanabileceğini belirtmek de önemlidir.
Aynı etkiyi elde etmek için özel çözümler kullanabilseniz de, bu teknoloji SQL Server'ın yeni sürümüyle birlikte gelir ve kullanıma hazır olarak kullanılabilir. Ayrıca, bu yeni bir teknoloji olduğu için kullanımında hala bazı sınırlamalar olduğunu ve bazı ekstra donanım talepleri eklediğini belirtmek önemlidir.
Ancak, ortamınız için sorun yaratmadıkları ve şirketinizin intranetinin dışında dağıtılan bir uygulamanız olmadığı sürece, Always Encrypted kullanmamak için neredeyse hiçbir neden yoktur.