SQL Server güvenlik kavramı Windows’un güvenlik mekanizmasına benzemektedir. SQL Server güvenlik mekanizmasının temelinde Securable (Güvenliği sağlanacak nesneler) ve Principal (bir nesne üzerinde yetkilendirilebilir nesneler) kavramları yatmaktadır. Örneğin bir tablo, stored procedure gibi nesneleri Securable olarak örneklendirebiliriz. Principal kavramı ise Securable üzerinde yetkilendirilecek nesneler olarak tanımlanır. Örneğin kullanıcılar, kullanıcı tanımlı roller, gibi nesneler Prinicipal olarak örneklendirilebilir.
Server Seviyesinde Güvenlik
SQL Server seviyesindeki güvenlik bilgileri master veritabanında tutulmaktadır. Herhangi bir kullanıcı SQL Server’a bağlanmaya çalışırken gerekli bilgiler master veritabanında tutulan verilerle karşılaştırılır. Eğer söz konusu kullanıcı bağlanmak için gerekli yetkiye sahipse sonraki adım olan veritabanında yetkilendirme işlemi yapılıp güvenlik adımları tamamlanır.
SQL Server Kimlik Doğrulama Türleri
MS SQL Server için server seviyesinde belirlenmesi gereken ilk güvenlik ayarı Kimlik Doğrulama modu’dur. İki tür kimlik doğrulama modu vardır; Windows Authentication Mode ve Mixed Mode.
Windows Authentication Mode sadece Windows üzerinde yetkilendirilmiş kullanıcılar için kullanılan bir seçimdir. Mixed mode ise hem Windows authentication da kullanılan hem de SQL Server’ın kendi kullanıcılarının tanımlandığı mode’dur.
Windows Authentication Mode: Microsoft tarafından tavsiye edilen ve sadece Windows kullanıcıları tarafından kullanılabilen mode’dur. Bu şekilde bağlantının sağlanabilmesi için kullanıcının Windows üzerinde domain veya local kullanıcı hesabı olarak oluşturulması ve SQL Server’a tanıtılması gerekmektedir. Bu tanıtım sırasında windows'un her kullanıcıya atadığı Windows SID değeri SQL Server’a tanıtılır ve kullanıcının geçerli bir kullanıcı olup olmadığı mekanizması bu SID’ye göre belirlenir. Windows Auth’un bir diğer avantajı da Windows üzerinde tanımlanan kullanıcı grupları sayesinde tek hamleyle birden fazla kullanıcıyı yetkilendirmesidir.
NOT: Test isimli bir kullanıcıyı Windows üzerinden sildiğimizi düşünelim, Test Kullanıcısı SQL Server tarafında sahipsiz bir kullanıcı olarak kalır. Daha sonra aynı isim ve yetkilerle yeni bir kullanıcı oluştursak bile SID değeri farklı olacağı için SQL Server’a ulaşamayacaktır.
Mixed Authentication Mode: Bu mod seçildiğinde hem Windows üzerinde tanımlanmış kullanıcılar yetkilendirilebilir hem de SQL Server’ın kendi kullanıcı hesapları tanımlanıp yetkilendirilebilir. Mixed Mode kullanıldığında SA isimli bir kullanıcı otomatik oluşturulur. SA SQL Server üzerinde tüm yetkilere sahip bir kullanıcıdır. Bu nedenle bu kullanıcı ya kullanılmamalı yada kullanılması şartsa çok kompleks bir şifre kullanılmalıdır. SA hesabının boş şifre ile kullanılması hacker’ların ilk baktığı açıktır.
SQL Server Authentication seçilirse Authentication SQL Server kendi güvenlik mekanizması için kendi içinde kullanıcı adı ve parola tutar ve bağlanmak isteyen kullanıcı SQL Server Authentication seçerse burada bulunan kullanıcı adı ve şifre sorulur.
SQL Server Authentication mecbur kalınmadıkça kullanılmamalıdır ve mevcut uygulamalarla sınırlı olmalıdır. SQL Server Authentication genelde uygulama bir üçüncü taraf firmadan alınmışsa ve kimlik değiştirilemiyorsa kullanılmaktadır.
SQL Server Login
Windows Authentication Mode: Bir kullanıcı Windows kullanıcı hesabı ile bağlandığında, SQL Server hesap adı ve Windows sorumlu belirteci (principial token) kullanarak parola doğrulanır. Bu kullanıcı kimliğinin Windows tarafından teyit edildiği anlamına gelir. Windows Authentication modu, Kerberos güvenlik protokolü, güçlü parolalar için karmaşıklık ilkesi ile hesap kilitleme ve parola süresi dolma (expiration) desteği sağlar.
SQL Server Authentication: SQL Server Authentication ile ilgili bilinmesi gereken çok önemli iki nokta vardır. Birinci nokta, SQL Server’ın login parolasının şifreli bir kopyasını değil parola’nın hashini sakladığıdır. Hash şifreden farklı olarak tersinir değildir. Bir login gerçekleştiğinde kullanıcı tarafından gönderilen hash’li şife ve saklanan hash karşılaştırılır. Bu iki hash eşleşirse parola kabul edilir ve giriş başarılı olur.
İkinci nokta ise, SQL Server 2000 sürümünden sonra hashleme için SHA kullanmaktadır. 6.5 ve 7 sürümlerinde is hashleme algoritması olarak Snefru kullanmaktaydı. 6.5 sürümünde parolalar sadece ASCII olabiliyordu, Snefru algoritması sadece ASCII string’leri destekliyordu. 7 sürümünde ise parolalar Unicode olarak işlenmeye başlandı bu 6.5 ve 7 sürümleri’nin hashleri arasındaki temel farktır.
2000 sürümünde hashleme algoritması SHA1 olarak değiştirildi, fakat geçmişle uyumluluk için sunucu hem orijinal parola’nın hashini hem de büyük harfe duyarsız parolalar için parola’nın büyük harfe dönüştürldükten sonraki hashini saklar. Bunun için, kullanıcı şifresi Unicode değilse Unicode yapılır, salt değeri eklenir, elde edilen değer SHA1 algoritması ile hashlenir, parola büyük harfe dönüştürülür, salt tekrar eklenir ve SHA1 ile hashlenir ve bütün değerler birleştirilir. Bu durum çok tepki çekmiştir çünkü şifre büyük harflerden oluşuyorsa hash kendini tekrar eden iki parçadan oluşmuş olur. Bu durum da sözlük saldırılarında kullanılacak sözlüğün boyutunu küçülteceği için parola’nın kırılma ihtimalini artırıyordu.
2005 ve 2008 sürümlerinde geriye dönük uyumluluk kaldırılarak, büyük harfe duyarsız hash de kaldırılmıştır. SQL Server 2005 ve 2008’de desteklenen hashleme algoritmaları şöyledir;
Ancak tavsiye edilen algoritmalar SHA-1 ve MD5 ‘dır.
SQL Server 2005 SHA256 gibi güçlü algoritmaları desteklemez, bu nedenle güçlü hashleme için rasgele bayt dizisi yani salt değeri gereklidir. SQL Server 2005 salt değeri kullanımını sağlamaz ancak .NET Framework kullanımına izin verir. NET SHA 256 kullanarak asla aynı değeri vermeyen hashler üretir. .NET SHA1, MD5, SHA256, SHA384 ve SHA512 algoritmalarını destekler. .NET üzerinde C# kodu ile .NETEncrypt fonksiyonu sayesinde girdi olarak alınan parola’dan hash ve salt değerlerini içeren SQL Server bayt dizisi elde edilebilir.
Kullanılan algoritma ne olursa olsun hashleme HASHBYTES sistem fonksiyonu tarafından yapılır. HASHBYTES iki değeri kabul eder. Bunlar kullanmak için algoritma ve hashlenecek değer’dir. HASHBYTES fonksiyonu’nun en büyük dezavantajı SQL Server’ın desteklediği tüm veri türlerini desteklememesidir. HASHBYTES fonksiyonu CHAR ve VARCHAR veri tipleriyle ASCII Dizesi kullanırsa 8000 karakterin üzerine izin verir ancak Unicode dizesi ile NCHAR ve NVARCHAR veri tipleriyle kullanıldığında 4000 karakterin üzerine izin verir.
SQL Server’da login bilgileri master database’deki syslogins tablosunda tutulmaktadır ve geriye dönük uyumluluk için bulundurulmaktadır. İleriki bir sürümde kaldırılacaktır. Görüntülemek için master DB’de aşağıdaki komut çalıştırılır,
Bu komut çalıştırıldığında aşağıdaki gibi bir tablo görüntülenir. Bu tablo da SQL Server’daki her oturum için bir satır bulunması gerekir.
![sekil-1.png](https://www.bilgiguvenligi.gov.tr/images/stories/inansencan/sql/sekil-1.png)
Bu tablo SQL Server’ın ilerleyen bir sürümünde kaldırılacağı için yeni projelerde bu tablo yerine sys.server_principals sistem görünümü kullanılması tavsiye edilmektedir. Syslogins ve sys.server_principals'in satır sayısı aynıdır çünkü iki tablo’da tanımlı her oturum için bir satır bulundurur. Sys.server_principals ‘i çalıştırmak için gerekli komut ve komut çalıştırıldığında görüntülenecek tablo aşağıdaki gibidir.
![sekil-2.png](https://www.bilgiguvenligi.gov.tr/images/stories/inansencan/sql/sekil-2.png)
Ayrıca sys.server_principals’in tüm sütunlarına sahip olan ve ekstra birkaç sütuna daha sahip olan, sys.sql_logins katalog görünümü de kullanılabilir. Bu katalog görünümünü çalıştırmak için gerekli kod ve tablo’nun görünümü ise aşağıdaki gibidir.
![sekil-3.png](https://www.bilgiguvenligi.gov.tr/images/stories/inansencan/sql/sekil-3.png)
SQL Server Bağlantısının Şifrelenmesi
Bir istemci uygulaması, SQL Server'a bağlandığında iletilen kimlik bilgileri (giriş paket içinde) her zaman şifrelenir. Varsa SQL Server güvenilen bir sertifika yetkilisinden bir sertifika kullanır. Güvenilen bir sertifika yüklü değilse, SQL Server örneği başlatıldığında kendinden imzalı bir sertifika oluşturur ve kimlik bilgilerini şifrelemek için bu kendinden imzalı sertifikayı kullanır. Bu kendinden imzalı sertifika güvenliğini artırmaya yardımcı olur ancak sunucu tarafında kimlik sızdırmaya karşı koruma sağlamaz. Kendinden imzalı sertifika kullanılır ve ForceEncryption seçeneği Evet olarak ayarlanırsa, SQL Server ve istemci uygulaması arasında bir ağ üzerinden aktarılan tüm veriler otomatik olarak imzalanan sertifika kullanılarak şifrelenir.
SQL Server makinasına olan bağlantıyı şifrelemek için kullanılabilecek iki yöntem vardır.
IPSec
SSL
Taşıma halinde şifreleme ağ üzerindeki veri paketlerinin şifrelenmesidir. IPSec şifreleme işini iyi yapar ancak işletim sistemi aracılığıyla ayarlanır ve sunucuya gelen/giden tüm veri şifrelenir. Eğer herhangi bir sorunu gidermek için ağdaki trafik analiz edilecekse IPSec kapatılır.
IPSec
TCP/IP protokolü geliştirilirken güvenlik üzerinde pek fazla durulmamıştı. Çünkü TCP/IP protokolünün bu denli yoğun ve standart olarak kabul edilip kullanılacağı düşünülmemişti. Bu nedenle verilerimiz ağ üzerinde savunmasız olarak ilerler ve birçok tehlikeyle karşılaşabilirler. Bu tehlikeler verilerimizin değiştirilmesi, verilerimizin kaybolması ve bununla beraber verilerimizin istenilen hedeflere ulaştırılmaması olabilir. IPsec protokolü sayesinde verilerimiz ağ üzerinde güvenli bir şekilde ulaşmak istedikleri hedeflere ulaştırılır. IPsec protokolü IP protokollerinin güvenlik ihtiyaçlarını karşılamak için geliştirilmiş olan bir güvenlik protokolüdür.
IPsec Güvenlik Nasıl Sağlanır ?
IPSec’ in güvenlik mimarisini oluşturan üç temel unsur vardır:
Bütünlük (integrity); hedefe ulaşan verinin kaynaktan gelen veri ile aynı olup olmadığı kontrol edilir. Ağ üzerinden gönderilen mesajın gerçekten gönderilen mesaj olup olmadığını anlamak için, mesajı alan bilgisayarın hesapladığı mesaj özeti (message digest) değeri ile mesajı gönderinin ilettiği mesaj özeti değerleri karşılaştırılır. Sonuç farklıysa iletilen mesaja iletim sırasında müdahale edildiği anlaşılır. Mesajları özetlemek için MD5 ve SHA-1 algoritmaları kullanılır.
Kimlik doğrulama (Authentication); iletişimde bulunan her iki tarafın da birbirlerinin kimliklerinin doğrulanması için kullanılır. İletişimde bulunan bilgisayarların birbirlerinin kimliklerini doğrulamaları için aynı kimlik doğrulama metodunu kullanması gerekir. IPSec protokolünü kullanarak iletişim kuracak bilgisayarlar, kimlik doğrulama işlemi için çeşitli yöntemler kullanabilirler. Bunları şöyle sıralayabiliriz:
Önpaylaşımlı anahtar (presharedkey) (MS-CHAP)
Kerberos (Windows tabanlı ağlar için)
Sertifika yetkilisi (certificateauthority)
Gizlilik (Confidentiality); Gönderilen verinin ağ üzerinden şifrelenmiş bir şekilde iletilmesini belirtmek için kullanılır. Bu durumda, ağdaki paketler bir izleyici (sniffer) aracılığıyla yakalansalar bile içerikleri şifrelenmiş olduğu için taşınan verilerin üçüncü şahıslar tarafından okunması engellenmiş olur. Şifreleme işleminde en çok kullanılan yöntemler DES ve 3DES yöntemleridir.
IPSec istemci veya sunucu işletim sistemleri tarafından sağlanır ve SQL Server’a özgü hiçbir özel yapılandırma gerektirmez.
İşletim sistemi ayarları ise,
Start>Programs>Administrative Tools>LocalSecurity Policy. Sağ tık “IP Security Policies on LocalComputer” option on themenu ontheleftandselect “Create IP Security Policy.” Thiswillbringupthe IP Security Policy Wizard.
SSL
SSL kullanmak ise nispeten daha kolaydır çünkü sadece SQL Server altyapısı ile gönderilen veriyi şifreler ve sadece DBA tarafından kontrol edilebilir. SSL şifreleme kullanmanın birkaç yöntemi vardır.
Güvenilir bir otoriteden sertifika almak. Bunun GoDaddy gibi bir yerden satın alınması gerekir.
Kendiniz bir sertifika oluşturmak. Bunun için IIS Resource Kit kullanılması gerekir.
SQL Server başladığında bir kendinden imzalı sertifika kullanmak
İlk iki seçenekte sunucuya bağlanmak isteyen her istemciye de import edilmelidir.
Bir sertifika yüklemek için,
Başlat menüsünde, Çalıştır'ı tıklatın ve Aç kutusuna MMC yazın ve Tamam 'ı tıklatın.
MMC konsolunda, Dosya menüsünde, Ekle / RemoveSnap-in 'i tıklatın.
Add / RemoveSnap-in iletişim kutusunda, Ekle'yi tıklatın.
InSnap-in iletişim kutusunda, Sertifikalar 'ı tıklatın, Ekle' yi tıklatın Bağımsız ekle.
Sertifikalar ek bileşenini iletişim kutusunda, bilgisayar hesabını tıklatın ve ardından Son'u tıklatın.
AddStandaloneSnap-in iletişim kutusunda, Kapat'ı tıklatın.
InAdd / RemoveSnap-in iletişim kutusunda, Tamam'ı tıklatın.
Ek bileşenini Sertifikalar, Sertifikaları genişletin Personal 'ı genişletin ve sonra sağ tıklatın, Sertifikalar, Tüm görevler' in ve ardından Al'ı tıklatın.
Bilgisayara bir sertifika eklemek ve MMC konsolu kapatmak için, Sertifika Alma Sihirbazı'nı tamamlayın.
Etkinleştirme işlemi is SQL Server Configuration Manager içierisinden yapılır. Güvenilen bir kurumdan alınmış sertifika ile man-in-the-middle saldırılarına karşı koruma daha yüksek olacaktır.
SSL Ilk zamanlar sadece HTTP trafiğini şifreleme amaçlı geliştirilmiş olsa da günümüzde TCP tabanlı tüm servisleri şifreleme amaçlı kullanılabilmektedir.
Sertifikalar sayesinde sayısal imzaları kullanarak bir verinin gerçekten beklenen kişi tarafından gönderildiği ve iletim esnasında değişikliğe uğramadığını anlayabiliriz, gönderilen verinin gerçekten beklediğimiz insana ulaştığından emin olmak için yani açık anahtarını kullanarak verileri şifrelediğimiz kişinin gerçekte düşündüğümüz kişi olduğundan emin olmak istediğimizde sertifika tanımı ortaya çıkıyor. Bir sertifika basitce kişinin açık anahtarının yetkili bir sertifika otoritesi tarafından imzalanmış halidir diyebiliriz.
Sertifika Otoritesi Sertifika isteğinde bulunan şahıs/kurumların gerçekte belirttikleri kişiler/kurumlar olduklarını(bunun yanında belirtilen diğer hususları da) doğrulayan ve onaylayan kurumdur. Verisign, Globalsign gibi. Eğer her iki tarafta ortak güvenilen bir sertifika otoritesi tarafından imzalanmış sertifika kullanıyorsa birbirlerinin public keylerine güvenebilirler.
SQL Server örneği bir genel sertifika yetkilisinden bir sertifika atanmış bir bilgisayarda çalışıyorsa, bilgisayar ve SQL Server örneğinin kimliği güvenilen kök yetkilisi tarafından garanti edilmiş olur. Bunun dışındaki sertifikalar ise sınırlı koruma sağlar.
SSL şifreleme seviyesi client ve sunucuda çalışan işletim sistemine bağlı olarak 40 bit veya 128 bit’tir. İstemci ile sunucu arasındaki trafiğin SSL ile şifrelenmesi güvenliği arttırır ancak bağlantı hızını azaltır.
SQL Server Password Policy
SQL Server’da Windows password policy mekanizmaları kullanılabilir. SQL Server’da Windows’takine benzer complexity ve expiration ilkeleri kullanılabilir.
Password Complexity
Parola karmaşıklık ilkeleri olası parolaların sayısını artırarak brute force ataklarını engellemek için tasarlanmıştır. Bu kural uygulandığında yeni parolalar aşağıdaki listeye uygun olmalıdır.
Parola, kullanıcı adının tamamını veya bir kısmını içeremez.
Parola en az sekiz karakter uzunluğunda olmalıdır.
Aşağıdaki dört karakter kategori’sinden en az üçünü içermelidir.
(A - Z) büyük harfler,
(a - z) küçük harfler,
(0 – 9) rakamlar,
! / $ / # / % gibi alfanümerik olmayan karakterler
Parolalar en fazla 128 karakter olabilir ve daha güvenli olması için uzun ve karmaşık parolalar tercih edilmelidir.
Password Expiration
Parola expiration ilkeleri bir parolanın ömrünü yönetmek için kullanılır. Zamanı geldiğinde değiştirlmeyen parolaların kullanıcıları disable olur.
Politika Uygulama
Parola ilkesinin uygulanması her bir SQL Server oturum için ayrı ayrı yapılandırılabilir. Bir SQL Server oturum açma parola ilkesi seçeneklerini yapılandırmak için ALTER LOGIN (Transact-SQL) kullanılır. Aşağıdaki kurallar parola ilkesi zorlama yapılandırması için geçerlidir:
CHECK_POLICY “ON” olarak değiştirildiğinde aşağıdaki davranışlar olur,
CHECK_EXPIRATION özel olarak “OFF” olarak ayarlanmazsa “ON” olarak gelir.
Parola geçmişi mevcut parolanın hash değeri ile başlatılır.
CHECK_POLICY “OFF” olarak değiştirildiğinde aşağıdaki davranışlar olur,
CHECK_EXPIRATION “OFF” konumdadır.
Parola geçmişi temizdir.
Lockout_time değeri resetlenmiştir.
Bazı politika kombinasyon seçenekleri ise desteklenmez.
Eğer MUST_CHANGE belirtilirse, CHECK_EXPIRATION ve CHECK_POLICY “ON” olmalıdır. Aksi takdirde deyim çalışmaz.
Eğer CHECK_POLICY “OFF” olarak ayarlanmışsa, CHECK_EXPIRATION “ON” yapılamaz. Seçenekleri bu şekilde olan ALTER LOGIN başarısız olur.
CHECK_POLICY “ON” olarak ayarlanırsa aşağıdaki gibi olan parolaların kullanılması engellenir.
Boş veya geçersiz,
Bilgisayar veya login adıyla aynı,
Şunlardan biri ise; password, admin, administrator, sa, sysadmin.
Güvenlik politikası Windows’ta ayarlanmış veya domain’den alınmış olabilir. Bilgisayardaki parola politikasını görüntülemek için, Local Security Policy MMC bileşeni kullanılabilir (secpol.msc).
Kaynaklar
[1] www.mssqltips.com
[2] www.msdn.microsoft.com
[3] İsmail ADAR – SQL Server 2012 – Pusula Yayıncılık
Server Seviyesinde Güvenlik
SQL Server seviyesindeki güvenlik bilgileri master veritabanında tutulmaktadır. Herhangi bir kullanıcı SQL Server’a bağlanmaya çalışırken gerekli bilgiler master veritabanında tutulan verilerle karşılaştırılır. Eğer söz konusu kullanıcı bağlanmak için gerekli yetkiye sahipse sonraki adım olan veritabanında yetkilendirme işlemi yapılıp güvenlik adımları tamamlanır.
SQL Server Kimlik Doğrulama Türleri
MS SQL Server için server seviyesinde belirlenmesi gereken ilk güvenlik ayarı Kimlik Doğrulama modu’dur. İki tür kimlik doğrulama modu vardır; Windows Authentication Mode ve Mixed Mode.
Windows Authentication Mode sadece Windows üzerinde yetkilendirilmiş kullanıcılar için kullanılan bir seçimdir. Mixed mode ise hem Windows authentication da kullanılan hem de SQL Server’ın kendi kullanıcılarının tanımlandığı mode’dur.
Windows Authentication Mode: Microsoft tarafından tavsiye edilen ve sadece Windows kullanıcıları tarafından kullanılabilen mode’dur. Bu şekilde bağlantının sağlanabilmesi için kullanıcının Windows üzerinde domain veya local kullanıcı hesabı olarak oluşturulması ve SQL Server’a tanıtılması gerekmektedir. Bu tanıtım sırasında windows'un her kullanıcıya atadığı Windows SID değeri SQL Server’a tanıtılır ve kullanıcının geçerli bir kullanıcı olup olmadığı mekanizması bu SID’ye göre belirlenir. Windows Auth’un bir diğer avantajı da Windows üzerinde tanımlanan kullanıcı grupları sayesinde tek hamleyle birden fazla kullanıcıyı yetkilendirmesidir.
NOT: Test isimli bir kullanıcıyı Windows üzerinden sildiğimizi düşünelim, Test Kullanıcısı SQL Server tarafında sahipsiz bir kullanıcı olarak kalır. Daha sonra aynı isim ve yetkilerle yeni bir kullanıcı oluştursak bile SID değeri farklı olacağı için SQL Server’a ulaşamayacaktır.
Mixed Authentication Mode: Bu mod seçildiğinde hem Windows üzerinde tanımlanmış kullanıcılar yetkilendirilebilir hem de SQL Server’ın kendi kullanıcı hesapları tanımlanıp yetkilendirilebilir. Mixed Mode kullanıldığında SA isimli bir kullanıcı otomatik oluşturulur. SA SQL Server üzerinde tüm yetkilere sahip bir kullanıcıdır. Bu nedenle bu kullanıcı ya kullanılmamalı yada kullanılması şartsa çok kompleks bir şifre kullanılmalıdır. SA hesabının boş şifre ile kullanılması hacker’ların ilk baktığı açıktır.
SQL Server Authentication seçilirse Authentication SQL Server kendi güvenlik mekanizması için kendi içinde kullanıcı adı ve parola tutar ve bağlanmak isteyen kullanıcı SQL Server Authentication seçerse burada bulunan kullanıcı adı ve şifre sorulur.
SQL Server Authentication mecbur kalınmadıkça kullanılmamalıdır ve mevcut uygulamalarla sınırlı olmalıdır. SQL Server Authentication genelde uygulama bir üçüncü taraf firmadan alınmışsa ve kimlik değiştirilemiyorsa kullanılmaktadır.
SQL Server Login
Windows Authentication Mode: Bir kullanıcı Windows kullanıcı hesabı ile bağlandığında, SQL Server hesap adı ve Windows sorumlu belirteci (principial token) kullanarak parola doğrulanır. Bu kullanıcı kimliğinin Windows tarafından teyit edildiği anlamına gelir. Windows Authentication modu, Kerberos güvenlik protokolü, güçlü parolalar için karmaşıklık ilkesi ile hesap kilitleme ve parola süresi dolma (expiration) desteği sağlar.
SQL Server Authentication: SQL Server Authentication ile ilgili bilinmesi gereken çok önemli iki nokta vardır. Birinci nokta, SQL Server’ın login parolasının şifreli bir kopyasını değil parola’nın hashini sakladığıdır. Hash şifreden farklı olarak tersinir değildir. Bir login gerçekleştiğinde kullanıcı tarafından gönderilen hash’li şife ve saklanan hash karşılaştırılır. Bu iki hash eşleşirse parola kabul edilir ve giriş başarılı olur.
İkinci nokta ise, SQL Server 2000 sürümünden sonra hashleme için SHA kullanmaktadır. 6.5 ve 7 sürümlerinde is hashleme algoritması olarak Snefru kullanmaktaydı. 6.5 sürümünde parolalar sadece ASCII olabiliyordu, Snefru algoritması sadece ASCII string’leri destekliyordu. 7 sürümünde ise parolalar Unicode olarak işlenmeye başlandı bu 6.5 ve 7 sürümleri’nin hashleri arasındaki temel farktır.
2000 sürümünde hashleme algoritması SHA1 olarak değiştirildi, fakat geçmişle uyumluluk için sunucu hem orijinal parola’nın hashini hem de büyük harfe duyarsız parolalar için parola’nın büyük harfe dönüştürldükten sonraki hashini saklar. Bunun için, kullanıcı şifresi Unicode değilse Unicode yapılır, salt değeri eklenir, elde edilen değer SHA1 algoritması ile hashlenir, parola büyük harfe dönüştürülür, salt tekrar eklenir ve SHA1 ile hashlenir ve bütün değerler birleştirilir. Bu durum çok tepki çekmiştir çünkü şifre büyük harflerden oluşuyorsa hash kendini tekrar eden iki parçadan oluşmuş olur. Bu durum da sözlük saldırılarında kullanılacak sözlüğün boyutunu küçülteceği için parola’nın kırılma ihtimalini artırıyordu.
2005 ve 2008 sürümlerinde geriye dönük uyumluluk kaldırılarak, büyük harfe duyarsız hash de kaldırılmıştır. SQL Server 2005 ve 2008’de desteklenen hashleme algoritmaları şöyledir;
Kod:
MD2/MD4/MD5/SHA/SHA-1
Ancak tavsiye edilen algoritmalar SHA-1 ve MD5 ‘dır.
SQL Server 2005 SHA256 gibi güçlü algoritmaları desteklemez, bu nedenle güçlü hashleme için rasgele bayt dizisi yani salt değeri gereklidir. SQL Server 2005 salt değeri kullanımını sağlamaz ancak .NET Framework kullanımına izin verir. NET SHA 256 kullanarak asla aynı değeri vermeyen hashler üretir. .NET SHA1, MD5, SHA256, SHA384 ve SHA512 algoritmalarını destekler. .NET üzerinde C# kodu ile .NETEncrypt fonksiyonu sayesinde girdi olarak alınan parola’dan hash ve salt değerlerini içeren SQL Server bayt dizisi elde edilebilir.
Kullanılan algoritma ne olursa olsun hashleme HASHBYTES sistem fonksiyonu tarafından yapılır. HASHBYTES iki değeri kabul eder. Bunlar kullanmak için algoritma ve hashlenecek değer’dir. HASHBYTES fonksiyonu’nun en büyük dezavantajı SQL Server’ın desteklediği tüm veri türlerini desteklememesidir. HASHBYTES fonksiyonu CHAR ve VARCHAR veri tipleriyle ASCII Dizesi kullanırsa 8000 karakterin üzerine izin verir ancak Unicode dizesi ile NCHAR ve NVARCHAR veri tipleriyle kullanıldığında 4000 karakterin üzerine izin verir.
SQL Server’da login bilgileri master database’deki syslogins tablosunda tutulmaktadır ve geriye dönük uyumluluk için bulundurulmaktadır. İleriki bir sürümde kaldırılacaktır. Görüntülemek için master DB’de aşağıdaki komut çalıştırılır,
Kod:
SELECT *
FROM master.dbo.syslogins
Bu komut çalıştırıldığında aşağıdaki gibi bir tablo görüntülenir. Bu tablo da SQL Server’daki her oturum için bir satır bulunması gerekir.
![sekil-1.png](https://www.bilgiguvenligi.gov.tr/images/stories/inansencan/sql/sekil-1.png)
Şekil 1: syslogins tablosu
Bu tablo SQL Server’ın ilerleyen bir sürümünde kaldırılacağı için yeni projelerde bu tablo yerine sys.server_principals sistem görünümü kullanılması tavsiye edilmektedir. Syslogins ve sys.server_principals'in satır sayısı aynıdır çünkü iki tablo’da tanımlı her oturum için bir satır bulundurur. Sys.server_principals ‘i çalıştırmak için gerekli komut ve komut çalıştırıldığında görüntülenecek tablo aşağıdaki gibidir.
Kod:
SELECT *
FROM sys.server_principals
![sekil-2.png](https://www.bilgiguvenligi.gov.tr/images/stories/inansencan/sql/sekil-2.png)
Şekil 2: sys.server_principals görünümü
Ayrıca sys.server_principals’in tüm sütunlarına sahip olan ve ekstra birkaç sütuna daha sahip olan, sys.sql_logins katalog görünümü de kullanılabilir. Bu katalog görünümünü çalıştırmak için gerekli kod ve tablo’nun görünümü ise aşağıdaki gibidir.
Kod:
SELECT *
FROM sys.sql_logins
![sekil-3.png](https://www.bilgiguvenligi.gov.tr/images/stories/inansencan/sql/sekil-3.png)
Şekil 3: sys.sql_logins katalog görünümü
SQL Server Bağlantısının Şifrelenmesi
Bir istemci uygulaması, SQL Server'a bağlandığında iletilen kimlik bilgileri (giriş paket içinde) her zaman şifrelenir. Varsa SQL Server güvenilen bir sertifika yetkilisinden bir sertifika kullanır. Güvenilen bir sertifika yüklü değilse, SQL Server örneği başlatıldığında kendinden imzalı bir sertifika oluşturur ve kimlik bilgilerini şifrelemek için bu kendinden imzalı sertifikayı kullanır. Bu kendinden imzalı sertifika güvenliğini artırmaya yardımcı olur ancak sunucu tarafında kimlik sızdırmaya karşı koruma sağlamaz. Kendinden imzalı sertifika kullanılır ve ForceEncryption seçeneği Evet olarak ayarlanırsa, SQL Server ve istemci uygulaması arasında bir ağ üzerinden aktarılan tüm veriler otomatik olarak imzalanan sertifika kullanılarak şifrelenir.
SQL Server makinasına olan bağlantıyı şifrelemek için kullanılabilecek iki yöntem vardır.
IPSec
SSL
Taşıma halinde şifreleme ağ üzerindeki veri paketlerinin şifrelenmesidir. IPSec şifreleme işini iyi yapar ancak işletim sistemi aracılığıyla ayarlanır ve sunucuya gelen/giden tüm veri şifrelenir. Eğer herhangi bir sorunu gidermek için ağdaki trafik analiz edilecekse IPSec kapatılır.
IPSec
TCP/IP protokolü geliştirilirken güvenlik üzerinde pek fazla durulmamıştı. Çünkü TCP/IP protokolünün bu denli yoğun ve standart olarak kabul edilip kullanılacağı düşünülmemişti. Bu nedenle verilerimiz ağ üzerinde savunmasız olarak ilerler ve birçok tehlikeyle karşılaşabilirler. Bu tehlikeler verilerimizin değiştirilmesi, verilerimizin kaybolması ve bununla beraber verilerimizin istenilen hedeflere ulaştırılmaması olabilir. IPsec protokolü sayesinde verilerimiz ağ üzerinde güvenli bir şekilde ulaşmak istedikleri hedeflere ulaştırılır. IPsec protokolü IP protokollerinin güvenlik ihtiyaçlarını karşılamak için geliştirilmiş olan bir güvenlik protokolüdür.
IPsec Güvenlik Nasıl Sağlanır ?
IPSec’ in güvenlik mimarisini oluşturan üç temel unsur vardır:
Bütünlük (integrity); hedefe ulaşan verinin kaynaktan gelen veri ile aynı olup olmadığı kontrol edilir. Ağ üzerinden gönderilen mesajın gerçekten gönderilen mesaj olup olmadığını anlamak için, mesajı alan bilgisayarın hesapladığı mesaj özeti (message digest) değeri ile mesajı gönderinin ilettiği mesaj özeti değerleri karşılaştırılır. Sonuç farklıysa iletilen mesaja iletim sırasında müdahale edildiği anlaşılır. Mesajları özetlemek için MD5 ve SHA-1 algoritmaları kullanılır.
Kimlik doğrulama (Authentication); iletişimde bulunan her iki tarafın da birbirlerinin kimliklerinin doğrulanması için kullanılır. İletişimde bulunan bilgisayarların birbirlerinin kimliklerini doğrulamaları için aynı kimlik doğrulama metodunu kullanması gerekir. IPSec protokolünü kullanarak iletişim kuracak bilgisayarlar, kimlik doğrulama işlemi için çeşitli yöntemler kullanabilirler. Bunları şöyle sıralayabiliriz:
Önpaylaşımlı anahtar (presharedkey) (MS-CHAP)
Kerberos (Windows tabanlı ağlar için)
Sertifika yetkilisi (certificateauthority)
Gizlilik (Confidentiality); Gönderilen verinin ağ üzerinden şifrelenmiş bir şekilde iletilmesini belirtmek için kullanılır. Bu durumda, ağdaki paketler bir izleyici (sniffer) aracılığıyla yakalansalar bile içerikleri şifrelenmiş olduğu için taşınan verilerin üçüncü şahıslar tarafından okunması engellenmiş olur. Şifreleme işleminde en çok kullanılan yöntemler DES ve 3DES yöntemleridir.
IPSec istemci veya sunucu işletim sistemleri tarafından sağlanır ve SQL Server’a özgü hiçbir özel yapılandırma gerektirmez.
İşletim sistemi ayarları ise,
Start>Programs>Administrative Tools>LocalSecurity Policy. Sağ tık “IP Security Policies on LocalComputer” option on themenu ontheleftandselect “Create IP Security Policy.” Thiswillbringupthe IP Security Policy Wizard.
SSL
SSL kullanmak ise nispeten daha kolaydır çünkü sadece SQL Server altyapısı ile gönderilen veriyi şifreler ve sadece DBA tarafından kontrol edilebilir. SSL şifreleme kullanmanın birkaç yöntemi vardır.
Güvenilir bir otoriteden sertifika almak. Bunun GoDaddy gibi bir yerden satın alınması gerekir.
Kendiniz bir sertifika oluşturmak. Bunun için IIS Resource Kit kullanılması gerekir.
SQL Server başladığında bir kendinden imzalı sertifika kullanmak
İlk iki seçenekte sunucuya bağlanmak isteyen her istemciye de import edilmelidir.
Bir sertifika yüklemek için,
Başlat menüsünde, Çalıştır'ı tıklatın ve Aç kutusuna MMC yazın ve Tamam 'ı tıklatın.
MMC konsolunda, Dosya menüsünde, Ekle / RemoveSnap-in 'i tıklatın.
Add / RemoveSnap-in iletişim kutusunda, Ekle'yi tıklatın.
InSnap-in iletişim kutusunda, Sertifikalar 'ı tıklatın, Ekle' yi tıklatın Bağımsız ekle.
Sertifikalar ek bileşenini iletişim kutusunda, bilgisayar hesabını tıklatın ve ardından Son'u tıklatın.
AddStandaloneSnap-in iletişim kutusunda, Kapat'ı tıklatın.
InAdd / RemoveSnap-in iletişim kutusunda, Tamam'ı tıklatın.
Ek bileşenini Sertifikalar, Sertifikaları genişletin Personal 'ı genişletin ve sonra sağ tıklatın, Sertifikalar, Tüm görevler' in ve ardından Al'ı tıklatın.
Bilgisayara bir sertifika eklemek ve MMC konsolu kapatmak için, Sertifika Alma Sihirbazı'nı tamamlayın.
Etkinleştirme işlemi is SQL Server Configuration Manager içierisinden yapılır. Güvenilen bir kurumdan alınmış sertifika ile man-in-the-middle saldırılarına karşı koruma daha yüksek olacaktır.
SSL Ilk zamanlar sadece HTTP trafiğini şifreleme amaçlı geliştirilmiş olsa da günümüzde TCP tabanlı tüm servisleri şifreleme amaçlı kullanılabilmektedir.
Sertifikalar sayesinde sayısal imzaları kullanarak bir verinin gerçekten beklenen kişi tarafından gönderildiği ve iletim esnasında değişikliğe uğramadığını anlayabiliriz, gönderilen verinin gerçekten beklediğimiz insana ulaştığından emin olmak için yani açık anahtarını kullanarak verileri şifrelediğimiz kişinin gerçekte düşündüğümüz kişi olduğundan emin olmak istediğimizde sertifika tanımı ortaya çıkıyor. Bir sertifika basitce kişinin açık anahtarının yetkili bir sertifika otoritesi tarafından imzalanmış halidir diyebiliriz.
Sertifika Otoritesi Sertifika isteğinde bulunan şahıs/kurumların gerçekte belirttikleri kişiler/kurumlar olduklarını(bunun yanında belirtilen diğer hususları da) doğrulayan ve onaylayan kurumdur. Verisign, Globalsign gibi. Eğer her iki tarafta ortak güvenilen bir sertifika otoritesi tarafından imzalanmış sertifika kullanıyorsa birbirlerinin public keylerine güvenebilirler.
SQL Server örneği bir genel sertifika yetkilisinden bir sertifika atanmış bir bilgisayarda çalışıyorsa, bilgisayar ve SQL Server örneğinin kimliği güvenilen kök yetkilisi tarafından garanti edilmiş olur. Bunun dışındaki sertifikalar ise sınırlı koruma sağlar.
SSL şifreleme seviyesi client ve sunucuda çalışan işletim sistemine bağlı olarak 40 bit veya 128 bit’tir. İstemci ile sunucu arasındaki trafiğin SSL ile şifrelenmesi güvenliği arttırır ancak bağlantı hızını azaltır.
SQL Server Password Policy
SQL Server’da Windows password policy mekanizmaları kullanılabilir. SQL Server’da Windows’takine benzer complexity ve expiration ilkeleri kullanılabilir.
Password Complexity
Parola karmaşıklık ilkeleri olası parolaların sayısını artırarak brute force ataklarını engellemek için tasarlanmıştır. Bu kural uygulandığında yeni parolalar aşağıdaki listeye uygun olmalıdır.
Parola, kullanıcı adının tamamını veya bir kısmını içeremez.
Parola en az sekiz karakter uzunluğunda olmalıdır.
Aşağıdaki dört karakter kategori’sinden en az üçünü içermelidir.
(A - Z) büyük harfler,
(a - z) küçük harfler,
(0 – 9) rakamlar,
! / $ / # / % gibi alfanümerik olmayan karakterler
Parolalar en fazla 128 karakter olabilir ve daha güvenli olması için uzun ve karmaşık parolalar tercih edilmelidir.
Password Expiration
Parola expiration ilkeleri bir parolanın ömrünü yönetmek için kullanılır. Zamanı geldiğinde değiştirlmeyen parolaların kullanıcıları disable olur.
Politika Uygulama
Parola ilkesinin uygulanması her bir SQL Server oturum için ayrı ayrı yapılandırılabilir. Bir SQL Server oturum açma parola ilkesi seçeneklerini yapılandırmak için ALTER LOGIN (Transact-SQL) kullanılır. Aşağıdaki kurallar parola ilkesi zorlama yapılandırması için geçerlidir:
CHECK_POLICY “ON” olarak değiştirildiğinde aşağıdaki davranışlar olur,
CHECK_EXPIRATION özel olarak “OFF” olarak ayarlanmazsa “ON” olarak gelir.
Parola geçmişi mevcut parolanın hash değeri ile başlatılır.
CHECK_POLICY “OFF” olarak değiştirildiğinde aşağıdaki davranışlar olur,
CHECK_EXPIRATION “OFF” konumdadır.
Parola geçmişi temizdir.
Lockout_time değeri resetlenmiştir.
Bazı politika kombinasyon seçenekleri ise desteklenmez.
Eğer MUST_CHANGE belirtilirse, CHECK_EXPIRATION ve CHECK_POLICY “ON” olmalıdır. Aksi takdirde deyim çalışmaz.
Eğer CHECK_POLICY “OFF” olarak ayarlanmışsa, CHECK_EXPIRATION “ON” yapılamaz. Seçenekleri bu şekilde olan ALTER LOGIN başarısız olur.
CHECK_POLICY “ON” olarak ayarlanırsa aşağıdaki gibi olan parolaların kullanılması engellenir.
Boş veya geçersiz,
Bilgisayar veya login adıyla aynı,
Şunlardan biri ise; password, admin, administrator, sa, sysadmin.
Güvenlik politikası Windows’ta ayarlanmış veya domain’den alınmış olabilir. Bilgisayardaki parola politikasını görüntülemek için, Local Security Policy MMC bileşeni kullanılabilir (secpol.msc).
Kaynaklar
[1] www.mssqltips.com
[2] www.msdn.microsoft.com
[3] İsmail ADAR – SQL Server 2012 – Pusula Yayıncılık