Samba文件共享服务

Samba文件共享服务
 
1.Samba服务基础
在Windows网络环境中,主机之间进行文件和打印机共享是通过微软公司自己的SMB/CIFS网络协议实现的。SMB(Server Message Block,服务消息块)和CIFS (Common Internet File System,通用互联网文件系统)是微软的私有协议,在Samba项目出现之前,并不能直接与Linux/UNIX系统进行通信。
Samba是著名的开源软件项目之一,它在Linux/UNIX系统中实现了微软的SMB/CIFS 网络协议,从而使得跨平台的文件共享变得更加容易。在部署Windows、Linux/UNIX混合平台的企业环境时,选用Samba可以很好地解决不同系统之间的文件互访问题。
 
1.1 Samba软件的组成
1.Samba软件包的构成
在RHEL5系统的DVD安装光盘中可以找到与Samba相关的几个软件包,主要包括服务端软件samba,客户端软件samba-client,用于提供服务端和客户端程序的公共组件samba-common,还有一个用于提供Web接口的图形管理程序软件samba-swat。
[root@sky ~]# ls /mnt/Packages/samba-*
/mnt/Packages/samba-3.6.9-151.el6.x86_64.rpm
/mnt/Packages/samba-client-3.6.9-151.el6.x86_64.rpm
/mnt/Packages/samba-common-3.6.9-151.el6.i686.rpm
/mnt/Packages/samba-common-3.6.9-151.el6.x86_64.rpm
/mnt/Packages/samba-winbind-3.6.9-151.el6.x86_64.rpm
/mnt/Packages/samba-winbind-clients-3.6.9-151.el6.i686.rpm
/mnt/Packages/samba-winbind-clients-3.6.9-151.el6.x86_64.rpm
 
通常情况下samba,samba-client,samba-common这三个软件包是随RHEL5系统默认安装好的,已经能够实现Samba服务器和客户端的大部分功能。用户可以查询系统中samba相关软件包的安装情况,若发现缺少上述三个软件包中的一个,只需要从RHEL5 光盘中找到安装包文件并进行安装即可。
[root@sky ~]# rpm -qa | grep "^samba"
samba-winbind-clients-3.6.9-151.el6.x86_64
samba4-libs-4.0.0-55.el6.rc4.x86_64
samba-common-3.6.9-151.el6.x86_64
samba-client-3.6.9-151.el6.x86_64
samba-winbind-3.6.9-151.el6.x86_64
 
2. Samba服务的程序组件
Samba服务器提供两个服务程序,分别完成不同的功能。其中smbd 负责为客户机提供服务器中共享资源(目录和文件等)的访问:nmbd负责提供基于NetBIOS协议的主机名称解析,以便为windows网络中的主机进行查询服务。
安装好samba软件包以后在RHEL5系统中会添加一个名为smb的标准系统服务,管理员可以通过服务脚本/etc/rc.d/init.d/smb或者service工具来控制Samba服务的启动与终止,而无需单独运行smbd或nmbd。例如,执行“service smb start”命令可以启动Samba服务器程序。
[root@sky ~]# yum -y install samba <==推荐使用yum方式安装
[root@sky ~]# service smb start
启动 SMB 服务:                                            [确定]
 
启动smb服务以后,会自动加载smbd和nmbd两个程序组件。使用netstat命令可以验证服务进程状态,其中smbd程序负责监听TCP协议的139端口(SMB协议),445 端口(CIFS协议) ,nmbd服务程序负责监听UDP协议的137-138端口(NetBlOS 协议)。
[root@sky ~]# netstat -anpt | grep "mbd"
tcp        0      0 0.0.0.0:139                 0.0.0.0:*                   LISTEN      29436/smbd          
tcp        0      0 0.0.0.0:445                 0.0.0.0:*                   LISTEN      29436/smbd          
tcp        0      0 :::139                      :::*                        LISTEN      29436/smbd          
tcp        0      0 :::445                      :::*                        LISTEN      29436/smbd
 
