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:
- SQL Server Configuration Manager programını başlatın.
- Protocols for
ile verilen düşümü tıklayın.
- Yana açılan pencereden TCP/IP öğesini seçin.
- 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
- Veri erişim Güvenliği Hakkında genel http://msdn2.microsoft.com/en-us/library/aa302392.aspx
- SQL Server port numarası ile ilgili değişiklikler hakkında http://msdn2.microsoft.com/en-us/library/ms177440.aspx
- Bağlantı ifadesinin registry’e kaydedilmesi hakkynda http://msdn2.microsoft.com/en-us/library/aa302406.aspx
- TribleDES basit gerçeklemesi hakkında http://www.codeproject.com/vb/net/VB_NET_TripleDES.asp
- SQL Enjeksiyonu hakkında http://www.verivizyon.com/detail.asp?cid=283
Makalede kullanılan örnek kodlar
indirmek için
tıklayınız