Sql Server Güvenlik Kavramı Bölüm – 1

SQL SERVER’DA GÜVENLİK Bölüm – 1

    Sql Server güvenlik konusu son zamanlardaki hızla artan hacking olaylarından sonra iyice önem kazanmıştır. Sql Server Windows işletim sistemleri üzerinde bir servis olarak çalışmaktadır. Kullanıcılar yetkileri ve onlara atanmış olan haklar çerçevesinde SQL Server üzerinde sunulan veritabanı ve diğer yönetim başlıklarında değişiklik yapabilirler. Bu sebepten ötürü SQL Server güvenlik konusu ele alındığında sadece sunucu komponentlerinin güncel olması yeterli olmaz buna ek olarak kullanıcı hareketlerinin denetlenmesi ve yeterli miktarda saklanması da önemlidir. Bu başlık altında tabi ki SQL Server’ın tüm hizmetleri sunmak üzere kurulu olduğu Windows sunucularına ait alt katman güvenliğinin de sağlanmış olması gerekir.

    İşletmelerde genellikle, Sql Server ile ilgili tüm konular yazılım bölümüne veya yazılımcıya atanmıştır. Bölümler arası çekişmeler veya senin görevin / benim görevim, sen yaptın / ben yaptım gibi anlaşmazlıklardan dolayı Sql Server’da ortaya çıkan sorunlar sahipsiz kalmakta, sistem bilgisi olmayan yazılımcıların bildiği kadar tedbirler alınmaktadır. Sql Server yazılımı bağımsız bir platformdur, herhangi bir yazılım dilinde yazılan bir program Sql Server’a veri aktarabilir ve okuyabilir. Bu sebeple yazılım ile veriyi birbirinden güvenlik platform tasarımı bakışı açısından ayırmak gerekir.

    Bir yazılımın silinmesi/bozulması mı yoksa tüm veritabanınızın silinmesi mi işinizi aksatacaktır? Kullandığınız bir paket programı, satın aldığınız yazılım firmasından tekrar isteyip yükleyebilirsiniz. Kendi geliştirdiğiniz bir yazılımın kaynak kodları sizde olduğu için tekrardan derleyip programı devreye alabilirsiniz. Fakat veritabanınızdaki veriler ve yedekler çalındığı / hacklendiği zaman bunları geri getiremezsiniz. Sistem ve veritabanı yedekleri her ne kadar bu tip durumlarda faydalı olsa da, bir saldırganın uzun süreli sunucunuza erişim sağladığı ve yedeklenme işlemine verileni de bozduğu senaryoları da düşünün. Hiçbir saldırgan sizin yazdığınız bir programın peşinde değildir, bu programın kaydettiği verilerin peşindedir, ancak bu şekilde zarar verebilir ve kendisine kar sağlayabilir.

    Bu makalede, Sql Server için alınabilecek güvenlik tedbirlerini, Sql Server’ın kurulu olduğu sunucu ve sistemlerde ne gibi önlemler alınmalı gibi konuları anlatmaya çalışacağım. Güvenlik konusu, sistem veya network konuları gibi kesin kuralları içermez, güvenlik ürünlerden çok süreçlere bağımlı bir olgudur. Güvenlik için birikim, bilgi ve tecrübe çok önemlidir. Bu makalede veya başka makale ve kitaplarda anlatılan Sql Server güvenliği konuları ile, yüzde 100 güvenli olacağınızın garantisi verilmez. Güvenlik, içerisinde birden çok rol içeren, ana unsurların düzgün ve kararlı çalışmasını sağlayan bir süreçtir. Bu süreç ne kadar düzgün yönetilir ise, o kadar yeterli seviyede güvenli sistemler olacaktır. Bilgi teknolojileri dünyasında güvenlik bir teknoloji değildir, teknolojilerin ortaya çıkardığı zafiyetleri kapsayan genel bir konudur.

    İlk olarak Sunucu ve Network güvenliğinde bahsedelim.

