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主机中访问共享文件夹的方法,将在后面讲解。
![](https://images0.cnblogs.com/blog/747908/201505/271016151266030.png)
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 |