在混合环境中创建和配置文件共享

运维 系统运维
本文主要介绍如何配置 Samba 和构造配置文件。同时,介绍了Samba 如何与网络进行交互,如何配置日志,以及如何调试 Samba 问题。

 本文内容如下:

  • 创建和配置文件共享
  • 规划文件服务迁移
  • 隐藏管理共享,即 IPC$
  • 创建用户和组用来处理文件共享的脚本
  • 使用与文件共享有关的命令行工具

先决条件

为了更好地理解本系列文章的内容,您应该精通 Linux 知识,并熟悉一个可供您练习本文介绍的命令的 Linux 系统。此外,您还应该具有访问 Windows 环境的权限,用 Windows 环境来测试文件和打印访问数据。

创建文件共享

在《出于各种目的 轻松设置Samba介绍了 Samba 能够识别 smb.conf 文件中各个部分的共享名,除了 homes、printers和 global。除了共享名之外,将共享名映射到磁盘上的某个位置也是一个重要信息。下面是一个最简单的有用共享:

[tmpdir]
path = /var/tmp

这段代码定义了一个共享 tmpdir,它将映射到 Samba 服务器的 /var/tmp 目录。例如,如果服务器名称为 phoenix,那么用户就能够通过通用命名规范 (UNC) 路径 \\phoenix\tmpdir 访问该文件共享。然而,这个简短的配置实际上用处不大:默认的共享设置是只读的,所以上面的共享是不可写的。

使用安全参数

Samba 有许多与安全性相关的参数,它们能够对用户与文件进行访问控制。这些参数大多都会影响 Samba 与底层 UNIX 文件权限的交互,但这些不在本文的讨论范围之内,本文将介绍一些常用的参数。

Server Message Block (SMB) 服务器,包括 Microsoft 本机实现,都包含一个名为 IPC$ 的共享,它是一种进程间通信共享,可以使用它通过网络执行软件功能。以美元符号($)结尾的共享都是隐藏共享,不会显示在 Microsoft 客户端,即使服务器会报告该共享的存在。

即使没有 smb.conf,Samba 也会创建一个 IPC$ 共享。如果创建了该共享,则可以控制对它的访问。下面是一个严格 IPC$ 共享的示例:

[IPC$]
hosts allow = 192.168.1.0/255.255.255.0
browsable = no

这个代码片段定义了 IPC$ 共享,并将它设置为只允许在 192.168.1.0 网络内访问。这个示例还关闭了 Browsable 特性,这表示当客户端请求 IPC$ 共享时,Samba 不会显示它。

以前,常见做法是隐藏一些敏感共享,如 IPC$,这样做主要是希望能够逃过攻击者的视线。对于 IPC$ 共享而言,这事实上不是一种很聪明的做法。例如,向服务器请求获得一个共享清单时,必须连接到 IPC$ 共享。如果查看 Samba 调试信息和数据包跟踪信息,就会发现这个 Browsable 选项根本没用。我提到这一点是因为考试大纲也提到了这一点。保护 IPC$ 共享的更好方法是限制能够连接的主机,而不是试图隐藏 IPC$ 共享。

用户可以在不指定用户的情况下登录一个共享,此时该用户是一名 访客。默认情况下,不允许访客访问共享,但是您可以通过 guest ok = yes 在共享中启用访客帐号。默认的访客用户是 nobody,但是您可以通过全局的 guest account 参数修改这个用户。

UNIX 系统中大量使用符号链接来链接文件系统的两个区域。例如,在 home 目录中,您可以创建一个指向系统级临时目录的符号链接并使用它,就像它是 home 的目录的一部分一样。Samba 也支持使用这些符号链接,让用户访问文件共享以外的区域。如果您不希望出现这种情况,那么您可以在共享配置中添加 follow symlinks = no。

如果您希望限制可以访问共享的用户,那么可以使用 valid users 参数。例如,valid users = sean, jon, isaac 表示只允许参数所指定的三种用户访问这个共享。除了文件级权限之外,您还可以使用该参数为敏感共享提供额外的安全保护。

Home 共享

人们经常使用 home 目录保存个人文件。UNIX 密码文件中的每一个用户都会分配一个 home 目录。您可以直接通过 Samba 导出任意数量的 home 目录,无需使用 [homes] 代码段来键入单独的配置代码段。当有人请求一个名为 joe 的共享时,Samba 会查找一个名为 joe 的已配置好的共享;如果 Samba 找不到该共享,那么它会查找同名的用户。如果找到了这个用户,那么 Samba 就会使用[homes] 代码段中的配置作为此共享的模板。

清单 1 显示了一个典型的 [homes] 代码段。

清单 1. 用户 home 共享的模板

[homes]
comment = Home Directories
writable = yes
browsable = yes
valid users = %S