Sql Server Servis Hesabının Seçilmesi:

 

    Sql Server bir Windows servisi olarak çalışır. Her Windows servisini çalıştıran bir kullanıcı hesabı vardır. Sql Server içinde bu hesabı doğru seçmek güvenlik için önemlidir. Sql Server kurulumunda, Sql Server’ı çalıştıracak hesabı değiştirmediyseniz, Sql Server Configuration Manager’dan bu değişikliği yapabilirsiniz.

Sql Server’ı çalıştıran hesabı görüntülemek için Sql Server – Configuration Tools – SQL Server Configuration Manager’ı açıyoruz

SSS-1

Sql Server Services – Sql Server (instance adınız) – Properties diyerek özellikler sayfasını açıyoruz.

SSS-2

Logon ekranında Sql Server’ı çalıştıran hesabımızı görüyoruz. Nt Service olarak gözüküyor.

SSS-3

    Sql Server, kurulu olduğu Windows Server üzerinde yönetici haklarına sahip olmayı gerektirmez. Sadece veri tabanlarının, yedeklerin ve logların tutulduğu dizinlerde okuma-yazma yetkisini arar.

    Built-in account: Built-in hesapların şifreleri olmaz. İşletim sistemi tarafından yönetilen hesaplardır. Local System hesabı, yönetici haklarına sahip yerel bir hesaptır. Active directory üzerinden bu hesap ile network kaynalarına erişelebilinmektedir.

    Network service, bu hesabın lokal makinada yetkileri biraz daha kısıtlıdır. Local system hesabı gibi network kaynaklarına erişebilmektedir.

    Local system ve Network Service dışında, bir domain hesabı da seçebilirsiniz. Fakat bu hesaba password policy uygulanmaması gerekmektedir. Şifrenin süresi dolduğunda hesap bloklanır ve Sql Server hizmeti çalışmaz hale gelir. Bir Built-in hesabı ile Sql Server’ı çalıştırmak yerine, domain hesabı seçmek daha iyidir. Domain bir hesaba bu yetki verildikten sonra, Local Sercurity Policy üzeriden de Log on as a service yetkisinin verilmesi gerekmektedir. Built-in hesaplar servisler ile paylaşılan hesaplardır, bu sebeple saldırganlar tarafından uzak komut istem ile Sql Server prosedürleri veya diğer servislerine müdahale edebilirler.

Technet: http://technet.microsoft.com/en-us/library/cc756898(v=ws.10).aspx

Sql Servislerinin Güvenlik ID’lerinin Kontrol Edilmesi ve Yönetilmesi:

    Sql Server’ı çalıştıran servis, güvenlik olarak bir Windows hesabına bağlıdır. Bu Windows hesabına bağlı birden çok servis vardır. Bu hesapların diğer kaynaklara (dosyalar, klasörler v.b.) erişiminde çakışma çıkmaması için, Windows her bir service Security Identifier dediği Security ID numarası atar. Bu SID dediğimiz ID’ler Sql Server kurulumunda oluşturulur.

    Sql Server servisinize SID’in atanıp atanmadığını öğrenmek için, komut satırını açın. Aşağıdaki kodu komut satırınıza yazın.

“sc qsidtype mssqlserver”

Not: Buradaki mssqlserver, sizin sisteminizdeki Sql Server’ın instance adıdır.

Technet: http://blogs.technet.com/b/askperf/archive/2008/02/03/ws2008-windows-service-hardening.aspx

SSS-4

En üst satırda Success olarak komut çalıştı. Service_name kısmında Sql Server’ın çalıştığı servis adı geldi. Service_SID_type kısmında ise Unrestricted olarak SID tipimizin olduğun gösteriyor. Unrestricted, servisimizin bir SID değerini aldığını belirtir. SID_type None olsaydı, Sql Servisinin SID değeri olmadığını, SID_type – Restricted olursa, servisin bir SID değeri olduğunu fakat sınırlı bir hakka sahip olduğunu belirtecekti.

