【讲清楚,说明白!】常用共享存储--Samba服务器配置实战
(一)Samba服务器的基本配置
(二)Samba服务中关于SELinux的一些注意点
(三)multiuser多用户挂载的配置
Samba是在Linux和Unix系统上实现SMB协议的一个免费软件,由服务器客户端程序构成。SMB(Server Messages Block)信息服务块是一种在局域网上共享文件和打印机的一种通信协议,它为局域网内的不同计算机之间提供文件及打印机等资源的共享服务。SMB协议是客户机/服务器型协议,客户机通过该协议可以访问服务器上的共享文件系统、打印机及其他资源。通过设置“NetBIOS over TCP/IP”使得Samba不但能与局域网络主机分享资源,还能与全世界的电脑分享资源。
1987年,微软公司和英特尔公司共同制定了SMB(Server Messages Block)消息服务块协议,旨在解决局域网内的文件或打印机等资源的共享问题,这也使得多个主机之间共享文件变得越来越简单。到了1991年,当时还在读大学的Tridgwell为了解决Linux系统与Windows系统之间的文件共享问题,基于SMB协议开发出了SMBServer服务程序。这是一款开源的文件共享软件,经过简单配置就能够实现Linux系统与Windows系统之间的文件共享工作。当时Tridgwell想把这款软件的名字SMBServer注册成为商标,但却被商标局以SMB是没有意义的字符而拒绝了申请。后来Tridgwell不断翻看字典,突然看到一个拉丁舞蹈的名字---Samba,而且这个热情洋溢的舞蹈名字中又恰好包含了“SMB”,于是Samba服务程序的名字由此诞生。Samba服务程序现在已经成为在Linux系统与Windows系统之间共享文件的最佳选择。
(一)Samba服务器的基本配置
(1.1)samba服务器中主要是有两个服务:smb和nmb。其中nmb服务主要是针对Windows 95或者Windows 98比较旧的操作系统,如果需要和这类操作系统进行文件共享则需要开启nmb服务。smb服务主要是在tcp的139和445 端口上进行工作,nmb服务主要是在udp的137和138端口上进行工作。
(1.2)首先在vms001主机上安装samba服务,然后我们将防火墙设置允许samba服务通过,并且将SELinux设置为开启进入Enforcing的模式,进入到/etc/samba/目录编辑smb.conf配置文件
# firewall-cmd --add-service=samba --permanent
(1.3)我们可以使用egrep命令过滤出smb.conf配置文件中生效的配置信息。其中workgroup表示的是所通信的Windows主机的工作组信息(图1-5),如果Linux主机需要和Windows主机进行通信,则此时workgroup信息需要填写正确的才可以识别。而第二个参数server string表示是注释信息,“%v”表示的是版本(图1-7)。
# egrep -v ‘(#|;|^$)‘ /etc/samba/smb.conf---“^$”表示的是空白行
# man smb.conf
(1.4)其中第三个参数interfaces表示的是服务运行的IP地址的范围,默认是运行在所有地址的监听的端口上(图1-9)。
# systemctl start smb
# systemctl enable smb
# netstat -tunlp | grep smb
(1.5)第四个参数log file表示的是samba服务运行的日志保存的位置。第五个参数max log size表示的是日志记录时保存容量的最大值信息,例如我们的/var/log目录下存放着messages文件,它记录的文件容量达到一定的大小后便开始rotate(轮换),即将messages文件备份成“messages+日期”格式的压缩文件,然后清空messages文件中的内容记录新的日志信息(图1-11)。
(二)Samba服务中关于SELinux的一些注意点
(2.1)第六个参数security表示的是一种验证方式,用来设置客户端来访问我的samba服务器的时候,是否需要输入密码,默认值user表示的是必须要输入用户名和密码进行验证才可以登录samba服务(图1-13)。其中Windows系统在登录samba服务的时候,使用的是samba服务中的用户名和密码,而这个samba用户必须是samba服务器上存在的本地用户,即必须要存在于/etc/passwd文件里。首先我们在系统中我们查询到存在tom用户和bob用户,但是不存在marry用户,同时设置bob用户为/sbin/nologin,使得bob用户可以登录samba服务,但是无法登录vms001主机。
# usermod -s /sbin/nologin bob---修改bob用户的登录shell为/sbin/nologin
(2.2)我们在vms001主机上安装包含smbpasswd命令的软件包,不过此时由于firewall是属于public开启的状态,所以我们需要设置防火墙允许samba服务通过,同时还要设置允许ftp服务通过。同时还要配置SELinux中的bool值,将ftpd_full_access的bool值设置为on,此时我们就可以正常的安装smbpasswd命令的软件包了。
# yum whatprovides */smbpasswd
# yum install samba-client-4.1.12-21.el7_1.x86_64 -y
# firewall-cmd --list-all
# firewall-cmd --add-service=samba --permanent
# firewall-cmd --add-service=ftp --permanent
# getsebool -a | grep ftp
# setsebool -P ftpd_full_access on
(2.3)接着我们可以将相关的用户添加到samba服务中,注意,此处添加用户时设置的samba密码可以和用户登录系统时使用的密码不同,添加bob用户是正常的,虽然bob用户设置的是/sbin/nologin,但是仍然可以正常的添加到samba服务中,而marry用户在vms001主机上并不存在,所以也无法添加到samba服务中。接着我们从Win7主机上尝试登陆vms001主机的samba服务(图1-20),在/etc/samba/目录下的smb.conf文件中已经提示我们需要设置目录的SELinux权限,此时我们是可以正常的登录samba服务中bob用户的文件夹中的(图1-24)。
# pdbedit -L---查询当前samba服务中的所有用户
# smbpasswd -a tom---将tom用户添加到samba服务中
# smbpasswd -d tom---将tom用户禁用
# smbpasswd -e tom---将tom用户启用
(2.4)接下来我们在vms001主机上创建一个目录,我们创建一个/zz目录,希望将这个目录共享出去,在smb.conf配置文件中配置完毕后,将smb服务重启一下。此时我们在Win7主机上便可以看到hello-zz目录,由于没有修改目录的上下文信息,所以无法正常的进入hello-zz目录,修改完毕后便可以正常的登录/zz目录了
# chcon -t samba_share_t /zz
(2.5)接着我们使用Linux客户端尝试登录vms001主机的samba服务,我们首先在vms002主机上安装smbclient命令的软件。此时我们从vms002主机上可以正常的登录vms001主机上samba服务共享的目录,但是却没有创建文件的权限(图1-32)。
# smbclient -L //vms001 -U bob%redhat---在Linux客户端上查询samba服务的共享目录信息
# smbclient //vms001/hello-zz -U bob%redhat---在Linux客户端上登录samba服务
(2.6)此时我们可以使用以下思路进行判断,如果我们搭建了某个服务,从客户端上开始往服务器上传输文件,但是没法传输上去,应该从以下三部曲来检查:1.检查配置文件是否允许写;2.检查文件系统是否有权限;3.检查SELinux的权限设置情况,一般SELinux涉及的就是上下文和布尔值两个方面。首先我们在vms001主机的smb.conf配置文件中的hello-zz目录下添加可写的权限,并将samba服务重启一下(图1-33);然后我们还要修改文件系统的权限,由于登录系统时,我们使用的是tom和bob用户,但是/zz目录中其他用户并没有可以写的权限,所以我们应该给/zz目录的“o”加上可写的权限(图1-35)。
# smbclient -L //vms001 -U bob%redhat
# smbclient //vms001/hello-zz -U bob%redhat
(2.7)现在我们的需求是允许指定的用户可以在samba服务器的目录中可以写,一般是通过以下的两种方式进行控制:1控制配置文件可否写的权限;2文件系统是否允许写的权限。而我们实现这种需求可以通过两种方法实现:第一种我们首先允许文件系统中所有的其他用户都可以写,然后在smb.conf配置文件中只是允许tom用户可以写,此时在Win7客户端上使用tom用户可以正常的在samba服务的hello-zz文件夹中创建文件(图1-38),而使用bob用户则无法正常的在samba服务的hello-zz文件夹中创建文件(图1-39)。
(2.8)第二种方法我们可以指定配置文件中的所有用户都可以写并将samba服务重启一下,但是在文件系统中我们去除其他用户可写的权限,同时使用acl来指定bob用户可以写,此时在Win7系统上使用tom用户登录vms001主机的samba服务,发现在hello-zz目录中无法创建文件了(图1-42),但是使用bob用户在vms001主机的samba服务上,发现是可以在hello-zz目录中创建文件的(图1-43)。
# chmod o-w /zz
# setfacl -m u:bob:rwx /zz/
# smbclient //vms001/hello-zz -U bob%redhat
(2.9)接着我们也可以使用hosts allow和hosts deny来指定特定的客户端可以访问或者无法访问samba服务,我们设置IP地址为192.168.26.104主机,用户名为tom的用户可以访问vms001主机的samba服务,此时我们发现Win7主机上tom用户是可以正常的访问vms001主机的samba服务的(图1-45),此时我们发现在vms002主机上使用bob用户是无法登录vms001主机的samba服务的(图1-46)。
注意:hosts allow指的是在smb.conf配置文件中指定的主机IP地址才可以正常的访问samba服务,没有指定的IP地址都不能访问;hosts deny指的是在smb.conf配置文件中指定的主机IP地址为拒绝访问samba服务,没有指定的IP地址才可以正常的访问。
# setfacl -x u:bob /zz/---取消bob用户对/zz目录的特殊权限
# smbclient //vms001/hello-zz -U bob%redhat
(2.10)在Windows中存在着隐藏共享的概念,即目录名后有“$”符,那么正常的时候用户登录共享服务是看不到目录名的,但是用户如果自己在知晓的情况下在目录名后加上一个“$”符号,此时便可以正常的登录到目录中去。现在我们的需求是将vms001主机的samba服务中的hello-zz目录设置为一个隐藏共享,我们将browseable的值设置为no,并将服务重启一下,此时用户便无法看到这个目录(图1-49),但是仍然可以登录到这个目录中(图1-50)。
(2.11)上面的目录设置了隐藏共享后对所有用户都是不可见的,并不能对特定的用户单独设置开放可见目录的操作。现在我们的需求是我们只对tom用户设置可见隐藏共享的目录,只有tom进入到隐藏共享的目录hello-zz后仍然是可见的,但是其他用户进入后仍然是看不见的。首先我们在smb.conf配置文件中将browseable设置为no(图1-51),表示对所有的用户都是隐藏不可见的,同时在Network-Related Options后添加一行信息“config file = /etc/samba/smb.conf.%U”(图1-52),这样我们就可以为指定的用户来配置特定的配置文件,例如我们创建了一个smb.conf.tom文件,在smb.conf.tom配置文件中我们设置值为yes,表示对tom用户目录是可见的(图1-53)。
(三)multiuser多用户挂载的配置
(3.1)我们在vms001主机的samba服务器端有两个用户,其中tom用户访问/zz目录的权限是rwx,而bob用户访问/zz目录的权限是r-x,此时我们从客户端vms002上访问vms001主机的samba服务时,vms002主机上如果存在多个用户tom1、tom2、tom3的时候,multiuser多用户挂载可以实现tom1用户以samba服务器上的tom用户身份访问/zz目录,tom2用户以samba服务器上的bob用户身份访问/zz目录这样的功能。
(3.2)我们在vms002主机上创建一个/smb目录,然后将/smb目录挂载到/hello-zz目录下,此时我们还需要在vms002客户端安装cifs软件包,安装完cifs软件包后,此时可以正常的将/smb挂载到/hello-zz目录下了。
# smbclient -L //vms001 -U bob%redhat
# mkdir /smb
# mount -o username=tom,password=redhat //vms001/hello-zz /smb
# yum install cifs-* -y---安装cifs模块的软件包
# cifscreds clearall---清除相关的缓存
(3.3)此时我们在vms002客户端上将/smb挂载到/hello-zz目录上,并且设置为multiuser多用户挂载的方式,且设置加密方式为ntlmssp。然后我们在vms002主机上创建三个用户tom1、tom2、tom3,并设置好密码(图1-60)。我们在vms002主机上切换到tom2用户,进入到/smb目录中发现并没有查询目录文件的权限,此时我们披上samba服务器上tom用户的“马甲”后,此时便拥有了tom用户的权限,可以查询目录内的信息,也可以创建新的文件(图1-61)。我们在vms002主机上切换到tom3用户,进入到/smb目录中发现也是没有查询目录文件的权限,此时我们披上samba服务器上bob用户的“马甲”后,此时便拥有了bob用户的权限,可以查询目录内的信息,但是没有创建文件的权限(图1-62)。以上就是我们multiuser多用户挂载常见的配置。
# mount -o username=tom,password=redhat,multiuser,sec=ntlmssp //192.168.26.101/hello-zz /smb---将/smb目录挂载到vms001主机的/hello-zz目录下
# cifscreds add vms001 -u tom---切换到samba服务器上使用tom用户的权限
—————— 本文至此结束,感谢阅读 ——————