Microsoft SQL Server 2005 instaluje i wykorzystuje więcej usług w systemie Windows, niż poprzednie wersje tego systemu. Jedną z nowych usług jest SQL Browser. Niniejszy artykuł ma na celu wyjaśnienie, jakie są zastosowania tej usługi, jakie są kosekwencje jej wyłączenia lub zatrzymania oraz jakie zasady bezpieczeństwa powinien w odniesieniu do tej usługi stosować administrator.
Począwszy od wersji SQL Server 2000, istnieje możliwość zainstalowania wielu instancji systemu SQL Server na jednej maszynie. Do obsługi połączeń z zainstalowanymi na komputerze instancjami w SQL Server 2000 służy SQL Server Resolution Protocol (SSRP). Protokół ten umożliwia nasłuchiwanie na porcie UDP 1434, przyjmuje zgłoszenia klientów i odpowiada klientom podając nazwy zainstalowanych na maszynie instancji, numery portów i ścieżki potoków nazwanych używane przez instancje. Niewątpliwą wadą SSRP jest jednak działanie w obrębie procesu samej usługi SQL Server. To dzięki temu oraz na skutek niestosowania dobrych praktyk bezpieczeństwa w kwestii aktualizacji zabezpieczeń i izolacji serwerów baz danych, w styczniu 2003 roku robak Slammer, wykorzystując prosty mechanizm rozsyłania pakietów UDP zebrał straszliwe żniwo (75 000 zainfekowanych serwerów w ciągu pierwszych 10 minut ataku robaka, podwojenie liczby zainfekowanych maszyn w 8,5 sekundy, ogromne straty w firmach mających dostęp do internetu na całym świecie na skutek ogromnego ruchu generowanego w sieci przez robaka). Dodatek Service Pack 3 do systemu SQL Server 2000 wyeliminował błąd wykorzystywany przez Slammera (zresztą hotfix „łatający” dziurę używaną przez Slammera został opublikowany o wiele wcześniej), ale po tym zdarzeniu w firmie Microsoft zapadła decyzja, że w nowej wersji systemu SQL Server obsługa zadań dotychczas wykonywanych przez usługę SQL Server przy użyciu SSRP spadnie na odrębną, autonomiczną usługę, by w przyszłości podobne ataki (o ile będą miały miejsce) nie były równoznaczne z atakami Denial of Service (Dos) na sam system zarządzania bazami danych.
Tą usługą w systemie SQL Server 2005 jest usługa SQL Server Browser. Usługa ta może obsługiwać zdalny dostęp do wielu instancji różnych wersji systemu SQL Server (2000/2005) na jednej maszynie. Poza rozwiązywaniem nazw zainstalowanych na serwerze instancji SQL Server, SQL Server Browser oferuje także inne funkcjonalności.
Każda instancja systemu SQL Server z włączoną obsługą protokołu TCP lub VIA (patrz dodatek A na końcu artykułu) otrzymuje port TCP do nasłuchiwania. Port ten może być określony jako statyczny (niezmienny) lub dynamiczny (przydzielany przez maszynę dynamicznie, czyli zmienny). Instancji domyśnej (ang. default instance) domyślnie przydzielany jest port 1433, zaś instancjom nazwanym (włącznie z instancjami SQL Server Express) domyślnie porty przydzielane są dynamicznie. Jeśli już decydujemy się na określenie statycznych portów dla instancji nazwanych, to należy wybierać inne numery portów niż 1433 - domyślnie rezerwowany przez instancję domyślną - i 1434 - rezerwowany domyślnie dla dedykowanego połączenia administracyjnego (ang. DAC – Dedicated Administrator Connection).
Jeżeli dla instancji administrator dodatkowo włączy obługę potoków nazwanych (ang. named pipes), to instancja nasłuchuje także na określonym potoku. Porty i potoki muszą być różne dla każdej instancji. W przeciwnym razie można doprowadzić do sytuacji, gdy uruchomiona już instancja blokuje uruchomienie innej instancji na tej samej maszynie (usługa SQL Server nie uruchomi się, jeżeli będzie zajęty port przydzielony danej instancji).
Usługa SQL Server Browser działa na porcie UDP 1434 (czyli w kwestii działania protokołu SSRP port do nasłuchiwania nie zmienił się). Usługa ta czyta rejestr, wyszukuje zainstalowane na komputerze instancje systemu SQL Server i zapamiętuje numery portów i ścieżki potoków nazwanych używanych przez owe instancje. W przypadku, gdy serwer dysponuje wieloma kartami sieciowymi, usługa pamięta pierwszy napotkany port dedykowany dla instancji SQL Server. SQL Server Browser wspiera zarówno IPv4, jak i IPv6.
SQL Server Browser odpowiada na komunikaty wysyłane klientów SQL Server 2000 i SQL Server 2005 na port UDP 1434 (taki komunikat jest wysyłany, gdy klient zgłasza żądanie dostępu do zasobów instancji SQL Server) wysyłając numer portu TCP/IP i/lub ścieżkę potoku nazwanego właściwej instancji. Po otrzymaniu numeru portu / ścieżki potoku odpowiednia blilioteka sieciowa (zależnie od konfiguracji) po stronie klienta może wysłać do właściwej istancji zestaw poleceń i zamknąć połączenie.
Konsekwencje zatrzymania usługi SQL Server Browser na serwerze są następujące:
| • | będzie możliwe normalne (bez określania portu) połączenie z instancją domyślną zainstalowaną na serwerze, |
| • | nie będzie możliwe połączenie z instancją nazwaną bez pełnego określenia parametrów połączenia (porty TCP, potoki nazwane), |
| • | nie będzie możliwe pobranie informacji o instancjach przez komponenty programistyczne (np. przez klasę System.Data.Sql.SqlDataSourceEnumerator z .NET Framework 2.0 – patrz dodatek B do artykułu), |
| • | nie będzie możliwe połączenie DAC bez określenia portu TCP 1434 (a w przypadku zainstalowanych wielu instancji na jednej maszynie, połączenie DAC bezpośrednio na port 1434 będzie nawiązane z instancją domyślną), |
| • | nie będzie możliwe połączenie z instancjami z poziomu usługi przekierowującej OLAP, |
| • | nie będzie możliwe listowanie dostępnych instancji nazwanych SQL Server w narzędziach klienckich, takich jak Query Analyzer czy Management Studio. |
| Informacja | ||||
Narzędzia klienckie systemu SQL Server 2005 mają zdolność zapamiętywania informacji zwracanych przez usługę SQL Server Browser. Autor artykułu wykonał prosty test polegający na nawiązaniu udanych połączeń z instancją nazwaną przy włączonej usłudze SQL Server Browser, a następnie testowaniu możliwości stworzenia nowych połączeń do tych samych instancji, ale już po wyłączeniu usługi. Okazuje się, że:
|
Komunikat, jaki zobaczy użytkownik próbujący połączyć się z użyciem nazwy instancji z instancją nazwaną zainstalowaną na maszynie, na której nie działa usługa SQL Server Browser, przedstawia poniższy rysunek.

