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]
- 停用列印
如果您再次嘗試選擇的元件,它將被停用,而沒有括號。