Anasayfa | Hakkımda | Kitaplarım | RSS Site içinde
Kategoriler
» SQL Server 2012
» SQL Server 2008
» C#
» MySQL
» Hayata Dair
» Güncel Haber-Duyuru
» Bir Soru Bir Cevap
» Oracle ve Diğer VTYS
» Java

Yazılımcılar için SQL Server Erişim Güvenliği

05.11.2007 00:00:00
Bir yazılımcı iseniz, uygulamanızın veritabanına erişiminin zaruri olduğunu bilirsiniz. Ancak veritabanınıza sizden başka kimsenin erişmemesi için almanız gereken bir dize önlemi gözardı etmemek gerekir. Bu makalade, SQL Server 2005 üstünde çalıştırılacak bir uygulamayı “veritabanı erişim güvenli” hale getirmek için önemli bazı hususları ele alacağız. Bir uygulamadan veritabanına sızmak için kullanılagelen belli başlı yöntemleri nasıl durdurabileceğimizle ilgili noktalara değineceğiz.

Web Sitenizle SQL Server aynı sunucu üstünde ise almanız gereken güvenlik önlemleri

Veri yönlendirmeli siteler için kullanılan ASP veya ASP.NET uygulamaları, SQL Server ile aynı makinalarda çalıştırılır. Bu, sunucu giderlerini azaltmak, bakımı kolaylaştırmak veya network trafiğini azaltmak gibi kaygılardan dolayı tercih edilir. Ancak bu tür durumlarda en büyük tehlike, SQL Server’ın Internet tarafından gelecek saldırılara açık olma durumudur.

Böyle bir durumu farkeden saldırgan, hiçbir değişiklik yapılmamış SQL Server için IP, port ve kullanıcı adı değerlerine sahiptir. şifre için de kaba kuvvet(olası ihtimallerin tümünü deneme) yoluna gidecek demektir. Burada amacımız, saldırganın işini zorlaştırmak için SQL Server ‘in default değererini değiştirmekten ibarettir.

SQL Server Port Numarasını değiştirmek

Elbette durum, bir dize firewall ayarı ile dramatiklikten kurtarılabilir. Ancak biz, firewall’yn ötesinde bir önlem olarak SQL Server ayarları ile de durumu garantiye almak istiyorsak, SQL Server’ın dinlediği port numarasını değiştirmek ciddi bir çözüm olarak ele alınabilir. Bir SQL Server 2005 için Default SQL Server port numarasını değiştirmek için şu aşamaları takip edebilirsiniz:

  1. SQL Server Configuration Manager programını başlatın.
  2. Protocols for ile verilen düşümü tıklayın.
  3. Yana açılan pencereden TCP/IP öğesini seçin.
  4. IP Address sekmesini tıklayın.(şekil 1)

şekil 1: Dinamik port dinlemenin kaldırılması ve Default SQL Server port numarasının değiştirilmesi.

Bu ekranda TCP Dynamic Ports değeri boş bıraklılarak, SQL Server’in dinamik port kullanımı engellenebilir.

TCP Port değeri boş bıraklırsa SQL Server 1433 portunu dinler. Sib bu değeri başka bir port ile değiştirebilirsiniz. Bu durumda SQL Server servisini yeniden başlatarak yeni porttan SQL Server’in istek alabilir ve cevap verebilir hale gelmesini sağlayabilirsiniz.

Bu durum, herhangi bir saldırganın, SQL Server’ınızı ele geçirmek için bildik bir porta yüklenmesini engellemek için yapılmış bir ayarlamadır.

Standart sa login hesabının erişimini durdurmak

şayet web sunucusu ile SQL Server aynı makinede kurulu ise bir diğer alınmasında fayda bulunan önlem olarak, sa kullanıcısının sisteme erişimini engellemek ve kendimize tahmin edilemez başka kullanıcılar açmak faydalı olacaktır. Webuser, gibi genel kullanıcı adları da tahmin edilebilir kullanıcı adları olarak ele alınabilir.

SQL Server sa kullanıcısının sisteme erişimini durdurmak:

1.Management Studio ile ilgili SQL Server’a bağlanın.

2.Object Explorer penceresi aracılığıyla Security/logins sekmesine gidin.

3.sa kullanıcısını bulun, sağ tıklayarak properties ekranını açın.

