Na koncové body (endpoints) jde nahlížet jako na místa, kterými se lze připojit k SQL Serveru. Lze tak určit kdo a jak se k SQL Serveru smí připojit. Problematika koncových bodů je celkem široká a tak se zaměřím jen na konkrétní část. Tou bude protokol TCP/IP a T-SQL jako typ dat, očekávaný koncovým bodem.

Omezení přístupu k SQL Serveru

V prvé řadě zakážeme všechny protokoly kromě TCP/IP. To provedeme pomocí nástroje Sql Server Configuration Manager. V sekci SQL Server Network Configuration vybereme naší instanci serveru (defaultně MSSQLSERVER) a v kontextové nabídce jednotlivých protokolů zvolíme Disabled. Protokol Named Pipes využívá Management Studio, takže pokud se bez něj neobejdete, nechte tento protokol povolený.

Pokud se podíváme do vlastností protokolu TCP/IP na kartu IP Addresses, uvidíme povolený přístup k serveru na určitých adresách a portech. My chceme aby server naslouchal jen na adrese 127.0.0.1 a portu 1433 (což je výchozí port SQL Serveru) U dalších adres nastavíme Enabled na 'No'. Na kartě Protocol musíme ještě změnit možnost Listen All na 'No'. Pokud bychom tak neučinili, byl by SQL Server přístupný i na zakázaných adresách.

Vlastnosti TCP/IP protokolu Vlastnosti TCP/IP protokolu

Aby se změny projevily, je třeba SQL server restartovat. To provedeme v sekci SQL Server Services, kde vybereme položku SQL Server (nazev_instance) a v kontextové nabídce zvolíme Restart.

Pokud se nyní budeme chtít připojit k SQL Serveru z naší aplikace, použijeme ConnectionString podobný tomuto:

"Data Source=127.0.0.1;Network Library=dbmssocn;Initial Catalog=pokus;User ID=testLogin;Password=testlogin"

kde jednotlivé parametry znamenají:

  • Data Source - adresa SQL serveru
  • Network Library - použitý protokol, hodnota "dbmssocn" značí TCP/IP
  • Initial Catalog - název databáze
  • User ID - přihlašovací jméno k serveru
  • Password - přihlašovací heslo

Připojení proběhne v pořádku. Stejně tak by proběhlo v pořádku, pokud bychom v Data Source specifikovali port "127.0.0.1,1433". Není-li tedy port uveden, je použit výchozí port SQL serveru.

Pokud bychom ovšem použili jiný port, nebo dokonce jinou adresu serveru (třeba 10.0.2.15, kde by byl server také dostupný, pokud bychom tuto adresu nezakázali), připojení by selhalo:

Při vytváření připojení k serveru SQL došlo k chybě související se sítí nebo s instancí. Server nebyl nalezen nebo nebyl přístupný. Ověřte, zda je název instance správný a zda je server SQL nakofigurován, aby povoloval vzdálená připojení. (provider: Zprostředkovatel TCP, error: 0 - Nemohlo být vytvořeno žádné připojení, protože cílový počítač je aktivně odmítl.)

Zatím to vypadá jen jako omezování možných přístupových cest k SQL Serveru, což už samo o sobě je krok k lepšímu zabezpečení.
Na pozadí se však již pracuje s koncovými body. Ke každému z protokolů se při vytváření instance serveru vytvoří výchozí koncový bod. Role public, které jsou členem všechny nově vytvořené loginy, má pro tyto koncové body právo connect.

Vlastní koncové body

Výchozí koncový bod (TSQL Default TCP) umožňuje přístup ze všech povolených IP adres a portů. U koncových bodů, které si sami vytvoříme, můžeme tyto údaje specifikovat.

SQL:
CREATE ENDPOINT [TestEndpoint]
STATE = STARTED
AS TCP
    (LISTENER_PORT = 1680
    ,LISTENER_IP = (127.0.0.1))
FOR TSQL () ;
GO

Tímto vytvoříme nový koncový bod, který je přístupný na adrese 127.0.0.1 a portu 1680.
Při vytvoření prvního uživatelského TCP koncového bodu se automaticky odebere oprávnění connect k výchozímu koncovému bodu, což nám sděluje hláška:

Creation of a TSQL endpoint will result in the revocation of any 'Public' connect permissions on the 'TSQL Default TCP' endpoint. If 'Public' access is desired on this endpoint, reapply this permission using 'GRANT CONNECT ON ENDPOINT::[TSQL Default TCP] to [public]'.

Jak vypadá kompletní syntaxe se můžete podívat na msdn.microsoft.com.

To že se koncový bod vytvořil, můžeme ověřit pohledem do systémové tabulky sys.tcp_endpoints

SQL:
name                          endpoint_id principal_id protocol protocol_desc type type_desc state state_desc is_admin_endpoint port is_dynamic_port ip_address
----------------------------- ----------- ------------ -------- ------------- ---- --------- ----- ---------- ----------------- ---- --------------- ----------
Dedicated Admin Connection    1           1            2        TCP            2    TSQL     0     STARTED    1                 0    1               NULL
TSQL DEFAULT TCP              4           1            2        TCP            2    TSQL     0     STARTED    0                 0    1               NULL
TestEndpoint                  65536       1            2        TCP            2    TSQL     0     STARTED    0                 1680 0               127.0.0.1

(3 row(s) affected)

Koncový bod Dedicated Admin Connection, je svázán se skupinou administrátorů serveru, proto se jich zakázání TSQL Default TCP nedotkne a mohou se dále přihlásit.

Vlastnosti TCP/IP protokoluAbychom mohli koncový bod využít, musíme port 1680 pro náš SQL Server povolit. To provedeme opět v Configuration Manageru. Stačí k uvedené adrese připsat port 1680.

Nyní máme koncový bod, ale není nikdo, kdo by k němu měl přístup. Přidělíme tedy právo connect pro koncový bod TestEndpoint uživateli s loginem testLogin:

SQL:
GRANT CONNECT ON ENDPOINT::[TestEndpoint]
TO [testLogin]

Pokud se teď připojíme s Data Source nastaveným na "127.0.0.1,1680", vše bude v pořádku. Pokud zkusíme připojení na port 1433, který je stále povolený, dostaneme pouze chybovou hlášku:

Login failed for user 'testLogin'.

Jednoduše můžeme znemožnit připojení k serveru skupině uživatelů (využívající daný koncový bod), pouhým vypnutím koncového bodu:

SQL:
ALTER ENDPOINT [TestEndpoint]
STATE = STOPPED

Což se při pokusu o připojení projeví zprávou:

Úspěšně bylo vytvořeno připojení k serveru. Potom však došlo k chybě během přihlašování. (provider: Zprostředkovatel TCP, error: 0 - Zadaný síťový název není již dále k dispozici.)

Pokud se rozhodnete koncový bod zrušit:

SQL:
DROP ENDPOINT [TestEndpoint]

zjistíte, že se již nelze k SQL Serveru připojit. Možná nahlédnete do logu, kde najdete nic neříkající hlášení "Error 18456, Severity: 14, State: 12". Vězte, že v tomto případě jste zapomněli obnovit práva pro připojení k výchozímu koncovému bodu pro roli public.

SQL:
GRANT CONNECT ON ENDPOINT::[TSQL DEFAULT TCP] TO [public]

Pro ty, které zaujalo řízení přístupu k SQL Serveru pomocí koncových bodu, zde ještě uvedu odkazy na oficiální zdroje:
Create Endpoint
Alter Endpoint
Drop Endpoint
Grant Endpoint Permissions
ConnectionString Property