安装 Samba 共享

现在我们已经准备好了samba共享和客户端,应该只有我们IP地址为192.168.0.100的客户端可以挂载,我们来测试一下。
客户端系统还需要安装 cifs-utils 包才能挂载 SMB/CIFS 挂载点。

[jack@onitroad ~]# mount //192.168.0.200/onitroad /mnt -o username=onitroad
Password for jack@onitroad//192.168.0.200/onitroad:  

现在它已经挂载了,我们可以检查并确认它是否列在 df 的输出中。

[jack@onitroad ~]# df -h
Filesystem                Size  Used Avail Use% Mounted on
/dev/sda3                  18G  4.5G   14G  25% /
/dev/sda1                 297M  144M  154M  49% /boot
//192.168.0.200/onitroad   18G  3.7G   15G  21% /mnt

如上图我们可以看到//192.168.0.200/onitroad已经成功挂载到/mnt目录。
如果我们想在系统启动时自动挂载它,我们可以修改 /etc/fstab 文件,如下所示。

//192.168.0.200/onitroad /mnt cifs username=onitroad,password=password 0 0

一旦将其添加到 /etc/fstab 文件中,我们就可以运行“mount -a”来尝试挂载它。
请注意,默认情况下 /etc/fstab 文件的文件权限允许任何用户读取该文件,因此我们可能不想将用户密码直接存储在该文件中。

我们可以使用凭据参数指向磁盘上包含这些凭据的文件,而不是在 /etc/fstab 中指定用户名和密码,如下所示。

//192.168.0.200/onitroad /mnt cifs credentials=/root/credentials 0 0

虽然此文件仍以明文形式存储凭据并且不费力地对其进行加密,但我们可以将权限设置为 600,以便只有 root 用户可以读取该文件,拒绝任何其他用户访问。

[jack@onitroad ~]# chmod 600 /root/credentials
[jack@onitroad ~]# ls -la /root/credentials
-rw-------. 1 root root 37 Jan 22 16:12 /root/credentials
[jack@onitroad ~]# cat credentials
username=onitroad
password=password

再次测试安装这些更改是否正常工作。

此时可以通过修改SMB服务器上的/etc/samba/smb.conf文件进行测试,将'host allow'IP地址设置为别的,然后重新加载smb服务,再次尝试连接。
连接应该会失败,因为客户端的 IP 地址不再允许进入,确认我们的配置只允许特定客户端进入。

Samba 服务器配置

具有要共享数据的服务器将充当 SMB 服务器并需要安装 samba 包。

yum install samba -y

安装后,我们可以启用我们的 Samba 服务器在启动时自动启动所需的 SMB 服务,我们现在也将启动该服务,因为它在安装后默认情况下未运行。
我们还使用 NMB 服务执行此操作,该服务负责 NetBIOS 并且是 samba 包的一部分。

systemctl enable smb nmb
systemctl start smb nmb

有关使用 systemctl 进行基本服务管理的更多信息,请参阅此处的教程。

一旦 smb 服务成功启动,我们可以确认它正在正确侦听 TCP 端口 139 和 445.

[jack@onitroad ~]# netstat -antup | grep smb
tcp        0      0 0.0.0.0:139             0.0.0.0:*               LISTEN      3536/smbd
tcp        0      0 0.0.0.0:445             0.0.0.0:*               LISTEN      3536/smbd
tcp6       0      0 :::139                  :::*                    LISTEN      3536/smbd
tcp6       0      0 :::445                  :::*                    LISTEN      3536/smbd

接下来必须配置防火墙以正确允许 SMB 流量通过,这可以使用 firewalld 完成,如下所示。
此更改将允许 TCP 端口 135/445 SMB/CIFS 流量从任何源 IP 地址进入服务器。
防火墙配置也必须重新加载,因为我们已经制定了一个永久规则,该规则不适用于正在运行的配置。

firewall-cmd --permanent --add-service=samba
firewall-cmd --reload

在本例中,我们将通过 SMB 挂载用户的主目录,因此我们需要对 SELinux 进行以下更改以允许此操作。
请注意,-P 使这是一个永久更改,它将在系统重新启动后持续存在。

setsebool -P samba_enable_home_dirs on

接下来,我们将创建一个用户,其主目录将被共享。
我们在此处指定 /sbin/nologin shell,因为我们不希望此特定用户能够通过控制台或者 SSH 直接登录到服务器,此帐户将仅用于 SMB 访问。

useradd onitroad -s /sbin/nologin

这将创建一个标准的 Linux 用户,但是我们需要在该帐户上设置一个 SMB 密码。

[jack@onitroad ~]# smbpasswd -a onitroad
New SMB password:
Retype new SMB password:
Added user onitroad.

Samba 文件共享使用 /etc/samba/smb.conf 文件进行配置,该文件列出了可通过 SMB/CIFS 访问的目录,并定义了应允许连接的任何特定源 IP 地址.

hosts allow = 127. 192.168.0.100

这将只允许我们位于 192.168.0.100 的客户端以及 localhost 127.0.0.0/8 连接。
也可以使用主机名代替 IP 地址,只要它们通过 DNS 解析为预期的 IP 地址即可。
或者,我们也可以通过在配置中指定“hosts deny”来拒绝特定主机。

请注意,防火墙当前设置为允许 SMB 端口上的任何 IP 地址,这里是应用程序负责允许或者拒绝 IP 地址,这就是 RHCE 目标的全部内容。
在现实世界中,我们还会使用防火墙只允许特定的源 IP 地址。

我们还可以允许访问特定用户而不仅仅是特定主机,因此这种方法需要以用户密码的方式进行身份验证。
在这种情况下,onitroad 帐户被允许通过 SMB 访问,所有其他用户将被拒绝。

valid users = onitroad

我们可以在更改配置文件后运行“testparm”命令来检查语法,这应该在重新启动服务之前通知配置中是否有任何错误或者错误。

[jack@onitroad ~]# testparm
Load smb config files from /etc/samba/smb.conf
rlimit_max: increasing rlimit_max (1024) to minimum Windows limit (16384)
Loaded services file OK.
Server role: ROLE_STANDALONE
Press enter to see a dump of your service definitions
# Global parameters
[global]
        workgroup = MYGROUP
        server string = Samba Server Version %v
        security = USER
        log file = /var/log/samba/log.%m
        max log size = 50
        idmap config * : backend = tdb
        hosts allow = 192.168.0.100
        cups options = raw

在对 /etc/samba/smb.conf 文件进行任何更改后,我们需要重新启动 smb 服务使更改生效。

systemctl restart smb nmb

创建自定义共享

到目前为止,我们只成功地通过 SMB 挂载了一个主目录,现在我们将介绍如何创建一个任意目录并挂载它。

首先,我们将创建一个目录,我们将通过 SMB 共享该目录。

[jack@onitroad ~]# mkdir /testing
[jack@onitroad ~]# chmod 777 /testing

接下来我们将开始修改 SMB 服务器上的 /etc/samba/smb.conf 文件,为我们希望共享的自定义目录添加以下配置文件。

[testing]
comment = This is a file share for the /testing directory.
browseable = yes
path = /testing
valid users = onitroad
writable = yes

这允许我们之前创建的 onitroad 用户帐户访问 /testing 目录。

最后我们修改这个目录的 SELinux 上下文。
如果此命令的语法难以记住,请参阅“semanage-fcontext”手册页以获取示例。

[jack@onitroad ~]# semanage fcontext -a -t samba_share_t "/testing(/.*)?"
[jack@onitroad ~]# restorecon -v /testing/
restorecon reset /testing context unconfined_u:object_r:default_t:s0->unconfined_u:object_r:samba_share_t:s0

接下来我们可以检查它是否可以访问,然后安装它。

[jack@onitroad ~]# smbclient -L 192.168.0.200 -U onitroad
Enter onitroad's password:
Domain=[MYGROUP] OS=[Windows 6.1] Server=[Samba 4.2.10]
        Sharename       Type      Comment
        ---------       ----      ------
        testing         Disk      This is a file share for the /root/testing directory.
[jack@onitroad ~]# mount //192.168.0.200/testing /mnt -o username=onitroad

此时我们可以从客户端创建一个测试文件,如下所示。

[jack@onitroad ~]# echo Testing > /mnt/test123

我们可以检查这个文件是否存在于服务器上,因为我们可以看到预期的内容在 SMB 服务器上的这个文件中,确认我们可以在这里从客户端写入内容。

[jack@onitroad ~]# cat /testing/test123
Testing

smbstatus 命令

我们可以在服务器上运行 smbstatus 命令以列出当前连接的客户端并收集更多信息。

[jack@onitroad ~]# smbstatus
Samba version 4.2.10
PID     Username      Group         Machine            Protocol Version
-----------------------------------------------------------------------------
13929     onitroad     onitroad     192.168.0.100 (ipv4:192.168.0.100:41380) NT1
Service      pid     machine       Connected at
------------------------------------------------------
IPC$         13929   192.168.0.100  Sat Jan 21 23:20:53 2014
onitroad    13929   192.168.0.100  Sat Jan 21 23:20:53 2014
No locked files

testparm 命令

如前所述,在 Samba 服务器上运行 testparm 命令来检查 /etc/samba/smb.conf 文件的语法。

重置 smb.conf 文件

如果我们认为已经损坏了无法修复的所有内容,只需移动或者删除 /etc/samba/smb.conf 文件,然后重新安装 Samba,这将创建一个具有默认设置的全新文件。

yum reinstall samba

SELinux

要通过 SMB 共享目录,上下文应设置为 samba_share_t。

或者,我们可以设置 samba_export_all_ro,它允许只读访问我们可能希望通过 SMB 共享的任何目录,即使它们没有设置 samba_share_t 上下文。
samba_export_all_rw 布尔值的工作原理相同,只是它允许读/写。

[jack@onitroad ~]# setsebool -P samba_export_all_ro off
[jack@onitroad ~]# setsebool -P samba_export_all_rw off

-P 使这些更改在系统重新启动后保持不变。

示例环境

这是我们将要测试的服务器列表,它们都运行 CentOS 7.

  • Samba 客户端:192.168.0.100 - 此 Linux 客户端将从 SMB/CIFS 服务器挂载一个目录。
  • Samba 服务器:192.168.0.200 - 此 Linux 服务器将通过 SMB/CIFS 为客户端提供一个目录。

Samba 客户端配置

现在服务器已准备好接受 SMB 连接,我们需要准备客户端。

首先安装 samba-client 包和用于挂载 SMB 共享的 cifs-utils。

yum install samba-client cifs-utils -y

接下来通过允许 samba-client 服务来修改防火墙。

firewall-cmd --permanent --add-service=samba-client
firewall-cmd --reload

我们可以通过在客户端上使用 smbclient 连接到服务器来确认浏览是否正常。
在这个例子中,我们使用我们在那里创建的 onitroad 帐户连接到位于 192.168.0.200 的 SMB 服务器。

[jack@onitroad ~]# smbclient -L 192.168.0.200 -U onitroad
Enter onitroad's password:
Domain=[MYGROUP] OS=[Windows 6.1] Server=[Samba 4.2.10]
        Sharename       Type      Comment
        ---------       ----      ------
        IPC$            IPC       IPC Service (Samba Server Version 4.2.10)
        onitroad       Disk      Home Directories
        Send_To_OneNote_2013:1 Printer   Send To OneNote 2013
        Microsoft_Print_to_PDF:4 Printer   Microsoft Print to PDF
        Fax:3           Printer   Fax
        Microsoft_XPS_Document_Writer:2 Printer   Microsoft XPS Document Writer

除其他外,我们可以看到 onitroad 共享列为主目录,如上所示。

如何向特定客户端提供 SMB/CIFS 网络共享

Samba 是服务器消息块 (SMB) 和通用 Internet 文件系统 (CIFS) 协议的开源实现,它允许我们从 Linux 访问 Windows 文件共享资源。

使用 Samba,我们可以通过网络将文件系统中的特定目录导出到其他 Windows 或者 Linux 客户端,从而允许我们通过网络在不同操作系统之间共享各种文件。

正确配置并尽可能保护它很重要,这样只有需要的客户端和用户才能访问 SMB/CIFS 共享,否则任何人都可能挂载和访问数据。

为此,我们将使用 SMB/CIFS 服务器上的 /etc/samba/smb.conf 文件并将共享锁定为仅可由特定 IP 地址和用户帐户访问。

日期:2020-07-07 20:56:29 来源:oir作者:oir