(1.3.1)sqlserver体系结构,连接安全(连接实例与网络协议及TDS端点)

  连接安全是sql server安全配置的第1道防线,它保证只有许可的客户端能够连接sql server,而且可以限制连接可用的通道(各种网络协议)。

1.连接到sql server实例

 

  

 

  sql server 2005数据库引擎使用TDS(表格格式数据流)数据包与应用程序通信,通过SNI(sql server网络接口)协议层,TDS数据包被分装在标准通信协议(例如TCP/IP、Named pipes)的数据包内,并通过标准通信协议在sql server数据库引擎和应用程序之间的网络上传输。除了封包外,SNI(sql server网络接口)协议层也负责将标准在通信协议中的TDS数据包中解包出来。

  SNI协议层取代了早期版本中Net-library(网络库),数据库引擎和sql native client都具有此协议层。SNI协议层不需要配置,如果将服务器和sql native client配置为使用相应的网络协议时,数据库引擎和sql nativeclient将自动使用适当的sni协议层设置。

  SQL Native Client(SQLNCLI)是SQLServer2005新增的一种数据访问技术,它将sql OLEDB访问接口和SQL ODBC驱动程序组合成一个本机动态链接库,同事提供了一个与微软数据访问组件(MDAC)截然不同的新功能。SQLCLI可以作为sql server 2005 tools的一部分,且可以通过sql server安装程序进行安装。

  TDS端点是sql server与客户端之间通信的sql server对象。安装 sql server时,sql server自动为其支持的4个网络协议(TCP/ip、VIA、Named Pipe、Shared Memory)分别创建一个端点,默认情况下,启用协议后,所有用户都可以访问它们。

  从客户端应用程序发送处理请求(T-SQL语句)到sql server服务器,到服务器处理完成并将结果返回给客户端的完成过程如下。

  (1)客户端应用程序通过数据库访问组件,例如sql native client、sql ole db、sql server ODBC驱动程序或db-library DLL发出数据访问请求,此请求将被数据访问组件封装生成TDS数据包;

  (2)TDS数据包被传递到SNI协议层(针对SQL Native Client 数据访问组件),或者是sql server 客户端 Net-Library(非SQL Native Client 数据访问组件的请求);

  (3)SNI协议层或者是客户端Net-Library将TDS数据包封装到标准通信协议的网络协议数据包中,并通过标准通信协议传递到目的地(服务端);

  (4)在服务器上,与网络协议对应的SNI协议层被应用于接受网络协议数据包,并解包出TDS数据包;

  (5)TDS数据包经TDS端点递交给数据库引擎进行处理;

  (6)如果需要将结果返回给客户端时,则沿与接收处理请求相反的线路返回结果;

  (7)客户端收到结果,并通过SNI协议层(或者Net-Library)将网络协议数据还原成TDS数据包,并转给上层的数据库接口,上层数据接口负责将TDS数据包还原为应用程序可以接受的“结果集”。

 

 

TCP Client的通讯,是基于流(NetworkStream)的。从一个典型的查询来说,是这样工作的

1. 客户端向流中写入一个连接请求(Connection),一般都要指定服务器的地址

2. 服务器端通过端口(默认为1433)监听到这个请求

3. 客户端和服务器建立一个连接

4. 客户端此时向服务器发送一个操作请求(Command)

5. 服务器接收到操作请求,执行有关的任务,获得数据(如果需要的话)

6. 服务器将数据,分包写入到它与客户端所共有的那个NetworkStream

7. 很显然,因为流的连续性的,如果客户端和服务器双方不明确每个包的尺寸,那么就可能导致读取出现问题

8. 只有双方在尺寸方面的认识是保持一致的,所以服务器不断写入数据(二进制字节),客户端不断读取数据,这样就完成了一个操作。

简短总结:  

客户端与服务器和交互:

  (1)数据库访问组件发出访问请求,并把请求数据封装成DTS数据包

  (2)数据包通过SNI封装到标准通信协议数据包,通过网络传输到服务器

  (3)服务器通过SNI接收该包,并解析出TDS包,之后通过TDS端点递交给数据库引擎处理

  (4)数据库引擎处理完后通过TDS端点把TDS包交给SNI,SNI把它转成标准通协议数据包发给客户端

  (5)客户端通过SNI收到数据包,并把数据包还原成TDS包,然后把它转给上层的数据库接口,上层数据库接口将TDS数据包还原成我们'可接受'的结果集。

  无论客户端应用程序与sql server实例是否在同一台计算机上,两者之间的通信都会经过上述过程。

 

