Samba服务配置

1.Samba简介

1987年,微软公司和英特尔公司共同制定了SMB(Server Messages Block,服务器消息块)协议,旨在解决局域网内的文件或打印机等资源的共享问题,这也使得在多个主机之间共享文件变得越来越简单。到了1991年,当时还在读大学的Tridgwell为了解决Linux系统与Windows系统之间的文件共享问题,基于SMB协议开发出了SMBServer服务程序。这是一款开源的文件共享软件,经过简单配置就能够实现Linux系统与Windows系统之间的文件共享工作。当时,Tridgwell想把这款软件的名字SMBServer注册成为商标,但却被商标局以SMB是没有意义的字符而拒绝了申请。后来Tridgwell不断翻看词典,突然看到一个拉丁舞蹈的名字—Samba,而且这个热情洋溢的舞蹈名字中又恰好包含了“SMB”,于是Samba服务程序的名字由此诞生。Samba服务程序现在已经成为在Linux系统与Windows系统之间共享文件的最佳选择。

SMB(Samba):用于linux和windows之间的文件共享,可以实现匿名用户和本地用户之间的文件共享。

工作原理:

  • smb进程 控制发布共享目录与权限 tcp 139 445
  • nmb进程 主要用于名称解析 udp 137 138

2.软件包及配置文件

  • 软件包
samba-4.10.16-25.el7_9.x86_64 									服务端
samba-winbind-clients.x86_64 0:4.10.16-25.el7_9 客户端工具
  • 二进制命令
/usr/sbin/nmbd
/usr/sbin/smbd
  • 主配置文件
[root@backup-server ~]# cat /etc/samba/smb.conf |grep -v ^#|grep -v '^;'|grep [a-z]
[global]
    workgroup = SAMBA
    security = user
    passdb backend = tdbsam
    printing = cups
    printcap name = cups
    load printers = yes
    cups options = raw
[homes]
    comment = Home Directories
    valid users = %S, %D%w%S
    browseable = No
    read only = No
    inherit acls = Yes
[printers]
    comment = All Printers
    path = /var/tmp
    printable = Yes
    create mask = 0600
    browseable = No
[print$]
    comment = Printer Drivers
    path = /var/lib/samba/drivers
    write list = @printadmin root
    force group = @printadmin
    create mask = 0664
    directory mask = 0775

cat /etc/samba/smb.conf |grep -v ^#|grep -v '^;'|grep [a-z]

2.1 Samba服务程序中的参数以及作用

[global] #全局参数。
workgroup = MYGROUP #工作组名称
server string = Samba Server Version %v #服务器介绍信息,参数%v为显示SMB版本号
log file = /var/log/samba/log.%m #定义日志文件的存放位置与名称,参数%m为来访的主机名
max log size = 50 #定义日志文件的最大容量为50KB
security = user #安全验证的方式,总共有4种
#share:来访主机无需验证口令;比较方便,但安全性很差
#user:需验证来访主机提供的口令后才可以访问;提升了安全性
#server:使用独立的远程主机验证来访主机提供的口令(集中管理账户)
#domain:使用域控制器进行身份验证
passdb backend = tdbsam #定义用户后台的类型,共有3种
#smbpasswd:使用smbpasswd命令为系统用户设置Samba服务程序的密码
#tdbsam:创建数据库文件并使用pdbedit命令建立Samba服务程序的用户
#ldapsam:基于LDAP服务进行账户验证
load printers = yes #设置在Samba服务启动时是否共享打印机设备
cups options = raw #打印机的选项
[homes] #共享参数
comment = Home Directories #描述信息
browseable = no #指定共享信息是否在“网上邻居”中可见
writable = yes #定义是否可以执行写入操作,与“read only”相反
[printers] #打印机共享参数
comment = All Printers
path = /var/spool/samba #共享文件的实际路径(重要)。
browseable = no
guest ok = no 等于 public = no #是否所有人可见,等同于”public”参数。
writable = no 等于 read only = yes
printable = yes

3.安装SMB服务

测试默认情况下的共享文件,也就是安装完软件直接启动。不做任何配置文件的修改

  • 服务端安装
[root@backup-server ~]# yum install -y samba samba-winbind-clients samba-client
[root@backup-server ~]# systemctl start smb
[root@backup-server ~]# systemctl enable smb