Rys. 1. Komunikat błędu przy próbie połączenia z instancją nazwaną (usługa SQL Server Browser wyłączona).
Wiedząc już, jakie są konsekwencje zatrzymania usługi SQL Server Browser, spróbujmy teraz odpowiedzieć na pytanie, jakie są konsekwencje uruchomienia tejże usługi. Oczywiście pierwszym następstwem uruchomienia usługi jest możliwość przeglądania danych dotyczących instancji przez aplikacje klienckie. Pytanie, czy na pewno chcemy, by takie przeglądanie danych było możliwe? A może chcemy, by te informacje były dostępne jedynie z poziomu sieci lokalnej? Wydaje się, że większość administratorów chciałaby zachować możliwość nawiązywania połączeń przy użyciu nazw instancji tylko w sieci LAN, natomiast nie chciałaby ujawniać zainstalowanych i uruchomionych instancji poza siecią lokalną. Krokiem, który to podejście implementuje, jest zablokowanie komunikacji po porcie UDP 1434 na poziomie firewalla oddzielającego LAN od strefy zdemilitaryzowanej (lub sieci rozległej, gdy DMZ nie jest stosowany). Zakładamy, że użytkownik, który łączy się z instancją SQL Server spoza sieci lokalnej musi znać parametry instancji (port, ścieżkę potoku nazwanego).
Warto pamiętać także, że usługa SQL Server Browser nie jest „cluster aware”, to znaczy, że jeżeli administrator chce wykorzystywać możliwości tej usługi nawet w przypaku, gdy zachodzi automatyczna zmiana wiodącego węzła klastra, musi zainstalować ją i uruchomić na każdym węźle z osobna.
Czasem administratorowi może zależeć na tym, by ukryć instancję przed usługą SQL Server Browser. Taką możliwość daje mu narzędzie SQL Server Configuration Manager. Rozwijając gałąź SQL Server 2005 Network Configuration, klikając prawym przyciskiem na pozycji Protocols for <nazwa instancji> i wybierając z menu kontekstowego opcję Właściwości (Properties) administrator uzyskuje dostęp do okna z zakładką Flags. W oknie tym ma możliwość ustawienia właściwości Hide Instance.

