Samba HOWTO (2)
时间:2007-02-17 来源:PHP爱好者
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的。
校对中……
php爱好者站 http://www.phpfans.net Linux|Apache|IIS.
用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的。
校对中……
php爱好者站 http://www.phpfans.net Linux|Apache|IIS.
相关阅读 更多 +