当前位置:Linux教程 - Samba - Samba计划文档

Samba计划文档

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: servernameservice

要打印的话:

C:WINDOWS> net use lpt1: servernamespoolservice

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 选项,不过这样一来所有的机器都必须具有相同的设定。不推荐使用范围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-: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=)中建立一份原始的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:storage1share1,它表示一个DFS结点。当支持DFS的客户端访问这样的结点链接时,就会被重定向到实际的存储位置(在此例中为storage1share1)。

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:storageAshareA linka

root# ln -s msdfs:serverBshare,serverCshare linkb

你应该为DFS根目录设置一定的权限,这样,只有指定的用户才能建立、删除或修改DFS链接。另外还要注意,符号链接名应该全部用小写。通过这样的限制,Samba就不会对链接名尝试所有的大小写组合形式。最后,设置符号链接使其指向需要的网络共享,然后重启Samba。

在支持DFS的客户端,用户可以通过sambadfs来浏览服务器上的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:[POGOhp-print]
description:[POGOPOGOhp-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系统的注册表项:

HKLMSystemCurrentControlSetControlPrintEnvironment

你会发现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打印功能,先用下面的命令停掉客户端的假脱机服务,再删除[HKLMSYSTEMCurrentControlSetControlPrint]中与打印服务器有关的注册键。

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中,这个机器账号口令文件的名称形如:

..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用户账号来代表连接服务器的那些域用户。也就是说,如果域用户DOMfred 要连到你的域安全级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 = %Nprofiles%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:winntinf目录,程序会方便地进行查找。要注意的是inf目录是‘隐藏’的。

在Windows NT 4.0的Service Pack 3(及更高版)中也提供了NT策略编辑器。只要用servicepackname /x命令解开文件就可以了,如,对于service pack 6a就用Nt4sp6ai.exe /x。另外在Office97的策略样板文件及微软的零管理工具包中也可以找到该策略编辑器。

Win95可以执行策略吗?

只要在Win9x中安装组策略管理器就可以控制组策略了。该程序位于Win98光盘的 ools eskit etadminpoledit目录中,双击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 etmon*.*。其中还有两个子目录,captures和parsers,后者存放分析数据包必须的DLL库。

然后在工作站上进行安装:

点击‘开始’-‘设置’- ‘控制面板’- ‘网络’- ‘服务’- ‘添加’

选择‘网络监视工具和代理’并点击‘确定’

在网络控制面板上点击‘确定’.

按提示插入Windows NT Workstation 4.0安装光盘

现在,把NT服务器的%SYSTEMROOT%System32 etmon*.*拷到工作站的%SYSTEMROOT%System32 etmon*.*,并设置适当的权限。注意,在NT上运行netmon需要管理员权限。

如果为Windows 9x安装监视工具,需要从它的光盘上安装网络监视代理(admin ettools etmon)。这个目录中还有一个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%System32config

其中的环境变量%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要当心的唯一问题,就是用户名和组名使用DOMAINuser和DOMAINgroup这样的形式,这是winbind所必须的,因为它要用这种形式来检测重定向查询的目标