Skip Ribbon Commands
Skip to main content

Ondrej Sevecek's Blog

:

Engineering and troubleshooting by Directory Master!
Ondrej Sevecek's Blog > Posts > Testování konektivity na SQL server
leden 14
Testování konektivity na SQL server

Stokrát jsem to už potřeboval a pokaždé jsem s tím musel znovu a znovu zápolit. Tak si to tu zdokumentuju, ať to můžu už navždycky jenom pejstovat :-)

Nejprve ale něco, co si může zapamatovat každý.

SQL Browser a portscan

SQL server může běžet buď na TCP 1433, což je výchozí port pro nepojmenovanou instanci (výchozí, default instance). Pokud nainstalujete instanci pojmenovanou (named instance), tak se startuje na portu náhodném. Ten se určuje dynamicky při startu služby SQL instance tak, aby to s ničím nekolidovalo. Tedy přesněji řečeno, pokud to koliduje, vymyslí se náhodně jiný port.

SQL server může taky poslouchat na portu TCP 445 (nebo dokonce NetBIOS TCP 139 - session service), to se potom nazývá named pipes a jedná se opravdu o přenos přes protokol SMB a tedy v podstatě sdílené soubory (k tomu nemusíte mít zapnut NetBIOS, aby vám jel přenos přes named pipes, ten je jenom navíc kvůli kompatibilitě s NT 4.0).

Klienti musí být schopni dynamický port, který dopředu neznají, nějak zjistit. Na to slouží služba SQL Server Browser (sqlbrowser.exe), která taky musí na SQL serveru běžet, aby to fungovalo. Tahle poslouchá na portu UDP 1434. Vždycky jenom na tomto. Něco ti klienti přecejenom znát musí.

No a tahle služba anonymně sděluje jména instancí a jejich přípojné body. Ideální na zjištění, jestli vůbec klient může, nebo nemůže fungovat, jestli je tohle z klienta dostupné. Ideální je použít program PORTQRY, který je zadarmo dostupný z MS a umí testovat i jiné porty.

PORTQRY -n dbserver.gopas.virtual -e 1434 -p UDP

Pokud máte zapnuto TCP/IP spojení na nějaké instanci a SQL Browser je dostupný, uvidíte jméno instancí a jejich aktuální čísla TCP portů. Pokud máte navíc zapnuty named pipes pro nějakou instanci, pro každou uvidíte něco jako \\dbserver\Pipe\MSSQL$jmenoinstance\sql\query.

Dostupnost konkrétního TCP portu zjistíte následovně, opět za pomoci PORTQRY:

PORTQRY -n dbserver.gopas.virtual -e 59595
PORTQRY -n dbserver.gopas.virtual -e 445

První příkaz zkouší konkrétní dynamický SQL port, druhý příkaz zkouší sdílené soubory.

SQL vnitřní připojení, ověření a čtení dat

Když jde najít instanci přes SQL browser a jede TCP připojení, můžeme začít zkoušet skutečné SQL připojení a ověření uživatele vůči nějakému SQL login. K tomu je ideální PowerShell:

$conn = New-Object Data.SqlClient.SqlConnection 'Server=dbserver.gopas.virtual\DBINSTANCE;Database=Master;Integrated Security=True'
$conn.Open()

Myslím, že ten connection string by měl být jasný. Metoda Open() provádí připojení a ověření současně. Takže pokud nejde SQL připojit, nebo se nemůžete ověřit Windows ověřením (Kerberos, nebo NTLM), vyhodí to výjimku (exception). Jinak si můžete vypsat jeho členy ClientConnectionId a ServerVersion. Znamená to, že jste se úspěšně ověřili a připojili se na nějaký SQL login.

Upozorňuju, že jméno pro Server v connection string musí být přesně to, které je na SQL serveru v certifikátu, pokud tam tedy to TLS/SSL vynucujete. V mém případě je v certifikátu dlouhé jméno včetně jména domény, tak musím uvést celé jméno. Pokud chcete šifrovat jen pro tento connection string, můžete toho dosáhnout pomocí Encrypt=True:

$conn = New-Object Data.SqlClient.SqlConnection 'Server=dbserver.gopas.virtual\DBINSTANCE;Database=Master;Integrated Security=True;Encrypt=True'
$conn.Open()

Pokud ověření proběhlo pomocí Kerberos, bezpodmínečně byste měli vidět platný TGS tiket MSSQLSVC/dbserver.gopas.virtual:59595 ve výstupu programu KLIST. Pokud tam jdete přes named pipes, tak tam bude jméno instance namísto čísla portu - něco jako MSSQLSVC/dbserver.gopas.virtual:DBINSTANCE. Pokud takový TGS tiket nemáte, ověřovali jste se nejspíš pomocí NTLM.

KLIST

Výpis KLIST také ukazuje, jestli Kerberos ověření použilo šifrování AES, nebo jenom něco slabšího.

Pokud ještě chcete dále testnout výpis obsahu nějaké tabulky, zkuste následující:

$conn = New-Object Data.SqlClient.SqlConnection 'Server=dbserver.gopas.virtual\DBINSTANCE;Database=Master;Integrated Security=True;Encrypt=True'
$conn.Open()

$cmd = $conn.CreateCommand()
$cmd.CommandText = 'SELECT name, create_date FROM sys.databases'

$reader = $cmd.ExecuteReader()
$table = New-Object Data.DataTable
$table.Load($reader)

$table

$reader.Close()
$conn.Close()
$conn.Dispose()

Tabulky vhodné k průzkumu jsou:

Database Table or View Columns Poznámka
Master sys.databases name, create_date stačí mít login a být členem Public server role
AdventureWorks2012 Person.Person FirstName, LastName k tomu, aby prošlo $conn.Open() stačí mít váš login namapován do databáze AdventureWorks na nějaký user uvnitř této databáze, nemusíte být členem ničeho dalšího
na to, abyste načetli obsah tabulky Person.Person musíte mít database schema nazvané Person

Takže pro pořádek, ještě tedy testovací skript na databázi AdventureWorks2012:

$conn = New-Object Data.SqlClient.SqlConnection 'Server=dbserver.gopas.virtual\DBINSTANCE;Database=AdventureWorks2012;Integrated Security=True;Encrypt=True'
$conn.Open()

$cmd = $conn.CreateCommand()
$cmd.CommandText = 'SELECT TOP 15 FirstName, LastName FROM Person.Person'

$reader = $cmd.ExecuteReader()
$table = New-Object Data.DataTable
$table.Load($reader)

$table

$reader.Close()
$conn.Close()
$conn.Dispose()

A hotovo :-)

Comments

Re: Testování konektivity na SQL server

with this sample, you can test the connectivity to an SQL server
ondass on 19.3.2015 12:26

Add Comment

Title


Pole Title nemusíte vyplňovat, doplní se to samo na stejnou hodnotu jako je nadpis článku.

Author *


Pole Author nesmí být stejné jako pole Title! Mám to tu jako ochranu proti spamu. Roboti to nevyplní dobře :-)

Body *


Type number two as digit *


Semhle vyplňte číslici dvě. Předchozí antispemové pole nefunguje úplně dokonale, zdá se, že jsou i spamery, které pochopily, že je občas potřeba vyplnit autora :-)

Email


Emailová adresa, pokud na ni chcete ode mě dostat odpověď. Nikdo jiný než já vaši emailovou adresu neuvidí.

Attachments