KSMBD - SMB3 内核服务器¶
KSMBD 是一个 Linux 内核服务器,它在内核空间中实现 SMB3 协议,用于通过网络共享文件。
KSMBD 架构¶
与性能相关的操作子集属于内核空间,而其他与性能不相关的操作属于用户空间。因此,历史上导致许多缓冲区溢出问题和危险安全漏洞的 DCE/RPC 管理以及用户帐户管理在用户空间中实现为 ksmbd.mountd。与内核空间 (ksmbd) 中性能相关的文件操作(打开/读取/写入/关闭等)。这也允许更轻松地与 VFS 接口集成以进行所有文件操作。
ksmbd (内核守护进程)¶
当服务器守护进程启动时,它会在初始化时启动一个 forker 线程(ksmbd/interface 名称),并打开一个专用端口 445 以侦听 SMB 请求。每当有新客户端发出请求时,Forker 线程将接受客户端连接并 fork 一个新线程,用于客户端和服务器之间的专用通信通道。它允许并行处理来自客户端的 SMB 请求(命令),并允许新客户端建立新连接。每个实例都命名为 ksmbd/1~n(端口号)以指示已连接的客户端。根据 SMB 请求类型,每个新线程可以决定将命令传递到用户空间 (ksmbd.mountd),目前 DCE/RPC 命令被识别为通过用户空间处理。为了进一步利用 Linux 内核,选择将命令作为工作项处理,并在 ksmbd-io kworker 线程的处理程序中执行。当负载增加时,它允许处理程序的多路复用,因为内核会负责启动额外的 worker 线程,反之,如果负载减少,它会销毁额外的 worker 线程。因此,在与客户端建立连接后。专用的 ksmbd/1..n(端口号)完全拥有接收/解析 SMB 命令的所有权。每个接收到的命令都是并行工作的,即,可以并行工作多个客户端命令。接收到每个命令后,为每个命令准备一个单独的内核工作项,然后将其排队以供 ksmbd-io kworkers 处理。因此,每个 SMB 工作项都被排队到 kworkers。这允许默认内核最佳地管理负载共享的优势,并通过并行处理客户端命令来优化客户端性能。
ksmbd.mountd (用户空间守护进程)¶
ksmbd.mountd 是一个用户空间进程,用于传输使用 ksmbd.adduser(用户空间 utils 的一部分)注册的用户帐户和密码。此外,它还允许将从 smb.conf 解析的共享信息参数传递给内核中的 ksmbd。对于执行部分,它有一个守护进程持续运行,并使用 netlink 套接字连接到内核接口,它等待请求(dcerpc 和共享/用户信息)。它处理 RPC 调用(至少几十个),这些调用对于来自 NetShareEnum 和 NetServerGetInfo 的文件服务器最重要。完整的 DCE/RPC 响应从用户空间准备好,并传递给客户端的关联内核线程。
KSMBD 功能状态¶
功能名称 |
状态 |
---|---|
协议 |
已支持。SMB2.1 SMB3.0, SMB3.1.1 协议(有意排除具有安全漏洞的 SMB1 协议)。 |
自动协商 |
已支持。 |
复合请求 |
已支持。 |
Oplock 缓存机制 |
已支持。 |
SMB2 租约(v1 租约) |
已支持。 |
目录租约(v2 租约) |
已支持。 |
多重信用 |
已支持。 |
NTLM/NTLMv2 |
已支持。 |
HMAC-SHA256 签名 |
已支持。 |
安全协商 |
已支持。 |
签名更新 |
已支持。 |
预身份验证完整性 |
已支持。 |
SMB3 加密(CCM, GCM) |
已支持。(支持 CCM/GCM128 和 CCM/GCM256) |
SMB direct(RDMA) |
已支持。 |
SMB3 多通道 |
部分支持。计划在未来实现重播/重试机制。 |
接收端缩放模式 |
已支持。 |
SMB3.1.1 POSIX 扩展 |
已支持。 |
ACL |
部分支持。仅提供 DACL,SACLs(审计)计划在未来实现。对于所有权 (SID),ksmbd 生成随机 subauth 值(然后将其存储到磁盘),并使用从 inode 获取的 uid/gid 作为本地域 SID 的 RID。当前的 acl 实现仅限于独立服务器,而不是域成员。正在与 Samba 工具集成,以允许未来支持作为域成员运行。 |
Kerberos |
已支持。 |
持久句柄 v1,v2 |
计划在未来实现。 |
持久句柄 |
计划在未来实现。 |
SMB2 通知 |
计划在未来实现。 |
稀疏文件支持 |
已支持。 |
DCE/RPC 支持 |
部分支持。通过来自 ksmbd.mountd 的 netlink 接口处理文件服务器所需的一些调用(NetShareEnumAll、NetServerGetInfo、SAMR、LSARPC)。正在研究通过 upcall 与 Samba 工具和库进行额外的集成,以允许支持额外的 DCE/RPC 管理调用(以及未来对 Witness 协议的支持等)。 |
ksmbd/nfsd 互操作性 |
计划在未来实现。ksmbd 支持的功能是租约、通知、ACL 和共享模式。 |
SMB3.1.1 压缩 |
计划在未来实现。 |
SMB3.1.1 over QUIC |
计划在未来实现。 |
RDMA 上的签名/加密 |
计划在未来实现。 |
SMB3.1.1 GMAC 签名支持 |
计划在未来实现。 |
如何运行¶
下载 ksmbd-tools(https://github.com/cifsd-team/ksmbd-tools/releases) 并编译它们。
请参阅 README(https://github.com/cifsd-team/ksmbd-tools/blob/master/README.md) 以了解如何使用 ksmbd.mountd/adduser/addshare/control utils
$ ./autogen.sh $ ./configure --with-rundir=/run $ make && sudo make install
创建 /usr/local/etc/ksmbd/ksmbd.conf 文件,在 ksmbd.conf 文件中添加 SMB 共享。
请参阅 ksmbd-utils 中的 ksmbd.conf.example,请参阅 ksmbd.conf 手册页了解配置共享的详细信息。
$ man ksmbd.conf
为 SMB 共享创建用户/密码。
请参阅 ksmbd.adduser 手册页。
$ man ksmbd.adduser $ sudo ksmbd.adduser -a <输入用于 SMB 共享访问的用户名>
在构建内核后插入 ksmbd.ko 模块。如果 ksmbd 已构建到内核中,则无需加载该模块。
- 在 menuconfig 中设置 ksmbd(例如 $ make menuconfig)
- [*] 网络文件系统 --->
<M> SMB3 服务器支持 (EXPERIMENTAL)
$ sudo modprobe ksmbd.ko
启动 ksmbd 用户空间守护进程
$ sudo ksmbd.mountd
使用 SMB3 客户端(cifs.ko 或 samba 的 smbclient)从 Windows 或 Linux 访问共享
关闭 KSMBD¶
- 杀死用户和内核空间守护进程
# sudo ksmbd.control -s
如何打开调试打印¶
每一层 /sys/class/ksmbd-control/debug
- 启用所有组件打印
# sudo ksmbd.control -d “all”
- 启用组件之一 (smb, auth, vfs, oplock, ipc, conn, rdma)
# sudo ksmbd.control -d “smb”
- 显示启用了哪些打印。
- # cat /sys/class/ksmbd-control/debug
[smb] auth vfs oplock ipc conn [rdma]
- 禁用打印
如果您再次尝试选择的组件,它将被禁用,而没有括号。