1.2 主配置文件smb.conf 
Samba服务的配置文件位于/ete/samba/目录中,其中smb.conf是主配置文件。在smb.conf文件中,以“#”号开始的行表示注释性的文字,以“:”开始的行表示是配置样例。在配置共享文件夹时用户可以参考文件中提供的样例行进行设置。去掉注释行样例行以及空行以外的内容,才是Samba服务器的有效配置。例如使用grep命令可以过滤出smb.conf文件中的有效配置。
[root@sky ~]# grep -v "#" /etc/samba/smb.conf | grep -v "^;" | grep -v "^$"
[global]   
    workgroup = MYGROUP
    server string = Samba Server Version %v
    log file = /var/log/samba/log.%m
    max log size = 50
    security = user
    passdb backend = tdbsam
    load printers = yes
    cups options = raw  
[homes]
    comment = Home Directories
    browseable = no
    writable = yes   
[printers]
    comment = All Printers
    path = /var/spool/samba
    browseable = no
    guest ok = no
    writable = no
    printable = yes
 
从以上内容可以看出,smb.conf文件中的配置内容默认包括以下三个部分。
➣   [global]全局设置,这部分配置项的内容对整个Samba服务器都有效。
➣   [homes]宿主目录共享设置:设置Linux用户的默认共享,对应用户的宿主目录。当用户访问服务器中与自己用户名同名的共享目录时,通过验证后将会自动映射到该用户的宿主文件夹中。
➣   [printers]打印机共享设置:如果需要共享打印机设备,可以在这部分进行配置。若需要在smb.conf文件中设置新的共享文件夹,只需要増加一段,如”[myshare]“开始的共享设置即可,其中”myshare”为用户自定义的共享名。新的共享文件夹设置可以参考“[homes]和[printers]部分的内容,具体配置方法将在下一节讲解。
 
下面列出smb.conf文件中常见的一些配置项及其含义说明(如下所示) 
常见全局配置项的含义
●   workgroup:所在工作组名称
●   server string:服务器描述信息
●   security:安全级别,可用值如下:share、user、server、domain
●   log file:日志文件位置,“%m”变量表示客户机地址
●   max log size:日志文件的最大容量,单位为KB
●   passwd backend:设置共享账户文件的类型
●   comment:对共享目录的注释、说明信息
●   path:共享目录在服务器中对应的实际路径
●   browseable:该共享目录在“网上邻居”中是否可见
●   guest ok:是否允许所有人访问,等效于“public”
●   writable:是否可写,与read only的作用相反
 
Samba服务器提供了一个配置文件检查工具——testparm程序,使用testparm工具可以对smb.conf配置文件的正确性进行检查,如果发现有错误将会进行提醒。例如,当配置文件中的public共享设置未指定文件夹路径时,执行testparm检测会给出提示”WARNING:No path in service public ......“。
[root@sky ~]# testparm
Load smb config files from /etc/samba/smb.conf
rlimit_max: increasing rlimit_max (1024) to minimum Windows limit (16384)
Processing section "[homes]"
Processing section "[printers]"
Processing section "[public]"
WARNING: No path in service public - making it unavailable!
NOTE: Service public is flagged unavailable.
Loaded services file OK.
Server role: ROLE_STANDALONE
Press enter to see a dump of your service definitions <==按Enter键输出当前配置清单
[global]
    workgroup = MYGROUP
    server string = Samba Server Version %v
    log file = /var/log/samba/log.%m
    max log size = 50
    idmap config * : backend = tdb
    cups options = raw
[homes]
    comment = Home Directories
    read only = No
    browseable = No
[printers]
    comment = All Printers
    path = /var/spool/samba
    printable = Yes
    print ok = Yes
    browseable = No
[public]
    available = No
 
2 构建文件共享服务器
在上节中学习了Samba服务的基本知识,并了解了主配置smb.conf文件中常用的一些配置项。接下来将学习如何设置文件夹共享,包括匿名访问和用户验证的共享设置,以及账户映则和客户机访问控制等常见配置。
 