客户端测试查看服务端共享了哪些文件

  • 测试连接
[root@bg-compute-1 ~]# smbclient -L 172.16.50.11
Enter SAMBA\root's password:  //此处不输密码,直接回车
Anonymous login successful

        Sharename       Type      Comment
        ---------       ----      -------
        print$          Disk      Printer Drivers
        IPC$            IPC       IPC Service (Samba 4.10.16)
Reconnecting with SMB1 for workgroup listing.
Anonymous login successful

        Server               Comment
        ---------            -------

        Workgroup            Master
        ---------            -------
  • SMB用户管理
# 创建一个本地用户
[root@backup-server ~]# useradd smb1

# 将用户添加到数据库并且设置密码  (server端设置)
[root@backup-server ~]# smbpasswd -a smb1     
New SMB password:
Retype new SMB password:
Added user smb1
# 查看smb数据库的用户(查看是否成功添加)
[root@backup-server ~]# pdbedit -L 
smb1smb1:1001:
# 删除smb1用户
[root@backup-server ~]# pdbedit -x smb1
# 查看smb数据库的用户(查看是否成功删除)
[root@backup-server ~]# pdbedit -L 
# 删除本地用户
[root@backup-server ~]# userdel -r smb1

4.配置实例一

共享本地目录/data/samba/share, 并且只允许harry用户可写,smbadmin组的成员只读

4.1 创建共享目录

[root@backup-server ~]# mkdir -p /data/samba/share
[root@backup-server ~]# echo hello world > /data/samba/share/t.txt
[root@backup-server ~]# ls /data/samba/share
[root@backup-server ~]# cat /data/samba/share/t.txt
hello world

4.2 创建用户和组方便后面测试

# 创建一个禁止登录服务器并且不创建home目录的用户
[root@backup-server ~]# useradd -M harry -s /sbin/nologin
# 创建用户组
[root@backup-server ~]# groupadd smbadmin
用户加入用户组
[root@backup-server ~]# useradd -M u1 -s /sbin/nologin -G smbadmin
[root@backup-server ~]# useradd -M u2 -s /sbin/nologin -G smbadmin

4.3 将创建的用户添加到smb服务的数据库并设置密码

# 为方便测试,密码统一设置为123456
[root@backup-server ~]# smbpasswd -a harry
New SMB password: 
Retype new SMB password:
Added user harry.
[root@backup-server ~]# smbpasswd -a u1
New SMB password:
Retype new SMB password:
Added user u1.
[root@backup-server ~]# smbpasswd -a u2
New SMB password:
Retype new SMB password:
Added user u2.
[root@backup-server ~]# pdbedit -L 
smb1:1001:
u1:1004:
harry:1003:
u2:1005:

4.4 编辑配置文件进行相应的配置并重启服务

[root@backup-server ~]# vim /etc/samba/smb.conf
[share]
        comment = samba share       # 描述
        path = /samba/share              # 共享的目录
        browseable = yes                 # 不隐藏标签
        valid users = harry,@sysadmin    # 可读用户
        write list = harry               # 可写用户
        create mask = 0774					 		 # 默认创建文件权限
        directory mask = 0774						 # 默认创建目录权限

[root@backup-server ~]# systemctl restart smb

4.5 客户端测试

  • 查看共享目录,可以查看到共享的share目录
[root@backup-server share]# smbclient -L 172.16.50.11
Enter SAMBA\root's password: 
Anonymous login successful

        Sharename       Type      Comment
        ---------       ----      -------
        print$          Disk      Printer Drivers
        share           Disk      samba share
        IPC$            IPC       IPC Service (Samba 4.10.16)
Reconnecting with SMB1 for workgroup listing.
Anonymous login successful

        Server               Comment
        ---------            -------

        Workgroup            Master
        ---------            -------
  • 测试harry用户可读可写
[root@backup-server samba]# smbclient //172.16.50.11/share -U harry
Enter SAMBA\harry's password: 
Try "help" to get a list of possible commands.
smb: \> ls
  .                                   D        0  Thu Oct 19 16:15:10 2023
  ..                                  D        0  Thu Oct 19 15:51:25 2023
  t.txt                               N       12  Thu Oct 19 15:50:59 2023
  1                                   D        0  Thu Oct 19 16:15:03 2023
  新建文件夹                     D        0  Thu Oct 19 16:15:10 2023

                31136425868 blocks of size 1024. 28290062240 blocks available
