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 簽名支援

計劃在未來實現。

如何執行

  1. 下載 ksmbd-tools(https://github.com/cifsd-team/ksmbd-tools/releases) 並編譯它們。

  2. 建立 /usr/local/etc/ksmbd/ksmbd.conf 檔案,在 ksmbd.conf 檔案中新增 SMB 共享。

    • 請參閱 ksmbd-utils 中的 ksmbd.conf.example,請參閱 ksmbd.conf 手冊頁瞭解配置共享的詳細資訊。

      $ man ksmbd.conf

  3. 為 SMB 共享建立使用者/密碼。

    • 請參閱 ksmbd.adduser 手冊頁。

      $ man ksmbd.adduser $ sudo ksmbd.adduser -a <輸入用於 SMB 共享訪問的使用者名稱>

  4. 在構建核心後插入 ksmbd.ko 模組。如果 ksmbd 已構建到核心中,則無需載入該模組。

    • 在 menuconfig 中設定 ksmbd(例如 $ make menuconfig)
      [*] 網路檔案系統 --->

      <M> SMB3 伺服器支援 (EXPERIMENTAL)

      $ sudo modprobe ksmbd.ko

  5. 啟動 ksmbd 使用者空間守護程序

    $ sudo ksmbd.mountd

  6. 使用 SMB3 客戶端(cifs.ko 或 samba 的 smbclient)從 Windows 或 Linux 訪問共享

關閉 KSMBD

  1. 殺死使用者和核心空間守護程序

    # sudo ksmbd.control -s

如何開啟除錯列印

每一層 /sys/class/ksmbd-control/debug

  1. 啟用所有元件列印

    # sudo ksmbd.control -d “all”

  2. 啟用元件之一 (smb, auth, vfs, oplock, ipc, conn, rdma)

    # sudo ksmbd.control -d “smb”

  3. 顯示啟用了哪些列印。
    # cat /sys/class/ksmbd-control/debug

    [smb] auth vfs oplock ipc conn [rdma]

  4. 停用列印

    如果您再次嘗試選擇的元件,它將被停用,而沒有括號。