概要
SMB2是一种网络文件共享协议,用于客户端和服务器之间进行文件共享和访问。本文将介绍SMB2工作原理、数据结构、关键特性等。持续更新中...
TCP/IP中的位置
在TCP/IP模型中,SMB位于应用层,依赖于传输层(TCP)和网络层(IP)来传输数据。在实际的网络通信中,SMB数据包会被封装在TCP段中,进一步封装在IP数据报中,最后转换为比特流在物理网络上传输。接收方在收到比特流后,逐层解封装,最终将SMB请求或响应交给高层的应用程序处理。
工作原理
-
Negotiate Protocol Request: 在在用户输入“\服务器名\”之后,首先要做的就是把服务器名解析为IP,可以通过DNS还是NetBIOS解析。得到IP地址后,客户端就向服务器发送第一个SMB请求:“Negotiate Protocol Request”。这个请求包含了客户端所支持的各种 SMB Dialect。
-
Negotiate Protocol Response: 服务器收到该请求后,选择一个它支持的最新版本(比如NT LM 0.12),再通过“Negotiate Protocol Response”回复给客户端
-
Session Setup Request: Negotiation 结束之后,,客户端请求和服务器建立一个session,在客户端发送的Session Setup Request里,包含了身份验证请求(如Kerberos的AP_REQ)。
-
Session Setup Response: 服务器回复Session Setup Response,包含了验证结果(如Kerberos的AP_REP)。关于认证协议Kerberos和NTLM,以后会再学习结束
-
Tree Connect Request: Session Setup通过后,客户端就成功的连上了服务器。客户端发送的Tree Connect Request来访问具体的共享,如果前面没有指定共享名(\服务器名),客户端访问的是命名管道$IPC , 如果指定了\服务器\共享名 ,那么这儿就是访问共享名的部分了。
-
Tree Connect Response:,服务器在检查过用户对该路径的权限后,回复Tree Connect Response。检查用户权限是这样进行的:服务器从Session Setup Request中已经得到用户所属的组,再通过和该路径上的ACL对比,即可得到用户权限。至此,用户就进入了共享文件夹。
-
下面就是文件或文件夹操作的相关命令,如新建,打开,重命名,删除,关闭。读写操作等。
SMB2共有如下19个命令字:
· 0x00 SMB2/NegotiateProtocol
· 0x01 SMB2/SessionSetup
· 0x02 SMB2/SessionLogoff
· 0x03 SMB2/TreeConnect
· 0x04 SMB2/TreeDisconnect
· 0x05 SMB2/Create
· 0x06 SMB2/Close
· 0x07 SMB2/Flush
· 0x08 SMB2/Read
· 0x09 SMB2/Write
· 0x0a SMB2/Lock
· 0x0b SMB2/Ioctl
· 0x0c SMB2/Cancel
· 0x0d SMB2/KeepAlive
· 0x0e SMB2/Find
· 0x0f SMB2/Notify
· 0x10 SMB2/GetInfo
· 0x11 SMB2/SetInfo
· 0x12 SMB2/Break
SMB2数据结构
smb2数据结构及关系(例)
结构含义不在此赘述。
主要特性
Multichannel、ABE、CopyTrunk、硬链接、Oplock/lease、Notify、OfflineFile、SMB签名、Encryption(加密)等
锁
SMB支持open、rl、oplock、lease四种锁
• Oplock/Lease是用于客户端缓存的锁。如果客户端在文件打开中请求了Oplock/Lease,服务端也授予了,则文件读写会先进行Windows客户端缓存。Windows会伺机将缓存数据刷回服务端。如果有另外的用户也打开了该文件,将触发Oplock/Leasebreak,则Oplock进行降级甚至失去Oplock,客户端收到break通知后会进行缓存刷盘。Lease是Oplock的改进,作用域更广,在同一客户端内LeaseKey相同不会发生break冲突,而Oplock作用域较小,同一客户端内不同进程打开文件也会相互冲突。
• open是文件级的锁。SMB协议创建文件或目录,或者打开已经存在的文件或目录的时候,会获取Open锁。加锁请求承载干SMB2 CREATE命令字中,涉及两个字段:DesiredAcccess和SharedAccess。DesiredAccess用于给自己申请权限,SharedAccess用干授予其他客户端或应用程序获取Open锁的权限。锁的信息保存在文件的归属节点上,所以Open锁的冲突检查发生在归属节点。
• brl锁(范围锁)Brl. Byte Range Locks字节范围锁,即通常所说的范围锁。用户对文件写时会申请加范围锁,防止多个用户写冲突,导致数据不一致。
通过SMB协议的命令字SMB2 LOCK实现加锁和解锁。与NLM锁类似,SMB锁类型按照是否独占分为:Shared(读)和Exclusive(写)两种锁,按照是否阻塞可以分为阻塞锁和非阻塞锁。相对于NLM锁,SMB锁不会进行锁的合并和分裂。另外,SMB加锁报文中可以一次申请多把范围锁,SMB服务器会对加锁请求依次进行处理,任何一个加锁请求失败,会终止后续的加锁请求,但是并不会导致已经成功的锁回滚。
Multichannel
• 将多个通道(Connection)绑定到一个SMB的session上;此时session与connect不是一一对应。
• 允许客户端与服务器之间同时使用多个网络连接。在多个网络连接的基础上,客户端与服务器可以进行更大数据量的传
输,增大了网络吞吐能力。
• 更好的实现客户端CPU上的负载均衡
• 允许在其中一些网络连接中断的情况下继续工作,增加了容错能力。
ABE
ABE 基于访问的枚举(AccessBasedEnumeration)
• 基于权限的目录项枚举,客户通过CIFS访问共享时,针对用户权限进行文件或目录的显示过滤,因此需要在读目录过程中对每一项文件或目录进行ACL鉴权,过滤掉用户没有权限的文件或目录,实现了基于权限的目录项显示管理,从而提高用户体验。
• 鉴权逻辑
非管理员用户来访,需要同时具有“读取数据、读取属性、读取扩展属性、读取权限”这四种特殊权限,其中一条权限被拒绝或不存在,对应文件/目录不进行显示(Owner用户默认具有读取权限的权限,并不在安全界面示);
管理员用户来访,显示所有文件/目录。该规则只用于目录项显示与否,若要打开文件/目录,需要对文件/目录本身进行ACL鉴权。
如果没有开启ABSE,客户通过IP地址或域名访问阵列时,会显示所有的CIFS共享,启用ABSE后,只显示客户端有权限访问的CIFS共享,ABE即只显示有权限访问的文件。ABE(Access based enumeration),基于权限的且录项枚举,该功能主要用于文件共享场景,开启该功能后,存储会根据用户是否具有对该文件或目录的权限进行决策是不是显示该文件或目录。
Failover
SMB2.0实现Failover原理:
• 将SMB2.0 Durable Handel将句柄在多控间持续镜像。
• 当控制器或接口卡故障时,系统进行NAS逻辑端口透明迁移。
• 当主机从新的挖制器来恢复SMB2.0业务时,该控制器会从Durable Handel的句柄备份控制器去获取句柄,从而保证业务连续性。
SMB3.0实现Failover原理:
• 将SMB3.0 Persistece Handel将句柄在多控间持续镜像。
• 当控制器或接口卡故障时,系统进行NAS逻辑端口透明迁移。
• 主机基于SMB3.0 Failover标准来恢复句柄时,将句柄备份控制器上的Persistence Handel恢复到指定控制器。
硬链接
• 硬连接主要用于多个文件名指向同一个文件。从而可以使得一份文件无需多次拷贝,通过创建硬链接给予多个用户使用,进而节省了存储空间。Windows硬链接主要可以通过windows API CreateHardLink以及UnxUtils工具来触发。
Windows通过发送SetInformation命令的子命令FileLinkInformation发起创建硬链接命令。
CopyChunk
• 传统文件拷贝流程为:客户端从服务端读取数据回客户端,然后在发起写命令向Server端目标文件进行写,导致数据来回传输
• 先打开源文件,获取一个24byte的resumekey(FSCTLSRV_REQUEST_RESUME_KEY,Server实现自己定义,IOCTL)QpenlD+fid
• 打开目的文件
• 进行Chunk拷贝(FSCTL_SRV_COPYCHUNK),在阵列侧进行
Notify
• Notify主要用于目录变化通知客户端及时刷新,主要有文件的增加、删除、创建、重命名、修改属性。当客户端访问共享文件夹时,客户端以Notify方式注册该文件夹,当文件夹中的文件发生变化时,文件系统会通知阵列。
OfflineFiles
• 客户端会在本地缓存共享文件,当客户端和服务端网络失去网络连接后,客户端可以继续访问本地文件。当网络连接回复后,客户端同步数据到服务端,从而实现离线目录访问的功能。
• 主要有不使用缓存、手动模式、自动模式几种模式。
SMB签名
• 用于校验报文是否被篡改,报文发送过程中通过签名算法计算出key,并且打包到报文中,客户端收到后用同样算法进行解密,秘匙为Session相关信息,如果计算出的key值和服务端带回来的一致则签名通过。
• aes_ccm_128用于SMB3签名计算:hamc_sha256用于SMB2签名计算;MD5用于SMB1签名计算。
Homedir
• 需要为每个用户分配一个私有空间,又不需别人访问的情况下,可以使用Homedir方案。启用主目录功能后,每个本地用户或域用户都可以访问以用户名命名的文件夹,该文件夹存放在主目录所在的文件系统中。访问home目录的方法:\IP(阵列系统域名)\用户名。
MMC
Microsoft 管理控制台(Microsoft Management Console.MMC)是包含已注册组件(称为管理单元)的一个可扩展框架,它可针对网络上的本地系统和远程系统提供全面的管理功能。