2.网络协议与TDS端点

  分析客户端应用程序与SQL Server 实例的通信过程,要完成两者之间的连接,需要满足如下几个条件。

  (1)在服务器和客户端安装标准通信用的网络协议

  客户端需要通过操作系统支持的网络连接才能连接到服务器上的sql server实例。因此,无论是客户端还是服务器,都需要安装并配置好操作系统的网络协议,并保证客户端和服务器端的网络连接是正常可用的。

  (2)SQL Server 网络协议

  sql server支持4中网络协议:TCP/IP 、VIA、Named Pipe 和 Shared Memory。客户端和服务端必须至少有一套对应的协议,并且这些协议的工作状态是启用的,这样才能保证客户端和服务端的TDS数据包封装和解包能够正常进行。

  (3)TDS端点

  TDS端点与sql server网络协议对应,它完成sql server与客户端之间的通信。

  在上述条件中,在服务器和客户端安装标准通信用的网络协议时操作系统配置方面的需求,它的安装及配置可以通过Windows相关工具来完成,具体的可参考操作系统的‘帮助’文档。

  其他两部分是sql server特有的配置需求:

  (3.1)sql server网络协议

  sql server网络协议是客户端连接到sql server数据库引擎的通道,必须启用网络协议才能完成连接和信息交换。sql server可同时通过多种协议处理请求(服务端同时请用多种协议);客户端必须使用服务端已经启用的网络协议处理请求(服务端同时启用多种协议);客户端必须使用服务端已经启用的网络协议中的一种与之通讯,如果客户端程序不知道sql server正在监听哪个协议,可以配置客户端按程序尝试多个协议。

                  SQL Server 网络协议

  

  在sql server网络协议的选择上,由于shared Memory不支持网络连接,因此,如果只希望本地连接,则可以禁止其他协议,只启用该协议。对于VIA协议,由于需要合VIA硬件一起使用,因此是否选择它与硬件的支持相关。剩下的Named Pipes 和 TCP/IP协议,他们均支持原创连接。

  在局域网(LAN)环境中,TCP/IP和Named Pipes在性能方面不相上下;但是,网络速度越慢(广域网或拨号上网网络上),两者的性能差异越明显,这是因为进程间通信(IPC)的机制在对等项间的通信方式不同,具体体现如下:

  【1】Named Pipes通常网络通信交互性更强。一个对等方直到另一个对等方用读取命令请求数据时才发送数据。使用Named Pipes 协议时,在开始读取数据前,网络读取一般包含一系列窥视Named Pipes的信息,这在慢速网络中可能开销非常大,炳辉导致过多的网络流量,其他的网络客户端反过来也会受到影响。

  【2】TCP/IP其数据传输的效率更高,开销更少;数据传输还可以利用TCP/IP性能增强机制的优点,例如窗口化、延迟确认等,这在慢速网络中可能非常有益。对于应用程序的不同类型,这类性能差异可能非常大。

 

总结:在局域网或广域网或拨号网络中,使用TCP/IP。当网速不是问题时,Named Pipes是更好的选择,因为其功能更强、更易于使用并具有更多的配置选项。

SQL  server网络协议配置,一般可以【开始】-》程序-》【你所安装的数据库版本】-》配置工具

    

然后进入

    

  (3.2)TDS端点

  TDS端点是sql server对象,是客户端连接到 sql server实例的入口,sql server自动为其支持的4个协议分别创建一个端点,默认情况下,启用协议后所有用户都可以访问它们。如果没有启用网络协议,则端点仍然存在,但不可以使用。执行下面的T-SQL脚本可以查询到sql server自动创建的端点。

  

select name,state_desc,is_admin_endpoint
from sys.endpoints
where type = 2
AND endpoint_id < 65536

--由于是在本地查询,结果如下

   在上述查询结果中,列is_admin_endpoint值为1的端点用于专用管理员连接(DAC);对于列is_admin_endpoint值为0的端点,可以使用类似于下面的语句来停止或者启动其工作。如果TDS端点被停止,则无法通过此端点访问数据库引起,对于TCP/IP协议之外的协议,无法为其创建用户定义的TDS端点,这就意味着一旦该网络协议对应的TDS端点停止工作,则无法使用相应的网络协议来连接到数据库引擎。