Eğer SID değeri None olarak çıkar ise, yukarıdaki komutun yanına Unrestricted yazarak, komutu tekrar çalıştırın. Böylelikle Sql Server servisinize bir Security ID değeri atamış olursunuz.

SID değer olan bir Sql Server, çalıştığı makine üzerinde ekstra yetkilere sahip olur, yedekleri diske yazma, import etme gibi. Sql server’da genel olarak yapılan export ve import işlerinde başarılsızlık olur ise SID değerini kontrol etmekte fayda vardır.

SID değeri None olarak kalabilir, fakat Restricted olarak kalırsa Sql Server’ın erişmek istediği kaynakları bloklar ve Sql Server hizmeti başlamaz.

Sql Servislerinde Virtual Service Hesabı Kullanılması:

    Virtual service hesabı ilk olarak Server 2008 R2 ile duyuruldu. Şifre gerektirmeyen yerel bir hesaptır. Network Service hesabı gibi çalışır. Network servisinden farklı en iyi özelliği her service için farklı bir hesap ile çalışmasıdır. Virtual bir servisi oluşturamaz ve silemezsiniz.

    Şekil SSS-3 te olduğu gibi, Log on ekranında “This Account”u seçip NT Service\(instace adınız) yazıyorsunuz ve şfireyi boş bırakarak, Sql Server service’ini yeniden başlatarak bu hesap ile çalıştırmaya başlayabilirsiniz. Şifre alanları boş olarak geçilmektedir.

Technet: http://technet.microsoft.com/en-us/library/dd548356(v=ws.10).aspx

    Sql Bağlantılarının SSL ile Şifrelenmesi:

    Sql Server bilindiği üzere server to client – client to server bir yapıdadır. Doğal olarak network üzerinden haberleşerek veri girişleri ve veri sorgulamaları yapılır. Sql server ile clientlar arasındaki haberleşme network üzerinde, sniffer dediğimiz araçlar ile izlenmesi gayet kolaydır. Bir saldırganın bir sistemdeki Sql Serverları ve bu servera bağlı clientları tespit etmesi oldukça kolaydır.

    Microsoft Network Analyzer’ın yerini alan Message Analyzer ile Sql Server’ın ağ trafiğini izlemeye başlayalım. İlk önce aşağıdaki linkten programı indiriyoruz. (İsterseniz Wireshark programı ile de aynı işlemleri yapabilirsiniz)

https://www.microsoft.com/en-us/download/details.aspx?id=44226

Basit bir kurulumu var. Kurulumdan sonra Quick Trace kısmında ağ bağlantımıza tıklayarak network trace’i başlatıyoruz.

SSS-5

Trace başladıktan sonra ikinci makinamdan Adventerworks2012 veri tabanındaki PurchaseOrderDetail tablosuna select sorgusu atıyorum.

SSS-6

Bu sorgudan sonra Message Analyzer’a gelip bakalım.

SSS-7

Çok rahatlıkla hangi makinadan sorgu geliyor ve hangi Sql Server’a gidiyor tespit edebildik. Eğer networkünüzdeki Sql Server’ın bu şekilde izlenip tespit edilmesini istemiyorsanız, bir SSL sertifikası alıp bunun önüne geçebilirsiniz. SSL Sertifikasını Verisign, Digicert veya Comodo gidi firmalardan temin edebilirsiniz.

Alınan bu sertifikayı Mmc konsolu açarak, Snap add ins den, yüklemelisiniz. Sertifikayı Sql Server servisini çalıştıran kullanıcıya yüklemeniz gerektedir.

Sertifikayı yükledikten sonra, Sql Server Conf. Manager – Sql Server Network Configuration – Protocols for Sql Server’ın properties ekranını açıyoruz.

