1 Samba概述

SMB (Server Messages Block,信息服务块)是一种在局域网上共享文件和打印机的一种通信协议,它为局域网内的不同操作系统的计算机之间提供文件及打印机等资源的共享服务。SMB协议是客户机/服务器型协议,客户机通过该协议可以访问服务器上的共享文件系统、打印机及其他资源。Samba 默认是工作局域网中的,广域网的需要进行某些配置和许可。如图:
image.png

早期的打印机需要与主机通过物理层线缆的方式进行连接才能进行打印操作,当网络中的主机过多时,这种方式过于笨重和不可靠。这就需要打印机可以共享到局域网中。这就需要Samba 协议。 打印机需要支持Samba 协议,在运行Samba的服务器的Linux系统中进行连接,就相当于运行Samba服务器的Linux系统是一个中转站或者是代理的方式,将打印请求转交给Samba 打印机进行处理。 FTP 是局域网和广域网的文件共享技术,而Samba 是局域网的文件共享技术。

1.1 为什么要讲 Samba ?

ftp 的优缺点:

  • 优点:文件传输、应用层协议、可跨平台
  • 缺点:只能实现文件传输,无法实现文件系统挂载;无法直接修改服务器端文件。

Samba 的特性:

  • 使用smb / cifs协议、可跨平台、可实现文件系统挂载、可实现服务器端修改文件。

    1.2 smb 协议和 cifs 之间的关系

    随着Internet的流行,Microsoft 希望将这个协议扩展到Internet上去,成为Internet上计算机之间相互共享数据的一种标准。因此它将原有的几乎没有多少技术文档的SMB协议进行整理,重新命名为CIFS(Common Internet File System),它使程序可以访问远程 Internet 计算机上的文件并要求此计算机提供服务。客户程序请求远在服务器上的服务器程序为它提供服务。服务器获得请求并返回响应。CIFS是公共的或开放的SMB协议版本,并由Microsoft使用。SMB 协议在局域网上用于服务器文件访问和打印的协议。

    简单来说,先有SMB协议,然后Microsoft 在重新编排整理推出的 CIFS 网络文件系统协议。 Samba 服务使用的协议是 SMB 协议。

2 Samba 服务详解

2.1 Samba 软件相关信息

  1. 协议:SMB / CIFS
  2. 服务:
    1. smb 实现资源共享、权限验证 TCP 139 445
  3. 配置文件(/etc/samba)
    1. smb.conf 主配置文件
    2. smbusers 别名配置文件

      2.3 登录验证模式(安全级别)

  • share 匿名验证(不需要用户名)
  • user本地用户验证〈Samba服务器默认的安全级别,用户在访问共享资源之前必须提供用户名和密码进行验证)。本地用户的模式使用场景会多些,也是Samba的默认模式。

拓展: tdbsam:该方式是使用一个数据库文件来验证。数据库文件叫passdb.tdb(默认路径为 /etc/samba/passdb.tdb)。可以通过 pdbedit -a向数据库中添加新用户,不过要建立的Samba用户必须先是系统用户。也可以理解为我们使用 pdbedit -a 将系统用户转化为了samba 用户。pdbedit命令的参数很多,列出几个主要的。
pdbedit -a username:新建Samba账户(将系统用户转化为samba用户,并设置密码)
pdbedit -x username:删除Samba账户
pdbedit -L:列出Samba用户列表,读取passdb.tdb数据库文件。

在FTP中本地用户是直接借助系统的/etc/passwd和/etc/shadow文件的用户名和密码 在Samba中本地用户是借助系统的/etc/passwd的用户名,而密码则需要使用Samba的数据库文件passdb.tdb。简而言之,Samba是使用Linux系统的账户+Samba passdb.tdb的密码组合。

范例:

  1. #实验操作系统为CentOS6
  2. ~ yum install -y samba
  3. ~ service smb start
  4. ~ chkconfig smb on && chkconfig smb --list
  5. #本地用户验证
  6. ~ useradd -s /sbin/nologin zhangsan
  7. ~ pdbedit -a zhangsan
  8. new password: 123456
  9. retype new password: 123456

