| .. SPDX-License-Identifier: GPL-2.0 |
| |
| ========================== |
| KSMBD - SMB3 Kernel Server |
| ========================== |
| |
| KSMBD is a linux kernel server which implements SMB3 protocol in kernel space |
| for sharing files over network. |
| |
| KSMBD architecture |
| ================== |
| |
| The subset of performance related operations belong in kernelspace and |
| the other subset which belong to operations which are not really related with |
| performance in userspace. So, DCE/RPC management that has historically resulted |
| into number of buffer overflow issues and dangerous security bugs and user |
| account management are implemented in user space as ksmbd.mountd. |
| File operations that are related with performance (open/read/write/close etc.) |
| in kernel space (ksmbd). This also allows for easier integration with VFS |
| interface for all file operations. |
| |
| ksmbd (kernel daemon) |
| --------------------- |
| |
| When the server daemon is started, It starts up a forker thread |
| (ksmbd/interface name) at initialization time and open a dedicated port 445 |
| for listening to SMB requests. Whenever new clients make request, Forker |
| thread will accept the client connection and fork a new thread for dedicated |
| communication channel between the client and the server. It allows for parallel |
| processing of SMB requests(commands) from clients as well as allowing for new |
| clients to make new connections. Each instance is named ksmbd/1~n(port number) |
| to indicate connected clients. Depending on the SMB request types, each new |
| thread can decide to pass through the commands to the user space (ksmbd.mountd), |
| currently DCE/RPC commands are identified to be handled through the user space. |
| To further utilize the linux kernel, it has been chosen to process the commands |
| as workitems and to be executed in the handlers of the ksmbd-io kworker threads. |
| It allows for multiplexing of the handlers as the kernel take care of initiating |
| extra worker threads if the load is increased and vice versa, if the load is |
| decreased it destroys the extra worker threads. So, after connection is |
| established with client. Dedicated ksmbd/1..n(port number) takes complete |
| ownership of receiving/parsing of SMB commands. Each received command is worked |
| in parallel i.e., There can be multiple clients commands which are worked in |
| parallel. After receiving each command a separated kernel workitem is prepared |
| for each command which is further queued to be handled by ksmbd-io kworkers. |
| So, each SMB workitem is queued to the kworkers. This allows the benefit of load |
| sharing to be managed optimally by the default kernel and optimizing client |
| performance by handling client commands in parallel. |
| |
| ksmbd.mountd (user space daemon) |
| -------------------------------- |
| |
| ksmbd.mountd is userspace process to, transfer user account and password that |
| are registered using ksmbd.adduser (part of utils for user space). Further it |
| allows sharing information parameters that parsed from smb.conf to ksmbd in |
| kernel. For the execution part it has a daemon which is continuously running |
| and connected to the kernel interface using netlink socket, it waits for the |
| requests (dcerpc and share/user info). It handles RPC calls (at a minimum few |
| dozen) that are most important for file server from NetShareEnum and |
| NetServerGetInfo. Complete DCE/RPC response is prepared from the user space |
| and passed over to the associated kernel thread for the client. |
| |
| |
| KSMBD Feature Status |
| ==================== |
| |
| ============================== ================================================= |
| Feature name Status |
| ============================== ================================================= |
| Dialects Supported. SMB2.1 SMB3.0, SMB3.1.1 dialects |
| (intentionally excludes security vulnerable SMB1 |
| dialect). |
| Auto Negotiation Supported. |
| Compound Request Supported. |
| Oplock Cache Mechanism Supported. |
| SMB2 leases(v1 lease) Supported. |
| Directory leases(v2 lease) Planned for future. |
| Multi-credits Supported. |
| NTLM/NTLMv2 Supported. |
| HMAC-SHA256 Signing Supported. |
| Secure negotiate Supported. |
| Signing Update Supported. |
| Pre-authentication integrity Supported. |
| SMB3 encryption(CCM, GCM) Supported. (CCM and GCM128 supported, GCM256 in |
| progress) |
| SMB direct(RDMA) Supported. |
| SMB3 Multi-channel Partially Supported. Planned to implement |
| replay/retry mechanisms for future. |
| Receive Side Scaling mode Supported. |
| SMB3.1.1 POSIX extension Supported. |
| ACLs Partially Supported. only DACLs available, SACLs |
| (auditing) is planned for the future. For |
| ownership (SIDs) ksmbd generates random subauth |
| values(then store it to disk) and use uid/gid |
| get from inode as RID for local domain SID. |
| The current acl implementation is limited to |
| standalone server, not a domain member. |
| Integration with Samba tools is being worked on |
| to allow future support for running as a domain |
| member. |
| Kerberos Supported. |
| Durable handle v1,v2 Planned for future. |
| Persistent handle Planned for future. |
| SMB2 notify Planned for future. |
| Sparse file support Supported. |
| DCE/RPC support Partially Supported. a few calls(NetShareEnumAll, |
| NetServerGetInfo, SAMR, LSARPC) that are needed |
| for file server handled via netlink interface |
| from ksmbd.mountd. Additional integration with |
| Samba tools and libraries via upcall is being |
| investigated to allow support for additional |
| DCE/RPC management calls (and future support |
| for Witness protocol e.g.) |
| ksmbd/nfsd interoperability Planned for future. The features that ksmbd |
| support are Leases, Notify, ACLs and Share modes. |
| ============================== ================================================= |
| |
| |
| How to run |
| ========== |
| |
| 1. Download ksmbd-tools(https://github.com/cifsd-team/ksmbd-tools/releases) and |
| compile them. |
| |
| - Refer README(https://github.com/cifsd-team/ksmbd-tools/blob/master/README.md) |
| to know how to use ksmbd.mountd/adduser/addshare/control utils |
| |
| $ ./autogen.sh |
| $ ./configure --with-rundir=/run |
| $ make && sudo make install |
| |
| 2. Create /usr/local/etc/ksmbd/ksmbd.conf file, add SMB share in ksmbd.conf file. |
| |
| - Refer ksmbd.conf.example in ksmbd-utils, See ksmbd.conf manpage |
| for details to configure shares. |
| |
| $ man ksmbd.conf |
| |
| 3. Create user/password for SMB share. |
| |
| - See ksmbd.adduser manpage. |
| |
| $ man ksmbd.adduser |
| $ sudo ksmbd.adduser -a <Enter USERNAME for SMB share access> |
| |
| 4. Insert ksmbd.ko module after build your kernel. No need to load module |
| if ksmbd is built into the kernel. |
| |
| - Set ksmbd in menuconfig(e.g. $ make menuconfig) |
| [*] Network File Systems ---> |
| <M> SMB3 server support (EXPERIMENTAL) |
| |
| $ sudo modprobe ksmbd.ko |
| |
| 5. Start ksmbd user space daemon |
| |
| $ sudo ksmbd.mountd |
| |
| 6. Access share from Windows or Linux using SMB3 client (cifs.ko or smbclient of samba) |
| |
| Shutdown KSMBD |
| ============== |
| |
| 1. kill user and kernel space daemon |
| # sudo ksmbd.control -s |
| |
| How to turn debug print on |
| ========================== |
| |
| Each layer |
| /sys/class/ksmbd-control/debug |
| |
| 1. Enable all component prints |
| # sudo ksmbd.control -d "all" |
| |
| 2. Enable one of components (smb, auth, vfs, oplock, ipc, conn, rdma) |
| # sudo ksmbd.control -d "smb" |
| |
| 3. Show what prints are enabled. |
| # cat /sys/class/ksmbd-control/debug |
| [smb] auth vfs oplock ipc conn [rdma] |
| |
| 4. Disable prints: |
| If you try the selected component once more, It is disabled without brackets. |