安装 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 共享列为主目录,如上所示。
Samba 是服务器消息块 (SMB) 和通用 Internet 文件系统 (CIFS) 协议的开源实现,它允许我们从 Linux 访问 Windows 文件共享资源。
使用 Samba,我们可以通过网络将文件系统中的特定目录导出到其他 Windows 或者 Linux 客户端,从而允许我们通过网络在不同操作系统之间共享各种文件。
正确配置并尽可能保护它很重要,这样只有需要的客户端和用户才能访问 SMB/CIFS 共享,否则任何人都可能挂载和访问数据。
为此,我们将使用 SMB/CIFS 服务器上的 /etc/samba/smb.conf 文件并将共享锁定为仅可由特定 IP 地址和用户帐户访问。