Rys. 2. Ukrywanie instancji SQL Server.
Ustawienie właściwości Hide Instance nie uniemożliwi połączeń z instancją SQL Server, a jedynie spowoduje, że usługa SQL Server Browser nie będzie rozwiązywała nazwy danej instancji.
Bez uruchomionej usługi SQL Server Browser (lub przy braku dostępu do portu UDP 1434 na przykład na skutek działania firewalla) użytkownik nadal może połączyć się z dowolną instancją SQL Server na wybranej zdalnej maszynie, pod warunkiem, że instancja ma włączoną obsługę protokołów sieciowych umożliwiających zdalny dostęp (TCP/IP, potoki nazwane, VIA) oraz że użytkownik łączy się z serwerem wskazując konkretny port / ścieżkę.
Jeżeli użytkownikowi zależy na połączeniu z wybraną instancją SQL Server przy użyciu protokołu TCP/IP nawet w przypadku, gdy usługa SQL Server Browser jest wyłączona / niedostępna, to musi on podać zamiast nazwy instancji nazwę lub adres IP maszyny i po przecinku numer portu TCP, np. tcp:MIAMI,1435 (przedrostek tcp: jest opcjonalny).
Jeżeli użytkownikowi zależy na połączeniu z wybraną instancją SQL Server przy użyciu potoków nazwanych nawet w przypadku, gdy usługa SQL Server Browser jest wyłączona / niedostępna, to musi on podać zamiast nazwy instancji ścieżkę UNC potoku nazwanego wybranej instancji, np. np:\\MIAMI\pipe\MSSQL$SQLEXPRESS\sql\query (przedrostek np: jest opcjonalny).
Poniższy rysunek pokazuje, jak połączyć się z konkretną instancją SQL Server, gdy użytkownik zna port TCP, na którym ta instancja nasłuchuje.

Rys. 3. Połączenie z instancją nazwaną SQL Server przez podanie numeru portu TCP.
Poniższy rysunek pokazuje, jak połączyć się z instancją SQL Server, gdy użytkownik zna ścieżkę potoku nazwanego, na którym ta instancja nasłuchuje.

