本文内容如下:
- 创建和配置文件共享
- 规划文件服务迁移
- 隐藏管理共享,即 IPC$
- 创建用户和组用来处理文件共享的脚本
- 使用与文件共享有关的命令行工具
本文将帮助您完成 Linux 专业协会的混合环境专业考试(302)的 Topic 312 中的 Objective 312.2 考试的准备。这个目标所占比重为 4。
为了更好地理解本系列文章的内容,您应该精通 Linux 知识,并熟悉一个可供您练习本文介绍的命令的 Linux 系统。此外,您还应该具有访问 Windows 环境的权限,用 Windows 环境来测试文件和打印访问数据。
学习 Linux,302(混合环境):配置 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 目录保存个人文件。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 团队提供的一项额外功能,旨在为共享主机上的用户提供帮助和减少混淆。
如果查看用户列表的 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 特性创建自己的共享,不必修改 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)来帮助您解决问题。
这是关于文件共享主题的系列文章中的最后一篇文章。下一个考试目标是 312.3,将教您如何创建和配置打印共享,并了解如何从其他系统访问这些共享。
学习
- Web 版的
smb.conf 手册页 比命令行版本更方便。
-
SMB HOWTO 深入研究了如何从 Linux
机器访问远程文件系统。
- 如果您使用的是 SELinux,这篇关于
管理 Samba 和 SELinux 的文档非常有用,特别是在配置 home 目录时。
- 在
LPIC Program
网站上,可以找到 LPI Linux 系统管理认证的 3 个级别的详细目标、任务列表和示例问题。特别是,要查看
LPI-302 详细目标 和
任务和示例问题。
- 浏览 developerWorks 上的 LPI 考试准备系列文章的全部文章,以了解 Linux 的基础知识,并基于 2009 年 4 月以前的 LPI
考试目标,为系统管理员认证考试做准备。
-
Exam Preparation Resources for Revised LPIC Exams
提供了一系列由 LPI 维护的其他认证培训资料。
-
关注免费的 developerWorks Live!
简报,获取最新的 IBM 产品、工具以及 IT 行业趋势的资讯。
- 观看
developerWorks 演示中心,包括面向初学者的产品安装和设置演示,以及为经验丰富的开发人员提供的高级功能。
- 在 developerWorks Linux 专区 寻找为 Linux 开发人员(包括 Linux 新手入门)准备的更多参考资料,查阅我们 最受欢迎的文章和教程。
- 在 developerWorks 上查阅所有 Linux 技巧 和 Linux 教程。
- 随时关注 developerWorks 技术活动和网络广播。
获得产品和技术
- 获取
最新版本的 Samba,以获得最新的特性。
- 以最适合您的方式
IBM 产品评估试用版软件:下载产品试用版,在线试用产品,在云环境下试用产品,或者在
IBM SOA 人员沙箱 中花费几个小时来了解如何高效实现面向服务的架构。
讨论
- 加入 developerWorks 中文社区,developerWorks 社区是一个面向全球 IT 专业人员,可以提供博客、书签、wiki、群组、联系、共享和协作等社区功能的专业社交网络社区。