4. login properties ekranından(şekil 2) veritabanı motoruna erişimini kısıtlamak için(DENY) seçeneğini ve login olamaması için de disabled seçeneğini işaretleyin.

şekil 2: SQL Server sa login hesabını dondurmak

DİKKAT:

Bunun dışında, Web sunucu üstünde bulunan bir SQL Server için oluşturacağınız kullanycılarınıza zor şifreler vermeyi ihmal etmeyin. Zor bir şifre tabiri günümüz için geçerli olmak üzere; harf, rakam ve ascii karakterleri(@~^… gibi) içeren ve 8 karakteri aşan şifreler için kullanılmaktadır.

Bağlantı İfadelerinizi Registry’e Kaydetmek

Bir önceki makalede ve bir çok eski makalede bağlantı ifadesinin, SQL Server’a erişim ile ilgili bütün bilgileri içeren bir ifade olduğunu görmüştük. şimdi bu ifadenin ard niyetliler için ele geçmesini önlemek için şifrelemeyi ele alacağız. Bir çok yerde, bağlantı ifadesini şifreleyip Windows Registry’sine kaydetmek bahsine rastlamışsınızdır. İşte bu işin nasıl yapılacağını ele alacağız.

DİKKAT:

Registry Windows ayarlarının tutulduğu bir ayarlar merkezidir ve umulmadık değişiklikler, sisteminizin zarar görmesine neden olabilir.

şayet paylaşımlı bir sunucu kullanıyorsanız, sunucu yöneticileri muhtemelen registry’e erişiminize izin vermeyeceklerdir. Bu durumda, ilk durum kadar ciddi bir güvenlik önlemi olmamakla birlikte, bağlantı ifadesini kodlarınızın içine şifreleyerek gömmeniz bir yere kadar tercih edilebilir. Ancak kesin bir yöntem değildir. Kaynakları takip ederek, alternatif bağlantı ifadesi kaydetme seçeneklerini inceleyebilirsiniz.

Şekil 3: Bağlantı ifadesini Trible DES ile şifreleyip geri çözebilen ve registry’e kaydedebilen C#.NET uygulaması (makale ekinde kaynak kodunu indirip çalıştırabilirsiniz.)

Bir ifadenin TribleDES ile şifreli halini elde etmek için, ekteki kütüphaneyi indirerek şu şekilde kullanabilirsiniz:

byte[] plainText = Encoding.ASCII.GetBytes(txtConnectionString.Text); 
byte[] key = Encoding.ASCII.GetBytes(txtKey.Text); 
byte[] initVec = Encoding.ASCII.GetBytes(txtInitializationVector.Text);
cTripleDES des = new cTripleDES(key, initVec); 
byte[] cipherText = des.Encrypt(plainText);
txtEncryptedString.Text = Convert.ToBase64String(cipherText);
                

DİKKAT:

TribleDES’ i kullanabilmek için anahtar’ın en az 16 ve başlangıç vektörünün de 8 karakter olması gerekir.

Yukarıdaki şekilde şifreli hali elde edilen ifadenin registry’e kaydedilmesi için şu türden bir ifade yeterli olacaktır:

RegistryKey rk = Registry.LocalMachine.OpenSubKey("Software", true);
rk = rk.CreateSubKey("TestApplication");

rk.SetValue("connectionString", txtEncryptedString.Text);
rk.SetValue("initVector",
Encoding.ASCII.GetBytes(txtInitializationVector.Text));
rk.SetValue("key", Encoding.ASCII.GetBytes(txtKey.Text));
MessageBox.Show("Bilgiler başarıyla registrye eklendi");

                

Uygulama HKEY_LOCAL_MACHINE\Software\TestApplication yoluna parametreleri ve değerlerini şifreli olarak eklemekte.

şekil 4: Registry’e aktarılmış bilgilerin regedit ile gösterilmesi

şifreli Bağlantı ifadesini bir ASP.NET uygulamasından çağırmak

şimdi artık tüm yapmamız gereken .NET kütüphanelerini kullanarak Software\TestApplication yolunda yer alan şifrelenmiş bağlantı ifadesi ve şifre çözmek için gerekli temel bilgileri alıp gerçek bağlantı ifadesini elde etmekten ibaret olacaktır.