image.png
在Windows 凭证中输入用户名:zhangsan,密码:123456即可
image.png
默认登录到zhangsan用户家目录,可以在该目录下添加和删除文件
image.png

  • 别名用户访问(虚拟用户)。其使用场景主要是为了更加安全和保护管理系统。

    2.3.1 Windows 开启Samba服务

    在控制面板 - 程序 - 程序和功能 - 启用或关闭 Windows 功能 - 重启服务即可
    image.png

    2.3.2 Windows 挂载SMB文件系统

    image.png
    image.png
    在此电脑中可以查看到 zhangsan 网络磁盘挂载。在目录中进行添加 / 删除 / 修改文件即可。
    image.png
    image.png
    可以在Windows中直接修改 Linux服务器的内容,非常的方便管理。

    2.4 常见配置参数解释

    vim /etc/samba/smb.conf

[global] 用于定义Samba服务器的总体特性,其配置项对所有共享资源生效
workgroup = WORKGROUP
#设定Samba Server所要加入的工作组或者域。
server string = Samba Server Version %v
#设定Samba Server 的注释,可以是任何字符串,也可以不填。宏%v表示显示Samba的版本号
interfaces = lo eth0 192.168.12.2/24
#设置Samba Server监听哪些网卡,可以写网卡名,也可以写该网卡的IP地址。
hosts allow =127. 192.168.1. 192.168.10.1
#表示允许连接到Samba Server的客户端,多个参数以空格隔开。可以用一个IP表示,也可以用一个网段表示。hosts deny 与hosts allow 刚好相反(二选一)。

例如: hosts allow=172.17.2. EXCEPT 172.17.2.50 表示容许来自172.17.2..的主机连接,但排除172.17.2.50 hosts allow=172.17.2.0/255.255.0.0 表示容许来自172.17.2.0/255.255.0.0子网中的所有主机连接

log file = /var/log/samba/log.%m
#设置Samba Server日志文件的存储位置以及日志文件名称。在文件名后加个宏%m(主机名),表示对每台访问Samba Server的机器都单独记录一个日志文件。
max log size = 50
#设置Samba Server日志文件的最大容量,单位为kB,0代表不限制
security = user
#设置用户访问Samba Server的验证方式。
passdb backend = tdbsam
load printers = yes/no
#设置是否在启动Samba时就共享打印机


[homes] 用于设置用户宿主目录的共享属性(特殊共享)
[homes] #共享名(特殊共享,泛指每个用户对应的家目录)
comment = Home Directories #共享描述
browseable = no #共享是否可被查看
writable = yes #共享是否可写(Samba配置文件+文件系统的可写权限)
; valid users = %S #允许访问该共享的用户

例如: valid users = bob,@bob(多个用户或者组中间用逗号隔开,如果要加入一个组就用“@组名”表示。) [ zhangsan ] #URL家目录 comment = Zhangsan Home Directories browseable = no #共享是否可见,该选项一般是不开放的 writable = yes #共享目录是否添加修改文件 ;valid user = guest, @guest


[printers] 用于设置打印机共享资源的属性(特殊共享,共享打印设备,现在基本不用)
[printers] #共享名
comment = All Printers #共享描述
path = /var/spool/samba #共享路径
browseable = no #共享是否可被查看
guest ok = no #是否可以匿名访问,类似于public
writable = no #是否可写
printable = yes #是否可以打印


[自定义]自定义共享区域
[自定义] #共享名
comment = the share is xbz #共享描述
path = /share/zdy #共享路径
public = yes #是否可以匿名访问,类似于guest ok
browseable = yes #共享是否可被查看
writable = yes #是否可写(同时设置目录的W)
配置文件检查工具:
testparm :若显示”Loaded services file OK.”信息表示配置文件的语法是正确的
-v:显示samba所支持的所有选项

  1. testparm
  2. testparm -v

image.png

2.5 访问控制

