5 Ağustos 2008 Salı

SQL Server 2005: Uzaktan Bağlantı

Merhabalar,


Bir SQL Server Instance' ına uzaktan bağlanma konusunda gerek forumlardan gerekse habergruplarından çok soru geliyor. En güzeli bu konuda bir yazı yazmak dedim ve bu makaleyi klavyeye(!) (kaleme?) aldım.

Bir SQL Server Instance' ına uzaktan bağlanabilmeniz için, kurulu olan SQL Server Instance' ının sürüm (Edition) bilgisi, SQL Server Instance' ının üzerinde kurulu olduğu İşletim Sistemini bilgisi öncelikle dikkate almanız gereken bilgilerdir.

Peki neden? Çünkü, meselâ SQL Server 2005' in Express Edition ve Developer Edition' larında, uzaktan bağlantı için kullanılabilecek TCP/IP ve Named Pipes protokolleri kapalıdır. Bu protokoller konusunda daha fazla bilgi almak için Bağlantı Protokolleri isimli yazımı okuyabilirsiniz.

Windows XP SP2 ve Windows' un daha sonraki sürümlerinde ise Windows Güvenlik Duvarı vardır ve bu uygulama etkin olduğunda SQL Server 2005 Instance' ınıza uzaktan erişimi engeller. Çünkü varsayılan olarak SQL Server' ın kullandığı portlar Windows Güvenlik Duvarında açık değildir.

Uzaktan Bağlantı için Yapılması Gerekenler
1 - SQL Server Instance' ınızın ilgili protokolünün yapılandırılması,
2 - Eğer varsa ve etkinse, Windows Güvenlik Duvarının yapılandırılması
3 - SQL Server' ınıza bağlanabilmeniz için kullanacağınız Login.

1- SQL Server Protokollerinin Yapılandırılması:
SQL Server 2005 Instance' ınız için hangi protokolü kullanacağınızı belirledikten sonra, bu protokolün yapılandırmasını gerçekleştirirsiniz. SQL Server protokollerinin yapılandırılması işlemleri için SQL Server 2005 ile birlikte gelen SQL Server Configuration Manager' ı kullanabilirsiniz. (Başlat\Programlar\Microsoft SQL Server 2005\Configuration Tools) Konuya örnek olması için aşağıda TCP/IP protokolünün nasıl yapılandırılabileceğini anlatacağım.

TCP/IP Yapılandırması Örneği:
SQL Server 2005 Instance' ınıza uzaktan yapılacak bağlantılarda kullanılacak TCP/IP protokolünü yapılandırmak için SQL Server Configuration Manager' ı başlatın.

Daha sonra, Şekil-1' de de gösterdiğim gibi SQL Server 2005 Network Configuration düğümü altından uzaktan bağlantı kurulmasını istediğiniz SQL Server 2005 Instance' ınızı seçin. Benim örneğimde bu, TEST2 Instance' ı olacak.

Şekil-1


TCP/IP protokolünü etkinleştirmek veya etkin olduğundan emin olmak için, Şekil-1' de de gösterildiği gibi Protocol Name alanındaki TCP/IP protokolünün Status değerine bakabilirsiniz. "Enabled" etkin olduğu anlamına gelir, "Disabled" ise etkin değil demektir. Bu değeri değiştirmek için TCP/IP protokolünün üzerinde fare ile çift tıklayın veya TCP/IP protokolünün üzerinde farenin sağ tuşuna tıklayarak, açılan menüden "Properties" seçeneğine tıklayarak "TCP/IP Properties" penceresini açın.

Şekil-1' de gösterildiği gibi "TCP/IP Properties" penceresi açılacaktır. TCP/IP protokolünü etkinleştirmek için, "TCP/IP Properties" penceresindeki "Protocol" isimli sekmede bulunan "Enabled" etiketinin karşısındaki aşağı açılır listeden "Yes" değerini seçin.

"Protocol" sekmesindeki "Listen All" seçeneği önemli bir seçenek bu nedenle buna da değinmek istiyorum. "Listen All", bilgisayara bağlı tüm Ağ Kartlarının (Örn:Ethernet) IP adreslerinin SQL Server tarafından dinlenip dinlenmeyeceğini belirler. Eğer bu seçeneğin değeri "No" yapılırsa, biraz sonra da değineceğim gibi "IP Addresses" sekmesindeki her IP adresini tek tek yapılandırmanız gerekir ve gene aynı sekmede bulunan "IPAll" seçeneklerinin herhangi bir geçerliliği kalmaz. Eğer değeri "Yes" yaparsanız, o zaman gene "IP Addresses" sekmesindeki "IPAll" seçenekleri etkinleşir ve diğer tüm IP adreslerine uygulanır. "Listen All" u etkinleştirdikten sonra "IPAll" seçeneğindeki ayarların, diğer ayarları bastıracağı unutmayın, yoksa ileriki paragraflarda aklınız karışabilir.