Herhangi bir yerde tekrardan Connection String ifadesini tam olarak oluşturmamız gerektiğinde:

RegistryKey rk = Registry.LocalMachine.OpenSubKey(
						@"Software\TestApplication", false);
bSifreliBaglanti.Text = (string)rk.GetValue("connectionString");

byte[] initVector = (byte[])rk.GetValue("initVector");
byte[] strKey = (byte[])rk.GetValue("key");

cTripleDES des = new cTripleDES(strKey, initVector);

byte[] plainText = des.Decrypt(Convert.FromBase64String(
							   lbSifreliBaglanti.Text));
lbGercekBaglanti.Text = Encoding.ASCII.GetString(plainText);

Örneği yeterli olacaktır. Bundan sonra, bağlantı ifadesi olarak Web.config dosyasında sadece TestApplication şeklinde registry girdisinin adını tutmak sizin için yeterli olacaktır.

SQL Enjeksiyonu ve korunma yolları hakkında

SQL Enjeksiyonu da yine veriviyon bünyesinde bir çok makalede ayrıntılarını bulabileceğiniz bir saldırı türüdür. Burada SQL Enjeksiyonunun detaylarından ziyade korunma yöntemlerini ele alacağız.

SQL Enjeksiyonu, fazla bir bilgi birikimi gerektirmeyen, yüzeysel birkaç bilgi ile bile tehlikeli olabilecek bir saldırı türüdür. Bu nedenle de verilerin kalbine direk yönlebilen tehlikeli bir saldırı tarzı olarak düşünülmelidir.

SQL Enjeksiyonundan kaçınmak için bir yazılymcının kodlarında mutlaka tek tırnakları yakalayarak iki tek tırnak ile değiştiriyor olması gerekir. Bu işi biraz ileri götürüp, kullanıcıdan alınan her değeri bir temizleme fonksiyonundan geçirmek,merkezi bir kullanıcı verileri temizleme yeteneğini programınıza kazandıracaktır.

Örnek bir C# Temilzeme fonksiyonu:

private string DokunmaSqlime(string kullaniciGirdisi)
{
// SQL içerisinde problem çıkartan karakterler
  // '  gelirse  ''  yapılmalı
  // [  gelirse  <] yapılmalı
  // %  gelirse [%] yapılmalı
  // _  gelirse [_] yapılmalı

  string s = inputSQL;
  s = inputSQL.Replace("'", "''");
  s = s.Replace("[", "<]");
  s = s.Replace("%", "[%]");
  s = s.Replace("_", "[_]");
  return s;
}  

Bu türden bir fonksiyonu, kullanıcıdan veri aldığınız her bir değer için şu şekilde kullanmak gerekir:

kullaniciAd=DokunmaSqlime(txtKullaniciAd.Text);

Öte yandan, kullanıcı girdilerini mümkün olduğu kadar sayılara indirgemek ve look-up tablolary, drop box gibi bu amaca yönelik girdi elemanları ve veritabanı öğelerini kullanmanız işlemlerinizi kolaylaştıracaktır.

Stored Procedure veya Ad-Hoc bütün sorgularınızda kullanıcıdan gelen SQL ifadesi kısmı için Parametre nesnelerini kullanmanız, SQL güvenliğinizi artıracaktır.

Sonuç ve Değerlendirme

Bu makalede, SQL Server’a bir yazılımın erişimini güvenli hale getirmek için dikkat edilmesi gereken temel hususları ele aldık.

Kaynaklar ve Ek Bilgi

  1. Veri erişim Güvenliği Hakkında genel http://msdn2.microsoft.com/en-us/library/aa302392.aspx
  2. SQL Server port numarası ile ilgili değişiklikler hakkında http://msdn2.microsoft.com/en-us/library/ms177440.aspx
  3. Bağlantı ifadesinin registry’e kaydedilmesi hakkynda http://msdn2.microsoft.com/en-us/library/aa302406.aspx
  4. TribleDES basit gerçeklemesi hakkında http://www.codeproject.com/vb/net/VB_NET_TripleDES.asp
  5. SQL Enjeksiyonu hakkında http://www.verivizyon.com/detail.asp?cid=283

Makalede kullanılan örnek kodlar indirmek için tıklayınız

Konuya müdahil olmak ister misiniz?
Başlık:  
İsim  :  
URL   :
Yorum