Flags sekmesinde, Force Encryption’a yes diyoruz. Certificate kısmında da yüklediğiniz sertifikayı seçip Ok diyoruz.

SSS-8

Sql Server Management Studio’ya bağlanırkende encrypt bağlantı sağlanabilir. SSMS açıldıktan sonra Connect to Server ekranında Options ile özellikleri açıyoruz.

SSS-9

Connection Properties ekranında Encrpt Connection diyerek client ile Sql Server arasında SSMS iletişimi encrypt edilebilmektedir.

SSS-10

Windows Firewall’un Yapılandırılması:

 

    Güvenlik duvarı olarak Windows firewall kullanıyorsanız, Sql Server’a erişmek için gerekli TCP ve UDP portlarını açmanız gerekmektedir. Windows firewall’u Server 2008 ile varsayılan olarak açık gelmektedir.

Control Panel – Windows Firewall’u açalım. Advanced settings’e geliyoruz.

SSS-11

Inbound Rules ( Gelen Kuralları) sekmesinde, Action tabındaki “New Rule” ile yeni bir kural oluşturacağız.

SSS-12

Rule type, rol tipinde Port’u seçiyoruz.

SSRS-13

Protocol and Port sekmesinde TCP ve Specific local port’u seçip, ports kısmında 1433 yazıyoruz.

SSS-14

Action sekmesini Allow the connecton- bağlantıya izin ver, olarak seçip devam ediyoruz.

SSS-15

Profile sekmesinde karşımıza 3 farklı seçenek çıkıyor. Domain, yapıda active directory var ise sadece domain deki makinalara erişim verir. Private, domain olmayan yapılarda workgroup olan yapılardaki bağlantılara izin verir. Public ise Sql Server’a dışarıdan erişimi sağlar.

SSS-16

Name kısmında kuralımız için isim verip Finish ile kural oluşturma işlemini tamamlıyoruz.

SSS-17

Kuralımız Inbound Rules ekranına geldi. Eğer daha fazla kısıtlama ve sadece güvenli makinaların erişmesini istiyorsak. Kuralımızın özellikler ekranını açarak, gerekli ayarlamaları yapalım.

SSS-18

General sekmesindeki Action bölümünde “Allow the connetion if it is secure” (Eğer bağlantı güvenli ise izin ver)seçeneğini seçiyoruz.

SSS-19

Sonrasında Remote Users ve Remote Computers sekmelerinden istediğimiz bilgisayar veya kullanıcıyı seçerek izin veriyoruz.

SSS-20

Sql Server Browser’ın Devre Dışı Bırakılması:

 

    Sql Server’ı yükledikten sonra Sql Server Browser hizmeti otomatik olarak devreye girer ve çalışmaya başlar. Kullanıcı tarafındaki bilgisayarlara Sql Server’ın olduğunun bilgisini gönderir. Network üzerinde hangi sunucularda Sql Server çalıştığı kolaylıkla Browser’ı açık olan sunuculardan tespit edilebilmektedir. Sql Server Browser’ı kapatmak için Sql Server Configuration Manager’ı açıyoruz (Şekil SSS-1).

    Sql Server Services bölümünde Sql Server Browser hizmetine çift tıklayarak properties ekranını açıyoruz. Stop butonuna tıklayarak Browser servisini durduruyoruz.

SSS-21

Sql Server yeniden başladığında Browser hizmetini tekrardan çalıştıracaktır, bu sebeple Service sekmesinde, Browser hizmetinin başlangıç ayarlarını devre dışı bırakıyoruz.

SSS-22