TCP/IP protokolünün IP adresi veya Port ayarlarını yapılandırmak için, gene "TCP/IP Properties" penceresinde bulunan "IP Addresses" isimli sekmeye tıklayın. (Bakınız: Şekil-2)

Şekil-2


Bu listede her Ağ Adaptörünüz için bir IP ayar bölümü listelenecektir.

Hangisinin etkinleştirilmesini istiyorsanız, onun "Active" ve "Enabled" ayarlarının karşısındaki değerleri "Yes" durumuna getirin. "Active", o IP adresinin dinleneceğini belirtir. "Enabled" ise o IP adresinin kullanılıp kullanılmayacağını. "IP Address" bölümde ise IPv4 veya IPv6 değeri yer alır. Eğer "TCP Dynamic Ports" etiketinin değeri "0" ise, bunun anlamı bu IP adresi için kullanılacak portun dinamik bir şekilde belirleneceğidir. Bu durumda SQL Server, bu IP adresi için müsait olan bir port numarası atayacaktır.

Meselâ Şekil-2' deki örnekte, TEST2 SQL Server Instance' ı, Dinamik Port olarak atanan 51495 portunun tüm IP' ler tarafından dinlenilmesi için yapılandırılmış. (Bu örnekte, "Protocol" sekmesindeki "Listen All" değerinin "Yes" olduğunu Şekil-1' den anımsayın, aksi takdirde IPAll değerlerinin bir geçerliği olmadığını daha önceki paragraflarımdan hatırlıyor olmalısınız.) Eğer tüm IP' lerin durağan bir IP kullanmasını isteseydik, o zaman "TCP Dynamic Ports" un değerini boş bırakıp, TCP Port' un değerine, kullanılmasını istediğimiz IP numarasını yazacaktık. Bu amaçla, 65535' e kadar müsait bir port numarası seçebilirsiniz.

Şimdi aklınıza şu da takılıyor olabilir, "biz dinamik port kullanacağımız zaman TCP Dynamic Port' s 0 yazıyoruz, nasıl oluyor da orada şimdi 51495 yazıyor?" Çünkü SQL Server bu IP' ye bir dinamik IP atadığı zaman, 0 yerine bu dinamik IP' yi görüyorsunuz.

Şekil-2' de gördüğünüz gibi 192.168.2.2 numaralı IP için iki tane port numarası kullanılmış. Eğer bir IP' nin birden çok port kullanmasını istiyorsanız, o zaman birden çok Port numarasını virgüllerle ayırarak yazabilirsiniz. Bu IP' ye Port numaraları yazılmış, ama peki IPAll' da da dinamik port (51495) kullanıyoruz? Hangisi geçerli olacak? Hemen bir kaç paragraf önceki yazımdan da hatırladığınızı varsayıyorum! Neydi? Eğer "Protocol" sekmesindeki "Listen All" un değeri "Yes" ise, o zaman IPAll' da yazan değerler, diğer değerleri bastırırdı. Yani bu durumda, eğer "Listen All" un değeri "No" olsaydı, 192.168.2.2 numaralı IP, 51495 numaralı dinamik portu değil, 16666 ve 46123 numaralı statik portları kullanacaktı. Bu kadar örnekten sonra bu kavramların oturtuğunu varsayıyorum.

SQL Server Instance' ınıza uzaktan bağlanabilmek için size durağan (Static) portları kullanmanızı tavsiye ederim. Bu nedenle, Şekil-2 deki "TCP/IP Properties" penceresindeki ilgili IP' nin "TCP Dynamic Ports" etiketinin değerini boş bırakmanızı tavsiye ederim. Yani orada ne "0" ne de başka bir değer yazmasın ve gene aynı penceredeki "TCP Port" etiketinin değerine müsait bir port numarası girin ve bu ayarların geçerli olabilmesi için, protokolün ait olduğu SQL Server Instance' ının SQL Server servisini durdurup tekrar başlatın.

Peki SQL Server Instance' ınızın hangi port numarasını dinlediğini nasıl teyit edeceksiniz? Bunun için Komut İstemcisi (Command Prompt) u kullanabilirsiniz. Komut İstemcisini çalıştırın (Başlat\Çalıştır ve tırnak içindeki komutu yazın "cmd" ve çalıştırın.)