写入权限的控制方式(类似于vsftp的限制方式:配置文件+文件系统写权限 ,组合):

  • 配置文件开启,文件系统严格控制(尽量采用这种方法,推荐)。

writable = yes
setfacl 或 chmod 777

  • 文件系统开启,配置文件严格控制

chmod 777/dir
read only = yes
write list =用户 , @组

2.6 服务启动管理

  • 启动、停止、重新启动和重新加载Samba服务。

service smb start | stop | restart | reload

  • 开机自动启动Samba服务。

chkconfig —level 2345 smb
chkconfig smb on|off
chkconfig smb —list

2.7 客户端登录方式

Linux 端:
smbclient -U 用户名-L //服务器IP #查看服务器共享
smbclient -U 用户名 //服务器IP/共享名 #登录服务器共享
Windows 端:
\服务器IP\共享名
net use * / del #清空登录缓存
范例:

  1. #SMB服务器
  2. hostname smb-server
  3. sed -i '/^HOSTNAME=/cHOSTNAME=smb-server.kubesphere.com' /etc/sysconfig/network
  4. yum install -y samba
  5. service smb start
  6. chkconfig smb on ; chkconfig smb --list
  7. ss -antlp | grep smbd
  8. for user in {zhangsan,lisi};do useradd -c "SMB User" -s /sbin/nologin $user;done
  9. pdbedit -a zhangsan && pdbedit -a lisi
  10. new password: 123456
  11. retype new password: 123456
  12. #非交互添加SMB用户(可选择)
  13. ~ vim expect-pdbedit
  14. #!/usr/bin/expect
  15. set user [lindex $argv 0]
  16. spawn pdbedit -a $user
  17. expect {
  18. "password" { send "123456\n";exp_continue }
  19. }
  20. expect eof
  21. ~ chmod +x expect-pdbedit
  22. ~ ./expect-pdbedit zhangsan && ./expect-pdbedit lisi
  23. #SMB客户端
  24. hostname smb-client
  25. sed -i '/^HOSTNAME=/cHOSTNAME=smb-client.kubesphere.com' /etc/sysconfig/network
  26. yum install -y samba-client #默认Linux发行版已经安装
  27. #查看服务器共享
  28. smbclient -U zhangsan -L //10.0.0.40
  29. smbclient -U lisi -L //10.0.0.40
  30. #登录服务器共享
  31. smbclient -U lisi //10.0.0.40/lisi
  32. Enter lisi's' password: 123456
  33. #列出共享目录的文件列表
  34. smb: \> ls
  35. #上传本地文件
  36. smb: \> put install.log
  37. #下载SMB共享目录的文件
  38. smb: \> get personal_reset_centos6.sh

image.png

  • Windows SMB服务如何使用以及挂载操作参考2.3.1以及2.3.2

范例:浏览器登录SMB
image.png

3 Samba 部署与实验

注意:先关闭服务器和客户端上的防火墙和SELinux
部署流程:

  1. 服务器端安装samba

    yum -y install samba

  2. 确认客户端和相关命令软件包是否安装(默认是安装的)

    rpm -q samba-client rpm -q samba-common

  3. 创建共享区域

备份主配置文件
创建独立的共享区间(仿照模板编写)

  1. 启动smb服务并查看默认共享区域。

a、service smb start
b、smbclient -U 用户名 -L smbserverIP