smb: \> mkdir test
NT_STATUS_ACCESS_DENIED making remote directory \test
smb: \>

测试发现harry用户能够成功访问,但是创建文件却失败了(原因分析:服务本身已经给定了harry用户写的权限,那么就应该是目录没有写的权限)
解决办法:
服务端给予harry用户读写执行的权限

[root@backup-server ~]# setfacl -m d:u:harry:rwx /data/samba/share/

客户端再次测试:

[root@backup-server samba]# smbclient //172.16.50.11/share -U harry
Enter SAMBA\harry's password: 
Try "help" to get a list of possible commands.
smb: \> ls
  .                                   D        0  Thu Oct 19 16:15:10 2023
  ..                                  D        0  Thu Oct 19 15:51:25 2023
  t.txt                               N       12  Thu Oct 19 15:50:59 2023
  1                                   D        0  Thu Oct 19 16:15:03 2023
  新建文件夹                     D        0  Thu Oct 19 16:15:10 2023

                31136425868 blocks of size 1024. 28290062240 blocks available
smb: \> mkdir test
smb: \> ls
  .                                   D        0  Thu Oct 19 16:17:48 2023
  ..                                  D        0  Thu Oct 19 15:51:25 2023
  t.txt                               N       12  Thu Oct 19 15:50:59 2023
  1                                   D        0  Thu Oct 19 16:15:03 2023
  新建文件夹                     D        0  Thu Oct 19 16:15:10 2023
  test                                D        0  Thu Oct 19 16:17:48 2023

                31136425868 blocks of size 1024. 28290062240 blocks available
  • 测试u1用户
root@backup-server samba]# smbclient //172.16.50.11/share -U u1
Enter SAMBA\u1's password: 
Try "help" to get a list of possible commands.
smb: \> ls
  .                                   D        0  Thu Oct 19 16:17:48 2023
  ..                                  D        0  Thu Oct 19 15:51:25 2023
  t.txt                               N       12  Thu Oct 19 15:50:59 2023
  1                                   D        0  Thu Oct 19 16:15:03 2023
  新建文件夹                     D        0  Thu Oct 19 16:15:10 2023
  test                                D        0  Thu Oct 19 16:17:48 2023

                31136425868 blocks of size 1024. 28290062240 blocks available
smb: \> mkdir u1
NT_STATUS_ACCESS_DENIED making remote directory \u1

测试发现u1用户能够成功访问并且能够查看,但是创建文件却失败了。(原因:配置文件中我们只是允许了harry用户能够进行写,而sysadmin组里面的成员并没有给写的权限。所以并不能创建文件)

注意:如果不加可用用户选项,那么表示当前samba数据库里面的用户都可以访问

5.配置实例二

基于用户名密码和acl的综合访问:

需求:

公司:uplooking
1、财务部门 /data/samba/upl_cw cw01财务总监有可读可写权限,财务部门员工可读,boss01对其有管理权限。
2、市场部门 /data/samba/upl_sc 市场部门员工可读可写,公司员工可以查询资料,boss02对其有管理权限。
3、HR部门 /data/samba/upl_rs rs01HR总监可读写,HR部门员工可以对财务部查询,vip用户可以查询
4、休息区 /data/samba/upl_pub 自己管理自己的文件
思路:
1、选择哪个服务做文件共享(samba)
2、需要一台Linux服务器(rhel/centos)
3、根据部门创建不同的工作目录来保存不同部门的文件
4、将目录发布出去
5、测试验证

5.1 在服务器上创建相应的工作目录

[root@backup-server ~]# mkdir /data/samba/upl_{cw,sc,rs,pub} -p

5.2 创建相应的用户和组

[root@backup-server ~]# groupadd uplooking
[root@backup-server ~]# groupadd cw
[root@backup-server ~]# groupadd rs
[root@backup-server ~]# groupadd sc
[root@backup-server ~]# useradd cw01 -g cw -G uplooking
[root@backup-server ~]# useradd cw02 -g cw -G uplooking
[root@backup-server ~]# useradd rs01 -g rs -G uplooking
[root@backup-server ~]# useradd rs02 -g rs -G uplooking
[root@backup-server ~]# useradd sc01 -g sc -G uplooking
[root@backup-server ~]# useradd sc02 -g sc -G uplooking
[root@backup-server ~]# useradd boss01 -g uplooking -G cw
[root@backup-server ~]# useradd boss02 -g uplooking -G sc
[root@backup-server ~]# useradd vip