O anki TCP/IP bağlantılarını ve protokol istatistiklerini görüntüleyebilmemiz için Komut İstemcisinde Netstat komutunu kullanabiliriz. Hangi Protokolün ve IP numarasının hangi portu kullandığını ve durumunu görüntülemek için "Netstat -a" komutunu kullanacağız. Bu komut hakkında daha fazla bilgi alabilmek için Komut İstemcisindeyken "Netstat -?" komutunu çalıştırabilirsiniz.

Aşağıdaki Şekil-3' te "Netstat -a" komutunu çalıştırdıktan sonra nasıl bir görüntüyle karşılaşacağınızı görebilirsiniz.


Şekil-3


Beyaz çerçeve ile işaretlediğim aralıkta, 192.168.2.2 IP numaralı SQL Server sunucumuzun 16666 ve 46123 numaralı portları dinlediğini (LISTENING) görebilirsiniz.


2 - Windows Güvenlik Duvarının Yapılandırılması:
Bu konuda Microsoft tarafından yazılmış bir makale zaten mevcut için benim bu konuda daha fazla bir şey yazmama gerek kalmıyor. Buraya tıklayarak bahsini ettiğim makaleye ulaşabilirsiniz.

Ahh ama bir şey de eklemeden edemeyeceğim! Bazı durumlarda bu işlemleri yapmanın da yetersiz kaldığını gördüm. Meselâ bir müşterimiz tüm bunları yaptığı halde gene de uzaktaki SQL Server sunucusuna bağlanamıyordu. Nedeni ise, modemindeki Güvenlik Duvarı ve kısıtlamalardı. Yani, modeminizdeki yapılandırmayı da gözden geçirmenizde yarar var. Aksi takdirde günlerce uğraşır sorunu çözemezsiniz...

3- Login:
Çoğunuzun bildiği gibi SQL Server' da Authentication Mode (Yetkilendirme Modu) olarak iki adet seçeneğimiz bulunuyor. Birisi Windows Authentication, diğeri ise SQL Authentication (veya Mixed Authentication).

Windows Authentication' ı sadece güvenilir ortamlarda kullanabilirsiniz. Nedir güvenilir ortamlar? Meselâ aynı Domain' in parçasıysanız güvenik ilişkisi olan bir ortamdasınızdır. Eğer yetkileriniz izin veriyosa, kendi Domain hesabınızla aynı Domain' in parçası olan diğer kaynakları kullanabilirsiniz. Bizim konumuzla alâkalı bir örnek vermek gerekirse, SQL Server Instance' ınıza bir Domain Güvenlik Grubunun bir üyesi olarak veya bir Domain hesabıyla bağlanabilirsiniz. SQL Server için herhangi bir şifre girmenize de gerek kalmaz. Mümkün olan her senaryoda bu Authentication Mode' unu kullanmanızı tavsiye ederim. SQL Authentication' dan çok daha güvenlidir. Zaten Microsoft' da bunu tavsiye eder ve dokümanlarında da SQL Authentication' ı sadece geriye destek için hâlâ barındırdıklarını söylüyorlar.

SQL Login deyince benim aklıma hemen "sa" geliyor. Çünkü kullanıcıların yaptığı bu yanlışı o kadar çok gördüm ki...

Arkadaşlar! Lütfen her şey için "sa" hesabını kullanmayın! KULLANMAAAAYIN! Çünkü "sa" hesabı "sysadmin" sabit sunucu rolü üyesi (ve bu rolden çıkarılamaz) bir hesaptır.

SQL Server 2005 Instance' ınızı kurarken Authentication Mode olarak eğer Windows Authentication' ı seçmiş iseniz, o zaman "sa" hesabı otomatik olarak kullanılamaz olacaktır. Tabi ta ki siz onu etkinleştirip, Authentication Mode' unu da Mixed Authentication yapmadığınız sürece. Eğer SQL Server 2005 Setup' taki Authentication Mode bölümünde Mixed Authentication' ı işaretlediyseniz, o zaman "sa" hesabı kullanılabilir olacaktır.

"sa" hesabını neden kullanmamalıyız konusuna SQL Server 2008: Güvenlik ile ilgili değişiklikler isimli yazımda deyinmiştim. Tekrar tekrar aynı şeyleri yazmanın gereği yok, o yüzden ilgilenenler, o yazımdaki "sa" hesabıyla ilgili yazdıklarımı okuyabilirler.

Eğer bağlanacağınız SQL Server Instance' ı ile güvenilir bir ortamda değilseniz, o zaman SQL Authentication yoluyla bir SQL Login kullanarak bağlanabilirsiniz.

Login hakları ise bu konunun ötesinde bir konu.



Ekrem Önsoy

Hiç yorum yok: