一、介绍

  简单的来讲 Samba 是一个基于 SMB协议(Server Messages Block,一种局域网文件共享传输协议)的文件共享服务,它可以实现 Linux 系统与 Windows 系统之间的文件共享,当然也可以用于 Linux 系统之间的文件共享,但是 Linux 系统之间的文件共享首选肯定是NFS。
  Samba 有两个主要的进程 smbd 和 nmbd。smbd 进程提供了文件和打印机共享,而 nmbd 则提供了 NetBIOS 名称服务和浏览支持,帮助 SMB 客户定位服务器,处理所有基于 UDP 的协议,使主机能浏览 Linux服务器。smbd 进程使用的是 TCP 端口139 和 445,nmbd 进程使用的是 UDP 端口138和139。

二、安装

[root@server ~]# yum install -y samba samba-client

  samba-client:这个组件则提供了当 Linux 做为 Samba Client 端时,所需要的工具指令。这个组件不安装也可以无影响,它可以实现远程连接Samba 共享文件资源,实现和 FTP 客户端样的操作。

三、主配置文件详解

  Samba服务的主配置文件为 /etc/samba/smb.conf,其可以分为两部分,一个是全局设置参数,一个是文件共享设置参数。配置文件详解参考了这篇文章:https://blog.csdn.net/weixin_40806910/article/details/81917077,写的非常详细建议阅读学习学习。

[global]    # 全局配置参数
    workgroup = MYGROUP         # 工作组名称                                         
    server string = Samba Server Version %v     # samba服务器的介绍信息,%v为显示SMB的版本号                     

    # 设置Samba服务的NetBIOS名称。如果不填,则默认会使用该服务器的DNS名称的第一部分。注意netbios name和workgroup名字不要设置成一样了。
    netbios name = smbserver

    # 设置Samba服务监听哪些网卡,可以写网卡名,也可以写该网卡的IP地址。  
    interfaces = lo eth0 192.168.12.2/24 192.168.13.2/24

    # 表示允许连接到Samba服务器的客户端,多个参数以空格隔开。可以用一个IP表示,也可以用一个网段表示。
    hosts allow = 192.168.10. 192.168.20.1
    # 还有多种方式,例如:
    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子网中的所有主机连接
    hosts allow=M1,M2
        # 表示容许来自M1和M2两台计算机连接
    hosts allow=@pega
        # 表示容许来自pega网域的所有计算机连接

    max connections = 0    # 用来指定连接Samba服务的最大连接数目。如果超出连接数目,则新的连接请求将被拒绝。0表示不限制。
    deadtime = 0           # 用来设置断掉一个没有打开任何文件的连接的时间。单位是分钟,0代表Samba Server不自动切断任何连接。
    log file = /var/log/samba/log.%m    # 定义日志文件的存放位置与名称,参数%m为来访主机名                 
    max log size = 50      # 定义日志文件的最大容量

    security = user                 
    # 定义用户访问samba的安全验证方式,共四种
       1.share:来访主机无需验证用户名和密码,安全性低。
       2.user:需要验证来访主机的用户名和密码。
       3.server:
         - 使用独立的远程主机来验证来访主机的用户名和密码,是一种代理验证。
         - 其实就是用远程服务器集中管理全部用户和口令,如果认证失败,Samba将使用user模式作为替代的方式。
       4.domain:使用域控制器进行身份验证。

    passdb backend = tdbsam
    # 定义用户后台的类型,共三种
       1.smbpasswd:使用smbpasswd命令为系统用户设置Samba服务的密码。
       2.tdbsam:
         - 使用一个数据库文件来创建用户数据库,数据库文件名为passdb.tdb,位于/var/lib/samba/private/passdb.tdb。
         - 可使用smbpasswd或pdbedit这两个命令来为系统用户设置Samba服务的密码 。
       3.ldapsam:基于LDAP服务进行身份验证。

    load printers = yes     # 设置在Samba服务启动时是否共享打印机

[共享名]
    comment =  描述       # 对该共享的描述,可以是任意字符串。

    path = 共享目录路径
    # 用来指定共享目录的路径。可以用%u、%m这样的宏来代替路径里的unix用户和客户机的Netbios名。
    # 用宏表示主要用于 [homes] 共享域。例如:如果我们不打算用home段做为客户的共享,而是在/home/share/下为每个Linux用户以他的用户名建个目录,作为他的共享目录,这样path就可以写成:path = /home/share/%u; 。
    # 用户在连接到这共享时具体的路径会被他的用户名代替,要注意这个用户名路径一定要存在,否则,客户机在访问时会找不到网络路径。
    # 同样,如果我们不是以用户来划分目录,而是以客户机来划分目录,为网络上每台可以访问samba的机器都各自建个以它的netbios名的路径,作为不同机器的共享资源,就可以 这样写:path = /home/share/%m 。

    browseable = yes/no             # 用来指定该共享是否可以浏览。
    writable = yes/no               # 用来指定该共享路径是否可写。
    write list = 允许写入该共享的用户 # 指定可以在该共享下写入文件的用户。
    read list = 用户                  # 指定只能读取该共享资源的用户和组。
    available = yes/no              # 用来指定该共享资源是否可用。

    admin users = 该共享的管理者       
    # 指定该共享的管理员(对该共享具有完全控制权限)。
    # 在samba 3.0中,如果用户验证方式设置成“security=share”时,此项无效。
    # 多个用户中间用逗号隔开,如果要加入一个组就用“@组名”表示。

    valid users = 允许访问该共享的用户        # 用来指定允许访问该共享资源的用户。多个用户或者组中间用逗号隔开,如果要加入一个组就用“@组名”表示。
    invalid users = 禁止访问该共享的用户  # 用来指定不允许访问该共享资源的用户。多个用户中间用逗号隔开,如果要加入一个组就用“@组名”表示。
    public = yes/no                     # 用来指定该共享是否允许guest账户访问。
    guest ok = yes/no                   # 意义同“public”。

# 特殊的几个共享
[homes]     # 用户家目录的共享参数
    comment = Home Directories      #描述信息
    browseable = no                         
    writable = yes
[printers]  # 打印机共享参数
    comment = All Printers
    path = /var/spool/samba
    browseable = no
    guest ok = no
    writable = no
    printable = yes     # 指明打印机是否可打印

  注:Samba 安装好后,可以使用 testparm 命令可以测试 smb.conf 配置是否正确。使用 testparm –v 命令可以详细的列出 smb.conf 支持的配置参数。

四、示例演示

  示例演示先为 Linux 系统之间的文件共享,然后再用 Windows 去访问共享资源
  我们先配置一个简单的共享资源。创建一个名为 test 的共享资源,该资源可浏览、可写入、不允许匿名用户访问。

[root@server ~]# vim /etc/samba/smb.conf
[global]
        workgroup = MYGROUP
        server string = Samba Server Version %v
        log file = /var/log/samba/log.%m
        max log size = 50
        security = user
        passdb backend = tdbsam
        load printers = yes
        cups options = raw 
[test]
        comment = a simple shared file
        path = /test
        browseable = yes
        writable = yes
        public = no

  Samba 服务默认的安全验证方式是 user, 因此要建立用户数据库,使用 pdbedit 命令为系统用户设置 Samba 服务的密码 ,第一次将账户信息写入数据库时需要使用 -a 参数,同时 Samba 服务的数据库要求写入的账户必须已经在系统存在。
  当然还有要注意一下共享目录的本身权限,即使在 samba 配置文件中开放了写入权限,但是本身权限不到位,后面 Client 端操作是会提示没有权限。

[root@server ~]# useradd user1
[root@server ~]# pdbedit -a user1
[root@server ~]# pdbedit -L         # 列出账户列表
user1:1001:

  创建共享目录,考虑到防火墙和 SELinux 的影响,需要对 Samba 服务放行,同时对共享目录设置一下 SELinux 安全上下文,让目录和里面的文件能被 Samba 服务访问到。

[root@server ~]# firewall-cmd --permanent --add-service=samba
success
[root@server ~]# firewall-cmd --permanent --add-service=mountd
success

# 注:mountd 进程是一个远程过程调用(RPC),其作用是对客户端要求安装(mount)文件系统的申请作出响应。

[root@server ~]# firewall-cmd --reload 
success
[root@server ~]# mkdir /test
[root@server ~]# chmod o+w /test
[root@server ~]# semanage fcontext -a -t samba_share_t /test    # 设置SELinux安全上下文
[root@server ~]# restorecon -Rv  /test      # 使SELinux安全上下文立即生效

[root@server ~]# ls -Zd /test               # 查看目录SELinux安全上下文
drwxr-xr-x. root root unconfined_u:object_r:samba_share_t:s0 /test
[root@server ~]# systemctl restart smb nmb
[root@server ~]# systemctl enable smb nmb

我们用 Client 端来测试一下,使用 smbclient 命令的 -L 参数显示服务器端所共享出来的所有资源。

[root@client ~]# yum install -y samba-client
[root@client ~]# smbclient -L //172.25.0.11 -U user1
Enter user1's password: 
Domain=[MYGROUP] OS=[Unix] Server=[Samba 4.1.1]

    Sharename       Type      Comment
    ---------       ----      -------
    test            Disk      a simple shared file
    IPC$            IPC       IPC Service (Samba Server Version 4.1.1)
Domain=[MYGROUP] OS=[Unix] Server=[Samba 4.1.1]

    Server               Comment
    ---------            -------
    SERVER               Samba Server Version 4.1.1

    Workgroup            Master
    ---------            -------
    MYGROUP              SERVER

当然我们也可以像使用 FTP 客户端一样使用 smbclient,同时还可以使用 -c 参数指定一次性连接使用命令。

[root@client ~]# smbclient //172.25.0.11/test -U user1
Enter user1's password: 
Domain=[MYGROUP] OS=[Unix] Server=[Samba 4.1.1]
smb: \> mkdir 0
smb: \> ls
  .                                   D        0  Fri May 24 20:07:47 2019
  ..                                  D        0  Fri May 24 19:44:11 2019
  1                                   D        0  Thu May 23 21:47:26 2019
  2                                   D        0  Thu May 23 22:09:50 2019
  0                                   D        0  Fri May 24 20:07:47 2019

        40913 blocks of size 262144. 28533 blocks available
smb: \> 
[root@client ~]# smbclient -c "ls" //172.25.0.11/test -U user1
Enter user1's password: 
Domain=[MYGROUP] OS=[Unix] Server=[Samba 4.1.1]
  .                                   D        0  Fri May 24 20:07:47 2019
  ..                                  D        0  Fri May 24 19:44:11 2019
  1                                   D        0  Thu May 23 21:47:26 2019
  2                                   D        0  Thu May 23 22:09:50 2019
  0                                   D        0  Fri May 24 20:07:47 2019

        40913 blocks of size 262144. 28533 blocks available

使用mount命令挂载共享资源

[root@client ~]# mkdir /test
[root@client ~]# mount -t cifs //172.25.0.11/test /test -o username=user1,password=123456
[root@client ~]# df -h
Filesystem          Size  Used Avail Use% Mounted on
/dev/vda1            10G  3.1G  7.0G  31% /
devtmpfs            906M     0  906M   0% /dev
tmpfs               921M   84K  921M   1% /dev/shm
tmpfs               921M   17M  904M   2% /run
tmpfs               921M     0  921M   0% /sys/fs/cgroup
//172.25.0.11/test   10G  3.1G  7.0G  31% /test

  注:CIFS(Common Internet File System) 文件系统也称通用 Internet 文件系统,它使程序可以访问远程 Internet 计算机上的文件并要求此计算机的服务。
  使用 Windows 访问共享资源,只需在 Windows 的“运行”命令框中输入两个反斜杠,然后再加服务器的IP地址即可,即://172.25.0.11/。然后输入用户名密码,就可以访问到了。

五、Multiuser 机制

  介绍一下 Samba 服务的 Multiuser(multi这个英文单词本身意思就是多个)挂载技术:客户端的管理员只需做一次挂载的操作,那么客户端的用户在访问挂载点时,若需要不同的权限,可以临时切换为新的共享用户(无需重新挂载)。挂载参数需要添加 “multiuser,sec=ntlmssp”,客户机上的普通用户可以通过 cifscreds 命令提交新的身份凭据。
  我们用一个示例来了解一下 Samba 服务的 Multiuser 机制,首先我们新建一个共享资源名字就叫做 multiuser,该资源可浏览、用户 user1 只有只读权限、用户user可写、可读,同时匿名用户也就是 guest 不可访问。

[root@server ~]# vim /etc/samba/smb.conf
[global]
        workgroup = MYGROUP
        server string = Samba Server Version %v
        log file = /var/log/samba/log.%m
        max log size = 50
        security = user
        passdb backend = tdbsam
        load printers = yes
        cups options = raw
[test]
        comment = a simple shared file
        path = /test
        browseable = yes
        writable = yes
        public = no
[multiuser] 
        comment = Multiuser mount experiment
        path = /multiuser
        browseable = yes
        writable = no 
        write list = user2
        public = no 
[root@server ~]# pdbedit -a user2
[root@server ~]# mkdir /multiuser
[root@server ~]# semanage fcontext -a -t samba_share_t /multiuser
[root@server ~]# restorecon -Rv /multiuser
restorecon reset /multiuser context unconfined_u:object_r:default_t:s0->unconfined_u:object_r:samba_share_t:s0
[root@server ~]# chmod o+w /multiuser
[root@server ~]# systemctl restart smb nmb

Client端测试

[root@client ~]# smbclient -L //172.25.0.11 -U user1
Enter user1's password: 
Domain=[MYGROUP] OS=[Unix] Server=[Samba 4.1.1]

    Sharename       Type      Comment
    ---------       ----      -------
    test            Disk      a simple shared file
    multiuser       Disk      Multiuser mount experiment
    IPC$            IPC       IPC Service (Samba Server Version 4.1.1)
Domain=[MYGROUP] OS=[Unix] Server=[Samba 4.1.1]

    Server               Comment
    ---------            -------
    SERVER               Samba Server Version 4.1.1

    Workgroup            Master
    ---------            -------
    MYGROUP
[root@client ~]# vim /etc/fstab            
#
# /etc/fstab
# Created by anaconda on Wed May  7 01:22:57 2014
#
# Accessible filesystems, by reference, are maintained under '/dev/disk'
# See man pages fstab(5), findfs(8), mount(8) and/or blkid(8) for more info
#
UUID=9bf6b9f7-92ad-441b-848e-0257cbb883d1 /                       xfs     defaults        1 1
//172.25.0.11/test /test cifs defaults,username=user1,password=123456 1 1
//172.25.0.11/multiuser /multiuser cifs defaults,username=user1,password=123456,multiuser,sec=ntlmssp,_netdev 1 1
[root@client ~]# mkdir /multiuser
[root@client ~]# mount -a
[root@client multiuser]# df -h
Filesystem               Size  Used Avail Use% Mounted on
/dev/vda1                 10G  3.1G  7.0G  31% /
devtmpfs                 906M     0  906M   0% /dev
tmpfs                    921M   84K  921M   1% /dev/shm
tmpfs                    921M   17M  904M   2% /run
tmpfs                    921M     0  921M   0% /sys/fs/cgroup
//172.25.0.11/test        10G  3.1G  7.0G  31% /test
//172.25.0.11/multiuser   10G  3.1G  7.0G  31% /multiuser

在 server 端的 multiuser目录中创建一个名为 1 的文件和一个名为 test 的目录,用来测试。

[root@server ~]# cd /multiuser/
[root@server multiuser]# vim 1
[root@server multiuser]# mkdir test

  切回 client 端测试,发现只可以读,不可以写。因为我们在挂载时用的是 user1 的身份挂载的,但是 user1 只有只读权限,所以操作才会被拒绝。

[root@client multiuser]# cat 1
this a test
[root@client multiuser]# vim 1
this a test
awawdawdaw
~
~
~ 
"1"
"1" E212: Can't open file for writing
Press ENTER or type command to continue
[root@client multiuser]# mkdir 5
mkdir: cannot create directory ‘5’: Permission denied

  如果我们想要不取消挂载,就获取 user2 用户的写入权限,就要用到 cifscreds 命令去提交新的身份凭证,我们来试一下。

[root@client multiuser]# cifscreds -u user2 add 172.25.0.11
Password: 
[root@client multiuser]# mkdir 5
mkdir: cannot create directory ‘5’: Permission denied

  但此时我们已经用 cifscreds 命令提交了身份凭证为什么权限还不足呢?经过我查找资料也没发现具体原因(可能我水平不够),可能是安全原因,因为 cifscreds 向当前会话的内核密钥环提供其用户名和密码(好吧有点牵强,还是附上红帽官网对于cifscreds的介绍)。

  The root user mounts the share using the multiuser option and an account that has minimal access to the contents of the share. Regular users can then provide their user name and password to the current session’s kernel keyring using the cifscreds utility. If the user accesses the content of the mounted share, the kernel uses the credentials from the kernel keyring instead of the one initially used to mount the share.

  经过我的实验,cifscreds 不适用于 root 用户(也不能说不适用,只是再在 root 用户下使用 cifscreds 命令把指定用户的用户名和密码加入内核密钥环会不生效),而适用与非 root 用户。废话不多说看实验,实践是检验真理的唯一标准还是很有道理的,还是要多做实验当然理论也不能丢。

[root@client multiuser]# useradd 1
[root@client multiuser]# su - 1
[1@client ~]$ cd /multiuser
[1@client multiuser]$ ll
ls: reading directory .: Permission denied
total 0
[1@client multiuser]$ cifscreds -u user2 add 172.25.0.11
Password: 
[1@client multiuser]$ cd /multiuser
[1@client multiuser]$ ll
total 1024
-rw-r--r--. 1 root root 12 May 24 21:39 1
drwxr-xr-x. 2 root root  0 May 24 21:41 test
[1@client multiuser]$ mkdir 66
[1@client multiuser]$ ll
total 1024
-rw-r--r--. 1 root root 12 May 24 21:39 1
drwxr-xr-x. 2 1003 1003  0 May 24 22:59 66
drwxr-xr-x. 2 root root  0 May 24 21:41 test
[1@client multiuser]$ 

发表评论

验证码: 23 + = 31