2.1 可匿名访问的共享
可匿名访问的共享适用于公开的资源分享,一般只建议提供只读访问.由于匿名共享不需要验证用户名和密码(或允许提供任意用户名,密码)就可以访问,在安全性要求不高的情况下,可以非常方便,快捷地与其他主机共享资源。
[root@sky ~]# vim /etc/samba/smb.conf 
[global]
   workgroup = WORKGROUP
   security = share
[aaa] 
   comment = sky file
   path = /home/aaa
   public = yes
   read only = yes
[root@sky ~]# service smb reload
重新载入 smb.conf 文件:                                   [确定]
[root@sky ~]# iptables-save     <==开放防火墙端口
# Generated by iptables-save v1.4.7 on Thu May 14 17:05:28 2015
*filter
:INPUT ACCEPT [1:494]
:FORWARD ACCEPT [0:0]
:OUTPUT ACCEPT [31:3076]
-A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT 
-A INPUT -p icmp -j ACCEPT 
-A INPUT -i lo -j ACCEPT 
-A INPUT -p tcp -m state --state NEW -m tcp --dport 22 -j ACCEPT 
-A INPUT -p tcp -m tcp --dport 139 -j ACCEPT       
-A INPUT -p tcp -m tcp --dport 445 -j ACCEPT 
-A INPUT -p udp -m udp --dport 137:138 -j ACCEPT 
COMMIT
# Completed on Thu May 14 17:05:28 2015
[root@sky ~]#  setenforce 0     <==关闭SElinux
配置完毕后,就可以从Windows客户机或Linux客户机中浏览并匿名访问此共享了。关于在Linux主机中访问共享文件夹的方法,将在后面讲解。

 
2.2 需用户验证的共享
匿名共享虽然用起来非常方便,但因为任何人都可以访问到共享的文件数据,在某些时候可能会导致信息的泄露。例如,当销售部员工Tom将商品报价数据匿名共享给销售经理kylin时,另一个部门的同事Jerry可能无意中正好看到了这些共享的数据,而Tom仍然毫无察觉。
设置用户验证的共享文件夹时,在主配置文件smb.conf中同样需要调整两个地方:其一,将默认的安全级别修改为share;其二,添加共享目录配置,指定用户权限。在此之前,还需要先创建授权的共享账户。
 
1 .建立Samba用户数据库
为了区别于Linux主机中的系统用户,通常将用于访问Samba共享资源的用户称为共享用户。Samba服务器使用独立的共享账号数据库文件,其中的账号名称必须有与它同名的系统用户相对应,以便主机对共享访问的读写权限进行控制;但共享用户的密码是额外设置的,可以与系统用户密码不一样。
 