Server – Client Arasında Extended Protection Yapılandırılması:

   

    Sql Server ile client arasında kimlik doğrulama katmanlı bir bağlantı vardır. Client bağlanacağı Sql Server’ı kayıtlı kimlik bilgilerinden bilir, her seferinde bağlanacağı Sql Server’ı aramaz. Aynı şekilde server tarafında da benzer durum yaşanır. Client geçerli giriş anahtarını ve şifresini sağladığı için server’a erişim hakkı sağlamıştır.

    Bu bağlantı şeklinde, saldırgan server ve client arasına girerek, kendisini Sql Server olarak gösterir. Client yemi yutmuş olur, Sql Server’a bağlandığını zanneder, aslında saldırganın makinasına bağlanmıştır. Saldırganda client’tan Windows Authentication bilgilerini çalarak, Sql Server’a bağlanmaya çalışır. Bu saldırı tipine Luring Attacks denir. Lure yem anlamına gelmektedir, yemleme atakları da diyebiliriz.

    Diğer saldırı şeklide, yaygınca bilinen Man-in-the-Middle atak diye tabir edilen, ortadaki adam manasına gelen bu saldırı yönteminde, Dns yönlendirmesi veya Ip routing yapan saldırgan Server ile client arasına girip dinleme yapar. Sql Server kimlik bilgilerini client tarafında onayladığı sırada saldırgan bilgileri ele geçirmiş olur. Bu saldırı tipine de Spoofing Attacks denmektedir.

    Bu tip saldırılardan korunmak için Sql Server üzerinde Extended Protection özelliğini aktif hale getirmemiz gerekmektedir.

Sql Server Configuration Manager – Sql Server Network Configuration – Protocols Sql Server’ın Properties ekranını açıyoruz.

SSS-23

Advanced sekmesinde “Extended Protection” kısmında Allowed’u seçiyoruz.

SSS-24

Extended protection özelliği Windows7 ve Server 2008 R2 işletim sistemlerinde gelmektedir. Eski sürümler için aşağıdaki güncellemeyi yüklemeniz gerekmektedir.

http://support.microsoft.com/kb/968389

Msdn: http://msdn.microsoft.com/en-us/library/ff487261.aspx

 

Veritabanı Dosyalarının Şifrelemesi:

    Veritabanı dosyaları, Sql Server çalışırken kilitlenir ve mdf-ldf uzantılı dosyaları normal şartlarda kopyalamayız. Kopyalayabilmek için Sql Server hizmetinin durdurulması gerekmektedir. Fakat bu dosyaların Sql Server çalışırken kopyalanması Hobocopy gibi programlarla mümkündür. Veritabanı dosyalarınızı ele geçiren bir saldırgan bu dosyaları farklı bir sunucuda akitf edip, istediği verilere ulaşabilir.

    Yukarıdaki durumu yaşamamak için veritabanı dosyalarını şifrelenmesi, bu dosyaların farklı Sql Server’lar üzerinde açılmasını engelleyecektir. Çalınan veritabanı dosyalarını açmak için bu şifrenin decrypt yani çözülmesi gerekmektedir. Bu şifreleme işlemine Transparent Database Encryption denmektedir. Bu özellik Enterprise, Datacenter ve Developer sürümlerinde geçerlidir.

    Veritabanı dosyaları nasıl şifrelenir buna bakalım;

İlk olarak server encryption master key – ana anahtar oluşturmamız gerekmektedir. Yeni bir sorgu ekranı açarak master key’i aşağıdaki gibi oluşturalım.

USE
master;

CREATE
MASTER
KEY
ENCRYPTION
BY
PASSWORD
=
‘Guclu_Sifre’;

 

Bu şifrelemenin hemen yedeklenmesi gerekmektedir. Eğer master veritabanınızı kaybederseniz, şifrelenmiş veritabanınızın içeriğini hiçbir şekilde göremezsiniz. Yedek alınan klasörü paylaşıma açın, ve klasör yolunu doğru yazdığınızda emin olun, aksi takdirde hata verecektir, yedek almayacaktır. Yedek almak için aşağıdaki kodu yazıyoruz.

BACKUP
MASTER
KEY
TO
FILE
=
‘\\YAVUZSONY\Yedek\Yavuzsony_master.key’
ENCRYPTION
BY