--修改端点状态
ALTER ENDPOINT [要改变状态的端点名称] STATE = STOPPED | STARTED
创建语法见联机丛书:create endpoint
create endpoint endpoint_name [authorization login] [state
= {started|stopped|disable] as tcp( listener_port = listenerport, listener_ip = ALL| IPV4| IPV6 ) for TSQL()

  其中linstener_port定义监听的端口,而listener_ip定义要侦听从哪个网络地址收到(传入)的信息。注意这个网络地址不是发送请求信息的客户端IP地址,而是接收客户端请求的服务器某个网络设备的IP地址。

  如果要修改TDS端点信息,使用alter endpoint语句,要删除则drop endpoint语句。

  连接到数据库引擎时,sql server将连接与特定端点的相关联,并确定连接登录是否手语了使用端点的权限。连接按照如下方式进行;

  【1】Shared Memory 连接使用TSQL LocalMachine端点;

  【2】Named Pipes连接使用 TSQL Named Pipes端点;

  【3】专用管理员连接(DAC)使用Dedicated Admin Connection端点;

  【4】VIA连接使用TSQL Default VIA端点;

  【5】TCP连接使用TCP端点;

  TCP端点包括sql server提供的名为TSQL Default TCP的默认端点,也包括用户使用CREATE ENDPOINT语句创建的用户定义TCP端点。当使用TCP连接时,通过连接到的IP地址和TCP端口,使用一下顺序与端点匹配;

  【1】如果IP地址和TCP端口与端点的IP地址和TCP端口完全匹配,则使用端点;

  【2】如果没有完全匹配,则对所有IP_ANY端点检查TCP端口,如果端口匹配,则使用该端点;

  【3】如果没有完全端口匹配,则使用默认TCP端点;

  如果连接有多个匹配的端点,则只会选择最优先匹配的一个端点,并检查该端点的连接权限,如果用户不具有该端点的权限,则该进程将不搜索下一个端点。

  例如,如果在sql server实例中,有一个名为'TSQL User TCP' 侦听IP地址192.168.1.1,侦听端口123的TCP端点,用户login1对此端点没有连接权限,但对默认的TSQL Default TCP有链接权限,则以login1从客户端发起请求,并通过服务器的192.168.1.1以1433端口介入sql server是历史,按照端点匹配原则,会使用'TSQL User TCP'端点进行连接,由于用户login1并不具有对此端点的连接权限,因此登录验证失败,虽然用户对默认的TSQL Default TCP端点有链接权限,但由于连接不尝试次端点,因此最终的结果是连接失败。但如果Login1发出的请求不是通过服务器192.168.1.1这个地址介入的,则连接使用默认的TSQL Dafault TCP端点,从而可以成功连接。

  对于TDS端点进行权限控制:授予(GRANT)、收回(REVOKE)或拒绝(DENY),可以限制能够使用此端点介入的用户,从而在sql server的层次上实现对连接进行控制,通过示例的配置,Log_Test只能从服务器的192.168.1.100这个地址并通过2433端点连接,下面是具体操作步骤。

  

USE master go

--drop login log_test
create login log_test
with password = N'a123456!'

create endpoint [tsql user test]
state = started
as tcp(
    listener_port = 2433,
    listener_ip = (192.168.1.100)
)
for tsql()

--会出现如下情况,如果要还原你就授权回去就OK --创建 TSQL 端点将导致撤销 'TSQL Default TCP' 端点上的所有 'Public' 连接权限。
--如果此端点上需要 'Public' 访问权限,请使用'GRANT CONNECT ON ENDPOINT::[TSQL Default TCP] to [public]'重新应用此权限。
--恢复授权
use master grant CONNECT ON ENDPOINT::[TSQL Default TCP] to [public]

--由于所有用户都属于public 角色,所以上述操作会导致登录Log_Test可能通过默认的TDS端点登录。因此,接下来的
--操作是撤销Log_Test在所有默认TDS端点上的连接权限。

deny connect on endpoint::[Dedicated Admin Connection] to Log_Test
deny connect on endpoint::[TSQL Local Machine] to Log_Test
deny connect on endpoint::[TSQL Named Pipes] to Log_Test
deny connect on endpoint::[TSQL Default TCP] to Log_Test
deny connect on endpoint::[TSQL Default VIA] to Log_Test

 

--最后,授予登录在用户定义端点上的连接权限

grant connect on endpoint :: [TSQL User test] to log_test

完成配置后,如果使用登录log_test发出的请求,不是通过192.168.1.100的2433端点传入的话,则无法访问sql server实例。

 

 

 

 

  

posted @ 2018-06-11 20:07  郭大侠1  阅读(800)  评论(0编辑  收藏  举报