清单 1 中的配置可以执行以下任务:

  • 开始配置 homes 代码段
  • 添加一个备注,该备注会显示在服务器可用文件共享的详细信息中
  • 将这个共享标记为可写,这样用户就能够修改他们的 home 目录
  • 指出用户浏览共享列表时能够看见这个共享;用户可以同时看到 homes 以及与用户名同名的共享
  • 限制只有该共享的拥有者才能够访问这个共享

注意清单 1 中 %S 宏的用法:可以将这个宏扩展到共享名称。因为用户名是与共享名相同,所以 valid users 限制了只有该共享的拥有者才能够使用这个共享。

现在,只要用户查找共享列表,就会看到他们的 home 目录,并且能够连接到该共享。然后此共享会映射到用户的 UNIX home 目录上。

关于 homes 共享中的一个有意思的方面是:如果您直接访问 \\server\homes 目录,则会直接进入自已的共享,效果与访问 \\server\username 一样。这是 Samba 团队提供的一项额外功能,旨在为共享主机上的用户提供帮助和减少混淆。#p#

添加用户和组的脚本

如果查看用户列表的 Microsoft 域,就会发现连接您服务器的用户可能没有本地 UNIX 帐号。解决这个问题的一个方法是,在用户连接服务器时,让 Samba 使用 add user script 参数为您创建该用户。可以将 %u 宏扩展到这个用户。您可以使用诸如 useradd 这样的系统工具或编写自己的脚本。

在使用 Microsoft 工具管理 Samba 时,还可以使用为组 (group) 而存在的类似参数 — add group script。如果您使用的工具是 add user to group 和 类似的 delete 脚本,那么这些参数也很有用的。smb.conf 的手册页中包含的可脚本化任务的完整列表。

让守护程序根据需要创建用户并不总是最好的方法。使用 winbind 或者基于 Lightweight Directory Access Protocol (LDAP) 的认证机制效果可能更好一些,这样 Samba 和 Linux 就能够共享一个通用的用户数据库。

处理混合情况

文件或目录名的字母大小写与 Microsoft 域中不太一样。例如,FILE、file 和 FiLe 均指向同一个文件。然而,在 Linux 中,大小写很重要,因此这三个文件是完全不同的。Samba 需要知道如何实现这两种平台之间的映射,以解决它们之间的冲突。这种大小写映射进程是称为 名称改编 的更大进程的一部分。

有一些参数会影响名称大小写的改编。其中最重要的参数是 case sensitive,它可以设置为 yes、no 或 auto。如果启用了 case sensitive,那么 Samba 就会使用客户端要求的大小写。如果禁用该设置,那么 Samba 会以大小写无关的方式查找这个目录。

与区分大小写有关的一个问题是:如果设置不正确,您可能无法访问一些文件。假设一个目录有两个文件,一个是 test,另一个是TEST。如果 Samba 以大小写无关的方式访问它们,则无法区分这两个文件。

该设置的默认值是 auto,它会寻找一个客户端扩展字段来指示客户端是否支持区分大小写的访问。Windows 客户端不支持这项功能,所以它们是大小写无关的。

default case 和 preserve case 这两个参数可以一起使用。如果将 preserve case 设置为 yes,则会使用客户端的设置。如果preserve case 设置为 no,则会使用 default case 的值来确定新创建文件的大小写。

启用 Usershare

用户可以使用 Usershare 特性创建自己的共享,不必修改 smb.conf。在管理员启用 Usershare 特性之后,一般用户即可使用命令行工具导出他们选择的目录。用户还可以在完成操作之后删除它们的共享。

使用 Usershare 的第一步是在全局范围内启用这个特性。清单 2 显示了启用 Usershare 的 smb.conf 代码的一部分。

清单 2. 启用 Usershare

[global]
usershare path = /var/lib/samba/usershares
usershare max shares = 5
usershare prefix allow list = /home
usershare prefix deny list = /var, /usr

清单 2 显示的是 [global] 代码段中的代码。首先,usershare path 定义了一个目录,Samba 使用这个目录来保存与用户共享相关的配置。这个目录有一些限制条件,我们将在后面的内容中进行说明。接下来介绍的是用户共享数量限制。最后两个参数展示了如何限制可以共享的目录。usershare prefix allow list 将所有共享都限制在给定目录中,在这里,这些共享都必须位于 /home 目录下。usershare prefix deny list 参数则相反,只允许共享给定目录以外的目录。

Samba 对用户共享使用了其他两个方面的限制。首先,创建共享的用户必须能够对 usershare path 指定的目录进行写入操作,这个目录必须具有粘贴位 (sticky bit) 设置(1000 或 +t)。其次,用户必须拥有共享的目录,除非 usershare owner only 设置为 false。

与文件权限有关的第一个限制意味着创建 usershare path 时必须小心。如果您希望将用户共享限制为只允许 usershares 组的用户共享,则需要添加以下一系列的命令:

# mkdir -p /var/lib/samba/usershares
# chown root:usershares /var/lib/samba/usershares
# chmod 1770 /var/lib/samba/usershares

