original in fr Éric Seigne
fr to en Georges Tarbouriech
en to zh white-cn
我为自由软件世界和其他一些软件工作,使用诸如PostGreSQL,MySQL以及PHP开发一些应用程序,用于web数据库访问。为了能够保证某些工作上的自由(比如有时候能够做一些其他工作,象开始新的C项目之类),最近我开始着手做一些自己的东西。更糟的是,我-仍然-是ABUL的成员www.abul.org(而且我还没有交会费)。
I work for the free software world and among others, I develop applications for web database access using tools such as PostGreSQL ,MySQL et PHP. To keep some freedom in my way of working (to be able to do another job from time to time... like starting a new C project) I recently started to set up my own business. To make things worse, I am -still- an ABUL member www.abul.org (and I have not yet paid my subscription!).
我将会尝试介绍给大家我们已经完成的工作:以Linux-samba服务器实现一个用作Windows网络的域控制器。
用户权限管理,profile....将会被详细介绍。
本文以Debian GNU/Linux 2.2 为基础,因此默认的smb.conf文件可能和你的文件有一些小的出入。
下面用的的samba版本号是2.0.7
首先我们假定你知道一点儿samba,而且它已经安装到你的server上头了。
如果没有,快速安装的方法是:
Debian: apt-get install samba
RedHat(Mandrake): rpm -vih /mnt/cdrom/RedHat(Mandrake)/RPMS/samba*
Samba使用单个的配置文件,这个文件里面你可以找到一些象这样的标记块: [global]
samba只有一个配置文件! |
<minimalist smb.conf file> [global] printing = bsd printcap name = /etc/printcap load printers = yes guest account = pcguest log file = /usr/local/samba/log.%m [tmp] comment = Temporary file space path = /tmp read only = yes public = yes </file> |
如果你用这个配置文件来运行samba,在你的局域网上头,那些windows机器就可以在他们的网络邻居里面发现一个叫做(你的linux机器的名字)的机器共享了一个temp目录出来,而且可以写入。
注意:一旦你更新了samba配置文件,你必须要通过使用/etc/init.d/samba restart (debian)来重起你的samba。
首先我们来看看这些参数:
指定netlogon在哪里。
用户profile文件部分。
用户Home目录。
变量 | 说明 |
客户端变量 | |
%a | 客户端体系: 比如: Win95, WfWg, WinNT, Samba ... |
%I | 客户端IP地址 |
%m | 客户端NetBios名 |
%M | 客户端DNS名 |
用户变量 | |
%g | 用户%u 主要组 |
%H | 用户%u home 目录 |
%u | Unix 当前用户名 |
共享变量 | |
%P | 当前共享的根目录 |
%S | 当前的共享名 |
服务器变量 | |
%h | Samba服务器的DNS名字 |
%L | Samba服务器的Netbios名字 |
%v | Samba版本 |
其他变量 | |
%T | 当前日期和时间 |
使用这些变量的例子:如果你的网络内有一些机器分别运行windows 3.11和windows98,你可以创建两个配置文件,为每种系统使用一个,那么可以使用%a变量。
<smb.conf file>
[global]
printing = bsd
printcap name = /etc/printcap
load printers = yes
guest account = nobody
invalid users = root
; 改掉它的netbios名
netbios name = pantoufle
; 它监听的网络
; (你不需要他在另外一个网络上面也进行服务,因为那个是因特网联接)
interfaces = 192.168.0.1/255.255.255.0
; security user表示每个用户都必须在这个server上面拥有一个Unix账号
security = user
; 这个机器属于哪个工作组
workgroup = rycks
; 服务器的简单说明,当察看细节的时候可以看到
; %h 是服务器的DNS名字,%v samba的版本号
server string = %h server (Samba %v)
; 我们使用samba自己的log文件,不仅仅使用syslog
syslog only = no
; 至少重要的信息应当写到syslog去,
; 其他信息会写到 /var/log/smb(nmb)/
syslog = 0;
; 嗯,调整一下性能!
socket options = IPTOS_LOWDELAY TCP_NODELAY \
SO_SNDBUF=4096 SO_RCVBUF=4096
; 使用加密过的口令哦,注意了,
; 每个W95客户端都要打上 MS SMB 安全补丁。
; NT4 必须打上 SP3 或者更高补丁
; 我不记得W3.11的情况了:很有可能它并不支持加密口令 :(
encrypt passwords = yes
; 这个server同时也是WINS 服务器。
; WINS 允许两个网络使用不同的ip段
; (比如 192.168.0.0/255.255.255.0 和 192.168.0.1/255.255.255.0)
; 互相察看"另外" 网络的共享资源,一旦网关gateway激活。
wins support = yes
; OS 级别。比如我们的server是域控制器,本地登录,诸如此类
; 如果网络里面有一个NT服务器的话,我们的级别应该"更高" 。
os level = 34
; 域管理
domain master = yes
local master = yes
preferred master = yes
; 域连接管理
domain logons = yes
; 当有用户登录时,运行什么脚本?
; %g 指向用户所在的主要组
logon script = %g.bat
; 在什么地方可以找到我们的脚本?
; %L 是samba服务器的netbios名
logon path=\\%L\netlogon
; 在什么地方存放用户的profile?
; %U 用户的登录名
logon home=\\%L\%U\winprofile
; 以何种方式检查资源以查找该机器名字?In which order check the resources to find
; the name of a machine?
; 注意,不象windows在正常的基础上就发送广播,我们的广播是最后进行。
name resolve order = lmhosts host wins bcast
; 是否Samba必须用DNS proxy的方式运作?
dns proxy = no
; 保留其文件名和大小写
preserve case = yes
short preserve case = yes
; 我们必须同步windows和Linux的口令么?
unix password sync = yes
; 如何同步口令
passwd program = /usr/bin/passwd %u
passwd chat = *Enter\snew\sUNIX\spassword:* \
%n\n *Retype\snew\sUNIX\spassword:* %n\n .
; Log文件的最大尺寸,
; 防止/var 目录爆掉 :p
max log size = 1000
; 我们是时间服务器:用来同步各个机器的时间
; 通过登录用.bat文件来使用这一特性。
time server = yes
; 指定netlogon所在位置。
; 这只会在登录时使用到
; 因此我们不必让它公开。
[netlogon]
path = /home/netlogon/%g
public = no
writeable = no
browseable = no
; 每个用户的Home目录
[homes]
comment = Home Directories
browseable = no
; 他可以写入了,对吧。
read only = no
; 默认的Unix umask.
create mask = 0700
; 基于安全目的,该目录被设定为700
directory mask = 0700
; 共享FTP,这样可以不用特别的客户端就能在
; 网络邻居里面使用了
[ftp]
path = /home/ftp/pub
public = yes
printable = no
guest ok = yes
; 临时目录
[tmp]
path = /tmp
public = yes
printable = no
guest ok = yes
writable = yes
; 另外的一个临时目录
; 提供给特定的需要特别多空间的用户
[bigtemp]
path = /home/bigtemp
public = yes
printable = no
guest ok = yes
valid users = erics
writable = yes
</smb.conf file>
简单看看,我们在服务器上应该有什么:
<file /home/netlogon/admin.bat> net use P: \\pantoufle\homes net use T: \\pantoufle\tmp net time \\pantoufle /SET /YES </file admin.bat> <file /home/netlogon/teachers/teachers.bat> net use P: \\pantoufle\homes net use T: \\pantoufle\tmp net time \\pantoufle /SET /YES regedit /s \\pantoufle\netlogon\teachers.reg </file teachers.bat> <file /home/netlogon/pupils/pupils.bat> net use P: \\pantoufle\homes net use T: \\pantoufle\tmp net time \\pantoufle /SET /YES regedit /s \\pantoufle\netlogon\pupils.reg </file pupils.bat> <file /home/netlogon/teachers/teachers.reg> [HKEY_CURRENT_USER\Software\Microsoft\Windows \CurrentVersion\Explorer\User Shell Folders] "Personal"="P:\\" </file teachers.reg> <file /home/netlogon/pupils/pupils.reg> [HKEY_CURRENT_USER\Software\Microsoft\Windows \CurrentVersion\Explorer\User Shell Folders] "Personal"="P:\\" </file pupils.reg> |
这个文件允许自动挂接用户个人目录到P: 而临时目录被挂接到T: 。同时系统时间也跟samba服务器作同步。
提示: .bat 文件的格式必须是“DOS模式”。最好就是在notepad里面生成这个文件,然后再放到服务器上。
使用域控制器可以让windows安全些 |
就是这个标题!当然,我从MS关于他们系统安全策略工具的文档里面借来的。
因此,为了创建一个windows系统策略,比如防止某些用户(所有的?)运行regedit或者dos程序等等,你不得不使用Windows98 CD上面的POLEDIT。
运行PolEdit,查看它的帮助,写下相关的信息……本文并不打算教你怎么使用私有软件。
一旦你准备好了.POL文件, 把它复制到samba服务器上,那个在[netlogon]中指定的路径里面。
注意: 对于W9x 客户机,系统策略文件必须是CONFIG.POL……至于WindowsNT,应该是另外一个名字,因为我没有NT没办法告诉你
:'(
哈,不用送给我一个NT让我测试。总之很感谢,你的良心大大的好 :o)
提示: PolEdit 允许创建用户组和用户,不过我们还没有成功过。只有默认用户被放到账号里面去。
比如,如果我用PolEdit创建一个“admin”组,当用户以“erics”身份连接的时候,允许运行regedit(他的主要组是“admin”),我没有办法运行regedit :(
不过,用poledit创建一个“erics”用户倒是工作得很好。
因为觉得像用poledit建立1056个用户这类工作很没劲,而且全局用户管理看上去更有意思一点儿,我们“建议”下面这样一些技巧:
为了这件事儿,我们已经解决了几个问题:造出来三个config.pol文件给默认用户,因此,在Linux服务器这边,我们还有:
/home/netlogon/teachers/CONFIG.POL
/home/netlogon/teachers/teachers.bat
/home/netlogon/pupils/CONFIG.POL
/home/netlogon/pupils/pupils.bat
/home/netlogon/admin/CONFIG.POL
/home/netlogon/admin/admin.bat
此外我们已经修改smb.conf文件把这个东西放进去:
<smb.conf file>
[netlogon]
; 我们用%g变量指定netlogon对于不同的用户组给出不同的用户目录
; 以让用户能够正确对应到符合他的config.pol文件。
path = /home/netlogon/%g
public = no
writeable = no
browseable = no
</smb.conf file>
如果运气好点儿的话,点20下鼠标,然后重起就足够够配置windows了! |
Win98客户机
点击 开始/设置/控制面板 然后 双击 网络(译注:不好意思,很久没有用过win9x了,都靠记忆翻译的对应名字,搞不好有出入,大家多担待)
安装:
然后点击"Identification" tab然后填入机器名和机器所在工作组名。
点击"Access control" 然后选中用户级访问控制
回到the configuration tab 然后双击"Client for MS network"
不要忘记配置 TCP/IP 支持:
双击:TCP/IP
IP地址:
在工作中,由于使用windows profile,瓶颈很快显现。
事实上,profile被MS认为重要的东西填满了,比如IE的cache,Outlook的cache等等。
简单地说,这意味着每当用户跟服务器连结或者断开时,都会有大约10MB的数据被下载或者上传(我的profile是很标准的,有桌面背景,ie,outlook的cache……)。
每个用户10MB,在一个有15台机器的地方(“一般”实验室的大小),就会用掉150MB,如果这个楼层有10个这样的地方……算算看下班铃响的时候,会有多少用户离开吧。
现在你该料到结果,那么提前5分钟跑路吧……(嗯,我得承认我读书时候就干过)……总比过了5分钟再跑强。就象一个大城市的将要发生的大塞车,最佳的跑路时机要么是早10分钟,要么两个小时以后!
因此,根据于你实施的策略,把每个用户home目录挂到P: (作为例子,P表示People,个人),并且告诉他们“把你的文档存到P里面去,不要放到‘我的文档’里面,否则文件会丢掉的”,这样应该是不错的办法。
接下来,你不得不去找一个软件,让它能够配置成为这样:把书签放到P:\bookmarks.html等等。
我甚至不知道在windows世界是不是有这样的东西!
如果你知道这样的解决方案,不妨写下来,共享知识吧~
在同一个域里面,是否有可能有多个工作组,对它如何进行管理,是否会跟GNU/Linux Samba之间发生问题?Is it possible to have various workgroups on the same domain, how can this be managed, is it possible to share the problems between various GNU/Linux Samba?(这句话比较头大,还是留着,免得误导)。
如何同时使用NT和Samba服务器?
NT客户端配置:CONFIG.POL文件在NT下面有另外一个名字。
当只有Samba服务器时(没有NT)一个现实的问题:我在W98上工作而且我想共享我的本地资源,比如我的打印机:
显示我的打印机共享状态
接下来点击添加
HOT NEWS: 有人给了我一个方案。在windows配置的第三步时选择“resource level access control”就有了。
Bruno <bcarrere(at)asp-france.fr> 进行了校对,并在之前给了一些其他的帮助 :o)
JohnPerr 督促我在LinuxFocus写下了我的第一篇文章,并且把这篇文章翻译成了英文。
Michel Billaud aka MiB 在我们的问题上给出了解决方案,并且还教会了我们一些小技巧,比如strace 等等 :o)
Etienne, Éric, 还有一个我忘记了名字的的朋友(为此致歉)。谢谢你们与大家共享你们在NT服务器方面的知识。
Jean Peyratout, 难道我们需要说出为什么嘛?这样会花很多时间的。
The Abul generally speaking
Rycks 给我时间和资源来为自由软件开发以及写文档。
O'Reilly 线上书籍:http://www.oreilly.com/catalog/samba/chapter/book/index.html
本文档的最新版本可以在the rycks.com documentation section找到。