3.1 本地验证(登录,上传,下载)

  1. 修改配置文件(添加自定义共享)

    [自定义] comment = the share is xbz path = /share/zdy public = yes browseable = yes writable = yes

  1. vim /etc/samba/smb.conf
  2. #添加以下内容
  3. [kubesphere]
  4. comment = kubesphere share dir
  5. path = /kubesphere
  6. public = yes
  7. writable = yes
  8. browseable = yes
  9. ; write list = +staff
  1. 创建共享目录并给相应权限

    mkdir /share/zdy chmod 777 /share/zdy #最好使用ACL权限

  1. mkdir /kubesphere
  2. setfacl -m u:zhangsan:rwx /kubesphere
  3. 或者
  4. chmod o+w /kubesphere
  5. #使用ACL权限后,若SMB用户没有该目录的写权限,则会报错
  6. ~ smbclient -U lisi //10.0.0.40/kubesphere
  7. Enter lisi's password:
  8. session setup failed: NT_STATUS_LOGON_FAILURE
  1. 测试配置文件并重启服务(后续步骤在该步骤已经完成实验) ```bash testparm service smb restart

kubesphere共享目录由于设置了browseable = yes所有人可见,SMB用户均可以看到

browseable = no是生产环境中的参数

SMB服务器可以查看到其SMB用户上传的文件

~ ls -lh /kubesphere/ total 56K -rwxr—r—. 1 zhangsan zhangsan 50K Jun 28 15:41 install.log -rwxr—r—. 1 lisi lisi 1.8K Jun 28 15:43 personal_reset_centos6.sh

SMB用户因为chmod o+w 权限以及SMB配置文件中的writable = yes权限,导致可以对其他SMB用户的文件进行删除修改操作

  1. ![image.png](https://cdn.nlark.com/yuque/0/2022/png/2555283/1656402434872-9decea57-a052-41b9-b7d2-c142dfc7859b.png#clientId=u6f204587-9696-4&crop=0&crop=0&crop=1&crop=1&from=paste&height=355&id=u730980b2&margin=%5Bobject%20Object%5D&name=image.png&originHeight=355&originWidth=913&originalType=binary&ratio=1&rotation=0&showTitle=false&size=26593&status=done&style=none&taskId=ud34b2375-9a98-4be6-9125-c1bbe6b1c15&title=&width=913)<br />![image.png](https://cdn.nlark.com/yuque/0/2022/png/2555283/1656402596668-ffccfc0d-c07e-4b59-9c36-07128039234e.png#clientId=u6f204587-9696-4&crop=0&crop=0&crop=1&crop=1&from=paste&height=243&id=u71a269fc&margin=%5Bobject%20Object%5D&name=image.png&originHeight=243&originWidth=908&originalType=binary&ratio=1&rotation=0&showTitle=false&size=26371&status=done&style=none&taskId=u17100e00-60a4-4f79-b03c-dd378ae794b&title=&width=908)
  2. 4. 创建Linux用户
  3. ```bash
  4. for user in {zhangsan,lisi};do useradd -c "SMB User" -s /sbin/nologin $user;done
  5. #不需要创建系统密码
  6. for user in {zhangsan,lisi};do echo "123456" | passwd --stdin $user;done
  1. 转换为Samba用户

    pdbedit -a zhangsan
    pdbedit -a lisi
    
  2. 客户端查看共享文件夹并登录测试 ```bash

    查看SMB服务器的共享

    smbclient -U -L

    登录SMB服务器

    smbclient -U ///<共享名>

例如:

smbclient -U zhangsan -L //10.0.0.40 smbclient -U zhangsan //10.0.0.40/kubesphere

注意:由于未设置上传文件的默认权限,指定用户上传的文件智能自己能修改和覆盖
<a name="rgN1D"></a>
## 3.2 访问控制 - 通过配置限制
valid users仅允许部分用户访问共享区域<br />注:前提条件是指定目录权限给到最大,通过修改配置文件来实现实验结果
<a name="N9knU"></a>
### 3.2.1 部分用户登录samba服务器
修改 /etc/samba/smb.conf 中自定义的共享区域

- 添加:设置合法用户列表
- valid users =用户,@组(多个逗号分隔)

范例:部分用户登录samba服务器
```bash
~ vim /etc/samba/smb.conf
[kubesphere]
comment = kubesphere share dir
path = /kubesphere
public = yes
writable = yes
browseable = yes
valid users = zhangsan
;       write list = +staff

~ service smb restart

