Samba小组
编译:meaculpa
中文译稿声明:
该文档是Samba软件的一部分,受GNU GPL保护,使用时请注意版权问题;由于译者水平有限,错误之处在所难免,希望各位读者来信指正,由此产生的一切后果,本人概不负责。
概要
本文档汇集了Samba文档历年来的HOWTOs。我试图确保所有内容都是最新的,但有时一个人维护不了这么大的项目。你可以在http://www.samba.org/的“Documentation”找到这份文档的最新版本,有更新的话寄给jerry@samba.org。
干杯,jerry
目录表
1. 如何安装并测试Samba
1.1. Step 0: 阅读手册页
1.2. Step 1: 编译二进制
1.3. Step 2: 所有关键步骤
1.4. Step 3: 建立配置文件
1.5. Step 4: 用testparm测试你的配置文件
1.6. Step 5: 启动smbd和nmbd进程
1.6.1. Step 5a: 从inetd.conf启动
1.6.2. Step 5b. 可选法:以后台进程启动
1.7. Step 6: 尝试列出服务器可获得之共享项
1.8. Step 7: 尝试从UNIX客户端建立连接
1.9. Step 8: 尝试从DOS、WfWg、Win9x、WinNT、Win2k、OS/2及其它客户端建立连接
1.10. 如不工作咋办?
1.10.1. 诊断问题
1.10.2. 范围ID
1.10.3. 选择协议级别
1.10.4. 从UNIX向PC客户端进行打印
1.10.5. 锁定
1.10.6. 映射用户名
1.10.7. 其它字符集
2. Samba 2.x中的LanMan和NT口令加密
2.1. 介绍
2.2. 工作原理
2.3. 重要的安全性说明
2.3.1. SMB加密的好处
2.3.2. 非加密口令的好处
2.4. smbpasswd文件
2.5. smbpasswd命令
2.6. 设定Samba支持LanManager加密
3. 在Samba中配置微软分布式文件系统树
3.1. 介绍
3.1.1. 说明
4. Samba 2.2.x中的打印支持
4.1. 介绍
4.2. 配置
4.2.1. 建立[print $]项
4.2.2. 为现有打印机设定驱动程序
4.2.3. 支持大量打印机
4.2.4. 通过Windows NT APW添加新打印机
4.2.5. Samba和打印机端口
4.3. Imprints工具包
4.3.1. 什么是Imprints?
4.3.2. 建立打印机驱动程序包
4.3.3. Imprints服务器
4.3.4. 客户端安装程序
4.4. 从Samba 2.0.x向2.2.x迁移
5. Samba 2.x中的security = domain选项
5.1. 把Samba 2.2添加到NT域
5.2. Samba和Windows 2000域
5.3. 为什么比security = server选项更好?
6. 把Samba 2.2配置成主域控制器
6.1. 说明
6.2. 配置Samba域控制器
6.3. 建立机器信任账号并把客户添加到域中
6.4. 常见问题及错误
6.5. 系统策略及配置文件
6.6. 其它可获得的帮助
6.6.1. 链接及类似资源
6.6.2. 邮件列表
6.7. DOMAIN_CONTROL.txt:Samba & Windows NT域控制
7. 用Winbind在Windows NT与UNIX间进行统一登录
7.1. 概要
7.2. 介绍
7.3. Winbind的功能
7.3.1. 使用目标
7.4. winbind如何工作
7.4.1. Microsoft远程过程调用
7.4.2. 名字服务切换
7.4.3. 可插式验证模块
7.4.4. 用户及组ID的分配
7.4.5. 缓存结果
7.5. 安装及配置
7.6. 限制
7.7. 结语
8. UNIX权限位和Windows NT访问控制表
8.1. 用NT安全对话框浏览和修改UNIX权限
8.2. 如何浏览Samba共享项上的文件权限
8.3. 浏览文件所有权
8.4. 浏览文件或目录权限
8.4.1. 文件权限
8.4.2. 目录权限
8.5. 修改文件或目录权限
8.6. 使用创建掩码选项
8.7. 使用文件属性映射
9. OS2客户HOWTO
9.1. 常见问答集
9.1.1. 如何把OS/2 Warp Connect或OS/2 Warp 4配置成Samba的客户端?
9.1.2. 如何把How can I configure OS/2 Warp 3 (非Connect版)、OS/2 1.2、1.3或2.x配置成Samba的客户端?
9.1.3. 把OS/2(任何版本)作为客户端还有其它的问题吗?
9.1.4. 如何让OS/2客户下载打印机驱动程序呢?
10. 中文翻译版致谢
第1章. 如何安装并测试Samba
1.1. Step 0: 阅读手册页
Samba发布版中所带的手册页包含了大量有用的信息,如果你不知道怎样阅读它们,可以试试下面的命令:
$ nroff -man smbd.8 | more
在Samba的网站http://www.samba.org可以找到其它的资源。
1.2. Step 1: 编译二进制
先运行source目录中的./configure 程序。它会自动根据你的操作系统情况来对Samba进行配置,如果你有特殊要求可以运行:
root# ./configure --help
这样就可以看到想要的特殊选项。然后,再执行:
root# make
这样就开始创建二进制程序。当编译成功你就可以用:
root# make install
来安装二进制程序和手册页了。还可以用下面的命令分别安装二进制程序和/或手册页:
root# make installbin
和
root# make installman
注意,如果你正在对以前的版本进行升级,那么原来老版本的二进制程序已经更名为带“.old”扩展了。如果你发现当前版本有问题,可以用下面的命令退回到以前的版本:
root# make revert
1.3. Step 2: 所有关键步骤
在这一步你必须为自己准备好一杯咖啡或其它刺激性的饮料。安装过程有时很复杂,所以可能会需要这样的东西。如果你以前安装过Samba则可以跳过这一步。
1.4. Step 3: 建立配置文件
在发布包的examples子目录里有一份配置文件的样本。我建议你仔细阅读这个文件,看看各选项在实际使用中是如何搭配的。所有选项的信息请参见手册页。
下面是最简单实用的配置文件:
[global]
workgroup = MYGROUP
[homes]
guest ok = no
read only = no
通过这样的配置,服务器上的用户只要用他们的账号就可能通过服务器与自己的主目录进行连接。(注意工作组也可以设置为Samba要加入的工作组名,请参见BROWSING.txt中的内容)
注意用make install不会安装smb.conf文件,你需要自己建立这个文件。(可以从发布包的examples/子目录里拷嘛)
然后把这个文件放到Makefile文件中指定的相应目录里(缺省查找/usr/local/samba/lib/目录)。
关于设置[homes]共享项的安全性请参考UNIX_SECURITY.txt文件。
1.5. Step 4: 用testparm测试你的配置文件
用testparm程序测试smb.conf文件非常重要。如果testparm运行OK就会列出可装载的服务项,否则会给出出错信息。在继续之前请确保它运行OK,并且服务项都符合要求。
1.6. Step 5: 启动smbd和nmbd进程
你必须选择是以后台进程方式还是从inetd里启动smbd和nmbd,注意二者只能选其一。要么把它们放到inetd.conf,然后由inetd根据需要来启动;要么从命令行或从/etc/rc.local里以后台进程方式启动。参见手册页中有关的命令行选项,特别要注意的是启动Samba的账号,通常必须是root。
以后台进程方式启动smbd和nmbd的主要优势是,对初始化连接请求的响应要更快一点,不过这并不是个太大的问题。
1.6.1. Step 5a: 从inetd.conf启动
注意:如果你用NIS或NIS+来分发服务映射表的话,就会与以下方法有所不同。
找到/etc/services中所定义的端口139/tcp。如没有就把下面这行加进去:
netbios-ssn 139/tcp
类似的,还应该有如下这样的端口137/udp定义:
netbios-ns 137/udp
接着编辑/etc/inetd.conf并加入下面这两行:
netbios-ssn stream tcp nowait root /usr/local/samba/bin/smbd smbd
netbios-ns dgram udp wait root /usr/local/samba/bin/nmbd nmbd
各种UNIX版本中的/etc/inetd.conf其语法可能也不同。参考一下该文件中其它项目的格式。
注意:有些UNIX的/etc/services已经包含了诸如netbios_ns这样的项目(小心下划线)。你必须编辑/etc/services或者/etc/inetd.conf使它们一致。
注意:在很多系统上你必须使用smb.conf中的“interfaces”选项来指定系统接口的IP地址及掩码。如果你不知道网络的广播地址,请以root身份运行ifconfig。nmbd会在运行时尝试检测广播地址,但在有些系统上这样做就会失败。如有必要请参见“testing nmbd”部分获得查找方法。
!!!警告!!!多数UNIX的inetd.conf只接受大约5个命令行参数。也就是说你不应该在选项和参数间用太多空格,或者使用一个脚本并让它从inetd启动。
接着重新启动inetd,为此你只要给它发信HUP信号就可以了。如果你已安装了一个以前版本的nmbd,那还需要把它杀一下。
1.6.2. Step 5b. 可选法:以后台进程启动
要以后台进程方式来启动服务器,应该创建一个如下这样的脚本,并起名为诸如startsmb。
#!/bin/sh
/usr/local/samba/bin/smbd -D
/usr/local/samba/bin/nmbd -D
然后用chmod +x startsmb这个命令使它可执行。当然你可以手工运行startsmb或者从/etc/rc.local启动。给nmbd和smbd各发一个杀进程信号就可以使它们停止运行。
注意:如果你用的是SVR4风格的init系统的话,可以改一下examples/svr4-startup这个脚本以使它适用于你的系统。
1.7. Step 6: 尝试列出服务器可获得之共享项
$ smbclient -L yourhostname
用上面这个命令,就可以得到一份服务器上可获得的共享项列表,不然的话就是设置上出了什么问题。注意,这个方法也可以用于查看其它LanManager客户端(如WfWg)可获得的共享信息。
如果选用了用户级安全,则Samba会在列出共享列表前要求你输入口令。详情请参见smbclient的手册页。(你可以在命令行上加入选项-U%来强迫它列出共享列表,但对于非Samba服务器就不能这么做了。)
1.8. Step 7: 尝试从UNIX客户端建立连接
$ smbclient //yourhostname/aservice
命令中的yourhostname应该是安装了smbd程序的主机名。而aservice就是在smb.conf文件中定义了的服务项。如果在smb.conf中定义了[homes]段的话可以试着用你的用户名来连接。例如,如果你的UNIX主机是bambi,而你的用户名是fred的话,该命令就应该是:
$ smbclient //bambi/fred
1.9. Step 8: 尝试从DOS、WfWg、Win9x、WinNT、Win2k、OS/2及其它客户端建立连接
要装载磁盘的话:
C:\WINDOWS\> net use d: \\servername\service
要打印的话:
C:\WINDOWS\> net use lpt1: \\servername\spoolservice
C:\WINDOWS\> print filename
至此,你已经安装成功,否则请向我汇报bug!
1.10. 如不工作咋办?
如果你万事不顺并开始考虑“是谁写了这一大堆的垃圾”的话,我建议你再做一次step 2(或多次),直到你平静下来。
然后你可以去读一下DIAGNOSIS.txt和FAQ。如果还是卡住的话请试一下邮件列表和新闻组(详情参见README)。Samba已经在世界上数千个站点成功安装,所以可能已经有人已经遇到并解决了你的问题。你还可以到WWW站点去查一下Samba-digest发布的消息。
当你修正了什么问题,请给我发回更新的文档或源代码,以方便后来人。
1.10.1. 诊断问题
如果你有安装方面的问题请参考DIAGNOSIS.txt,看看能否找到该问题。
1.10.2. 范围ID
缺省情况下Samba会用一个空的范围ID。这样的话,所有的windows机器也必须有一个空范围ID。如果你真想用非空的范围ID,就需要在nmbd、smbd和smbclient命令中使用-i <scope>选项,不过这样一来所有的机器都必须具有相同的设定。不推荐使用范围ID。
1.10.3. 选择协议级别
SMB协议有很多别名,现在Samba支持5种,它们分别是CORE、COREPLUS、LANMAN1、LANMAN2和NT1。
你可以在smb.conf文件中选择支持最高级的协议。缺省为NT1,对大多数站点来说这是最合适的。
以前一些版本的Samba必须使用COREPLUS,现在已经修正了这种限制,而且已经不太需要使用低于LANMAN1的协议了。保留COREPLUS只是兼容一些少数情况,如WfWg要在该协议中保持口令的大小写格式,而在LANMAN1、LANMAN2或NT1下所有的口令在被发送前都转换为大写,所以在某些情况下你可能要强制使用“password level=”选项。
使用LANMAN2和NT1主要的好处是支持一些客户的长文件名(如smbclient、Windows NT或Win95)。
详情请参见smb.conf(5)手册页。
注意:如要支持打印队列报表,则在WfWg下必须用TCP/IP作为缺省协议。如果在有些系统上把NetBEUI作为缺省的话,就会打断打印队列报表,这大概是WfWg的一个bug。
1.10.4. 从UNIX向PC客户端进行打印
要从一台UNIX主机使用smb服务器上的打印机,就需要编译smbclient程序。然后还需要安装“smbprint”脚本。详情请阅读smbprint的使用说明。
另外还有一个具有同样功能的SYSV风格脚本smbprint.sysv,它也有使用说明。
1.10.5. 锁定
有时锁定会产生一些麻烦。
SMB服务器要实现两种类型的锁定。第一种是“记录锁定record locking”,它允许一个客户锁定一个打开文件的一段字节;第二种就是“拒绝模式deny modes”(译者注:也称“共享模式”),它在打开文件时指定的。
Samba使用UNIX系统调用fcntl()来支持“记录锁定”。而通常实现的方法是用rpc来调用服务器上运行的rpc.lockd进程。不幸的是rpc.lockd实现问题太多了,特别是要与其他版本进行对话的情况。rpc.lockd崩溃并不是什么稀罕事儿。
还有一个问题是,把PC客户端产生的32位锁定请求转换为多数UNIX所支持的31位请求。但很多PC应用程序(典型的如OLE2应用)使用字节范围(其中最高位为标志位)的方式进行工作。Samba尝试通过转换来支持这类应用程序,并且这样的转换被证明是相当成功的。
严格意义上的SMB服务器应该在每次读写被调用文件之前检查其锁定情况。但fcntl()按上述方式来工作速度可能比较慢,而且会使rpc.lockd过载。当然这几乎也是不必要的,如果锁定对客户来说非常重要的话,他们应该在读写之前独立生成锁定调用。缺省情况下,Samba只在客户明确要求时才生成锁定调用,但如果你设置了“strict locking = yes”选项的话,它会在每次读写时生成锁定调用。
你还可以使用“locking = no”完全禁止记录锁定。用于那些不支持或不需要锁定的共享项(如cdrom)。此时,Samba会向客户端返回一个伪造的代码。
第二种锁定叫“拒绝模式”。它是在应用程序打开文件并决定允许的访问类型时设置的。客户端可以请求的模式有DENY_NONE、DENY_READ、DENY_WRITE或DENY_ALL。另外还有特殊兼容模式DENY_FCB和DENY_DOS。
在那些负载沉重的、执行共享模式代码很慢的服务器上,可以用“share modes = no”选项禁止共享模式。如果你的操作系统支持的话,可以使用共享内存加快共享模式的执行,详情参见Makefile文件中的FAST_SHARE_MODES选项。
1.10.6. 映射用户名
要映射PC及UNIX服务器的用户名,可以去看一下smb.conf中“username map”选项。详情参见smb.conf的手册页。
1.10.7. 其它字符集
如果文件名使用重音字符(如德语、法语或斯堪的纳维亚语)有问题,那么最好去看一下smb.conf中的“valid chars”选项以及examples目录中的validchars软件包。
Chapter 2. Samba 2.x中的LanMan和NT口令加密
2.1. 介绍
Samba兼容LanManager和Windows NT口令加密。
本文描述了SMB口令加密算法的工作原理,并给出了建议,请仔细阅读。
2.2. 工作原理
LanManager加密与UNIX口令加密稍微有些相似。SMB服务器使用一个存放用户口令散列值的文件,该文件的建立过程为:取得用户的明文口令,将首字母转为大写,然后要么截短到,要么用空字节补足14个字节长。然后把这14个字节值作为两个56位的DES密钥,用来产生出一个‘魔术’8字节值,最后形成一个16字节的值,并由服务器及客户机保存,这就是“散列口令”。
Windows NT的加密机制就更高级了,它对用户口令的Unicode码进行MD4散列运算,而且也产生一个16字节的不可逆散列值。
当客户端(LanManager、Windows for WorkGroups、Windows 95或Windows NT)要装载一个Samba驱动器(或使用Samba资源),就先发出一个连接请求并与服务器协商要使用的协议。Samba服务器在回复时产生一个8字节的随机值(这个值称为“质询”),并把它发回客户端,然后再保存起来。注意,对于每个连接其质询都是不一样的。
然后,客户端对上述16字节散列口令再加上5个空字节,把结果作为三个56位的DES密钥,再用这三个密钥去加密8字节的质询值,最后形成一个24字节的“响应”值。
客户端通过SMB调用SMBsessionsetupX(当选用用户级安全时)或SMBtconX(当选用共享级安全时)把响应值发给Samba服务器。当使用Windows NT协议级时,用户口令的散列值与响应值都要经过上述的计算,并通过SMB调用发给服务器,所以就有两个24字节的值。
Samba服务器用自己保存的16字节散列口令值(从smbpasswd取得,该文件在后面描述)和质询值重复以上计算,然后检查计算结果与客户端提供的24字节值是否匹配。如果匹配,那么允许客户端进行访问,否则拒绝访问。
注意,Samba服务器不了解也不保存用户口令的明文值 - 只是用它来进行加密。同样,这个明文口令或散列值也不在网络上传输,这样就增强了安全性。
2.3. 重要的安全性说明
从表面上看,UNIX和SMB的口令加密技术很相似,其实区别很大。在UNIX中,登录时通常通过网络发送明文口令,这很糟糕。而SMB加密机制虽然不通过网络发送明文口令,但它把16字节散列值保存在磁盘上,这也很糟糕。原因何在?因为该16字节散列值与“口令”等价:虽然不能从它那里得到用户的口令,但可以把它们用在一个经过修改的客户端程序中,以便访问服务器。虽然这需要一定的攻击技术,但却是完全可能的。所以请妥善保护smbpasswd。
当然了,理想的情况是,我们希望既不在网络上也不在磁盘上操作明文口令。遗憾的是这不可能,因为Samba要与其它SMB系统(Win、WfWg、Win95等)保持兼容。
警告
注意,Windows NT 4.0 Service pack 3改变了缺省的验证机制,不再在线发送明文口令。解决方法是,要么让Samba使用加密口令,要么编辑NT的注册表,重新允许使用明文口令。详情请参见WinNT.txt文档。
具有同样情况的微软操作系统还有:
安装了基本网络重定向功能的MS DOS Network client 3.0
更新了网络重定向功能的Windows 95
Windows 98 [se]
Windows 2000
注意:当前,微软所有的SMB/CIFS客户端都支持通过SMB质询/响应机制进行验证。允许使用明文口令并不会禁止客户参与加密验证的能力。
2.3.1. SMB加密的好处
不通过网络传送明文口令。使用网络嗅探器无法记录传输的口令。
NT必须使用SMB加密口令同服务器进行通信。如果该服务器还在使用用户级安全模式,它会拒绝浏览服务器。它在每次连接时坚持要用户输入口令,当然这很烦人,而唯一的解决方法就是使用SMB加密。
2.3.2. 非加密口令的好处
明文口令不保存的磁盘上。
可以使用与其它UNIX服务一样的口令,如login和ftp。
你可能已经使用了发送明文口令的其它服务(如telnet和ftp),所以多加一个也无关紧要。
2.4.smbpasswd文件
为了使Samba使用上述那些协议,必须查找用户名的16字节散列值。不幸的是,由于UNIX口令值也是通过散列功能来实现的,因此必须使用一个单独的口令文件smbpasswd存放这个16字节值。同时使用两个口令文件就应该避免同步问题。你可以用一个叫mksmbpasswd.sh的工具从UNIX的/etc/passwd文件产生一个smbpasswd文件,如:
$ cat /etc/passwd | mksmbpasswd.sh > /usr/local/samba/private/smbpasswd
如果你使用了NIS系统,就用:
$ ypcat passwd | mksmbpasswd.sh > /usr/local/samba/private/smbpasswd
我们把mksmbpasswd.sh程序放在Samba包的source目录中。而smbpasswd文件缺省情况是保存在以下目录的:
/usr/local/samba/private/smbpasswd
这里的/usr/local/samba/private/目录应该属于root,并且它的权限应是0500(chmod 500 /usr/local/samba/private)。
同样,这个目录里的smbpasswd文件也应属于root,且具有权限0600(chmod 600 smbpasswd)。
smbpasswd文件的格式如下(这里已被换行,在文件中应该是每项占一行):
username:uid:XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX:XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX:[Account type]:LCT-<last-change-time>:Long name
其中,Samba只使用username、uid、XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX、[Account type]和last-change-time这几项。
这里XXX段中两个冒号‘:’之间的32个‘X’字符极其重要,如果冒号间的字符不足32个,那么Samba对该账号的验证将会失败。其中第一个XXX段用于Lanman口令散列,而第二个则是Windows NT版本。
这个口令文件在建立时,所有用户的口令都是有32个‘X’字符。这样就禁止了用户对服务器的访问。当用户设置了口令后,‘X’字符改变为32个ascii十六进制值,用来表示其口令的16字节散列值。
要把用户口令设为空的话(不推荐),可以用vi编辑该文件并用“NO PASSWORD”这样的ascii文本替换头11个字符(不带引号)。
例如,把bob的口令清除之后,他的账号项应该如下:
bob:100:NO PASSWORDXXXXXXXXXXXXXXXXXXXXX:XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX:[U ]:LCT-00000000:Bob's full name:/bobhome:/bobshell
如果你想让用户用smbpasswd命令设置他们自己的口令,就可以用NO PASSWORD来初始化他/她的口令项,这样他们在更改新口令时就不必输入旧口令了(不推荐,这不安全)。不过,必须让用户不提供口令也可以用smbpasswd程序连接到smbd进程,为此,你只要在smb.conf文件的[global]段中加入以下内容:
null passwords = yes
更安全的做法应该是为用户分配一个缺省口令而不是采用上述方法。
注意:要小心保护smbpasswd文件。如果有人可以接触这个文件,那他(具有足够的协议知识)就可以访问你的SMB服务器(要有足够的协议知识)。
2.5. smbpasswd命令
使用smbpasswd命令可以维护smbpasswd文件中的两个32字节口令字段。我们通常把它安装在/usr/local/samba/bin/目录中(或者你的主Samba二进制程序目录)。
注意,在Samba 1.9.18p4中,不要把这个程序配置为可以setuid到root身份(新版smbpasswd代码已经限制这个操作,不用担心会被意外地按这种方式运行)。
现在,smbpasswd程序以客户机/服务器模式工作,它作为客户端连接本地smbd,然后更改用户口令。所以,它就有下面这些优点:
smbpasswd不再被setuid到root身份 - 消除了大部分的安全问题。
现在,smbpasswd可以更改Windows NT服务器上的口令(在更改NT域用户口令时只能将请求发给NT主域控制器)。
普通用户运行smbpasswd程序只要打:
$ smbpasswd
Old SMB password: <在此键入旧口令 - 如没有旧口令则打回车>
New SMB Password: <键入新口令>
Repeat New SMB Password: <重复输入>
如果旧口令输入有问题,或者两个新口令不匹配,就无法更改口令。
如果是以普通用户调用该程序,只能更改其自身的Samba口令。
如果是以root用户运行,就可以使用选项来指定要更改口令的用户。注意,smbpasswd不会提示或检查旧口令,因此可以用它来为忘记口令的用户重新分配口令。
对于熟悉UNIX的用户来说,smbpasswd的工作方法与使用passwd或yppasswd命令类似。
关于这个程序的详情请参见它的手册页。
2.6. 设定Samba支持LanManager加密
下面简要描述一下如何来设定Samba,使它支持LanManager加密:
先编译安装好Samba。
在smb.conf文件的[global]段中加入encrypt passwords = yes选项,打开口令加密功能。
在Makefile文件指定的目录(--prefix=<dir>)中建立一份原始的smbpasswd口令文件。参见前面smbpasswd文件部分的详情。
提示,完成之后可以用smbclient工具来测试一下。
Chapter 3. 在Samba中配置微软分布式文件系统树
3.1. 介绍
使用分布式文件系统(DFS)可以把用户查看的文件、目录的逻辑视图与相应网络资源的物理位置隔离。它具有更高的可靠性、更透明的存储扩展性以及负载均衡等特点。有关DFS的详细资料可以在微软文档中找到。
本文描述了如何使用Samba在UNIX主机中实现分布式文件系统树(用支持DFS的客户端进行连接)。
要打开DFS功能,可以用--with-msdfs选项对Samba进行配置,当编译完成后,可以在smb.conf文件中设置全局选项host msdfs使Samba成为DFS服务器。然后再使用共享选项msdfs root指定一个共享项作为DFS根目录,这个目录用符号链接的形式来连接其它服务器。例如,在根共享目录中有一个符号链接junction->msdfs:storage1\share1,它表示一个DFS结点。当支持DFS的客户端访问这样的结点链接时,就会被重定向到实际的存储位置(在此例中为\\storage1\share1)。
Samba的DFS系统可以同所有支持DFS的客户端(从Windows 95到2000)一起工作。
以下举例说明如何把Samba设置为DFS服务器。先建立如下这样的smb.conf文件
[global]
netbios name = Samba
host msdfs = yes
[dfs]
path = /export/dfsroot
msdfs root = yes
在/export/dfsroot目录中,我们设置一些指到其它网络服务器的DFS链接。
root# cd /export/dfsroot
root# chown root /export/dfsroot
root# chmod 755 /export/dfsroot
root# ln -s msdfs:storageA\\shareA linka
root# ln -s msdfs:serverB\\share,serverC\\share linkb
你应该为DFS根目录设置一定的权限,这样,只有指定的用户才能建立、删除或修改DFS链接。另外还要注意,符号链接名应该全部用小写。通过这样的限制,Samba就不会对链接名尝试所有的大小写组合形式。最后,设置符号链接使其指向需要的网络共享,然后重启Samba。
在支持DFS的客户端,用户可以通过\\samba\dfs来浏览服务器上的DFS树。当访问linka或linkb(客户端显示的目录)时,就会立即转到相应的网络共享之上。
3.1.1. 说明
如果Windows客户端已经装载的非DFS共享现在被用作了DFS根目录的话,就需要重新启动,反之亦然。其实,你应该用一个新的共享项作为DFS根目录。
当前,DFS符号链接名必须全部使用小写字母。
出于安全目的,作为DFS根的目录应该设置合适的权限,只允许指定的用户修改目录中的符号链接。
Chapter 4. Samba 2.2.x中的打印支持
4.1. 介绍
在2.2.0版本中,Samba使用MS-RPC(例如SPOOLSS命名管道)实现了本地Windows NT打印机制。以前的版本只支持LanMan打印调用。
新的SPOOLSS还提供了以下的额外功能:
根据需要,支持Windows 95/98/NT/2000客户端下载打印机驱动程序。
使用Windows NT添加打印机向导(APW)或Imprints工具包(参考http://imprints.sourceforge.net)上传打印机驱动程序。
支持本地MS-RPC打印调用,如StartDocPrinter、numJobs()等等(关于Win32打印API的详情请参考MSDN文档http://msdn.microsoft.com/)。
支持打印对象的访问控制表(ACL)。
通过使用内部信息数据库来保存脱机任务信息,更好地支持打印队列操作。
注意,Windows NT/2000客户端要求Samba服务器为打印机分配一个合法的驱动程序。为此,就要考虑支持MSRPC打印调用以;而Windows 9x客户端无须Samba主机安装打印机的驱动程序。而且,Samba也不使用这些驱动程序来处理假脱机文件,驱动程序完全是客户端使用的。
4.2. 配置
[print $] 与 [printer $]
在以前的版本中,Samba推荐使用一个名为[printer $]的共享,它来自于Windows 9x共享打印机时所创建的printer $服务。Windows 9x打印服务器总是用这个printer $服务来让用户不用口令就可以下载打印机驱动程序。
另外,在那些版本中还有两个与此有关的选项:printer driver location、printer driver。前者用于指定保存打印机驱动程序的目录,后者定义打印机驱动程序名。
现在它们已被忽略,所以请别再用了。关于如何进行更新,请参考移植部分。
4.2.1. 建立[print $]项
为了上传打印机驱动程序文件,你必须先配置共享项[print $]。注意,它的名称很重要(print $是Windows NT打印服务器用来提供打印机驱动程序下载的服务项),别写错了。你可以参考一下下面这个例子(当然,有些选项值,如‘path’是任意的,可以用适当的值进行替换):
[print $]
path = /usr/local/samba/printers
guest ok = yes
browseable = yes
read only = yes
; 由于把它配置为只读,所以需要一个‘write list’。检查文件
; 系统权限以确保该账号可以向这个共享拷贝文件。如果这个账号
; 不是root账号,则应该作为‘printer admin’。
write list = ntadmin
使用write list选项可以让指定的用户具有写权限,这样他/她就可以在这个共享中更新文件。配置文件共享的详情请参见smb.conf(5)手册页。
guest ok = yes这个选项的取舍取决于你的站点是如何配置的。如果Samba服务器上的每个用户都有账号,就无须使用了。
作者注:无须使用的含义是,如果所有的Windows NT用户都可以通过Samba服务器进行验证(这说明域用户及NT本地用户已经可以通过域控制器进行验证),那么guest访问是不必要的。当然,如果你没有禁止某些用户访问服务器,同时也没有安全方面的顾虑,还是可以放心使用这个功能的。要禁止用户,可以在[global]段中加入map to guest = Bad User选项,不过在使用前最好彻底理解该选项的含义。--jerry
Windows NT打印服务器要支持多种客户端平台下载相应的驱动程序文件,必须在[print $]服务项中建立对应每一种平台的子目录,Samba也使用了这种方法。
你可以在[print $]共享项下为每一种希望支持的平台建立对应的子目录。
[print $]-----
|-W32X86 ; "Windows NT x86"
|-WIN40 ; "Windows 95/98"
|-W32ALPHA ; "Windows NT Alpha_AXP"
|-W32MIPS ; "Windows NT R4000"
|-W32PPC ; "Windows NT PowerPC"
注意!需要权限
在当前版本中,要为samba服务器添加新打印机,必须满足以下两个条件中的任意一个:
向Samba服务器添加打印机的账号,其uid必须为0(如,root账号)。
向Samba服务器添加打印机的账号必须是printer admin列表中的成员之一。
当然,该账号还应该有权在[print $]子目录下添加文件。要记住,缺省情况下所有文件共享项都是‘只读’的。
当建立了所需的[print $]服务项及相关子目录后,只要在Windows NT 4.0客户端用root账号(或printer admin)登录到Samba服务器。选到Samba服务器的“打印机”文件夹中,这时应该就看到服务器定义的打印机共享列表。
4.2.2. 为现有打印机设定驱动程序
如上所述,Samba服务器打印机文件夹中的打印机列表还没有分配实际的驱动程序。但在缺省情况下,Samba会把驱动程序名设为“NO PRINTER DRIVER AVAILABLE FOR THIS PRINTER”。要是你试图查看打印机属性,就会得到如下信息:
Device settings cannot be displayed. The driver for the specified printer is not installed, only spooler properties will be displayed. Do you want to install the driver now?
在对话框中点击“No”后就会出现打印机属性窗口,这时有两种可选的方法来安装驱动程序:
点“New Driver...”按钮安装一套新的,或者
从已安装的驱动程序下拉列表中进行选择。最初该列表为空。
如果你要安装Windows NT x86以外的操作系统驱动程序,就要使用打印机属性对话框中的“Sharing”书签。(译者注:该书签中有一按钮为“Other Driver”)
如果你使用root账号连接到服务器,还可以在这个对话框中修改其它打印机的属性,如ACLs和设备设定。
最后还要说明一下,Windows NT打印服务器有可能会把并未共享的打印机列在打印机文件夹中。但Samba就不考虑这种情况了,根据定义,它只共享smb.conf文件指定的那些打印机。
另外还有一点很有趣,Windows NT客户机并不使用SMB打印共享,而宁愿使用MS-RPC直接打印到远程NT主机。当然,这要假定要打印的人在远程主机上必须有一定权限,Windows NT为打印机分配的缺省权限为:“Everyone”组可打印。
4.2.3. 支持大量打印机
在我们开发Samba 2.2的时候曾经出现过一个问题,那就是需要支持下载100台打印机的驱动程序。如果用Windows NT APW来实现的话就稍微有点麻烦了。要是多台打印机都共用驱动程序的话,就可以用rpcclient的setdriver命令对已安装的驱动程序进行关联。例如:
$ rpcclient pogo -U root%secret -c "enumdrivers"
Domain=[NARNIA] OS=[Unix] Server=[Samba 2.2.0-alpha3]
[Windows NT x86]
Printer Driver Info 1:
Driver Name: [HP LaserJet 4000 Series PS]
Printer Driver Info 1:
Driver Name: [HP LaserJet 2100 Series PS]
Printer Driver Info 1:
Driver Name: [HP LaserJet 4Si/4SiMX PS]
$ rpcclient pogo -U root%secret -c "enumprinters"
Domain=[NARNIA] OS=[Unix] Server=[Samba 2.2.0-alpha3]
flags:[0x800000]
name:[\\POGO\hp-print]
description:[POGO\\POGO\hp-print,NO DRIVER AVAILABLE FOR THIS PRINTER,]
comment:[]
$ rpcclient pogo -U root%secret > -c "setdriver hp-print \"HP LaserJet 4000 Series PS\""
Domain=[NARNIA] OS=[Unix] Server=[Samba 2.2.0-alpha3]
Successfully set hp-print to driver HP LaserJet 4000 Series PS.
4.2.4. 通过Windows NT APW添加新打印
缺省情况下,Samba在“打印机”文件夹中会提供smb.conf文件定义的所有共享打印机。同时,如果满足以下条件,就会在该文件夹中提供添加打印机向导的图标:
连接的用户可以用管理权限(如root账号或printer admin)调用OpenPrinterEx(\\server)。
指定选项show add printer wizard = yes (缺省值)。
要用APW在Samba服务器上添加打印机,必须定义add printer command选项,这个选项所指定的程序也必须可以用来向系统(例如/etc/printcap或相应的文件)及smb.conf添加打印机。
当客户端使用APW图标添加的共享打印机不存在时,smbd会执行add printer command并重新分析smb.conf文件,然后查找新的打印机共享。如果该共享还未定义,则向客户端返回“拒绝访问”出错信息。注意,add printer program是以连接的用户身份执行的,它并不需要root来执行。
另外还有一个附加选项delete printer command,可以用它来从“打印机”文件夹中删除打印机项。
4.2.5. Samba和打印机端口
Windows NT/2000打印服务器为每台打印机分配一个端口,通常是LPT1:、COM1:、FILE:等等。同样,Samba也必须支持打印机端口这种概念,但系统上缺省只有一个打印机端口,称为“Samba Printer Port”,这并不是一个真正的打印端口,因为只有Windows客户机才需要它。
注意,Samba并不支持“打印机缓冲池”这个概念,当一台逻辑打印机分配了多个端口时,缓冲池用作负载均衡或失败重试。
如果你需要定义多个端口,smb.conf文件中有一个enumports command选项,你可以用它指定一个外部程序,通过这个程序在系统上产生一列端口。
4.3. Imprints工具包
Imprints工具包提供了一套与Windows NT APW等价的UNIX程序。详情请参见Imprints的网站http://imprints.sourceforge.net/。另外,它的源代码发布包中有详细的文档可以参考,本节只简要介绍一下。
4.3.1. 什么是Imprints?
Imprints是一套工具包,它支持以下功能:
统一存储Windows NT及95/98的打印机驱动程序。
提供建立Imprints打印机驱动程序所必须的工具集。
提供了一套用于客户访问、安装远程Samba及Windows NT服务器打印机的程序。
4.3.2. 建立打印机驱动程序包
建立打印机驱动程序包的细节超出了本文的范围(详情请参见Samba发布包中的Imprints.txt文件)。简而言之,Imprints驱动程序包是一套含有驱动程序、相关INF文件及客户端安装所需之控制文件的压缩包。
4.3.3. Imprints服务器
Imprints服务器实际上是个数据库服务器,你可以通过标准HTTP机制对它进行查询。数据库中的每个打印驱动程序项都有一个相关的URL用于下载。而且每个包还附带GnuPG产生的数字签名,用这个签名就可以验证所下载包的真实性。建议“不要”禁止这个安全特性。
4.3.4. 客户端安装程序
Imprints客户端安装程序的详情请参见源代码包所含之Imprints-Client-HOWTO.ps文件。
Imprints客户端安装程序有两种形式:
一组Perl命令行脚本
一个基于GTK+的Perl命令行脚本的图形界面
用客户端程序可以查询Imprints数据库服务器已知的打印机型号,还可以下载并安装远程Samba和Windows NT打印服务器提供的驱动程序。
基本安装过程有四个步骤,并用smbclient和rpcclient对Perl代码进行了包装。
foreach (支持的打印机架构平台)
{
1. rpcclient: 取得远程服务器上的适当上传目录
2. smbclient: 上传驱动程序文件
3. rpcclient: 发送AddPrinterDriver() MS-RPC调用
}
4. rpcclient: 发送AddPrinterEx() MS-RPC调用,实际建立打印机
当在各种客户端平台上执行Imprints工具包时会遇到驱动程序名的问题。例如,Windows NT使用诸如“Apple LaserWriter II NTX v51.8”的驱动程序名,而Windows 95则使用“Apple LaserWriter II NTX”。
问题是,对于打印机来说,要更新的是哪一套客户端驱动程序呢。有经验的读者会记得Windows NT的打印机属性对话框只用一种打印机驱动程序名。可以看一下下面这个Windows NT 4.0系统的注册表项:
HKLM\System\CurrentControlSet\Control\Print\Environment
你会发现Windows NT总是使用NT的那一套驱动程序名,这当然没有问题,因为NT只查找现有的NT版驱动程序。但Samba没有这种特性,因此,当驱动程序还没有安装时,就不能只使用一种驱动程序名?
要解决这种问题,就需要使Imprints的打印机驱动程序包同时含有Windows NT和95/98的驱动程序,并且先安装NT的。
校对中……
4.4.从Samba 2.0.x向2.2.x迁移
在Samba 2.2中,打印机驱动程序的管理已经与以前的版本有所改变(我们希望有所改进),从你现有版本向2.2迁移可能会遇到象下面这样的问题。
一般说来,Windows系统具有一定的记忆功能。如果Windows NT客户端已连接过Samba 2.0服务器的话,它会记住这是一台LanMan打印服务器。而Samba2.2版本会尽可能支持MSRPC打印,当你升级以后,NT客户还是记住以前的设置。
要使用全新的MSRPC打印功能,先用下面的命令停掉客户端的假脱机服务,再删除[HKLM\SYSTEM\CurrentControlSet\Control\Print]中与打印服务器有关的注册键。
C:\WINNT\> net stop spooler
请小心操作注册表。
当删除了相应的注册表项之后,请用start替换掉刚才命令中的stop来重启假脱机服务。
另一方面,Windows 9x使用LanMan打印调用,无须进行任何修改操作。
警告
我们将考虑把以下的smb.conf选项作废掉,所以请不要在新的安装中再使用了。
printer driver file (G)
printer driver (S)
printer driver location (S)
在迁移过程中,你可能会面临如下的方案:
无须支持Windows NT打印机驱动程序,则只要使用现有的选项就可以了。
如果要支持NT打印机驱动程序,但却不想把9x驱动程序迁移到新服务器上,那么请保留现有的printers.def文件。当smbd在TDB中查找打印机的9x版驱动程序失败时,就会使用printers.def文件(及所有相关的选项)。make_printerdef工具仍会保持向后兼容,不过已经这属于那种老掉牙的工具了。
如果在Samba服务器上安装了打印机的Windows 9x版驱动程序,那么这套程序的优先级最高,上面那三个旧的打印选项将被忽略(包括printer driver location)。
如果要把现有的printers.def文件迁移到新服务器上,那么只能用Windows NT的APW来安装NT及9x驱动程序了。详情请参见smbclient和rpcclient的用法。另外在http://imprints.sourceforge.net/有Imprints客户端安装程序的示例。
Chapter 5. Samba 2.x中的security = domain选项
5.1. 把Samba 2.2添加到NT域
要把Samba服务器添加到NT域中,必须在PDC的域服务器管理器中加入它的NetBIOS主机名,这样就在PDC的域SAM中加入了它的机器账号。要注意的是,在添加时要把Samba服务器作为一台“Windows NT工作站或服务器”,而不是“主或备份域控制器”。
假定你要把一台名为SERV1的Samba服务器加入到NT域DOM中,而该域的主域控制器及两个备份域控制器分别名为DOMPDC、DOMBDC1和DOMBDC2。那么首先停掉所有的Samba后台进程,再运行以下命令:
root# smbpasswd -j DOM -r DOMPDC
如果运行顺利,则会得到以下信息:
smbpasswd: Joined domain DOM.
smbpasswd(8)的用法请参见其手册页。
在以后的发布版中,加入域时就无须事先在PDC上创建机器信任账号了。
通过上面这条命令,Samba服务器使用机器账号口令更改协议,把它的机器账号口令写到了一个文件中,并保存在存放smbpasswd文件的目录中,通常应该是:
/usr/local/samba/private
在Samba 2.0.x中,这个机器账号口令文件的名称形如:
<NT域名>.<Samba服务器名>.mac
.mac后缀代表这是一个机器账号口令文件。因此,根据上面的例子,这个口令文件应该名为:
DOM.SERV1.mac
而在Samba 2.2中,该文件已被TDB(Trivial Database)文件secrets.tdb所取代。只有root账号才拥有该文件,其它人皆不可读。它是系统采用域安全级时的关键所在,请仔细维护。
现在,还得编辑smb.conf(5)文件,以便使用域安全级。
在[global]段中修改(或添加)security =选项为:
security = domain
同时再修改workgroup =:
workgroup = DOM
它应该是待加入的域名。
另外还须设置encrypt passwords选项为yes,以便使用加密口令。
最后,添加(或修改)[global]段中的password server =选项指定口令验证服务器:
password server = DOMPDC DOMBDC1 DOMBDC2
Samba在进行用户验证时,会依次使用这些主域和备份域控制器,所以如果要分散验证任务器的负载,可以根据需要改变这个列表的次序。
或者,用如下设置,这样smbd会在进行验证时自动检测域控制器:
password server = *
注:其实,在Samba 2.0.6中就已经有了这种同NT一样的工作机制。它使用广播或查询WINS数据库的方式来查找进行验证的域控制器。
最后,请重启Samba后台进程,客户就可以使用域安全级了。
5.2. Samba和Windows 2000域
很多人一直关心Samba与Windows 2000域的工作情况。现在,在混合模式或本地模式的Windows 2000域中,Samba 2.2已经可以作为其中的成员服务器了。
在上述的两种模式之间有很多令人混淆的地方。只有Windows NT备份域控制必须要处于相同域中时,才需要让Win2k域控制器以“混合模式”来运行。而缺省情况下,处于“本地”模式的Win2k域控制器仍支持常规客户端的NetBIOS和NTLMv1验证协议,这些客户端是:Windows 9x和NT 4.0。而Samba服务器的工作方式与Windows NT 4.0成员服务器类似。
把Samba 2.2添加到Win2k域的步骤与向Windows NT 4.0域中添加Samba服务器几乎是相同的。只是,NT 4的“服务器管理器”现在被换成了Win2k的“活动目录用户及计算机”。
5.3. 为什么比security = server选项更好?
现在,要使用Samba的域安全级,还是需要建立本地UNIX用户账号来代表连接服务器的那些域用户。也就是说,如果域用户DOM\fred 要连到你的域安全级Samba服务器,则在UNIX系统上需要一个本地账号fred来与之对应。这和以前的security = server安全模式很相似,在那种旧模式中,Samba服务器使用与Windows 95或Windows 98相同的方法把验证请求发往NT服务器。
Winbind paper中提到了关于为Windows NT域用户自动分配UNIX的uid和gid的内容。这种功能现在只有开发分支中才有,不过不久就会加入到发布版中的。
Samba服务器采用域安全级的好处在于,它可以象NT服务器一样来使用RPC通道传递验证。也就是说,它可以象NT服务器那样参与域信任关系(例如,可以把Samba服务器加到资源域中,然后通过该域的控制器把验证传递到账号域中的域控制器上去)。
另外,如果使用security = server的话,服务器上的每一个Samba进程都会在运行时保持对验证服务器的连接,这样就可能耗尽NT服务器的连接资源。而使用security = domain的话,Samba进程只在用户进行验证时才连接到PDC/BDC,完成之后就断开,因此节省了服务器的连接资源。
最后,使用与NT服务器一样的方式向PDC进行验证,可以使Samba服务器获得用户的鉴别信息,象用户的SID及其所属的NT组列表等等。在未来的版本中,Samba会这些信息来扩展一些功能,开发者把它称为“appliance”模式。在这种模式中,Samba将从PDC返回的用户验证信息中产生相应的UNIX的uid和gid,而无须再手工建立本地用户账号了,这样的话,在NT域环境中,Samba服务器真的可以算是即插即用了。请在将来的代码中留意该功能。
注意:本文中很多文字引用了LinuxWorld的文章Doing the NIS/NT Samba。
Chapter 6. 把Samba 2.2配置成主域控制器
6.1. 说明
注意,作者提示:本文是David Bannon的Samba 2.2 PDC HOWTO和Samba NT Domain FAQ的结合。
Samba 2.2之前的版本已实现了少量的Windows NT 4.0主域控制器功能。而2.2版还完成了下面这些功能:
Windows NT 4.0/2000客户进行域登录
在用户安全级中加入Windows 9x客户
从Samba主域控制器中接收Windows客户的用户及组列表
漫游用户设置
Windows NT 4.0风格的系统策略
但还有这些功能没有实现:
Windows NT 4域信任
Windows NT 4.0域控制器的安全账号数据库复制(如,Samba主域控制器与NT备份域控制器进行复制,或反之)
通过用户管理器向域中添加用户账号
实现Windows 2000域控制器功能(如Kerberos和活动目录)
请注意,在本文所描述的Windows 9x客户并不是域中的真正成员。因此,支持Windows 9x域登录风格的协议与NT4域登录是完全不同的,而且这个功能早就被正式支持了。
从Samba 2.2.0开始,正式支持了NT4风格的域登录,适用于Windows NT 4.0和Windows 2000 (包括SP1)客户。本文描述了把Samba配置成PDC所必须的步骤。开始之前请先确保它正常工作,否则请参考UNIX_INSTALL.html以及smb.conf(5)的手册页。
具体实现基本上分为两步:
配置Samba作为PDC
建立机器信任账号并把客户加入到域中来
另外还有一些次要的东西如用户配置、系统策略等。但这些并不是必须的,而且,这和Windows NT的网络概念是差不多的,这里只简单地提一下了。
6.2. 配置Samba域控制器
首先是服务器工作所必须的smb.conf选项,在此就不详细解释了,详情请参见smb.conf(5)的手册页。为方便读者,我们已经把这些选项链接到smb.conf中实际的描述上了(译者注:如果你是单独获得这个文件的,请把它放到html版的手册页目录中去)。
以下是实现PDC的样本配置文件:
[global]
; 基本服务器设定
netbios name = POGO
workgroup = NARNIA
; 成为域及本地主浏览器
os level = 64
preferred master = yes
domain master = yes
local master = yes
; 安全性设定(必须使用security = user)
security = user
; PDC必须使用加密口令
encrypt passwords = yes
; 支持域登录
domain logons = yes
; 指定保存用户配置的目录
logon path = \\%N\profiles\%u
; 指定用户的主目录及相应的映射盘符
logon drive = H:
logon home = \\homeserver\%u
; 为所有用户指定一个通用登录脚本并使用[netlogon]共享项的相对DOS路径
logon script = logon.cmd
; 域控制器必须的共享项
[netlogon]
path = /usr/local/samba/lib/netlogon
writeable = no
write list = ntadmin
; 存放用户配置的共享项
[profiles]
path = /export/smb/ntprofile
writeable = yes
create mask = 0600
directory mask = 0700
对上面的配置,有几点需要强调一下:
必须使用加密口令,工作原理请参见ENCRYPTION.html文件。
服务器必须支持域登录并具有[netlogon]共享项。
为了使Windows客户查找域控制器,Samba服务器必须成为域主浏览器。
由于Samba 2.2并未真正实现NT组账号和UNIX组账号间的映射(原因一言难尽),所以你应该参考smb.conf文件中的domain admin users和domain admin group两个选项来建立域管理员之类的账号。
6.3. 建立机器信任账号并把客户添加到域中
机器信任账号就是计算机账号。它的口令则是域控制器进行可靠通信所必须而且共享的机密。Windows 9x无法成为真正的域成员就是因为它不拥有机器信任账号,从而无法和域控制器协同工作。
机器信任账号的口令是保存在NT主域控制器的注册表中的。而Samba主域控制器则把它们与用户的LanMan和NT散列口令(通常是smbpasswd文件)保存在同一个目录中。但机器信任账号只使用NT散列口令。
要建立机器信任账号有两种方法:
在把客户加入到域之前,通过手工方式建立。如果用这种方法,那么这个机器信任账号的口令就是已知值 -- 小写的机器netbios名。
在客户加入到域时建立机器账号。如果用这种方法,就把用于添加客户的管理账号的会话关键字作为产生随机口令值的密钥。
为了产生Windows NT的SID,Samba需要让机器账号占有一个UNIX的uid,所以,所有机器账号都要在/etc/passwd和smbpasswd中有相应的项存在。在将来的版本中将无须在/etc/passwd中建立相应项。
在/etc/passwd文件中,机器账号的名称应该是机器名后加 $符号,而且没有口令、登录shell及主目录等项。例如名为‘doppy’的计算机的账号应该是:
doppy $:x:505:501:NTMachine:/dev/null:/bin/false
如果你使用手工方式来建立机器账号,那么必须先在/etc/passwd(或NIS口令表)中建立相应项,然后再用如下命令格式在smbpasswd文件中添加机器账号:
root# smbpasswd -a -m machine_name
其中的machine_name为计算机的netbios名。
此时,请马上把该计算机加到域中去。入侵者可以利用这种开放的账号访问域中的用户信息。
如果你用的是在客户机加入域时自动建立其机器账号这种方法,那么需要在smb.conf中使用add user script选项并为其指定适当的值。以下示例可用于RedHat 6.2 Linux系统:
add user script = /usr/sbin/useradd -d /dev/null -g 100 -s /bin/false -M %u
在Samba 2.2中,只有root账号才可以用这种方法来建立机器账号。因此在smbpasswd文件中还要root账号。但出于安全性考虑,最好为其另设口令,而不要使用同/etc/passwd中相同的口令。
6.4. 常见问题及错误
机器账号后无法添加‘ $’符号。
FreeBSD(和其它BSD系统)无法创建带‘ $’符号的用户名。上述问题只有在创建账号时才会遇到,而建立之后就该账号就可以正常工作。所以可以先创建不带‘ $’符号的用户账号,再用vipw编辑账号的用户名,在后面添加‘ $’。或者,索性使用vipw创建整个账号,但要注意必须使用一个唯一的uid!
在建立机器账号时系统提示“你已经连接到域中”。
这说明你在客户端使用了一个不合法的账号来为计算机创建机器账号。请先退出,关闭初始连接并用其它合法的用户账号再试试。
另外,如果你的计算机已是一个‘组成员’,而它所属的组名与要加入的域同名的话(真是个坏主意),也会得到这样的信息。只要更换工作组名,重启后再试就可以了。
系统提示“加入到域时出现错误,提供的信任与现有设置发生冲突”
这和上面提到的“你已经连接到域中……”是同一个问题。
“系统无法为你提供登录(C000019B)”
我已经顺利加入到域中,但在更换了Samba版本后,尝试登录时就得到这样的信息:“系统无法为你提供登录(C000019B),请再试一次或与你的管理员联系”。
这是因为,保存在private/WORKGROUP.SID文件中的域SID发生了改变。例如,你删除了这个文件,但smbd又自动再创建了一个;要么就是,你正在版本2.0.7、TNG和HEAD分支代码之间换来换去(不推荐这么做)。要解决这个问题只有一个办法,那就是恢复原始域SID信息,或者从域中删除该域客户并重新加入。
“该计算机的机器账号不存在或不可访问”
当我试着把客户机加入到域中时得到这样的信息,这是什么问题?
这说明PDC上没有与当前客户机相对应的机器账号。如果你是使用add user script选项来建立账号,那么这就表示这个脚本在工作时出了问题,所以必须确保域用户管理正常进行。
另外,如果你是通过手工方式来建立账号,那么这样的信息就说明建立的账号有问题。看一下/etc/passwd和smbpasswd文件中是否存在机器账号,并确保其账号名是客户机的netbios名后加一个‘ $’符号(如computer_name $)。另外,据说还有人发现,如果Samba服务器与NT客户机的子网掩码不一致,也会发生这样的问题,这样的话你应该知道怎么解决了吧。
6.5. 系统策略及配置文件
在Samba域中设置系统策略及漫游用户配置文件与在NT4域中是一样的。你应该阅读微软的白皮书Implementing Profiles and Policies in Windows NT 4.0。
这里有一些额外的资料:
什么是Windows NT策略编辑器?
要建立或编辑ntconfig.pol文件必须使用NT服务器策略编辑器poledit.exe,NT服务器版提供了这个程序。工作站版虽然也有一个策略编辑器,但不能用来建立域策略。此外,还可以在NT工作站/服务器上安装Windows 95的策略编辑器,但它无法以NT的方式来工作。然而,在工作站版中可以使用服务器版中的一些相应文件。所需的文件是poledit.exe、common.adm和winnt.adm,只要把两个*.adm文件放到c:\winnt\inf目录,程序会方便地进行查找。要注意的是inf目录是‘隐藏’的。
在Windows NT 4.0的Service Pack 3(及更高版)中也提供了NT策略编辑器。只要用servicepackname /x命令解开文件就可以了,如,对于service pack 6a就用Nt4sp6ai.exe /x。另外在Office97的策略样板文件及微软的零管理工具包中也可以找到该策略编辑器。
Win95可以执行策略吗?
只要在Win9x中安装组策略管理器就可以控制组策略了。该程序位于Win98光盘的\tools\reskit\netadmin\poledit目录中,双击grouppol.inf就可以完成安装。然后重复注册/登录数次来检查Win98是否执行了组策略。但每台Win9x主机都要安装一套,很麻烦。
如果你发现没有正常执行组策略,可以升级Win9x的grouppol.dll文件。而相应的组列表会从服务器的/etc/group中取得。
哪里有‘用户管理器’和‘服务器管理器’呢?
因为我没有购买NT服务器版的光盘,到哪里去找‘域用户管理器’和‘服务器管理器’?
微软发布了一套名为nexus的用于windows 95系统的工具,它包含了:
服务器管理器
域用户管理器
事件查看器
该工具可以从ftp://ftp.microsoft.com/Softlib/MSLFILES/NEXUS.EXE下载。
Windows NT 4.0版本的‘域用户管理器’和‘服务器管理器’可以通过微软的FTP站点ftp://ftp.microsoft.com/Softlib/MSLFILES/SRVTOOLS.EXE下载。
6.6. 其它可获得的帮助
在邮件列表、RFC和文档中可以获得很多资料。同Samba发布包随同提供的文档中对常见的SMB问题进行了很好地说明,如浏览问题等。
有没有用于调试域登录操作的诊断工具?
Samba本身就是最好的调试诊断工具了。你可以对smbd和nmbd使用-d选项来为它们指定一个调试等级。关于这个选项,可以参考这两个进程的手册页及smb.conf文件。其中,调试等级的范围是从1(缺省值)到10(用于调试口令)。
另外一个很有用的方法就是用gcc -g选项来编译Samba。这样就会在二进制程序中包含调试功能,你可以用gdb连接到正在运行中的smbd/nmbd进程中。要把gdb连接到一个为NT工作站提供服务的smbd进程,首先要在工作站那一端建立连接,在登录时选择进入到域中,这样就会产生‘LsaEnumTrustedDomains’。然后,让工作站保持这个打开的连接,这时会有一个相应的smbd进程处于运行状态中(假定没有把空闲超时设得太短),当你在工作站端输入口令时,服务器端就可以用gdb进行连接了。
其它值得研究的Samba命令:
testparam | more
smbclient -L //{服务器的netbios名}
在http://www.tcpdup.org/有一个tcpdump的SMB专用版。另外,可以在http://www.ethereal.com找到另一个用于UNIX和Win32主机的包嗅探器Ethereal。
要在Windows NT上进行监视工作,可以使用MSDN光盘、NT服务器版光盘或SMS光盘中提供的网络监视器(netmon)。SMS中提供的版本可以监视任意两个计算机(要把网络接口置为混杂模式)间的通信数据包。而NT服务器版光盘提供的版本只能监视本地子网中流向自已及广播地址的通信数据包。另外,要注意Ethereal可以读写netmon格式的数据文件。
如何在NT工作站或Win9x机器上安装‘网络监视器’?
在NT工作站上安装netmon可以按照以下的步骤进行,在这个例子中,安装的netmon版本是4.00.349,它来自Windows NT Server 4.0,并安装到Windows NT Workstation 4.0,但同时需要这两个版本的安装光盘。其它版本的netmon安装步骤类似。
首先需要在NT服务器版上安装‘网络监视工具和代理’:
点击‘开始’-‘设置’- ‘控制面板’- ‘网络’- ‘服务’- ‘添加’
选择‘网络监视工具和代理’并点击‘确定’
在网络控制面板上点击‘确定’
按提示插入Windows NT Server 4.0安装光盘
这样,netmon程序就保存在%SYSTEMROOT%\System32\netmon\*.*。其中还有两个子目录,captures\和parsers\,后者存放分析数据包必须的DLL库。
然后在工作站上进行安装:
点击‘开始’-‘设置’- ‘控制面板’- ‘网络’- ‘服务’- ‘添加’
选择‘网络监视工具和代理’并点击‘确定’
在网络控制面板上点击‘确定’.
按提示插入Windows NT Workstation 4.0安装光盘
现在,把NT服务器的%SYSTEMROOT%\System32\netmon\*.*拷到工作站的%SYSTEMROOT%\System32\netmon\*.*,并设置适当的权限。注意,在NT上运行netmon需要管理员权限。
如果为Windows 9x安装监视工具,需要从它的光盘上安装网络监视代理(\admin\nettools\netmon)。这个目录中还有一个readme文件,它介绍了安装步骤。
6.6.1. 链接及类似资源
Samba主站。在这里我们提供了离你最近的镜像站点!
Samba镜像站中的开发文档可能会提到你的问题。如果是这样的话,就说明开发者正在解决它。
看看Scott Merrill是如何来模拟备份域控制器的:http://www.skippy.net/linux/smb-howto.html。
在http://bioserve.latrobe.edu.au/samba中,David Bannon维护了一篇把2.0.7作为PDC的文章。
在http://samba.org/cifs/中有其它关于CIFS的信息。
在http://mailhost.cb1.com/~lkcl/ntdom/中有关于UNIX上的NT域的内容。
早期SMB规范:ftp://ftp.microsoft.com/developr/drg/CIFS/
6.6.2. 邮件列表
如何从邮件列表中获得帮助?
Samba有许多相关的邮件列表。请到http://samba.org选择离你最近的镜像站点,然后选Support栏中的Samba related mailing lists。
与Samba TNG有关的问题请到http://www.samba-tng.org。但请不要把这类问题发到Samba的主列表中去。
在使用邮件列表时请遵循以下规则:
记住,开发者是志愿工作者,他们没有任何收益,也不保证其观点百发百中,通常也只能算是最佳建议而已。
尽可能提供你所使用的Samba及操作系统的版本,还有smb.conf的有关部分,至少要给出影响PDC功能的[global]段中的选项。
如果你是通过CVS获得代码的,那么除了代码版本之外,还应提供最后一次刷新的日期。
请尽量简单厄要地表达问题,不要用html格式来发送邮件。
不要讨论无关的问题。
不要交叉投递,请选择最合适的列表进行提问。很多人都订阅了多个列表,他们讨厌过多地看到同一话题。如果有人看到某个问题更适合其它列表,会帮你转发过去的。
如果要讨论一个调试方面的问题,请不要把整个记录都发上来,提供相应的出错信息足矣。
如果你有一个完整的netmon跟踪信息(从打开管道到出错),那么就把*.cap文件发上来吧。
在邮件中夹带附件请三思而后行,最好只提供相关的部分。要知道Samba的邮件列表有大量的订阅者,不是每个人都希望收到一份smb.conf的。
如何取消邮件列表?
要退订请去当初订阅的地方看看:http://lists.samba.org,或者看一下这里。请不要在邮件中询问如何退订。
6.7. DOMAIN_CONTROL.txt:Samba & Windows NT域控制
该附录的原作者为Samba开发小组的John H Terpstra。
注意:“域控制器”和那些与之相关的术语同属于一种特殊验证方法,这种方法是建立SMB域的基础。在Windows NT Server 3.1之前,各家公司都单独开发了域控制器,并各自对LAN Manager 2.1协议进行了扩展。Windows NT则使用了微软自己的方法来分发用户验证数据库。DOMAIN.txt文件举例说明了Samba基于共享验证数据库机制参与或建立SMB域的方法,它和Windows NT的SAM是不同的。
Windows NT Server既可作为独立的文件和打印服务器,也可作为参与域控制的服务器(域成员、主域控制器或备份域控制器)。
OS/2 Warp Server、Digital Pathworks和其它类似产品在这方面的功能都很相似,它们都可以同Windows NT一起参与域控制。但只有那些含有兼容Windows NT代码的服务器才可以作主域控制器(如Windows NT Server、Advanced Server for Unix)。
对很多人来说这些术语实在是太令人混淆了,所以让我们来解释一下。
每个Windows NT系统(工作站或服务器)都有一份注册表数据库。该注册表含有所有在NT环境中运行的服务(与UNIX的后台进程类似)的初始信息。同时,注册表还包括应用程序所需动态库的位置。其实,它囊括了系统运作所需的全部信息。
在任何Windows NT机器上,只要打开一个命令提示符并输入以下命令就可以找到注册表文件:
C:\WINNT\>dir %SystemRoot%\System32\config
其中的环境变量%SystemRoot%可以用下面的命令得到:
C:\WINNT\>echo %SystemRoot%
你需要了解的主要几个注册表部件就是这些文件:default、system、software、sam和security。
在一个域环境中,Windows NT域控制器会互相复制SAM和SECURITY文件,这样就保证了域中所有控制器数据的一致性。
Windows NT系统是由一种安全模式构成的,在这种模式中,所有待运行的应用程序和服务都必须先向安全管理器验明自身以获得所需的适当权限。而且NT的用户数据库也位于注册表中,这些数据包括用户的安全标识符、主目录、组成员资格、桌面配置等等。
每个NT系统(工作站与服务器)都有自己的注册表。参与域安全控制工作的NT服务器共享一套公有的数据库,而工作站及独立服务器则各自拥有一份完全独立的注册表数据库,在这一点上,这两种系统是有区别的。
NT的用户数据库称为SAM(Security Access Manager),使用它可以完成所有用户的验证工作,另外还有交叉验证(例如,确保用户请求的服务项根据用户的权限进行工作)。
Samba开发小组已经提供了一个工具,用来把NT的SAM转换为smbpasswd格式。该工具可以在离你最近的Samba镜像站的/pub/samba/pwdump找到,详情可以参见ENCRYPTION.txt文件。这个工具虽然很有用,但要用它把SAM复制到Samba系统上却并不那么容易。
在一个由配置好了的NT服务器所控制的安全域系统中,Windows for Workgroups、Windows 95和Windows NT Workstations/Servers都可以协同工作。每个这样的域最多只能有一台主域控制器(PDC);而每个域至少要有一台备份域控制器(BDC)。这些域控制器要互相复制SAM数据库,因此它们的注册表中都会有最新的SAM信息。
Chapter 7. 用Winbind在Windows NT与UNIX间进行统一登录
7.1. 概要
在异种计算机环境中通过统一登录来集成UNIX和Windows NT系统长期以来一直是人们追求的目标。我们向你推荐一个称为winbind的Samba组件来解决统一登录的问题。它在UNIX上实现了微软的RPC调用、可插式验证模块和名字服务切换,通过这些功能可以使NT域用户能在UNIX主机上以UNIX用户身份进行操作。本文对winbind系统进行了描述,解释了它所提供的功能以及配置和内部工作原理方面的问题。
7.2. 介绍
大家都知道UNIX和Windows NT系统使用不同的技术和方式来表示用户和组信息。这就使得集成这两种系统变得更加困难。
现在常用的方法之一,就是在两种系统上创建相同的用户账号,并使用Samba在两者之间提供文件和打印服务器。但是这种方法还不是很完美,因为在一大堆机器上维护账号是件麻烦事儿,而且在两种系统间使用两套口令既容易引起同步问题,又使用户感到很混乱。
于是,我们就把UNIX主机的统一登录问题划分成三个小问题来看:
获得Windows NT用户和组信息
验证Windows NT用户
为Windows NT用户更改口令
最理想的情况是,所使用的方法应该可以解决以上所有的问题,并且无须在UNIX主机上复制信息,也无须使系统管理员在维护这两种系统的用户及组信息时产生额外的负担。winbind系统提供了一套解决上述三个问题简单而漂亮的方案。
7.3. Winbind的功能
winbind把一台UNIX主机变成一个完全的域成员,这样就可以统一管理UNIX和NT上的账号了。这时,这台UNIX主机将可以查看NT的用户及组信息,就好象这些信息是UNIX本地的一样,同时,使用户可以在纯UNIX环境里象使用NIS+一样的来使用NT域。
最后实现的结果是,当UNIX主机向操作系统查询任何用户或组名时,该查询都会被发往指定域中的NT域控制器。因为winbind通过系统低层(使用C库中的NSS名字解析模块)重定向了该查询,而这对NT域控制器来说是完全透明的。
UNIX主机上的用户可以把NT用户及组名当作“本地”账号来用,还可以把文件的属主改成NT域用户,甚至可以用一个域用户的身份登录到UNIX主机并运行一个X-Window会话。
使用winbind要当心的唯一问题,就是用户名和组名使用DOMAIN\user和DOMAIN\group这样的形式,这是winbind所必须的,因为它要用这种形式来检测重定向查询的目标域控制器,并考虑信任域的问题。
另外,winbind还利用了可插式验证模块(PAM)通过NT域向任何使用PAM的应用程序提供验证服务。这就解决了系统间的口令同步问题,因为所有口令都保存在一个单一的位置上(域控制器中)。
7.3.1. 使用目标
winbind的服务目标是那些要把UNIX工作站或服务器加到现有NT域结构的机构。这些机构可以利用winbind在无须维护单独账号结构的情况下配置UNIX工作站,这就减少了向NT结构中添加UNIX工作站的管理费用。还有,使用winbind可以把基于UNIX的设备环境集成到基于微软系统的域结构中去。
7.4. winbind如何工作
winbind系统是按客户机/服务器结构设计的。一个持续运行的winbindd进程监听一个UNIX套接字,并等待请求的到达。这些请求是由运行NSS和PAM的客户机产生的,服务器按序对其进行处理。
下面详细描述winbind的实现技术。
7.4.1. Microsoft远程过程调用
在过去的两年中,Samba开发小组的各位成员已经对微软的远程过程调用系统(MSRPC)进行了分析!在Windows NT主机上,很多与网络有关的操作都使用了这套系统,如远程管理、用户验证以及打印假脱机。虽然,一开始对该系统的分析工作只是为了有助于在Samba中实现主域控制器功能,但是,同时又产生了大量有其它用途的代码。
winbind使用各种MSRPC调用来处理域用户和组信息,并以此获得个别用户或组的详细情况。MSRPC调用还可以用于验证NT域用户并更改它们的口令。winbind向NT主域控制器直接查询用户及组信息,并把这些NT的账号信息映射到UNIX的用户名和组名上。
7.4.2. 名字服务切换
名字服务切换(NSS)是很多UNIX操作系统所具有的功能。使用它可以从不同的资源中解析系统信息,如主机名、邮件别名和用户信息等。例如,单独的UNIX工作站可以从一系列保存在本地系统上的平面文件中解析系统信息;而网络工作站则可以先从本地文件中获得系统信息,再参考NIS数据库查询用户信息或从DNS服务器查询主机信息。
在解析UNIX用户名和组时,使用NSS应用编程接口的winbind就象一个系统信息源。而另一方面,它通过使用MSRPC调用获得NT服务器的信息,并使用上述接口提供一套新的账号信息表。使用这套标准UNIX库调用的好处是,只要在运行winbind的UNIX主机上查阅一次用户和组信息,就可以象在本地一样查看NT域及其受托域在内的所有用户和组信息。
NSS主要的控制都包含在/etc/nsswitch.conf文件中。当一个UNIX应用程序产生一个查询请求时,C库就会在该文件中查找与所请求之服务类型相匹配的行。例如,当查询用户和组信息时,就使用“passwd”这个服务类型。对指定服务类型的进一步查找则按其配置次序进行,例如,如果passwd配置行为:
passwd: files example
那么标准C库首先装入模块/lib/libnss_files.so,然后才是/lib/libnss_example.so。从这里可以看出,它会依次动态地进行装载,然后使用模块调用解析器功能来尝试对请求进行解析,完成之后就把结果返回给应用程序。
使用NSS接口,winbind可以很方便地与操作系统结合。我们要做的只是把libnss_winbind.so放到/lib/目录中,并在/etc/nsswitch.conf文件的适当位置添加“winbind”,到时候C库就会调用winbind去解析用户名和组名了。
7.4.3. 可插式验证模块
可插式验证模块(PAM)是一套对验证和授权技术进行抽象化的系统。使用PAM模块,可以为不同的系统应用指定不同的验证方法,而无须重新编译这些应用。另外,还可以使用PAM实现特殊的授权策略。例如,系统管理员可以限制用户在登录控制台时使用本地口令文件,在进行网络登录时使用NIS数据库。
winbind使用验证管理和口令管理这两种PAM接口把NT用户集成到UNIX系统中。这样,NT用户就可以由合适的主域控制器进行验证,然后登录到UNIX主机中,之后,这些用户就可以更改他们的口令,并使更改立即在主域控制器上生效。
PAM的一组配置文件位于/etc/pam.d/,它们用于各种验证服务。当应用程序产生一个验证请求时,PAM代码就会查找这些配置文件,以便决定按什么样的次序装载哪些模块来执行验证核查。利用PAM的这种多接口形式可以很方便地为winbind添加新的验证服务。只须把pam_winbind.so模块拷贝到/lib/security/目录中,并更新配置文件,使相关的服务通过winbind来进行验证。详情请参考PAM文档。
7.4.4. 用户及组ID的分配
当在Windows NT中建立一个用户或组账号时,系统就为之分配一个数字关系符(RID),而UNIX则在一定的数字范围内使用合适的值产生uid和gid。winbind要做的就是对这两种标识符进行互相转换,它在UNIX系统可用的uid和gid范围中寻找可用于保存NT用户和组账号的值。当首次解析NT用户时,就把该范围内可用的下一个uid值分配给他,对于解析组账号也是同样操作。今后,winbind就可以把NT账号完全映射到UNIX账号了。winbind把映射结果保存在tdb数据库中,保证了映射操作的可靠性。
7.4.5. 缓存结果
持续运行的系统会产生大量的用户及组账号查询。为了使这些查询不影响网络流量,winbind使用了一种缓存机制,这种机制是基于PDC所提供的SAM序列号的。winbind把PDC返回的用户及组账号信息和序列号一起缓存起来,只要修改了用户或组账号信息,NT就会把对应的序列号增值,如果winbind发现一个缓存过的序列号过期了,就再向PDC发出请求,并把返回结果与缓存项进行比较,如不匹配,就丢弃缓存信息,直接向PDC要求更新。
7.5. 安装及配置
安装winbind最简单的方法就是使用Samba镜像站提供的工具包了,它位于站点的pub/samba/appliance/目录中。这些工具包向你提供了处于snapshots阶段的Samba源代码,以及具备完整功能的winbind二进制程序。由于winbind需要少量的Samba_TNG代码,而Samba_TNG还处于开发阶段,因此安装起来就要比普通的Samba版本稍微复杂一点。
完成安装之后最好读一下winbindd(8)手册页,它提供了完整的配置信息及配置样本。
7.6. 限制
在当前版本中,winbind还存在一些限制,我们希望在将来的版本中克服这些限制:
winbind现在还只有Linux版,当然要把它移植到其它操作系统是完全可能。要实现这样的目标,需要其它操作系统中的C库支持“名字服务切换”和“可插式验证模块”,而对大多数UNIX系统来说,这两样通常都是可以获得的。
winbind在对两种系统的标识符进行映射时并没有使用什么更好的算法,它是根据未映射的用户及组账号的次序来看的。如果包含映射信息的文件有问题或被破坏的话,它很难对其进行恢复。
现在,winbind的PAM模块还无法对NT用户设置的可登录工作站及登录时间限制进行记账。
在对winbind的源代码进行编译时要花很长时间,因为它要组合两个Samba分支的源代码。正在考虑的解决方法是,在主分支代码中提供所有必须的功能。
7.7. 结语
winbind系统通过使用“名字服务切换”、“可插式验证模块”以及适当的MSRPC调用向UNIX系统提供了对NT域用户的无缝集成,减少了使用混合系统的网络管理负担。
Chapter 8. UNIX权限位和Windows NT访问控制表
8.1. 用NT安全对话框浏览和修改UNIX权限
在Samba 2.0.4版本中提供了一个新的功能,可以让NT客户在NT上使用安全设置对话框来浏览和修改UNIX权限。但要注意的是,这并不影响运行Samba服务器的UNIX主机安全,它还是得服从Samba管理员所设置的文件权限。在Samba 2.0.4及以上版本中,我们已经把选项nt acl support的缺省值从false改为了true,所以缺省就允许了上述功能。
8.2. 如何浏览Samba共享项上的文件权限
在NT 4.0上,用鼠标右键单击Samba共享盘或UNC路径上的任何文件或目录,在弹出的下拉菜单底部选属性项,这时会打开文件属性对话框,而Samba 2.0.4会在其中添加一个新的书签:安全。在这一页中又有三个按钮:权限、审核、所有者。其中,审核按钮的使用权限取决于你的账号身份。而此时,对Samba共享项来说这个对话框并没有什么用处,因为添加这个有用的按钮现在还不能查看用户列表。
8.3. 浏览文件所有权
点击“所有者”按钮就可以看到所选文件的属主,属主名形如:
“服务器名\用户名 (长名)”
其中的服务器名为Samba服务器的NetBIOS名,而用户名则是拥有该文件的UNIX用户名,后面的(长名)是该用户的描述信息(通常取自口令数据库的GECOS字段)。
如果你把选项nt acl support设为false的话,那么显示的文件属主就是NT用户“Everyone”。不过你现在还无法更改文件属主,因为这是属于root才能做的特权操作。
Samba开发小组的Jeremy Allison写一套NT的安全库,它叫做Seclib。NT上的用户可以使用它以管理员权限连接到Samba 2.0.1服务器,然后作为root身份更改本地NTFS文件系统、远程NTFS文件系统或Samba共享盘上的文件属主权。你可以在Samba主站的ftp上找到这套库。
8.4. 浏览文件或目录权限
使用“权限”按钮可以查看所选文件或目录的权限及unix属主。显示的属主格式为:
"服务器名\用户名 (长名)"
这些名词的含义与上面提到的那个一样。如果你把选项nt acl support设为false的话,那么显示的文件属主就是NT用户“Everyone”,而对应的权限则是“完全控制”。
文件和目录所显示的权限信息是不一样的,下面分别来介绍一下。
8.4.1. 文件权限
Samba把标准UNIX权限中的“读”、“写”、“执行”映射到NT的三个ACL元素‘r’、‘w’和‘x’,以便分别对应NT权限。UNIX的其他人权限被映射到NT的全局组Everyone上,而UNIX的文件所有人及所在组的权限就对应到了NT的用户和本地组之上。
由于很多UNIX权限设置不能映射为NT常用的“读”、“更改”和“完全控制” ,所以在NT上显示这些权限时只能带上“特殊访问”的前缀词了。
那么在UNIX中,无权访问文件如何来表示呢?为使用户可以查看和修改“无权访问”,Samba把这它放到了NT的ACL属性“取得权限”(在UNIX中无意义)上,并向NT表示成“0”权限位,这也说明了没有权限。More details on the decision behind this will be given below.
8.4.2. 目录权限
NTFS文件系统有两种不同的目录权限设置。第一种是目录本身的ACL设置,通常在权限列表的第一个圆括号显示为“RW”这种形式。Samba把这种目录权限同上述的文件权限一样来处理。
第二种是“继承”权限,该目录中的任何文件都会在创建时继承它的权限。在UNIX中是没有这种概念的。Samba使用NT的ACL实现了这种继承权限,这样在Samba共享项中建立新文件时可以得到该共享的UNIX权限。
8.5. 修改文件或目录权限
要修改文件和目录的权限,只要在安全对话框中更改所显示的权限即可。但是,用户在操作标准Samba权限掩码时还是有些限制的,另外也要考虑DOS属性的映射问题。当然,如果你把选项nt acl support设为false,那么就无法设置权限了,你只能得到“拒绝访问”这样的信息。
首先要注意的是,你点击“添加”按钮之后,并不能获得Samba 2.0.4系统上的用户列表(你会得到“远程过程调用执行失败”这样的错误信息)。此时你只能对对话框中列出的现有权限进行操作,其实这也就够了,因为UNIX系统上只有这些权限。(译者注:我发现新版本2.2.0就可以得到用户列表了。)
如果你在NT安全对话框中删除了三组权限(用户、组或其他人)中的设置,那么就清除了UNIX系统上的相应权限位。当再次查看文件或目录的权限时,就会看到前面提到的那个“0”标志了。当然,你在这里可以改回原来的权限设置。
还有,UNIX只支持三个NT的ACL权限位“r”、“w”、“x”,所以Samba服务器将忽略那些其它的NT安全属性。
当你对目录设置权限时,权限列表的第二个圆括号中的权限会应用到该目录中的所有文件之上。如果你不希望产生这种效果,只要清除“替换已存在文件的权限”复选框就可以了。
如果要清除某一项权限,只要选择那一项点击“删除”按钮就可以了;或者把这它设为“取得权限”,这时NT会把该项显示为“0”。
8.6. 使用创建掩码选项
Samba 2.0.5向用户提供了四个新的创建掩码选项:
security mask
force security mode
directory security mask
force directory security mode
当用户在NT上更改远程文件的权限时,Samba就把它们映射为UNIX标准权限,并把它们与security mask选项的值进行比较,如果该选项没有把被更改权限所对应的那一位设为1,就忽略这一位的更改(标准UNIX权限有12位)。如果把该选项的某一位设为0,那么用户就不能更改这一位所对应的权限了。
如果你没有明确地这个选项,那么它的值就和create mask选项的值相同。如果想允许用户修改文件的所有权限(三个权限组),就把它设为0777就可以了。
接着,Samba把更改的权限再与force security mode选项进行比较,该选项值为1的那一位所对应的权限位将被强行置位为1。如果把该选项的某一位设为1,则用户修改的权限中所对应的那一位也总是被置位为1。
同上面一样,缺省该选项的值与force create mode选项相同。如果不想限制用户修改文件的所有权限(三个权限组),就把它设为000吧。
注意,在对更改请求使用这两个选项时是按上述的次序进行的。
而对于目录来说,Samba执行的操作也与文件类似,它使用的是directory security mask和force directory security mode 这两个选项。它们的缺省值分别与directory mask 和force directory mode的值相同。
Samba管理员可以使用这些方法对每个共享项进行权限设置,这样就可以限制用户对权限位的修改。
如果你希望允许用户完全控制一个共享项中的文件及目录权限,就不要打开强制选项,在smb.conf文件中按照下面这样来设置:
security mask = 0777
force security mode = 0
directory security mask = 0777
force directory security mode = 0
如前所说,Samba 2.0.4中的以下选项:
create mask
force create mode
directory mask
force directory mode
可以用于替换前面那四个选项。
8.7. 使用文件属性映射
Samba可以把文件的DOS属性映射为UNIX权限,但这会与安全对话框中设置的那些权限位造成冲突。
如果有一个UNIX文件,其拥有者对它没有读权限的话,在NT的标准属性对话框中会显示该文件为“只读”(译者注:有这种无聊的情况吗?)。当然,在这个属性对话框中,用户还是可以用上面提到过的“安全”书签把对文件的读权限改回来的,但如果在属性对话框中点击“确定”按钮,那么NT又会把文件属性变成只读(因为属性对话框中显示的还是“只读”嘛),所以只能用“取消”按钮来退出这个对话框使更改生效。
Chapter 9. OS2客户HOWTO
9.1. 常见问答集
9.1.1. 如何把OS/2 Warp Connect或OS/2 Warp 4配置成Samba的客户端?
完整的解决方案请参考:http://carol.wins.uva.nl/~leeuw/samba/warp.html。
基本上需要三个组件:
文件和打印客户程序(‘IBM Peer’)
TCP/IP (‘Internet支持’)
“NetBIOS over TCP/IP”驱动程序 (‘TCPBEUI’)
你可以参考Warp的使用手册来安装前两个组件。如果已装好了系统,现在要加入网络支持的话,在“系统设置”文件夹中选择“网络安装”就可以了。
不过,手册中没有提到如何安装“NetBIOS over TCP/IP”驱动程序。其实只要启动MPTS.EXE程序,点击“配置LAPS”,在“协议”中点击“IBM OS/2 NETBIOS OVER TCP/IP”,在“当前配置”行中点击“更改号码”,把0改为1,然后保存配置就可以了。
如果Samba服务器不在本地子网中,就要在“服务器名列表”中添加它们的IP地址和主机名;或者指定一台WINS服务器(IBM及RFC把它称为‘NetBIOS名字服务器’)。如果你使用的是Warp Connect,还需要把‘IBM Peer’更新到与Warp 4的相同的版本上。详情请参考上述网址。
9.1.2. 如何把How can I configure OS/2 Warp 3 (非Connect版)、OS/2 1.2、1.3或2.x配置成Samba的客户端?
从ftp://ftp.microsoft.com/BusSys/Clients/LANMAN.OS2/获得微软为OS/2客户免费提供的LAN Manager 2.2c Client程序,它的安装和使用方法请参考http://carol.wins.uva.nl/~leeuw/lanman.html。这里简单介绍一下,在安装这套客户端程序之前,编辑OS/2引导分区根目录中的\OS2VER文件,加入以下行:
20=setup.exe
20=netwksta.sys
20=netvdd.sys
另外,别用它提供的NE2000驱动程序,因为它有很多错误。请到ftp://ftp.cdrom.com/pub/os2/network/ndis/去找找吧。
9.1.3. 把OS/2(任何版本)作为客户端还有其它的问题吗?
当你使用NET VIEW命令或“文件打印客户资源浏览器”时,会看不到Samba服务器。http://carol.wins.uva.nl/~leeuw/samba/fix.html提供了一个解决方法。在更新的Samba版本中也会解决这个问题。它还修正了其它一些问题,如,从工作区把对象拖到Samba服务器时可以保持其长文件名。
9.1.4. 如何让OS/2客户下载打印机驱动程序呢?
首先创建一个叫[PRINTDRV]的共享项。把OS/2打印机的驱动程序文件(一定要用原始安装文件)拷到那个目录里。
接着在服务器上装好该打印机的NT版驱动程序,然后在smb.conf文件中加入选项“s2 driver map = 文件名”。而在后面指定的文件中用以下的形式把NT驱动程序名映射成OS/2的名称:
<NT驱动程序名> = <OS/2驱动程序名>.<设备名>
如:HP LaserJet 5L = LASERJET.HP LaserJet 5L
当然了,你可以在这个文件中对多个驱动程序进行映射。
注意,如果上述映射中没有指定设备名的话,第一次下载时OS/2系统会提示无法获得驱动程序文件,这时再试一下就可以成功了。解决的办法就是加上设备名罗!
译者注:由于译者从未使用过OS/2,对于此章的内容读者如有任何疑问请参考原文:Samba-HOWTO-Collection.html
Chapter 9. 中文翻译版致谢
在本文的翻译过程中,得到了Layman、Solobaby的大力支持,感谢他们在我绞尽脑汁的时候提供了最正确最严谨的建议! - 5/15/2001