Linux成为"文件服务器"之一 Samba简介
给Windows客户提供文件服务是通过samba实现的,凡架设过MS Windows网络的人都知道MS Windows网络的核心是SMB/CIFS,而samba也是一套基于UNIX类系统、实现SMB/CIFS协议的软件,作为UNIX的克隆,Linux也可以运行这套软件。和NT相比较,samba的文件服务功能一点也不亚于NT,效率很高,借助Linux本身,可以实现用户磁盘空间限制功能,NT到4.0版本还是无法实现这点,samba由samba小组(http;//samba.org)开发,更新速度很快,目前最高的版本是2.0.7版,是2000年4月25日发布的,每个更新版本在功能上都所增强,也修复了已知的BUG。本章所涉及到的技术内容以2.0.3版蓝本。目前各种Linux发布大都包含这套软件,如果你的Linux发布是Read Hat,则是以RPM形式提供,可以在安装Linux的时候选择这个软件,也可以单独安装,以root身份。
rpm -i samba-2.0.3-8.i386.rpm,就可以了。
如果你的Linux发布没有包含这个软件,可以从ftp;//samba.org/pub/samba去下载。另外,您的Linux的核心要支持smbfs,一般各种发布已经把smbfs的支持包含进去,如果没有包含的话,就要重新编译核心,获得smbfs支持,具体如何编译核心请参阅相关文章。
由于本章的内容是基于文件服务器, 重点介绍samba在文件服务器上的应用。目前samba还不能完全代替Windows NT,尤其是把samba设置成PDC,最好不要这样做,NT PDC非常复杂,samba还只能实现其中一部分功能。希望未来的版本可以做到。
这套软件由一系列的组件构成,主要的组件有
smbd SMB服务器,给SMB客户提供文件和打印服务
nmbd, Netbios 名称服务器,提供Netbios名称服务和浏览支持,帮助SMB客户定位服务器
smbclient, SMB客户程序,用来存取SMB服务器上的共享资源。
testprns 测试服务器上打印机访问的程序
testparms 测试Samba配置文件的正确性的工具。
smb.conf samba的配置文件。
smbstatus 这个工具可以列出当前smbd服务器上的连接。
make_smbcodepage 这个工具用来生成文件系统的代码页
smbpasswd 这个工具用来设定用户密码。
swat samba的Web管理工具。
二、如何配置samba
实际上,samba安装完后,只要把/etc/smb.conf这个文件里的workgroup=XXXXX这个参数该为您的工作组,启动samba就可以运行了,但这根本不能符合我们的需要。samba的配置都是围绕smb.conf来进行的,配置方式有很多种,如果熟练的话可以手工编辑这个文件,也可以通过linuxconf来配置,而且samba本身带了一个基于web的管理工具swat,使用901端口,安装完samba后,它会在您机器的/etc/services的尾部加上一条
swat 901/tcp #Add swat service used via inetd
在inetd.conf里填上
swat stream tcp nowait.400 root /usr/sbin/swat swat
在浏览器的地址栏里键入 http://youhostname:901/ 就可以进入swat对samba进行管理。下面就介绍如何手工配置这个文件以达到让samba成为一个符合需求的文件服务器。
先看看一小段的smb.conf:
# smb.conf example
[global]
workgroup = WORKGROUP
server string = Samba Server
hosts allow = 192.168.1. 192.168.2. 127.
load printers = no
printcap name = /etc/printcap
guest account = guest
log file = /usr/local/samba/var/log.%m
max log size = 50
security = user
socket options = TCP_NODELAY
[homes]
comment = Home Directories
browseable = yes
writable = yes
[printers]
comment = All Printers
path = /usr/spool/samba
browseable = no
guest ok = no
writable = no
printable = yes
printer driver = Epson LQ-1600K
[tmp]
comment = Temporary file
path = /tmp
read only = no
public = yes
[public]
comment = Public Zone
path = /home/samba
public = yes
writable = yes
1.段
从上面的例子可以看出,smb.conf的格式和Windows里的INI文件很像,含有多个段,每个段由段名开始,一直到下个段名,每个段名放在方括号中间。段里的参数的格式是
名称 = 值
文件里的每个段名、参数以及注释都只能占一行,换句话说就是一行里只能写一个段名或参数或注释,如果一行写不下或不想把一行写的过长,可以在行尾用""来表示续行。段名和参数名不分大小写。可以有注释,注释以;或#开始到该行结束。
除了[global]段外,所有的段都可以看作是一个共享资源,段名是该共享资源的名字,而段里的参数就是共享资源的属性。[global], [homes] 和 [printers]这三个段是比较特殊的,将在后面说明。而下面的注意事项则是针对普通的段。
一个共享资源段由要提供访问的路径和附加的访问权限组成,可以是文件资源或打印资源。共享资源段可以给guest级的用户服务,一般来说guest用户是不需要密码的,如果给guest提供服务,guest的权限是根据UNIX里的guest帐户来赋予。 如果共享资源段不是给guest提供服务的,则访问这样的段需要客户的密码。由于赋予用户对共享资源段的访问权限是基于该用户在UNIX系统的对该资源的访问权限,所以服务器是不能赋予超过UNIX系统赋予该用户的权限的。
例如:
下面的共享资源段的例子定义了一个文件共享,用户对路径/home/abc有写入的权限,共享资源段名是abc,也就是共享名。
[abc]
path = /home/abc
writeable = true
而这下面的段定义了一个打印共享,共享是只读的,但可打印,就是说唯一允许的写访问就是打开、写入和关闭脱机文件。
[myprinter]
path = /usr/spool/public
read only = true
printable = true
guest ok = true
特殊段
[global] 段
在这个段的参数是全局有效的。
[homes] 段
当用户请求一个共享时,服务器将在存在的共享资源段中去寻找,如果找到匹配的共享资源段,就使用这个共享资源段。如果找不到,就将请求的共享名看成是用户的用户名,并在本地的password文件里找这个用户,如果用户名存在且用户提供的密码是正确的,则以这个home段克隆出一个共享提供给用户。这个新的共享的名称是用户的用户名,而不是home,如果home段里没有指定共享路径,就把该用户的宿主目录(home directory)作为共享路径。
通常的共享资源段能指定的参数基本上都可以指定给[home]段。但一般情况下[home]段有如下配置就可以满足普通的应用。
[homes]
writeable = yes
注意,如果在[home]段里加了guess access =ok, 所有的用户都可以不要密码就能访问所有的宿主目录!
[printers] 段
该段用于提供打印服务。
如果定义了[printers]这个段,用户就可以连接在printcap文件里指定的打印机。当一个连接请求到来时,smbd去查看配置文件里已有的段,如果和请求匹配就用那个段,如果找不到匹配的段,但[home]段存在,就用[home]段。否则请求的共享名就当作是个打印机共项名,然后去寻找适合的printcap文件,看看请求的共享名是不是个有效的打印共享名。如果匹配,那么就克隆出一个新的打印机共享提供给客户。
注意,[printers]服务必须是printable,如果指定为其它,服务器将拒绝加载配置文件。
通常指定的路径应该任何人都有写入权限。
[printers]
path = /usr/spool/public
writeable = no
guest ok = yes
printable = yes
printer driver = Epson LQ-1600K
2.参数
段里可以指定的参数非常多,有些参数是全局段才可以用的,而有些参数是任何段都可以用的,先介绍一些基本参数,明白这些基本参数,基本上就可以一般性地应用samba了,如果要更精细地控制samba,可以继续参考一些高级配置。另外,本章假设读者对MS WINDOWS 网络是熟悉的,不熟悉的可以参考相关资料。
全局参数
2.1 基本参数
workgroup
说明:这个参数用来指定samba所要加入的工作组,另外如果在设置了security=domain,则workgroup可以指定域名。例如:
workgroup = wgp1
指明工作组为wgp1
netbios name
说明:这个参数指定samba的netbios名,可以不设置,samba将会使用机器的DNS名的第一部分,如果你的机器的DNS名是host1.domain,就用host1 例如:
netbios name = public
指定NetBios名为public
server string
说明:这个参数指定在浏览列表里的机器描述,和MS WINDOWS 里配置网络时的描述是一样的。可以是任何字符串。也可以不填,samba会用缺省的 samba %v,即samba 尾随它的版本号,不过如果要模仿NT象一点的话,可以填一下。例如:
server string = Master File Server
2.2 安全参数
security
说明:这是个重要的安全配置参数,有4个值,分别是share、user、server和domain,定义了samba的基本安全级,通常是 user
security = user
这是samba的默认配置,这种情况下要求用户在访问共享资源之前资源必须先提供用户名和密码进行验证。
securtiy = share
这是几乎没有安全性的级别,任何用户都可以不要用户名和口令访问服务器上的资源。
security = server
和user安全级类似,但用户名和密码是递交到另外一个SMB服务器去验证,比如递交给一台NT服务器。如果递交失败,就退到user安全级,从用户端看来,server和user这两个级别是没什么分别的。
security = domain
这种安全级别要求网络上存在一台NT PDC,samba把用户名和密码递交给NT PDC去验证。
从用户端看来,user级以上的安全级其实是没什么分别的,只是服务器验证的方式不同,但这三种安全级都要求用户在本Linux机器上也要系统帐户。否则是不能访问的。
encrypt passwords
说明:是否对密码进行加密,samba本身可以维护一个密码文件/etc/smbpasswd,如果不对密码进行加密则在验证会话期间客户机和服务器之间传递的是明文密码,samba直接把这个密码和Linux里的/etc/passwd密码文件进行验证。这其中有些问题,之一就是在Windows 95 OS/R2以后的版本和Windows NT SP3以后的版本缺省都不传送明文密码,要让这些系统能传送明文密码必须在其注册表里更改
对于Windows 95 OS/R2以上的版本,可以在
[HKEY_LOCAL_MACHINESystemCurrentControlSetServicesVxDVNETSUP]
里加一个十六进制值
EnablePlainTextPassword=00000001
对于WINDOWS NT SP3 以上的版本,可以在
[HKEY_LOCAL_MACHINESYSTEMCurrentControlSetServicesRdrParameters]
里加一个十六进制值
EnablePlainTextPassword=00000001
这样就可以让它们能在网络上传送明文密码。
另外,还有一件很烦人的事情就是NT系统,如果一个服务器是处于用户级别上的安全模式,又不支持密码加密传送的话,NT将拒绝和服务器连接,除非服务器向用户提示要密码。这在实际应用中会出现什么情况呢。如果你在NT机器有个帐户user1,在Linux机器上也有个帐户user1,密码都是一样,但你去和Linux机器上的共享连接的时候,NT就会提示你错误的密码或未知的用户名,要求你再次输入用户名和密码,NT才和服务器连接。如果你映射了Linux上的共享资源作为NT的一个网络驱动器,那么NT在下次启动试图重新连接这个网络驱动器时,又会提示你错误密码或未知用户名.... 烦得很。所以一般samba的应用基本都设定为yes
encrypt passwords = yes
当然,samba的用户是基于Linux系统用户的, sambad的加密工具是smbpasswd,最简单的用法是
smbpasswd -a username 这里的username必须是/etc/passwd里存在的用户名
然后会提示输入密码和确认密码,会生成一个新的密码条目,放在/etc/smbpasswd这文件里。另外,
samba提供了一个工具—mksmbpasswd.sh,这是shell脚本,可以从/etc/passwd文件里生成smbpasswd文件,
用法是:
cat /etc/passwd | mksmbpasswd.sh > /etc/smbpasswd
把passwd里的用户都加到smbpasswd里。
从安全起见,smbpasswd这个文件的存取权限请设为600
username map
说明:这个参数可以让你指定一个文件包含来自客户机的用户名与Linux系统用户名之间的映射,文件的格式是每行一个映射,映射的格式是
Linux usename = client username ...
例如 root = admin adminstrator
这样,当客户机的用户是admin或administrator时,就被转换成root。
这个功能对用户管理很方便,可以让管理员不需要对客户或服务器上的用户帐号大动干戈。
文件名通常用默认的/et/smbusers
password level
说明:这是针对一些SMB客户像Windows for Workgroup、OS/2之类而设的,像WFW这样的系统在发送用户密码的时候,会把密码转换成大写再发送,这样就和samba的密码不一致,这个参数可以设定密码里允许的大写字母个数,这样samba就根据这个数目对接收到的密码进行大小写重组,以重组过的密码尝试验证密码的正确性。这个值越大,组合的次数就越多,验证时间就越长,安全性也越低!
例如: 如果这个值是2,用户的密码是abcd,但发送出去其实是ABCD,samba就会把这个ABCD进行大小写重组,组合的密码可以是下列
Abcd, aBcd, abCd, abcD, abcd, ABcd, AbCd, AbcD,aBCd,aBcD,abCD。
所以如果没有必要,就把这个值定为是零(一般应该是没这必要,现在谁还用WFW这样的系统)。这样的话samba只尝试两次,一个是接收到的密码,另一个尝试的是这个密码都是小写的情况。即使是这样,也还存在着一定的安全性问题。
guest account
说明:这个参数指定guest级帐户的用户名,可以是nobody、ftp,guest级别的用户可以不要密码就访问给定的guest服务。
host allow
说明:这个参数指定那些机器可以访问samba,例如:
host allow = 192.168.1. 127.
指定192.168.1.0里的所有机器都可以访问。
如果不允许子网里的一台机器访问,可以这样设
host allow = 192.168.1. EXCEPT 192.168.1.33
禁止192.168.1.33访问
host deny
说明:和host allow 相反是指定那些机器不能访问,格式一样。
2.3 日志记录参数
log file
说明:这个参数指定日志文件的名称,路径一般放在/var/log/samba,可以在文件名后加个宏%m表示对每台访问samba的机器都单独记录一个日志文件。
例如: log file = /var/log/samba/log.%m,
如果host1、host2这台机器访问过samba,就会留下log.host1、log.host2这两个日志文件。
max log size
说明:这个参数指定最大日志文件的大小,以KB为单位。
例如: max log size = 50k
2.4 协议参数
announce version
说明:指定服务器的宣告版本号,默认是4.2,如果在WINDOWS的网上邻居里查看samba服务器的属性,就可以看见在类型一行里有 Windows NT 4.2 Server 的字样。一般不要去更改它,如果你要让samba模拟NT像一点的话,可以改成4.0。
|
|
|