#SMB客户端登录
#zhangsan SMB用户登录成功
~ smbclient -U zhangsan //10.0.0.40/kubesphere
Enter zhangsan's' password:
Domain=[MYGROUP] OS=[Unix] Server=[Samba 3.6.23-51.el6]
smb: \> ls
  .                                   D        0  Tue Jun 28 15:55:58 2022
  ..                                 DR        0  Tue Jun 28 15:38:11 2022

                49150 blocks of size 2097152. 44882 blocks available
#lisi SMB用户登录失败
~ smbclient -U lisi //10.0.0.40/kubesphere
Enter lisi's password:
Domain=[MYGROUP] OS=[Unix] Server=[Samba 3.6.23-51.el6]
tree connect failed: NT_STATUS_ACCESS_DENIED

3.2.2 部分用户对共享区域有写权限

修改 /etc/samba/smb.conf 中自定义的共享区域

  • 添加:开启只读,设置可写列表
  • read only = yes
  • write list = lisi

范例:部分用户对共享区域有写权限

#SMB服务器配置
~ vim /etc/samba/smb.conf
[kubesphere]
comment = kubesphere share dir
path = /kubesphere
public = yes
writable = yes
browseable = yes
read only = yes
write list = lisi
;            valid users = zhangsan

~ service smb restart

#SMB客户端登录
~ smbclient -U zhangsan //10.0.0.40/kubesphere
smb: \> put install.log
NT_STATUS_ACCESS_DENIED opening remote file \install.log
#写入操作报错

~ smbclient -U lisi //10.0.0.40/kubesphere
smb: \> put install.log
putting file install.log as \install.log (7110.4 kb/s) (average 7110.5 kb/s)
smb: \> ls
  .                                   D        0  Tue Jun 28 16:08:13 2022
  ..                                 DR        0  Tue Jun 28 15:38:11 2022
  install.log                         A    50968  Tue Jun 28 16:08:13 2022

                49150 blocks of size 2097152. 44882 blocks available

image.png

3.2.3 设置上传文件的默认权限

create mask #文件的默认权限。
directory mask #目录的默认权限
修改配置文件自定义的共享区域

  • 添加:
  • create mask = 666
  • directory mask = 777

    mask:默认权限,例如:设置mask = 644即就是权限值,文件的权限就是644 umask:掩码,缺省值,例如:设置umask = 022即掩码,需要使用666-022=644,得到的文件权限就是644。

范例:设置上传文件的默认权限

#默认上传文件具有执行权限
~ ls -l /kubesphere/
total 52
-rwxr--r--. 1 lisi lisi 50968 Jun 28 16:08 install.log
#SMB服务器设置默认权限
~ vim /etc/samba/smb.conf 
[kubesphere]
comment = kubesphere share dir
path = /kubesphere
public = yes
writable = yes
browseable = yes
read only = yes
write list = lisi
create mask = 644
;       valid users = zhangsan

~ service smb restart 

#SMB客户端登录
~ smbclient -U lisi //10.0.0.40/kubesphere
Enter lisi's'password: 123456
Domain=[MYGROUP] OS=[Unix] Server=[Samba 3.6.23-51.el6]
smb: \> put personal_reset_centos6.sh 
putting file personal_reset_centos6.sh as \personal_reset_centos6.sh (255.6 kb/s) (average 255.6 kb/s)
#SMB服务器端验证权限效果
~ ls -l /kubesphere/
total 56
-rwxr--r--. 1 lisi lisi 50968 Jun 28 16:08 install.log 
#没有设置默认权限create mask = 644参数
-rw-r--r--. 1 lisi lisi  1832 Jun 28 16:25 personal_reset_centos6.sh 
#设置默认权限create mask = 644参数

3.3 用户别名和映射网络驱动器

3.3.1 用户别名(虚拟用户)

1)添加别名(/etc/samba/smbusers)
添加:

  • zhangsan = zs

2)启用别名(修改主配置文件)

  • vim /etc/samba/smb.conf

添加:

  • username map = /etc/samba/smbusers

3)测试

  • smbclient -U 别名 //服务器ip/共享名

范例:用户别名(虚拟用户)