Samba共享用户的账号数据库文件默认位于/etc/samba/passdb.tdb,是一个经过加密的文件,其中保存了Samba用户的账号名称,登录密码、账号可用状态等信息,使用pdbedit工具可以对共享用户进行管理、例如,执行”pdbedit -a -U vina”命令可以添加一个名为vina的Samba共享用户,其中的“-a“选项表示添加,”-u“选项用于指定用户名称(也可以省略”-u"选项直接指定用户名)。
[root@sky samba]# useradd vina        <==先添加系统用户vina
[root@sky samba]# pdbedit -a -u vina        <==再添加共享用户vina
new password:             <==设置共享用户vina的密码
retype new password:
Unix username:        vina
NT username:          
Account Flags:        [U          ]
User SID:             S-1-5-21-3085942465-2114545798-2993888275-1000
Primary Group SID:    S-1-5-21-3085942465-2114545798-2993888275-513
...... //省略部分内容
执行”pdbedit -L“命令可以列出所有的Samba共享用户,若只想查看某一个用户的信息,可以指定用户名称作为参数,结合”-v“选项可以输出更详细的内容。
[root@sky samba]# pdbedit -L      <==列出所有samba用户
vina:501:
[root@sky samba]# pdbedit -vL vina        <==只列出vina用户,输出详细信息
Unix username:        vina
NT username:          
Account Flags:        [U          ]
User SID:             S-1-5-21-3085942465-2114545798-2993888275-1000
Primary Group SID:    S-1-5-21-3085942465-2114545798-2993888275-513
Full Name:            
Home Directory:       \\sky\vina
HomeDir Drive:        
Logon Script:         
Profile Path:         \\sky\vina\profile
Domain:               SKY
Account desc:         
Workstations:         
Munged dial:          
Logon time:           0
Logoff time:          三, 06 2月 2036 23:06:39 CST
Kickoff time:         三, 06 2月 2036 23:06:39 CST
Password last set:    四, 14 5月 2015 17:37:47 CST
Password can change:  四, 14 5月 2015 17:37:47 CST
Password must change: never
Last bad password   : 0
Bad password count  : 0
Logon hours         : FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
当指定的samba用户不需要再使用时,可以通过pdbedit工具进行删除,只要结合”-x“选项并指定Samba用户的名称即可。例如,执行”pdbedit -x -u vina“命令可以删除名为vina的samba账号。
[root@sky samba]# pdbedit -x -u vina
[root@sky samba]# pdbedit -vL vina
Username not found!
 
2.设置用户访问授权
若要使用用户验证的Samba共享,应将secunty安全级别提升为“user”。共享目录的用户授权设置主要由”valid users”、“weite list”配置项指定。当需要授权多个共享用户时,以逗号或空格进行分隔。如果需要授权一个用户组,可以使用“@组名“的形式,但需要为组内的每个系统用户都创建对应的Samba共享用户。
 
例如,若要将本地目录/opt/mytools/发布为共享文件夹,共享名为tools,要求只有共享用户vanko、hunter能够访问,其中hunter用户具有写入权限,可以参照以下步骤操作。
 
(1)创建共享用户vanko、hunter,确认共享目录。
[root@sky ~]# useradd vanko      <==创建系统用户
[root@sky ~]# useradd hunter
[root@sky ~]# pdbedit -a -u vanko      <==创建Samba共享用户
[root@sky ~]# pdbedit -a -u hunter
[root@sky ~]# mkdir /opt/mytools             <==新建本地测试目录
 
(2)修改smb.conf配置文件,添加名为tools的共享目录配置段。 
[root@sky ~]# vim /etc/samba/smb.conf 
[global]
   security = user              <==提升默认的安全级别
[tools] 
   comment = You can get software tools from here.
   path = /opt/mytools
   public = no
   read only = no
   valid users = vanko, hunter
   write list = hunter
                                   
(3)重新加载smb.conf文件中的配置,或重启smb服务,
[root@sky ~]# service smb reload
重新载入 smb.conf 文件: [确定]
 
3.确定目录访问授权
通过Samba服务器共享本地的文件夹时,用户最终是否拥有读取,写人权限,除了需要设置用户授权以外,还要满足一个前提条件——在服务器本机中,与共享用户同名的系统用户对发布为共享的本地文件夹(如/opt/mytools/)必须有相应的读取,写入权限。
 
因此,在上一步骤的例子中,还需要调整/opt/mytools目录的权限,使vanko用户能够读取,hunter用户能够写入。例如为了简便起见,可以将/opt/mytools文件夹的权限设置为777. 
[root@sky ~]# chmod 777 /opt/mytools/
 
另外,当通过共享目录上传文档时,对于共享用户所上传的文件,创建子目录的默认权限,可以分别使用配置项”directory mask"、"create mask"进行指定。例如若要使用户访问tools共享时,所上传的目录的默认权限为755,文件的默认权限为644 可以参考以下步骤在[tools]配置段添加相关内容。
[root@sky ~]# vim /etc/samba/smb.conf
   directory mask = 0755
   create mask = 0644
[root@sky ~]# service smb reload
 
2.3 用户映射及访问地址限制
为了进一步提高Samba共享服务的安全性,除了可以对指定的共享目录设置用户授权以外,还可以采取用户映射,访问地址限制等措施。
1.共享账号映射(别名) 
在使用Samba共享账号时,通常情况下,一个共享用户账号都有一个同名的系统用户账号。一些别有用心的攻击者可能会使用网络中泄露的共享用户账号,将其作为Samba服务器的系统用户尝试远程登录,给Linux主机带来极大的安全隐患。
 
鉴于此,Samba服务器为我们提供了”用户名称映射“(sername Map)机制,可以将一个共享用户映射为多个不同的名称(别名)。这样一来,只需要通过共享用户的别名和密码就可以访问授权的资源了,而不需要知道真实的共享用户(系统用户)名称。
 
Samba共享账号的映射文件默认位于/etc/samba/smbusers,文件中的配置记录使用"共享用户名=别名1 别名2 别名3...”的格式。在该文件中默认已经添加了两条兼容Windows客户机的别名映射。
[root@sky ~]# cat /etc/samba/smbusers 
# Unix_name = SMB_name1 SMB_name2 ...
root = administrator admin
nobody = guest pcguest smbguest
 
当客户机以用户administrator或admin访问共享时,Samba服务器将其视为本机的共享用户root;同样地,用户guest,pcguest等被映射为共享用户nobody。若要添加新的映射账号,只需在文件/etc/samba/smbusers的末尾追加相关记录即可。例如,若希望为现有的Samba共享用户vanko指定两个别名sunboy,player,可以执行以下操作。
[root@sky ~]# vim /etc/samba/smbusers 
vanko = sunboy player
 
这样一来,对于授权给共享用户vanko访问的共享文件夹,只要使用共享用户sunboy或者Player也都可以访问(密码仍然使用共享用户vanko的)。而共享用户vanko 的账号名称可以不告诉使用者,从而提高了系统用户vanko的安全性。
 
设置好共享用户的别名记录以后,若要正常启用账号映射功能,需要修改主配置文件/etc/samba/smb.conf,添加全局配置项”username map= /etc/samba/smbusers"然后重新加载配置即可生效。
[root@sky ~]# vim /etc/samba/smb.conf 
[global]
username map = /etc/samba/smbusers
[root@sky ~]# service smb restart
 
2.访问地址限制
针对访问Samba服务器的客户机可以通过”hosts allow"、“hosts deny”配置项进行访问限制,前者用于指定仅允许访问共享的客户机地址,后者用于指定仅拒绝访问共享的客户机地址,两种方式任选其一即可。
 
访问地址限制一般应用于[global】全局配置部分,也可以应用于某个具体的共享配置段部分。限制的对象可以是主机名,ip地址或者网络段地址(省去主机部分),多个地址之间以逗号或空格进行分隔。例如,若希望仅允许来自192.168.1.0/24,173.17.0.0/16网段的客户机访问Samba服务器,可以参考以下操作调整配置。
[root@sky ~]# vim /etc/samba/smb.conf 
[global]
hosts allow = 192.168.1. 172.17.
[root@sky ~]# service smb reload
 
3 访问共享文件
本节将学习在Linux主机中如何访问共享资源,其中的部分操作将以构建好的Samba服务器(IP地址为192.168.1.10)为例,包括共享文件夹tools,共享用户vanko、hunter。
 
3.1使用smbclient访问共享文件夹
在RHEL5系统中,samba-client软件包提供的smbclient工具可以用于查询,访问共享资源。下面分别介绍其常见的几种用法。
 
1. 查询目标主机的共享资源列表
使用smbclient命令查询共享资源时,需要添加”-L”选项并指定目标主机的地址或主机名。在工作组环境中查询共享资源时,一般不需要用户验证,提示输入密码时直接按回车键即可。例如,执行以下操作可以匿名查询Samba服务器192.168.1.10 中提供的共享资源列表。
[root@sky ~]# smbclient -L 192.168.1.10
Enter root's password: 
Anonymous login successful
Domain=[WORKGROUP] OS=[Unix] Server=[Samba 3.6.23-14.el6_6]
 
    Sharename       Type      Comment
    ---------       ----      -------
    IPC$            IPC       IPC Service (Samba Server Version 3.6.23-14.el6_6)
    tools           Disk      You can get software tools from here.
 
2. 登录并访问共享文件夹
使用smbcclient命令访问共享文件夹时,需要通过“//主机地址/共享名”的形式指定共享文件夹的位置。对于允许匿名访问的共享文件夹,提示输入密码时直接按回车键即可。例如,执行以下操作可以连接到Samba服务器192.168.1.10中名为tools的匿名共享目录。
[root@sky ~]# smbclient //192.168.1.10/aaa
Enter root's password:  
 
如果访问的是需要用户验证的共享文件夹,则必须结合”-U"选项指定经过授权的共享用户名称(或映射的别名),并输入正确的密码进行验证。例如,对于2.2节中的tools共享,使用共享用户vanko(或别名sunboy,player)、hunter都可以进行访问。
[root@sky ~]# smbclient -U vanko //192.168.1.10/tools
Enter vanko's password: 
Domain=[WORKGROUP] OS=[Unix] Server=[Samba 3.6.23-14.el6_6]
smb: \> 
 
通过smbclient工具成功登录Samba服务器以后会出现“smb:\>"提示符,提供了二个类似于ftp命令程序的环境。在“smb:\>”环境中,使用特定的命令可以对共享目录进行列表、上传、下载等操作。例如,使用ls用于列表目录,pwd查看当前路径,get和mget用于下载文件,put和mput用于上传文件 ·  ·  ·  ·  ·  · 使用"?"或”help”命令可以查看各种交互命令的在线帮助信息。下列操作过程展示了其中的部分操作命令。
smb: \> pwd
Current directory is \\192.168.1.10\tools\
smb: \> ls
  .                                   D        0  Thu May 14 18:34:34 2015
  ..                                  D        0  Thu May 14 18:34:34 2015
 
        35418 blocks of size 524288. 25769 blocks available
smb: \> lcd /root/
 
3.2 使用mount挂载共享文件夹
smbclient客户端工具可以非常方便地登录到Samba服务器,但是只有将文件下载到本地以后才能查看文件内容。而若使用mount工具将共享文件夹挂载到本地,则通过本地的挂载点目录即可直接使用共享文件夹的内容,使文件共享更加方便。
 
使用mount命令挂载共享资源时,只需通过”//主机地址/共享名“的形式指定共享文件夹的位置(视为设备资源),并指定本地的挂载点目录即可。例如,若要将Samba服务器192.168.1.10中的tools共享目录挂载到本地的/media/smbdir文件夹,以共享用户hunter进行验证,可以在客户机中执行以下操作。
[root@sky ~]# mkdir /media/smbdir
[root@sky ~]# mount -o username=hunter //192.168.1.10/tools /media/smbdir/
Password: 
[root@sky ~]# mount | tail -1       <==确认挂载结果
//192.168.1.10/tools on /media/smbdir type cifs (rw)
 
挂载成功以后,可以对Samba服务器设置的访问权限进行测试。根据上节中的Samba服务器配置,hunter用户对tools共享目录拥有写入权限,所上传文件的默认权限为644,所创建目录的默认权限为755。
[root@sky ~]# cd /media/smbdir/         <==切换到挂载点目录
[root@sky smbdir]# mkdir mydir          <==创建测试文件夹
[root@sky smbdir]# touch myfile         <==创建测试文件
[root@sky smbdir]# ls -ld my*           <==验证所创建目录,文件的权限
drwxr-xr-x. 2 hunter hunter 0 5月  14 18:43 mydir
-rw-r--r--. 1 hunter hunter 0 5月  14 18:43 myfile
 
 
 





posted @ 2015-05-27 10:16  Hello-Sky  阅读(4553)  评论(1编辑  收藏  举报