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中,这个机器账号口令文件的名称形如:
..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客户机的子网掩码不一致,也会发生这样的问题,这样的话你应该知道怎么解决了吧。
-------------------------------------------------------------------------