Rys. 4. Połączenie z instancją nazwaną SQL Server przez podanie potoku nazwanego.
SQL Server Browser jest kolejną usługą na liście usług systemu SQL Server. Administrator powinien pamiętać, że wyłączenie lub zatrzymanie tej usługi niesie za sobą potrzebę dokładnego określania parametrów połączenia przez użytkowników. Niewątpliwie zapamiętanie nazw instancji jest dla użytkownika systemów SQL Server prostsze od zapamiętania ścieżek potoków nazwanych czy portów TCP dla każdej instancji, z której korzysta. Poza tym sam administrator może czerpać z funkcjonowania usługi SQL Server Browser wymierne korzyści poprzez wykorzystanie połączenia DAC do rozwiązywania problemów z serwerem. Z drugiej strony administrator musi pamiętać o tym, że SQL Server Browser nie powinien rozgłaszać informacji o instancjach poza pożądany fragment sieci.
Microsoft SQL Server 2005 oferuje administratorom nowe narzędzie, przy użyciu którego można (między innymi) skonfigurować protokoły sieciowe serwera. Narzędziem tym jest SQL Server Configuration Manager. Ta konsola MMC (Microsoft Management Console) pozwala nie tylko na włączanie i konfigurację protokołów sieciowych wszystkich zainstalowanych na serwerze instancji SQL Server 2005, ale także na zarządzanie usługami tych instancji oraz dodawanie aliasów (alternatywnych nazw dla instancji SQL Server). Konsola SQL Server Configuration Manager jest dostępna w grupie programów Microsoft SQL Server 2005 – Configuration Tools. Można ją także znaleźć na liście zakładek MMC, a także w konsoli Zarządzanie komputerem w sekcji Usługi aplikacyjne.
Aby zarządzać protokołami instancji, należy w lewej częśći okna konsoli Configuration Manager rozwinąć grupę SQL Server 2005 Network Configuration i wybrać odpowiednią instancję SQL Server 2005. Po prawej stronie pojawi się lista dostępnych protokołów (Shared Memory, Named Pipes, TCP/IP, VIA). Klikając prawym przyciskiem myszy na wybranym protokole można go włączać / wyłączać (opcje Enable i Disable), a także ustawiać odpowiednie opcje.

Rys. 5. Konsola SQL Server Configuration Manager.
Porty TCP można ustawić klikając prawym przyciskiem myszy na protokole TCP/IP i wybierając z menu kontekstowego opcję Właściwości. Następnie w oknie Właściwości: TCP/IP należy wybrać zakładkę IP Addresses. Pojawi się lista adresów IP i portów TCP przydzielonych interfejsom. Aby ustawić statyczny port TCP dla instancji, należy wyczyścić pole TCP Dynamic Ports (wstawienie w to pole liczby 0 powoduje, że instancja nasłuchuje na dynamicznie przyznawanym porcie TCP) oraz wpisać wybrany numer portu TCP w pole TCP Port. Poniższy rysunek przedstawia przykładową konfigurację instancji domyślnej SQL Server 2005 – wybranym statycznym portem jest TCP 1433.

Rys. 6. Konfiguracja protokołu TCP/IP dla instancji SQL Server 2005.
Do listowania dostępnych w sieci instancji SQL Server 2000/2005 można użyć niewielkiej aplikacji konsolowej, napisanej na platformie .NET 2.0. Przykładowy kod aplikacji:
using System;
using System.Data.Sql;
using System.Data;
namespace SQLServerEnumerator
{
class Program
{
static DataTable servers;
static void Main(string[] args)
{
Console.WriteLine("Available SQL Server 2000 and 2005 instances:");
Console.WriteLine("---------------------------------------------\n\r");
Console.WriteLine("Searching for servers\n\r");
servers = GetSQLServers();
foreach (DataRow server in servers.Rows)
{
Console.WriteLine("Server name :" + server[0]);
Console.WriteLine("Instance name:" + server[1]);
Console.WriteLine("Is clustered :" + server[2]);
Console.WriteLine("Version :" + server[3] + "\n\r");
}
Console.ReadKey();
}
static protected DataTable GetSQLServers()
{
SqlDataSourceEnumerator enumSql = SqlDataSourceEnumerator.Instance;
return enumSql.GetDataSources();
}
}
}
Aplikacja wykorzystuje klasę System.Data.Sql.SqlDataSourceEnumerator z bibliotek .NET Framework 2.0. Klasa ta posiada metodę GetDataSources, która zwraca informacje (nazwę serwera, nazwę instancji, czy instancja jest w kastrze, wersja SQL Server) o dostępnych w sieci instancjach SQL Server. Informacje te są zaszyte w obiekcie klasy DataTable (każdy obiekt klasy DataRow znajdujący się w kloekcji Rows obiektu klasy DataTable przechowuje informacje o jednej instancji SQL Server).
| Informacja |
Testy pokazują, że usługa SQL Server Browser nie wysyła rzeczywistego numeru wersji instancji SQL Server i że zawsze pokazuje na wersję RTM (w przypadku instancji SQL Server 2005 jest to numer wersji 9.0.1399). |
![]() | Paweł Potasiński (Microsoft Certified Trainer, Asseco Business Solutions S.A.) |