SMB 服务器
SMB(Server Message Block)是一个网络文件共享协议;其核心功能是允许客户端访问其他计算机服务器上的文件、目录、打印机、串行端口等资源;
Microsoft Windows Server内置的文件和打印机共享就是 SMB 服务器(通常指 LanmanServer 服务);
SMB 通信包含以下步骤:
- 协议协商:现代 Windows 系统默认优先使用直接托管在 TCP 上的方式,客户端直接在 TCP 端口445上连接服务器;连接建立后,客户端发送一个 Negotiate Protocol 请求,列出支持的 SMB 协议版本和方言;务器从客户端支持的列表中选择它支持的最高版本,并通过 Negotiate Protocol Response 告知客户端;
- 会话建立:客户端发送 Session Setup 请求,其中包含用户的身份验证信息;如果成功,服务器会建立用户的安全上下文并创建一个会话ID并返回给客户端。这个会话ID用于标识后续该用户的所有请求;
- 树连接:客户端发送 Tree Connect 请求,该请求指定要访问的服务器上的共享名;服务器验证用户对该共享的访问权限,如果授权成功,服务器创建一个树ID并返回给客户端;
Linux系统要使用smb服务,首先服务器必须预先配置SMB用户;
SMB用户的核心功能是身份验证和权限控制;客户端登录SMB服务器后,在服务器上进行的所有的操作都会以该SMB用户的身份进行;
安装smb软件包并准备用户:
[root@server ~]# yum install -y samba samba-client | tail -n 1
Complete!
[root@server ~]# useradd -s /sbin/nologin -u 2000 op1
[root@server ~]# smbpasswd -a op1
New SMB password:
Retype new SMB password:
Added user op1.
# 查看用户清单
[root@server ~]# pdbedit -L
op1:2000:
useradd命令用于创建用户,smbpasswd命令用于为已创建的用户设置密码;
语法:useradd [选项] [用户名]
smbpasswd [选项] [用户名]
| useradd选项 | 作用 |
|---|---|
| -m, --create-home | 创建用户主目录 |
| -c, --comment | 添加注释 |
| -s, --shell | 指定用户登录后使用的 shell |
| -g, --gid | 指定用户的主要组 |
| -G, --groups | 指定用户的附加组 |
| -d, --home-dir | 指定用户主目录的路径 |
| -e, --expiredate | 设置账户的过期日期,格式为 YYYY-MM-DD |
| -D | 显示或更改默认的创建值 |
| smbpasswd选项 | 作用 |
|---|---|
| -a | 添加用户 |
| -x | 删除用户 |
| -d | 禁用用户 |
| -e | 启用用户 |
| -L | 以本地模式运行 |
| -n | 不设密码 |
| -r | 指定要操作的远程机器 |
| (无选项) | 修改指定用户的 SMB 密码 |
使用smbstatus命令可以查看SMB用户的使用情况,包括客户端IP;
[root@server ~]# smbstatus
Samba version 4.10.16
PID Username Group Machine Protocol Version Encryption Signing
----------------------------------------------------------------------------------------------------------------------------------------
1609 dev2 dev2 10.1.8.12 (ipv4:10.1.8.12:39766) SMB3_02 - partial(AES-128-CMAC)
1609 op1 op1 10.1.8.12 (ipv4:10.1.8.12:39766) SMB3_02 - partial(AES-128-CMAC)
Service pid Machine Connected at Encryption Signing
---------------------------------------------------------------------------------------------
devcode 1609 10.1.8.12 Mon Dec 1 09:50:39 AM 2025 CST - -
IPC$ 1609 10.1.8.12 Mon Dec 1 10:45:17 AM 2025 CST - -
devcode 1609 10.1.8.12 Mon Dec 1 10:45:17 AM 2025 CST - -
IPC$ 1609 10.1.8.12 Mon Dec 1 09:50:39 AM 2025 CST - -
No locked files
客户端想要成功访问 SMB 服务器,需要满足三个条件;分别为:SMB配置文件正确、Linux文件系统权限正确、SELinux安全上下文正确;
- SMB配置文件:Samba的配置文件是
/etc/samba/smb.conf;
Samba配置文件主要分为两大块:全局设置和 共享定义;
[global] 部分即全局设置;对整个Samba服务器生效,定义了服务器的基本行为、网络属性和安全策略;
- workgroup:设置服务器所属的工作组或域,通常与Windows网络环境一致;
- server string:服务器的描述信息;
- passdb backend:指定用户密码的后端存储方式;
- log file:指定Samba日志文件的路径;
- interfaces:绑定Samba服务到特定的网络接口;
- hosts allow:设置允许访问的主机;
[自定义名称] 部分即共享定义;每个以 [] 开头的部分都定义了一个共享资源,其名称就是客户端访问时看到的共享名;
- comment:描述信息;客户端查看共享列表时,会显示描述信息;
- path:提供共享的物理目录路径;即服务器上提供服务的文件路径;
- valid users:允许访问此共享的用户或用户组;
- write list:在共享中拥有写入权限的用户或用户组;可以超越 read only 设置;
- read only:设置共享是否为只读;
- browseable:设置共享是否在网络邻居中可见;
- guest ok:是否允许匿名访问;
- create mask:控制客户端创建新文件时的权限;
- directory mask:控制客户端创建新目录时的权限;
# 定义一个名为devcode的共享,客户端访问方式为 \\[服务器IP]\devcode
[devcode]
comment = webapp
valid users = op1,@dev
path = /samba_shares
write list = @dev
- 文件系统权限:SMB 用户对共享目录有相应的 rwx 权限才能对文件进行操作,SMB使用服务器用户登录就是为了方便管理权限;
一般涉及到用户的组权限,目录和文件权限,还有配置的mask属性;
[root@server ~]# ls -ld /samba_shares
drwxrwsr-x 2 root developers 24 Dec 1 10:09 /samba_shares
[root@server ~]# ll /samba_shares
total 4
-rwxrwxr-x 1 root developers 5 Dec 1 10:12 index.html
- 安全上下文:默认情况下,SELinux 会阻止 Samba 服务进程访问非标准目录;安全上下文是 SELinux 为 Samba 的共享文件定义的安全类型;
可以使用seinfo -t 命令列出所有可设置的安全类型;
samba_share_t是 SELinux专门为Samba共享目录建立的类型;设置后,Samba 进程会获得此目录的读写权限;
需使用semanage和restorecon命令设置SELinux允许Samba服务;
该命令立即生效,在重启后依然有效;
[root@server ~]# semanage fcontext -a -t samba_share_t '/samba_shares(/.*)?'
[root@server ~]# restorecon -Rv /samba_shares
启动smb服务并开启防火墙:
[root@server ~]# systemctl enable smb --now
Created symlink from /etc/systemd/system/multi-user.target.wants/smb.service to /usr/lib/systemd/system/smb.service.
[root@server ~]# firewall-cmd --permanent --add-service=samba
success
[root@server ~]# firewall-cmd --reload
success
全部配置完毕后客户端就可以访问SMB服务器了;
客户端挂载
Windows和Linux系统都可以挂载共享目录;
Windows可通过文件资源管理器或终端挂载:
# 命令行挂载
net use Z: \\[服务器IP]\[共享名] /user:[用户名] * /persistent:yes
# PowerShell
New-SmbMapping -LocalPath Z: -RemotePath \\[服务器IP]\[共享名] -UserName [用户名] -Password "[密码]" -Persistent $true
Linux可以使用smbclient 命令查看服务器提供的共享;
[root@client ~]# smbclient -L //10.1.8.10 -U op1
Enter SAMBA\operator1's password: `redhat`
Sharename Type Comment
--------- ---- -------
print$ Disk Printer Drivers
devcode Disk
IPC$ IPC IPC Service (Samba 4.10.16)
op1 Disk Home Directories
Reconnecting with SMB1 for workgroup listing.
Server Comment
--------- -------
Workgroup Master
--------- -------
之后使用mount命令进行挂载;
[root@client ~]# mkdir -p /mnt/devcode
[root@client ~]# mount -t cifs //[服务器IP]/[共享名] /mnt/devcode
多用户挂载
多用户挂载(Multiuser Mounts)是 Linux CIFS/SMB 客户端的一项高级功能,它允许多个系统用户通过同一个挂载点访问共享资源时使用不同的身份凭证;
用户凭证是客户端用于向SMB服务器证明其身份的用户名和密码组合;
多用户挂载解决的不是一个服务器权限问题,而是一个客户端身份映射问题;当客户端使用用户1挂载了共享,那么在服务器看来,所有来自那个挂载点的请求都来自于用户1,多用户挂载即往挂载点添加用户,使多个用户可以共有一个挂载点;
- 注意1:多用户挂载实际上会造成并发冲突、权限混淆、额外的配置和服务等问题;在大多数场景下,单用户模式是首选方案;
- 注意2:使用多用户挂载的决定权在客户端,客户端可以选择不使用;服务器只需进行配置;
服务器确保共享配置允许用户独立访问:
[SecureShare]
path = /srv/multiuser
valid users = @smbusers
force user = %U # 强制使用连接用户身份 非常重要!
force group = %G
create mask = 0660
directory mask = 2770
客户端在挂载时启用多用户挂载:
[root@client ~]# mount -t cifs //10.1.8.10/multishare /mnt/multiuser \
-o multiuser,sec=krb5,uid=0,noperm
- -o multiuser:启用多用户模式
- sec=krb5:使用Kerberos认证(或ntlmssp)
- uid=0:挂载点所有者设为root
- noperm:禁用客户端权限检查
需要使用cifscreds 命令实现多用户挂载;当使用多用户挂载模式时,该命令将用户的 SMB 用户名和密码安全地存储在系统的密钥环中;
语法:cifscreds add -u [用户名] [服务器地址或IP]
[root@client ~]# cifscreds add -u newuser1 10.1.8.10
[root@client ~]# cifscreds add -u newuser2 10.1.8.10
两个用户通过同一个挂载点访问时,各自使用独立的身份和权限;
4069

被折叠的 条评论
为什么被折叠?



