Linux Samba 服务器(新手)
概述
Samba是一种PC之间共享文件和打印机及其它信息的协议。例如,它可以提供当前可用文件或打印机列表支持。本身支持这个协议的操作系统有Windows95/98/NT、OS/2和Linux。其它的一些操作系统,如DOS、Windows、VMS、各种UNIX、MVS也可通过增加模块来支持它。
Apple Macs系列微机和某些Web浏览器也可使用这个协议。SMB的替代产品包括Netware,NFS,AppleTalk,Banyan Vines, Decnet 等等。它们都有各自的优点,但没有是一种是被公认的标准,而且广泛地安装在台式机上。
注意事项
下面所有的命令都是Unix兼容的命令。
源路径都为“/var/tmp”(当然在实际情况中也可以用其它路径)。
安装在RedHat Linux 6.1下测试通过。
要用“root”用户进行安装。
Samba的版本号是 2.0.6
软件包的来源
MM的主页:http://us1.samba.org/samba/samba.html
必须确保下载:samba-2.0.6.tar.gz
安装软件包需要注意的问题
在安装Samba前后保存一下文件列表对你也许是一个好主意,而后用diff比较一下两个文件列表从而找出Samba的文件被安装到哪里去了,方法是在安装Samba之前运行一下“find /* > smb1”,而在安装Samba服务之后运行“find /* > smb2”,接着执行命令“diff smb1 smb2 > smb”从而得到安装文件列表。
编译和安装
把软件包(tar.gz)解压缩:
[root@deep]# cp samba.version.tar.gz /var/tmp
[root@deep]# cd /var/tmp
[root@deep]# tar xzpf samba.version.tar.gz
配置
cd进入新的Samba目录,然后在终端上键入如下命令:
编辑“Makefile”文件(vi +28 Makefile.in)并做如下改动:
SBINDIR = @bindir@
改为:
SBINDIR = @sbindir@
VARDIR = @localstadir@
改为:
VARDIR = /var/log/samba
上面的命令将二进制文件的bin目录设为“usr/sbin”目录而Samba的日志文件位于“var/log/Samba子”目录。
编辑“convert_smbpasswd”文件(vi +10 script/convert_smbpasswd)并做如下改动:
nawk BEGIN {FS=":"}
改为:
gawk BEGIN {FS=":"}
它将指定用GNU版本的awk文件处理工具取代Bell研究实验室版本的awk程序来处理“smbpasswd”文件,文件“convert_smbpasswd”用于将格式为Smb1.9.18的 “smbpasswd”文件转换成一种Samba2.0格式的“smbpasswd”文件。
编辑“include.h”文件,(vi +655 include/include.h)并删除几行。
删除下面几行:
#ifdef strcat
#undef strcat
#endif /* strcat */
#define strcat(dest,src) __ERROR__XX__NEVER_USE_STRCAT___;
编辑“smbmount.c”文件,(vi +99 client/smbmount.c)并做如下改变:
static void close_our_files(int client_fd)
{
int i;
for (i = 0; i < 256; i++) {
if (i == client_fd) continue;
close(i);
}
改为:
static void close_our_files(int client_fd)
{
struct rlimit limits;
int i;
getrlimit(RLIMIT_NOFILE,&limits);
for (i = 0; i < limits.rlim_max; i++) {
if (i == client_fd) continue;
close(i);
}
以上这两步改变将使“include.h”和“smbmount.c”文件和RedHat glibc 2.1库兼容。
编译和优化
在终端上键入如下命令:
CC="egcs"
./configure
--prefix=/usr
--libdir=/etc
--with-lockdir=/var/lock/samba
--with-privatedir=/etc
--with-swatdir=/usr/share/swat
--with-pam
--with-mmap
注意:选项“--with-mmap”在某些机器上可以极大的提高应用程序的性能,在其它机器上,它不起任何作用,还有机器会降低其性能。
这些设置告诉Samba对于当前的硬件配置:
l 包含PAM密码数据库验证支持
l 包含试验性的MMAP内核支持(提高应用程序性能)
[root@deep]# make all
[root@deep]# make install
[root@deep]# install -m 755 script/mksmbpasswd.sh /usr/bin/
[root@deep]# rm -rf /usr/share/swat/
[root@deep]# rm -f /usr/sbin/swat
[root@deep]# rm -f /usr/man/man8/swat.8
[root@deep]# mkdir -p /var/lock/samba
[root@deep]# mkdir -p /var/spool/samba
[root@deep]# chmod 1777 /var/spool/samba/
“install”命令把“mksmbpasswd.sh”脚本安装到“/usr/bin/”目录,这个脚本是设置Samba允许用户通过“smbpasswd”文件连接到我们的服务器的文件。参见本文后面的部分有关怎样设置和应用Samba密码。
“rm”命令删除“/usr/share/swat”目录及其中所有文件,同时也删除位于“/usr/sbin/”的Swat的二进制文件。SWAT程序是一种基于web的配置工具,它允许用户通过Web配置“smb.conf”文件。这个工具监听服务器的901端口,当然为了使用SWAT工具,必须有一个web服务器在后台运行,例如:Apache。SWAT工具在服务器上打开了一个安全漏洞,所以我建议不用它并把它删除。
“mkdir”命令在系统中为所有共享打印工作创建一个“/var/spool/samba/”目录,当然这个目录仅当你打算使用Samba的局域网共享打印机时才是必须的。既然我们不打算配置Samba服务器共享打印机,就不必在服务器上创建这个目录(var/spool/samba/),而且不必用“chmod”命令来改变“var/spool/samba/”的“粘性(sticky)”标志位以确保只有文件的所有者才可以删除那个目录中的文件。
注意:安装过程假定在系统中运行影子(Shadow) passwords/pam(而且也应该这样做),如果按我们的方法安装Linux,这一定已经预先设置好了。
清除不必要的文件
[root@deep]# cd /var/tmp
[root@deep]# rm -rf samba-version/samba.version.tar.gz
rm命令把用于编译安装Samba服务的所有源文件清除,同时也把Samba的压缩文件从var/tmp目录中清除出去。
配置
不同服务的配置文件根据需求和网络结构的不同有各自的特殊性,即可以将Samba服务器安装成只允许一个客户连接,也可以将其安装成允许1000个客户连接
可以到这去下载“floppy.tgz”文件:http://pages.infinit.net/lotus1/doc/opti/floppy.tgz。把“floppy.tgz”文件解开之后,可以在相应的目录下发现我们在这本书中介绍的所有软件的配置文件。这样就没有必要手工重新生成这些文件,或者用拷贝粘贴的方法把它们粘贴到配置文件中去。不管是打算自己动手生成配置文件还是拷贝现成的,你都要学会自己修改配置文件并且把配置文件拷贝到正确的目录下。下面将具体说明。
为了运行Samba服务,以下文件必须存在,而且它们被创建在或拷贝到合适的目录之中。
l 拷贝smb.conf和 lmhosts文件到“/etc/”目录
l 拷贝smb脚本文件到“/etc/rc.d/init.d/”目录
l 拷贝samba文件到“/etc/logrotate.d/”目录
l 拷贝samba文件到“/etc/pam.d/”目录
可以从“floppy.tgz”文档中获取以上这些文件,从解压的“floppy.tgz”文档中拷贝这些文件到适当的位置,或者从本书中拷贝并粘贴到相应的文件中。
配置“/etc/smb.conf”文件:
“/etc/smb.conf”文件是Samba服务器的主要配置文件,它规定了哪些目录可以被Windows机器访问,哪些IP地址被授权等等,在[global]一节中的行中包含了全局配置信息,它们是对于所有的共享都公用的信息,(除非它们被每共享属性所重载),紧跟其后是[share]一节。
在我们的例子中,我们创建了一个目录[tmp],且允许一个IP地址连接到Samba服务器,而且不打算在Samba和Windows之间使用共享打印机。
编辑“smb.conf”文件(vi /etc/smb.conf)并添加:
[global]
workgroup = OPENARCH
server string = Samba %h
encrypt passwords = True
security = user
smb passwd file = /etc/smbpasswd
log file = /var/log/samba/log.%m
socket options = IPTOS_LOWDELAY TCP_NODELAY
domain master = Yes
local master = Yes
preferred master = Yes
os level = 65
dns proxy = No
name resolve order = lmhosts host bcast
bind interfaces only = True
interfaces = eth0 192.168.1.1
hosts deny = ALL
hosts allow = 192.168.1.4 127.0.0.1
debug level = 1
create mask = 0640
directory mask = 0750
level2 oplocks = True
wide links = no
read raw = no
[homes]
comment = Home Directories
browseable = no
read only = no
invalid users = root bin daemon nobody named sys tty disk mem kmem users
[tmp]
comment = Temporary File Space
path = /tmp
read only = No
valid users = admin
invalid users = root bin daemon nobody named sys tty disk mem kmem users
下面逐行说明这些配置
[global]
workgroup = OPENARCH
当客户访问时你的服务器时服务器所显示的组名
server string = Samba %h
计算机显示主机名,“%h”表示你所连接计算机的主机名。
encrypt passwords = True
这项设置将与客户机协调起来通过加密来取代明文密码,监听程序不能发现被加密的密码。出于安全的考虑,这个选项必须设置为True。
security = user
在用户级的安全级别上,一个连接服务器的客户必须首先用一个有效的用户名和密码,否则该连接将被拒绝,这意味着在Samba服务器的“/etc/passwd”文件中必须存在这个客户的一个有效的用户名和密码,否则这个客户的连接将被断开。
smb passwd file = /etc/smbpasswd
这个选项“smb passwd file”设置加密的“smbpasswd”文件的路径,“smbpasswd”文件是“etc/passwd”文件的一个拷贝,它包含连接Samba服务器所需的有效的用户名和密码。在有连接请求时,Samba软件将读取这个文件以确定用户的合法性。
log file = /var/log/samba/log.%m
这个选项“log file”带扩展名“%m”允许不同的用户或客户机在Samba服务器上拥有各自的日志文件。
socket options = IPTOS_LOWDELAY TCP_NODELAY
这个选项“socket options”协调局域内的连接,以提高Samba服务器的文件传输能力。
domain master = Yes
这个选项“domain master”,指定(nmbd) Samba服务守护程序作为该工作组的主域浏览器,这个选项对于同一个组内或同一个网络中所有Samba服务器,只有一个服务器被设置成Yes。
local master = Yes
这个选项“local master”允许 (nmbd) Samba服务守护程序尝试使其成为子网内的局部主浏览器,就象如上所述,通常在同一子网内的Samba服务器只有一个Samba服务器成为局部主浏览器。
preferred master = Yes
这个选项“preferred master”,在Samba服务守护程序成为一个工作组中优先的主浏览器与上面的一样,你只能在同一网络内设置一个Samba服务器中指定一个作为优先的浏览器。
os level = 65
这个选项“os level”决定了Samba服务守护程序是否有机会成为一个工作组广播的区域内的局域主浏览器,数字65将使它优先于任何NT服务器,如果在你的局域网中存在NT服务器,而且希望Linux Samba服务器优先于NT成为工作组中广播区域内的主局域浏览器,那么你就必须设置os level选项为65,而且这个选项必须设置在一个Linux Samba服务器上,在网络内的其它Linux Samba服务器必须禁用此选项。
dns proxy = No
这个选项“dns proxy”,如果设置为Yes,则指定(nmbd) Samba服务守护进程为一个WINS服务器,并且负责查找未登记的Net BIOS名称,把Net BIOS名字作为DNS名称,并作为一个名字查询客户程序从DNS服务器中查询DNS名称,我们并不打算把Samba服务器配置成WINS服务器,我们不必把这的选项设成Yes。
name resolve order = lmhosts host bcast
这个选项“name resolve order”决定使用哪些名字服务程序及使用它们的优先顺序来解析它们的主机名和IP地址。
bind interfaces only = True
这个选项“bind interfaces only”如果设置为True,允许限制机器上哪个网络界面可以为Smb请求提供服务,这是一个安全方面的特性。下面配置“interfaces = eth0 192.168.1.1”将完成这个选项。
interfaces = eth0 192.168.1.1
这个选项“interfaces”允许用户重载Samba服务程序浏览用的缺省浏览网络界面、名称登记和其它NBT通讯设备。缺省的情况下,Samba将访问内核中所有激活的网络界面,将利用除了127.0.0.1以外的所有广播网络界面,对于这个选项Samba将只监听192.168.1.1的“eth0”界面,这是一个安全特性,并完成上面的配置(bind interfaces only =True).
hosts deny = ALL
在“hosts deny”选项中所列出的主机将被禁止访问Samba,除非指定的服务有它们允许主机列表来重载它,缺省情况下我们禁止所有来访主机,允许的主机在下一个选项中指定(hosts allow =)。
hosts allow = 192.168.1.4 127.0.0.1
选项“hosts allow”是一组通过逗号、空格,跳格分隔开的主机IP列表,它们被允许访问Samba服务器,我们允许192.168.1.4和本地机127.0.0.1访问Samba服务器。注意,localhost必须设置,否则你会收到某些错误信息。
debug level = 1
选项“debug level”允许在“smb.conf”文件中指定调试级别(日志级别),如果你设置调试级别高于2,你的应用的性能将大为降低,这是因为服务器每一步操作中都将产生大量的调试信息写入日志文件,它的代价将是很高的。
create mask = 0640
选项“create mask”设置从DOS模式映射到UNIX权限时缺省权限,当选项设为0640时,所有从Windows系统中转移到Unix系统中的文件缺省情况下具有0640的权限。
directory mask = 0750
选项“directory mask”设置一个从DOS模式到Unix模式创建或拷贝目录时缺省的8进制权限,若这个选项设置为0750,所有从Windows系统中创建和拷贝到Unix系统中的目录在缺省情况下都具有0750的权限。
level2 oplocks = True
选项“level2 oplocks”可提高访问以特别方式写的文件的性能(例如,应用程序,EXE文件)
wide links = no
选项“wide links”控制在Unix文件系统中服务器的链接是否可以访问。在服务器所输出的目录树内的链接总是可访问的,这个选项只是控制输出目录树以外的链接的访问,建议出于安全考虑,建议禁用此选项。
read raw = no
选项“read raw”控制的是Samba服务器在向客户机传送数据时是否支持直接读取(read raw)SMB请求。注意,在“read raw”操作中没有使用内存映射,因此,当象我们这样禁用“read raw”选项,即设置为选项值为“No”时,你会发现使用内存映射程序会更有效。
[tmp]
comment = Temporary File Space
选项“comment”是位于共享名旁边的一个文本区域中的字符串,即当你使用network或“net view”请求Samba服务器时,服务器所罗列出来共享资源所显示的名称。
path = /tmp
选项“path”指定为用户提供服务的目录。
read only = No
选项“read only”指定是否用户仅被允许以只读方式访问文件。
valid users = admin
选项“valid users”列出能够登录服务的用户列表。
invalid users = root bin daemon nobody named sys tty disk mem kmem users
选项“invalid users”列出禁止登录服务的用户列表,这种近乎“偏执”的检验用以绝对保证不合适的设置会破坏你的系统安全。
配制“/etc/lmhosts”文件
配制“/etc/lmhosts”文件,“lmhosts”文件是提供Samba Net BIOS名称到IP地址的映射的文件,它与“/etc/hosts”文件格式相似,只是主机名字必须符合Net BIOS名称格式。
创建“/etc/lmhosts”文件并添加:
# Sample Samba lmhosts file.
#
127.0.0.1 localhost
192.168.1.1 deep
192.168.1.4 win
在我们的例子里文件中包含三个IP到Net BIOS名字映射,localhost (127.0.0.1)、一个名为deep 的(192.168.1.1)客户机,一个叫win的(192.168.1.4)的客户机。
配制“/etc/rc.d/init.d/smb”脚本文件
配制“/etc/rc.d/init.d/smb”脚本文件来起动和停止Samba 服务器smbd和nmbd守护进程
创建smb脚本文件(touch /etc/rc.d/init.d/smb),并添加:
#!/bin/sh
#
# chkconfig: - 91 35
# description: Starts and stops the Samba smbd and nmbd daemons
# used to provide SMB network services.
# Source function library.
. /etc/rc.d/init.d/functions
# Source networking configuration.
. /etc/sysconfig/network
# Check that networking is up.
[ ${NETWORKING} = "no" ] && exit 0
# Check that smb.conf exists.
[ -f /etc/smb.conf ] || exit 0
RETVAL=0
# See how we were called.
case "$1" in
start)
echo -n "Starting SMB services: "
daemon smbd -D
RETVAL=$?
echo
echo -n "Starting NMB services: "
daemon nmbd -D
RETVAL2=$?
echo
[ $RETVAL -eq 0 -a $RETVAL2 -eq 0 ] && touch /var/lock/subsys/smb ||
RETVAL=1
;;
stop)
echo -n "Shutting down SMB services: "
killproc smbd
RETVAL=$?
echo
echo -n "Shutting down NMB services: "
killproc nmbd
RETVAL2=$?
[ $RETVAL -eq 0 -a $RETVAL2 -eq 0 ] && rm -f /var/lock/subsys/smb
echo ""
;;
restart)
$0 stop
$0 start
RETVAL=$?
;;
reload)
echo -n "Reloading smb.conf file: "
killproc -HUP smbd
RETVAL=$?
echo
;;
status)
status smbd
status nmbd
RETVAL=$?
;;
*)
echo "Usage: $0 {start|stop|restart|status}"
exit 1
esac
exit $RETVAL
现在使脚本文件执行并改变其缺省的权限:
[root@deep]# chmod 700 /etc/rc.d/init.d/smb
用以下的命令来创建Samba到rc.d的符号链接
[root@deep]# chkconfig --add smb
Samba脚本在下次重启服务器时并不会自动启动smbd、nmbd守护进程(daemon)。
可以通过执行下面的命令来更改缺省设置:
[root@deep]# chkconfig --level 345 smb on
用下面的命令来手工起动Samba服务器
[root@deep]# /etc/rc.d/init.d/smb start
配置“/etc/pam.d/samba”文件
配置“/etc/pam.d/samba”文件使其能采用pam认证
创建“Samba”文件(touch /etc/pam.d/samba),并添加:
Auth required /lib/security/pam_pwdb.so nullok shadow
Account required /lib/security/pam_pwdb.so
配置“/etc/logrotate.d/samba”文件
配置“/etc/logrotate.d/samba”文件使日志文件每周自动更新一次。
创建“Samba”文件(touch /etc/logrotate.d/samba),并添加:
/var/log/samba/log.nmb {
notifempty
missingok
postrotate
/usr/bin/killall -HUP nmbd
endrotate
}
/var/log/samba/log.smb {
notifempty
missingok
postrotate
/usr/bin/killall -HUP smbd
endrotate
}
Samba的安全性
创建一个加密的password文件
“/etc/smbpasswd”文件是Samba加密的密码文件,它包括用户名,Unix用户代号、SMB控制的用户密码、用户标志信息和密码最后更改日期。
重要信息:创建一个Samba用户,必须首先拥有一个有效的Linux帐号,用如下的命令从“/etc/passwd”文件来创建smbpasswd文件:
[root@deep]# cat /etc/passwd | mksmbpasswd.sh > /etc/smbpasswd
创建用户帐号:
[root@deep]# smbpasswd -a username (remember that “username” must be a valid Linux account).
New SMB password:
Retype new SMB password:
Password changed for user username.
[root@deep]# chmod 600 /etc/smbpasswd
[root@deep]# testparm (this will verify the smb.conf file for error).
注意:详细信息参见“samba/doc/texts/”中的ENCRYPTION.txt。
保证重要配置文件的安全
设置不可更改标志位可以预防意外删除或覆盖受保护的文件,它也可以预防别人创建到它的符号链接,一旦配置好“smb.conf”和“lmhosts”文件,用下面的命令把它们免疫起来是个不错的主意:
[root@deep]# chattr +i /etc/smb.conf
[root@deep]# chattr +i /etc/lmhosts
更多的资料
获取更详细的信息,可以阅读以下man帮助:
$ man Samba (7) - A Windows SMB/CIFS fileserver for UNIX
$ man smb.conf (5) - The configuration file for the Samba suite
$ man smbclient (1) - ftp-like client to access SMB/CIFS resources on servers
$ man smbd (8) - server to provide SMB/CIFS services to clients
$ man smbmnt (8) - mount smb file system
$ man smbmount (8) - mount smb file system
$ man smbpasswd (5) - The Samba encrypted password file
$ man smbpasswd (8) - change a users SMB password
$ man smbrun (1) - interface program between smbd and external programs
$ man smbsh (1) - Allows access to Windows NT filesystem using UNIX commands
$ man smbstatus (1) - report on current Samba connections
$ man smbtar (1) - shell script for backing up SMB shares directly to UNIX tape drives
$ man smbumount (8) - umount for normal users
$ man testparm (1) - check an smb.conf configuration file for internal correctness
$ man testprns (1) - check printer name for validity with smbd
Samba的管理工具
下面列出一些很常用的命令,还有更多的命令我们没有介绍,必须查阅man帮助文件以获取详细信息。
smbstatus
smbstatus是一个能够列出当前Samba连接的简单程序。
用以下命令显示当前Samba连接:
[root@deep]# smbstatus
Samba version 2.0.6
Service uid gid pid machine
----------------------------------------------
tmp webmaster webmaster 3995 gate (192.168.1.3) Sat Sep 25 19:40:54 1999
No locked files
Share mode memory usage (bytes):
1048464(99%) free + 56(0%) used + 56(0%) overhead = 1048576(100%) total
Samba的用户工具
下面列出一些很常用的命令,还有更多的命令我们没有介绍,你必须查阅man帮助文件以获取详细信息。
smbclient
smbclient是一种客户端和SMB/CIFS服务器“交谈”的工具。它提供了一种类似FTP的用户界面。它所提供的操作包括从服务器上下载文件、从客户机上上传文件和从服务器上获得目录信息等等操作。
用以下命令连接WINDOWS机器:
[root@deep]# smbclient //sbmserver/sharename -U username
[root@deep]# smbclient //gate/tmp -U webmaster
Password:
Domain=[ OPENARCH] OS=[ Windows NT 4.0] Server=[ NT LAN Manager 4.0]
Smb: >
其中“//sbmserver”是你所连接的服务器的名称。“/sharename”是服务器上共享目录的名称,“-U”表示这台机器的一个用户名。
安装到系统中的文件
> /etc/rc.d/init.d/smb
> /etc/rc.d/rc0.d/K35smb
> /etc/rc.d/rc1.d/K35smb
> /etc/rc.d/rc2.d/K35smb
> /etc/rc.d/rc3.d/K35smb
> /etc/rc.d/rc4.d/K35smb
> /etc/rc.d/rc5.d/K35smb
> /etc/rc.d/rc6.d/K35smb
> /etc/codepages
> /etc/lmhosts
> /etc/pam.d/samba
> /etc/smb.conf
> /etc/MACHINE.SID
> /etc/logrotate.d/samba
> /etc/smbpasswd
> /usr/bin/smbclient
> /usr/bin/smbspool
> /usr/bin/testparm
> /usr/bin/testprns
> /usr/bin/smbstatus
> /usr/bin/rpcclient
> /usr/bin/smbpasswd
> /usr/bin/make_smbcodepage
> /usr/bin/nmblookup
> /usr/bin/make_printerdef
> /usr/bin/smbtar
> /usr/bin/addtosmbpass
> /usr/bin/convert_smbpasswd
> /usr/bin/mksmbpasswd.sh
> /usr/man/man1/nmblookup.1
> /usr/man/man1/make_smbcodepage.1
> /usr/man/man1/smbclient.1
> /usr/man/man1/smbrun.1
> /usr/man/man1/smbsh.1
> /usr/man/man1/smbstatus.1
> /usr/man/man1/smbtar.1
> /usr/man/man1/testparm.1
> /usr/man/man1/testprns.1
> /usr/man/man5/lmhosts.5
> /usr/man/man5/smb.conf.5
> /usr/man/man5/smbpasswd.5
> /usr/man/man7/samba.7
> /usr/man/man8/nmbd.8
> /usr/man/man8/smbd.8
> /usr/man/man8/smbmnt.8
> /usr/man/man8/smbmount.8
> /usr/man/man8/smbpasswd.8
> /usr/man/man8/smbspool.8
> /usr/man/man8/smbumount.8
> /usr/sbin/smbd
> /usr/sbin/nmbd
> /var/log/samba
> /var/lock/samba
发布人:netbull 来自:非常 Linux