5.3 编辑配置文件进行相应的配置并重启服务

[root@backup-server ~]# vim /etc/samba/smb.conf
[cw_share]
        comment= cw01财务总监有可读可写权限,财务部门员工可读,boss01对其有管理权限
        path = /data/samba/upl_cw
        valid users = @cw,boss01,@rs
        write list = cw01,boss01
        create mask = 0774					 		 # 默认创建文件权限
        directory mask = 0774						 # 默认创建目录权限
[sc_share]
        comment= 市场部门员工可读可写,公司员工可以查询资料,boss02对其有管理权限
        path = /data/samba/upl_sc
        valid users = @uplooking
        read only = yes
        write list = @sc,boss02
        create mask = 0774					 		 # 默认创建文件权限
        directory mask = 0774						 # 默认创建目录权限
[hr_share]
        comment = rs01HR总监可读写,HR部门员工可以对财务部查询,vip用户可以读写
        path = /data/samba/upl_rs
        valid users = @rs,vip
        write list = rs01,vip
        create mask = 0774					 		 # 默认创建文件权限
        directory mask = 0774						 # 默认创建目录权限
[pub]
        comment = 自己管理自己的文件
        path = /data/samba/upl_pub
        public = yes
        writable = yes
        hosts allow = 172.16.20.0/24
        create mask = 0774					 		 # 默认创建文件权限
        directory mask = 0774						 # 默认创建目录权限

[root@backup-server ~]# systemctl restart smb

5.4 将用户加入到samba数据库里

[root@backup-server ~]# smbpasswd -a cw01
New SMB password:
Retype new SMB password:
Added user cw01.
[root@backup-server ~]# smbpasswd -a cw02
New SMB password:
Retype new SMB password:
Added user cw02.
[root@backup-server ~]# smbpasswd -a rs01
New SMB password:
Retype new SMB password:
Added user rs01.
[root@backup-server ~]# smbpasswd -a rs02
New SMB password:
Retype new SMB password:
Added user rs02.
[root@backup-server ~]# smbpasswd -a sc01
New SMB password:
Retype new SMB password:
Added user sc01.
[root@backup-server ~]# smbpasswd -a sc02
New SMB password:
Retype new SMB password:
Added user sc02.
[root@backup-server ~]# smbpasswd -a boss01
New SMB password:
Retype new SMB password:
Added user boss01.
[root@backup-server ~]# smbpasswd -a boss02
New SMB password:
Retype new SMB password:
Added user boss02.
[root@backup-server ~]# smbpasswd -a vip
New SMB password:
Retype new SMB password:
Added user vip.
[root@backup-server ~]# pdbedit -L
smb1:1001:
u1:1004:
cw01:1006:
harry:1003:
u2:1005:
cw02:1007:
rs01:1008:
rs02:1009:
sc01:1010:
sc02:1011:
boss01:1012:
boss02:1013:
vip:1014:

5.5 相应的acl授权

[root@backup-server ~]# setfacl -m d:u:cw01:rwx /data/samba/upl_cw/
[root@backup-server ~]# setfacl -m d:u:boss01:rwx /data/samba/upl_cw/
[root@backup-server ~]# setfacl -m d:g:cw:rx /data/samba/upl_cw/
[root@backup-server ~]# setfacl -m d:g:sc:rwx /data/samba/upl_sc/
[root@backup-server ~]# setfacl -m d:g:uplooking:rx /data/samba/upl_sc/
[root@backup-server ~]# setfacl -m d:u:boss02:rwx /data/samba/upl_sc/
[root@backup-server ~]# setfacl -m d:u:rs01:rwx /data/samba/upl_rs/
[root@backup-server ~]# setfacl -m d:g:rs:rx /data/samba/upl_rs/
[root@backup-server ~]# setfacl -m d:u:vip:rwx /data/samba/upl_rs/
[root@backup-server ~]# setfacl -m d:g:uplooking:rwx /data/samba/upl_pub/

5.6 客户端测试验证:

