{"id":621,"date":"2007-06-25T20:54:25","date_gmt":"2007-06-25T18:54:25","guid":{"rendered":"http:\/\/www.glorf.it\/blog\/2007\/06\/25\/sql-server\/sql-server-2005-immer-mit-named-pipes"},"modified":"2007-06-25T20:54:25","modified_gmt":"2007-06-25T18:54:25","slug":"sql-server-2005-immer-mit-named-pipes","status":"publish","type":"post","link":"http:\/\/www.glorf.it\/blog\/2007\/06\/25\/sql-talk\/sql-server\/sql-server-2005-immer-mit-named-pipes","title":{"rendered":"SQL-Server-2005: immer mit Named-Pipes"},"content":{"rendered":"<p>Mein Kollegen Vladimir entdeckte, dass man den SQL-Server-2005 nicht mehr so konfigurieren kann, dass er nur &#252;ber Shared-Memory erreichbar ist.<br \/>\nSeit SQL-Slammer konfigurieren wir die an Arbeitspl&#228;zen installierten MSDEs so, dass sie nicht &#252;ber das Netz erreichbar sind. Das wird auch von immer empfohlen, wenn man irgendwelche Sicherheitstipps liest.<br \/>\nIst ja logisch, damit bietet der SQL-Server erheblich weniger Angriffsfl&#228;che.<\/p>\n<p>Mit dem SQL-Server-2000 entfernt man einfach alle Protokolle &quot;Server Network Utility&quot; f&#252;r die jeweilige Instanz. Dann kann man immer noch mittels Shared-Memory auf den lokalen SQL-Server zugreifen. <\/p>\n<p>Der SQL-Server-2005 unterst&#252;tzt das Shared-Memory-Protokoll aber nicht mehr. Im &quot;SQL Server Configuration Manager&quot; sieht man zwar noch das Protokoll &quot;Shared Memory&quot;, aber das stimmt nicht. Das kann man auch ganz gut im Process-Explorer sehen, wenn man sich die beiden Prozesse ansieht. Es ist mit einem kleinen Tests aber auch leicht nachvollziehbar.<br \/>\nDazu muss man einfach in dem Tool am SQL-Server-2005 alle Protokolle deaktivieren und nur Shared Memory &#252;brig lassen. Danach muss man den Dienst neu starten.<\/p>\n<p>Dann sieht man schon im Errorlog des SQL-Servers:<br \/>\n<code>Server local connection provider is ready to accept connection on [ \\\\.\\pipe\\SQLLocal\\SQLEXPRESS ].<br \/>\nServer local connection provider is ready to accept connection on [ \\\\.\\pipe\\MSSQL$SQLEXPRESS\\sql\\query ].<\/code><\/p>\n<p>Wenn man sich nun explizit &#252;ber Shared-Memory (LPC) zum SQL-Server verbindet, dann klappt der Zugriff:<\/p>\n<p><code>>SQLCMD -S lpc:.\\MyExpress -E<br \/>\n1> SELECT net_transport FROM sys.dm_exec_connections WHERE session_id = @@SPID<br \/>\n2> go<br \/>\nnet_transport<br \/>\n&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;-<br \/>\nShared memory<\/p>\n<p>(1 Zeilen betroffen)<br \/>\n1> exit<\/code><\/p>\n<p>Der Zugriff verwendet aber nicht Shared-Memory, sondern eine spezielle Named-Pipe (obwohl Named-Pipes deaktiviert wurde):<\/p>\n<p><code>>SQLCMD -S np:\\\\.\\pipe\\SQLLocal\\MyExpress -E<br \/>\n1> SELECT net_transport FROM sys.dm_exec_connections WHERE session_id = @@SPID<br \/>\n2> go<br \/>\nnet_transport<br \/>\n&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;-<br \/>\nShared memory<\/p>\n<p>(1 Zeilen betroffen)<br \/>\n1> exit<\/code><\/p>\n<p>Weil die alten Client, die bspw. ODBC nutzen, das &quot;neue&quot; Shared-Memory nicht kennen, werden sie auf etwas umgelenkt, dass sie kennen: die &quot;bisherigen&quot; Named-Pipes. Deswegen ist jetzt jeder SQL-Server immer auch &#252;ber die Standard-Pipe erreichbar, selbst wenn das Protokoll Named-Pipes deaktiviert ist:<\/p>\n<p><code>>SQLCMD -S np:\\\\.\\pipe\\MSSQL$MyExpress\\sql\\query  -E<br \/>\n1> SELECT net_transport FROM sys.dm_exec_connections WHERE session_id = @@SPID<br \/>\n2> go<br \/>\nnet_transport<br \/>\n&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;-<br \/>\nNamed pipe<\/p>\n<p>(1 Zeilen betroffen)<br \/>\n1> exit<\/code><\/p>\n<p>Man kann jetzt dar&#252;ber streiten, ob das ein Sicherheitsproblem ist, aber es ist kein Bug, sondern ein beabsichtigtes Feature um abw&#228;rtskompatibel zu sein. Es ist auch kein Geheimnis, ich fand mehrere Artikel im Internet, die das best&#228;tigen, wenn auch das Problem nicht als solches beschreiben (erkennen?), z.B. <a href=\"http:\/\/blogs.msdn.com\/sql_protocols\/archive\/2005\/10\/29\/486861.aspx\">bei SQL-Protocols<\/a>.<\/p>\n<p>Der Zugriff &#252;ber eine Remote-Pipe funktioniert hingegen nicht:<\/p>\n<p><code>>SQLCMD -S np:\\\\MyPC\\pipe\\MSSQL$MyExpress\\sql\\query  -E<br \/>\nHResult 0xE9, Level 16, State 1<br \/>\nNamed Pipes Provider: Kein Prozess ist am anderen Ende der Pipe.<\/p>\n<p>Sqlcmd: Error: Microsoft SQL Native Client : Communication link failure.<br \/>\nSqlcmd: Error: Microsoft SQL Native Client : An error has occurred while<br \/>\nestablishing a connection to the server. When connecting to SQL Server<br \/>\n2005, this failure may be caused by the fact that under the default settings<br \/>\nSQL Server does not allow remote connections..<\/code><\/p>\n<p>Das geht nur, wenn man auch Named-Pipes erlaubt.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Mein Kollegen Vladimir entdeckte, dass man den SQL-Server-2005 nicht mehr so konfigurieren kann, dass er nur &#252;ber Shared-Memory erreichbar ist. Seit SQL-Slammer konfigurieren wir die an Arbeitspl&#228;zen installierten MSDEs so, dass sie nicht &#252;ber das Netz erreichbar sind. Das wird auch von immer empfohlen, wenn man irgendwelche Sicherheitstipps liest. Ist ja logisch, damit bietet der [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":[],"categories":[16],"tags":[],"_links":{"self":[{"href":"http:\/\/www.glorf.it\/blog\/wp-json\/wp\/v2\/posts\/621"}],"collection":[{"href":"http:\/\/www.glorf.it\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"http:\/\/www.glorf.it\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"http:\/\/www.glorf.it\/blog\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"http:\/\/www.glorf.it\/blog\/wp-json\/wp\/v2\/comments?post=621"}],"version-history":[{"count":0,"href":"http:\/\/www.glorf.it\/blog\/wp-json\/wp\/v2\/posts\/621\/revisions"}],"wp:attachment":[{"href":"http:\/\/www.glorf.it\/blog\/wp-json\/wp\/v2\/media?parent=621"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"http:\/\/www.glorf.it\/blog\/wp-json\/wp\/v2\/categories?post=621"},{"taxonomy":"post_tag","embeddable":true,"href":"http:\/\/www.glorf.it\/blog\/wp-json\/wp\/v2\/tags?post=621"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}