PASSWORD
=
‘Guclu_bir_sifre_daha’;

 

Eğer bir password policy kullanıyorsanız, örnek olarak en az 8 karater, en az bir büyük harf, en az bir özel karakter gibi, şifrenizi bu policy’e göre vermeniz gerekmektedir.

Şimdi sıra server sertifikası üretmesine geldi, bu sertifika sunucuya özel bir sertifikadır. Veritabanı dosyalarınızın şifrelenmesinde kullanılacaktır.

CREATE
CERTIFICATE SqlSertifikasi WITH
SUBJECT
=
‘Sql Sertifika’;

 

Oluşturduğumuz sertifikayı yedekleyelim, hem de dosya olarak elimizde bulunsun.

BACKUP
CERTIFICATE SqlSertifikasi TO
FILE
=
‘\\YAVUZSONY\Yedek\SQL_SqlSertifikasi.cer’

WITH
PRIVATE
KEY ( FILE
=
‘\\YAVUZSONY\Yedek\SQL_SqlSertifikasi.pvk’,

ENCRYPTION
BY
PASSWORD
=
‘Guclu_Sifre_Guclu_Sql’
);

 

Oluştruduğumuz server sertifikası ile, veritabanı üzerinde encryption key oluştuyoruz.

USE SATIS;

GO

CREATE
DATABASE
ENCRYPTION
KEY

WITH
ALGORITHM
=
AES_128

ENCRYPTION
BY
SERVER
CERTIFICATE SqlSertifikasi;

 

Son olarak veritabanı şifrelemesini aktif hale getiriyoruz.

ALTER
DATABASE SATIS

SET
ENCRYPTION
ON

 

Oluşturduğumuz key ve sertifika dosyalarına bakalım, bu dosyaların yedeğini almayı unutmayın.

SSS-25

Güvenlik sertifikası, private key ve master key olarak 3 dosyayı veritabanı şifrelemesinde kullandık.

Transparent Database Encryption, veritabanı mdf ve ldf dosyalarınızı görünmez bir şekilde şifreledi. Bu dosyaların şifrelendiği bilgisi Sql Server üzerinde veya dosyaların özellik sayfalarında gözükmez.

Şifrelenmiş bir veritabanını Sql Server’a geri eklemeniz için, ilk önce güvenlik sertifikasını ve encryption key’i geri yüklemeniz gerekmektedir. Geri yüklerken şifreyi yazıyoruz.

USE
master;

CREATE
CERTIFICATE SqlSertifikasi FROM
FILE
=
‘\\YAVUZSONY\Yedek\SQL_SqlSertifikasi.cer’

WITH
PRIVATE
KEY ( FILE
=
‘\\YAVUZSONY\Yedek\SQL_SqlSertifikasi.pvk’,

DECRYPTION
BY
PASSWORD
=
‘Guclu_Sifre_Guclu_Sql’)

 

Msdn: http://msdn.microsoft.com/en-us/library/bb934049.aspx

Xp_CmdShell Özelliklerinin Kısıtlanması:

    Sql Server 2005’te güvenlik sorunları teşkil eden bazı özellikler, yeni Sql Server versiyonlarında, kurulumda varsayılan olarak devre dışı bırakılıp getirilmiştir. Bunlardan en önemlisi xp_cmdshell komutudur. Bu özelliklerin aktif etmek için Sql Server Management Studio da instance adına sağ tıklayıp “Facets” bölümüne gelelim.

SSS-26

Facet alanından Surface Area Configuration’ı seçiyoruz.

SSS-27

AdHocRemoteQueriesEnabled, OleAutomationEnabled ve XPCmdShellEnabled alanlarının False değerinde olması gerekiyor, eğer değilse bu alanları False değerine getiriyoruz.

SSS-28

Sql Server’da Güvenlik makale dizisinin 1. Bölümünün sonuna geldik, 2. Bölümde görüşmek üzere.