#SMB服务器端配置
~ vim /etc/samba/smbusers 
# Unix_name = SMB_name1 SMB_name2 ...
root = administrator admin
nobody = guest pcguest smbguest
#添加以下内容
zhangsan = zs
lisi = ls

~ vim /etc/samba/smb.conf
[global]
#全局配置下添加用户别名路径
username map = /etc/samba/smbusers 

#重启SMB服务即可
~ service smb restart

#SMB客户端使用用户别名登录
~ smbclient -U zs -L //10.0.0.40
~ smbclient -U zs //10.0.0.40/kubesphere
Enter zs's' password: 
Domain=[MYGROUP] OS=[Unix] Server=[Samba 3.6.23-51.el6]
smb: \> ls
  .                                   D        0  Tue Jun 28 16:25:19 2022
  ..                                 DR        0  Tue Jun 28 15:38:11 2022
  install.log                         A    50968  Tue Jun 28 16:08:13 2022
  personal_reset_centos6.sh                 1832  Tue Jun 28 16:25:19 2022

                49150 blocks of size 2097152. 44882 blocks available
#SMB客户端使用未注册的别名登录将会失败
~ smbclient -U li //10.0.0.40/kubesphere
Enter li's password: 
session setup failed: NT_STATUS_LOGON_FAILURE

3.3.2 映射网络驱动器(挂载)

  1. Linux 下:
  • 临时挂载:

mount -t cifs -o username=xxx, password=xxx //服务器ip/服务器共享 /本地挂载目录

  • 永久挂载:/etc/fstab

//服务器ip/服务器共享/本地挂载目录 cifs defaults, username=xxx,password=xxx 0 0。

  1. Windows 下:

我的电脑、计算机、此电脑、这台电脑等右键映射网络驱动器【注意是反斜杠\ 】
范例:Linux 映射网络驱动器(挂载)

#SMB客户端临时挂载
~ mkdir /mnt/smb
~ mount -t cifs -o username=lisi,password=123456 //10.0.0.40/kubesphere /mnt/smb/
~ ls -lh /mnt/smb/
total 56K
-rwxr--r--. 1 502 502  50K Jun 28 16:08 install.log
-rw-r--r--. 1 502 502 1.8K Jun 28 16:25 personal_reset_centos6.sh

#SMB客户端永久挂载
~ vim /etc/fstab
//10.0.0.40/kubesphere  /mnt/smb                cifs    defaults,username=lisi,password=123456 0 0
~ mount -a 
~ mount | grep 10.0.0.40
//10.0.0.40/kubesphere on /mnt/smb type cifs (rw)
~ df -Th

~ echo "hello smbFS" >> /mnt/smb/smb.txt
~ ls -lh /mnt/smb/
total 60K
-rwxr--r--. 1 502 502  50K Jun 28 16:08 install.log
-rw-r--r--. 1 502 502 1.8K Jun 28 16:25 personal_reset_centos6.sh
-rw-r--r--. 1 502 502   12 Jun 28  2022 smb.txt
#SMB客户端的操作以及服务器端的操作均会实时同步

image.png
范例:Windows 映射网络驱动器(挂载)
image.png
image.png
在此电脑中可以查看到 zhangsan 网络磁盘挂载。在目录中进行添加 / 删除 / 修改文件即可。
image.png

3.4 Web 管理工具 - swat

  1. 安装(导入安装包)
  • 使用yum -y install * 安装所有上传的rpm包。
  1. 修改/etc/xinetd.d/swat

添加:

  • only_from = 登录来源IP [10.0.0.40SMB服务器]
  • disable = no

3.重启 xinetd 服务

  • service xinetd restart
  • chkconfig xinetd on && chkconfig xinetd —list
  1. 测试

浏览器:IP: 901 #登录时注意端口号。

#CentOS6安装swat
#了解即可,swat属于samba的Web管理工具
~ yum install -y libsmbclient samba-common samba-winbind-clients samba samba-swat xinetd samba-client samba-winbind

~ netstat -atunlp | grep 901

image.png