[root@centos7-2 ~]# smbclient -L 172.16.50.11
Enter root's password: 
Anonymous login successful
Domain=[SAMBA] OS=[Windows 6.1] Server=[Samba 4.7.1]

    Sharename       Type      Comment
    ---------       ----      -------
    homes           Disk      Home Directories
    print$          Disk      Printer Drivers
    share           Disk      samba share
    cw_share        Disk      cw01财务总监有可读可写权限,财务部门员工可读,boss01对其有管理权限
    sc_share        Disk      市场部门员工可读可写,公司员工可以查询资料,boss02对其有管理权限
    hr_share        Disk      rs01HR总监可读写,HR部门员工可以对财务部查询,vip用户可以读写
    pub             Disk      自己管理自己的文件
    IPC$            IPC       IPC Service (Samba 4.7.1)
Anonymous login successful
Domain=[SAMBA] OS=[Windows 6.1] Server=[Samba 4.7.1]

    Server               Comment
    ---------            -------
    backup-server            Samba 4.7.1

    Workgroup            Master
    ---------            -------
    SAMBA                backup-server

详细测试此处就省略了。。。

6.Samba总结

  • SAMBA 可以让 Linux 与 Windows 直接进行文件系统的使用;
  • SAMBA 主要架构在 NetBIOS 上发展的,且以 NetBIOS over TCP/IP 克服NetBIOS 无法跨路由的问题;
  • Samba 使用的 daemon 主要有管理分享权限的 smbd 以及 NetBIOS 解析的nmbd
  • Samba 使用的模式主要有单机的 workgroup 方式,以及网域控管的 PDC 模式;
  • Samba 的主配置文件之档名为 smb.conf
  • smb.conf 内,主要区分为 [global] 服务器整体设定与 [share] 分享的资源两大部分
  • Samba 使用者账号控管主要的设定值为 security = {share,user,domain}等
  • Samba 客户端可使用 smbclient 以及 mount.cifs 进行网络的挂载
  • 新版的 Samba 默认使用数据库记录帐户信息,新增账号用 pdbedit ,修改密码则用 smbpasswd
  • Samba 主要支持 CUPS 的打印机服务器
  • 在权限控管方面,最容易出错的为 SELinux 的规则与类型 (SELinux type)
  • 默认情况下,服务端会将系统中的所有本地用户的家目录共享出去;并且不允许匿名用户访问
  • 本地用户都可以通过用户名和smab数据库的密码去访问当前用户的家目录
  • samba数据库里面的用户必须是当前操作系统中存在的用户

配置文件:一般放在/etc/samba/smb.conf里面,可以通过rpm -qc packagename查询;编辑完配置文件可以通过testparm来进行samba的确认。

7.常用命令

  • 将本地用户加入到smb数据库里
# smbpasswd -a stu1   // 将用户添加到数据库并且设置密码
  • 查看smb数据库的用户
# pdbedit -L    //查看smb数据库的用户 
  • 查看共享目录:客户端通过smbclient命令查看服务器共享出什么目录
smbclient -L NetBiosName -U username 
  • linux客户端访问
# smbclient //172.16.50.11/homes -U smb1    // 通过smb1用户访问homes
  • 清空windows缓存
# 有时候似乎断开并不及时
net use * /del /y 
# 重启LanmanWorkstation服务
net stop LanmanWorkstation
sc start LanmanWorkstation

.8访问权限控制

  • 控制读写访问
writable = yes/no        // 可写总开关
read only = yes/no       // 可读总开关
write list = tom,@admin  // 可读 多个用户用逗号隔开  加个@符号对组的控制
read list = tom,@admin   // 可写
  • 对象的访问控制
valid users = tom,@admin   // 指定可用用户
invalid users = tom,@admin // 指定不可用用户 
# 注意:两个参数不要同时存在
  • 网络访问控制
hosts allow = 150.203.6.0/255.255.255.0 EXCEPT 150.203.6.66      // 允许哪个网络里的访问,表示150.203.6.0这个网段除了150.203.6.66这个用户不能访问,别的都能访问
hosts allow = 150.203.15.0/255.255.255.0          
hosts allow = *.uplooking.com
hosts deny = 172.16.50.10 vm01.example.com       // 拒绝哪个网络的访问 
#如果deny和allow冲突,allow优先