第一个命令创建了目录以及所有必要的父目录。第二个命令将目录的用户和组的所属权分别设置为 root 和 usershares。最后一个命令将目录的所有者和组权限设置为 Read/Write/Execute,即拒绝其他所有人访问,并设置了粘贴位。因此,只有 root 和 usershares 组的成员能够使用这个目录;通过粘贴位设置,只有文件的拥有者才能够删除该文件。

创建共享可能是这个练习中最难的一部分。用户可以执行以下命令:

net usershare add docs /home/me/Documents/ "My docs" Everyone:F

上面这个命令会将 /home/me/Documents 导出为一个称为 docs 的共享,并拥有完全控制所有人的控制权。其他允许使用的命令包括:

  • net usershare list 列出用户已经创建的用户共享。
  • net usershare info docs 显示 docs 共享的配置。
  • net usershare delete docs 删除 docs 共享。

命令行工具

Samba 提供了一些命令行工具。通过 Samba 提供的 libsmbclient,其他人可以开发一些常用的 SMB/Common Internet File System (CIFS) 工具。

UNIX 和 Windows 之间的一个显著区别是 UNIX 有一个大型文件系统,而 Windows 有一系列的驱动器名。smbclient 实用程序允许您通过一个类似 File Transfer Protocol (FTP) 的界面来浏览远程的 Windows 共享,但是远程 Windows 共享对应用程序是透明的,所以它像其他文件系统一样应该是可挂载的。

Samba 提供了一个名为 smbmount 的工具,有时会将它重新打包为 mount.cifs。您可以直接调用这个命令,或者通过 mount 命令调用它。清单 3 显示的是将远程 CIFS 共享挂载到常规文件系统的 Linux 系统。

清单 3. 挂载远程 CIFS 共享

# mount -t cifs '\\192.168.1.134\docs' /mnt -o user=myuser
Password:
# mount
...
\\\\192.168.1.134\\docs on /mnt type cifs (rw)

第一个命令将一个 CIFS 文件系统挂载到指定的 UNC 路径,然后将它放到 /mnt 下。与 UNC 路径不同的是,它看起来好像是一个标准的 mount 调用。选项是通过 -o 传递的。这里所需的唯一选项是用户名。mount.cifs 手册页中概括了其他所有选项,其中可能包含一个密码和一个域。如果您没指定一个密码,系统会提示您输入一个密码。最后,mount 命令会显示已挂载的文件系统。

另一个命令是 smbsh。smbsh 没有通过标准的 UNIX 方法挂载文件系统,而是拦截文件请求的库调用,然后在必要时将请求重定向到某个 CIFS 共享。但是,大多数系统都不再提供这个命令,因为用它不像挂载文件系统那样稳定。

迁移文件共享

当您将一个文件服务从一台服务器移到另一台服务器时,用户可能会忘记访问新的服务器。Samba 允许您让服务器响应另一个名称。例如,如果您将文件共享从服务器 phoenix 移动到服务器 fs2 时,您可以让 fs2 来响应 phoenix 的请求。当然,您必须保证 phoenix 不会响应请求,或者关闭或重命名它。

要为服务器添加别名,可以使用全局参数 netbios aliases。如果您希望将 Samba 服务器的名称修改为不同于服务器的 UNIX 名称的其他名称,则可以使用参数 netbios name。

在准备迁移时,您目前为止所了解的有关挂载文件系统的命令还有助于将文件从一台服务器复制到另一个服务器。您可能还希望使用一些 UNIX 工具(如 rsync)来帮助您解决问题。

原文:http://www.ibm.com/developerworks/cn/linux/l-lpic3-312-2/index.html?ca=drs-

【编辑推荐】

  1. 出于各种目的 轻松设置Samba
  2. 从源码配置和构建 Samba
  3. 性能损耗?文件服务器容量工具告诉你为什么
责任编辑:黄丹 来源: IBMDW
相关推荐

2020-08-27 15:02:11

Progress

2011-03-29 09:47:43

2012-02-08 15:59:48

ibmdw

2019-07-30 10:16:41

云计算IT混合云

2012-02-16 11:15:46

ibmdw

2021-11-26 15:14:20

混合云网络安全SASE

2012-02-24 15:14:18

ibmdw

2011-04-12 09:53:32

Spring

2019-10-22 11:15:21

云计算数据安全

2012-02-29 09:20:08

ibmdw

2009-07-15 15:57:28

AWT或Swing

2022-02-15 10:45:53

混合云云计算SASE

2014-12-09 10:15:21

openstack混合云

2010-12-31 09:42:36

NFS角色账户映射

2023-08-03 15:13:59

混合云Kubernetes

2024-11-15 14:03:56

2013-11-12 09:20:58

网络虚拟化SDN

2010-10-14 17:16:01

惠普云计算BSA9.0

2020-09-25 10:52:27

2010-01-08 17:32:11

Ubuntu samb
点赞
收藏

51CTO技术栈公众号