第四章 Samba服务

第四章 Samba服务

4.1 samba简介

上一章我们讲了NFS,可实现Linux间的文件共享,我们知道windows之间也有共享的功能,但是不同操作系统之间的共享,如:Linux与windows之间互访共享资源就需要samba服务来实现了。

SMB(Server Message Block)协议,也被称作Session MessageBlock协议、NetBIOS协议、或LanManager协议。它是用来在微软的Windows 操作系统之间共享文件和打印机的。Samba是使用SMB协议在Linux和Windows之间共享文件和打印机的一组程序套件。

利用Samba可以实现如下功能:

  • 把Linux系统下的文件共享给Windows系统
  • 在Linux系统下访问Windows系统的共享文件
  • 把Linux系统下安装的打印机共享给Windows系统使用
  • 在Linux系统下访问Windows系统的共享打印机

samba服务使用的通信端口与windows共享相同,都是TCP的139 和445端口,当然,samba也是借助于RPC服务的111端口与客户端通信的。

本章将主要介绍Linux与windows之间共享资源的互访操作。那么,在客户端访问共享时,无论客户端是哪一种操作系统,为了安全,都需要使用服务器端的有效用户登录成功后才可访问,所以针对不同的共享目录,可以设置不同的权限设置。下面就来看一下具体的实验操作。

PS:下面实验使用windows2003作为windows的实验方,原因是windows2003关于共享操作的过程较为简单,利于实现。而其他如:win2008、win2012、win7、win10等,由于安全性要求较高,配置共享较为麻烦。我们本章主要是介绍Linux中samba服务的功能,所以选择win2003便于体现实验效果。

4.2 windows访问Linux共享

4.2.1 Linux中samba设置共享

首先我们在Linux中安装samba的软件包,同NFS一样,centos的安装光盘中自带samba的软件安装包,可以配置yum源后安装samba:

yum -y install samba samba-common samba-client

这三个包依次是samba的主程序包、共享功能包、Linux作为客户端访问windows时的客户端包。

下面来做一下实验环境的介绍:

使用两台主机,一台windows2003服务器,一台CentOS7.4服务器。使用windows2003的目的是由于windows2003的共享操作简单,便于实验效果的体现。

分别配置ip地址:windows2003 192.168.10.1 Linux 192.168.10.10

Linux关闭防火墙:iptables –F setenforce 0

好了,基础环境搭建完毕后,开始部署实验。

1、创建共享目录,设置安全权限

mkdir /mnt/read /mnt/write /mnt/ppwrite

创建这三个目录的目的是在samba配置中将该三个目录共享出来,但设置不同的访问权限:read目录只读,write任何人可写,ppwrite目录仅pp用户可写。

chmod 777 read

chmod 777 write

chmod 777 ppwrite

注:与NFS相同,网络访问也需要遵守权限规则:网络权限与安全权限二者以最严格的的为准,所以我们也需要把目录的安全权限放开,以证明samba的共享权限的生效

2、编辑配置文件,设置共享目录

samba的配置文件是:/etc/samba/smb.conf,vi编辑可见已经有了很多默认的设置,其中:

[global]模块是对所有共享的目录做统一化默认配置的,当然针对不同的共享目录,我们也可以设置其独立的访问权限。

[home]模块是针对每个用户登录到共享后,对其家目录默认访问权限。PS:上一节讲过,windows作为客户端访问Linux的共享时,需要使用Linux中的有效用户登录,那么该用户的家目录是针对其默认共享出来的。

[printer]和[print$]模块是针对打印机共享做默认设置的。

这几个模块的默认内容可以无需更改,下面我们来创建几个自定义模块共享指定的目录:

vi /etc/samba/smb.conf

[global] 模块中写入:

ntlm auth = yes ---支持windows的登录验证

[read] ---设定共享名,改名自定义,可以与共享的目录名不同

public= yes ---允许guest账户访问

path= /mnt/read ---指定共享目录的路径

writable= no ---设置本共享目录为只读权限

[write]

public= yes

path= /mnt/write

writable= yes

[ppwrite]

public= yes

path= /mnt/ppwrite

writable= no ---设定默认为只读权限

writelist = pp ---指定具备写权限的用户,多用户可用空格分隔

注:writable、write list两行配合使用即除了pp用户可写外,其他用户只读。

该配置文件中使用的是writable来指定是否有可写权限的,也可以通过read only = yes 或 read only = no 来设定是否只读,功能效果与writable是一样的。

tips:在很多Linux版本中,global中的ntlmauth设置是没有的,设定完毕后启动smb服务即可以使用。而且这也与windows客户端的版本有关。所以读者在windows登录时,在保证用户密码正确的前提下,如果始终报账号密码有误,无法登录,则需要在CentOS7.4版本的smb配置文件中加入ntlm auth设置。

另外,[global]模块中的workgroup项有的教材建议更改成workgroup=WORKGROUP,目的是符合windows关于共享访问的工作组要求,其实不做更改,使用原用默认的也是可以的,不影响windows的访问。

3、设定samba用户

samba支持windows客户端使用Linux的系统用户登录访问共享,那么就会存在安全隐患:如果人为的使用该用户不登录samba,而是通过ssh直接登录系统,便可以做出一定的恶意破坏。所以,为了安全起见,samba会要求给系统用户登录samba时重新设置新的登录密码。那么系统用户就只能登录samba不能登录系统了。具体规则总结如下:

1)、必须是Linux系统中存在的用户

2)、系统用户必须明确加入samba用户中,并且指定新密码

下面来看一下操作命令:

useradd pp ---创建系统用户

passwd pp ---配置用户密码

smbpasswd -a root ---把root加入到samba用户中,并设置新密码

注:samba登录密码和系统密码建议不一致;若是非系统用户添加时会报错

smbpasswd –a pp ---把pp加入到samba用户中,并设置新密码

pdbedit-L ---查看samba的可用账号

另外,关于samba用户的管理,还支持删除、修改等功能,命令如下:

smbpasswd -d qq ---禁用用户

smbpasswd -e qq ---启用用户

smbpasswd -x qq ---删除用户

smbpasswd pp ---不加-a参数就是更改现有用户的密码

4、 启动服务

systemctl restart smb ---重启samba主服务

systemctl enable smb

systemctl status smb

systemctl restart nmb ---重启nmb服务

systemctl enable nmb

systemctl status nmb

说明:nmb服务是支持主机名解析的,可以将Linux的主机名解析成ip地址,客户端可以使用 \\主机名 的格式访问Linux的samba共享,如果客户端使用的是ip地址直接访问samba,则可无需nmb服务

注:同NFS一样,为了保证samba服务器重启后仍能支持客户端访问,需要设

置开机自动关闭防火墙,具体操作见NFS章。

4.2.2 windows客户端访问

Linux服务器端配置完毕后,可以使用windows验证访问了。

在windows中点开运行界面,输入 \\ip 即可访问,如下图:

确定后即会打开登录窗口:

输入samba用户及密码后,即可看到Linux共享出的目录了,如下图:

然后可以进入各个共享出的目录,以验证samba设置权限的生效。

tips:windows客户端登录时,为了验证针对不同用户权限的限制(如:ppwrite目录仅pp用户可写,使用root登录到samba后,也不可写入),我们需要切换用户登录samba,但是,在windows中,我们关闭共享的窗口,再次登录时会发现没有了登录验证,可以直接打开共享界面了,而且还是以上次登录用户的身份打开的。这是因为windows客户端访问共享时,第一次登录成功,即会在缓存中记录下登录信息,则之后的登录会直接打开,无需再次登录了。所以我们要向更换用户登录samba需要把windows系统注销再进后,再次登录samba,就可以重新输入samba登录名、密码了。或者把windows的workstations服务(运行中输入 services.msc 命令,即可查找得到)重启,清理一下缓存,也具备相同效果。

4.2.3 samba共享进阶

上面所建立的共享目录,只是简单的基本功能配置,下面来做一个较复杂的共享。

需求说明:建立共享目录share ,该目录拒绝其他用户访问,仅允许zu1组中的用户访问。zu1中有三个用户:root、pp、kk。这三个用户对share的权限也不同:root只读;pp可读写、kk拒绝访问。

依据上述需求,我们的部署方案如下:

1、配置基本环境

useradd kk

passwd kk

smbpasswd -a kk

useradd qq

passwd qq

smbpasswd -a qq

cd /mnt

mkdir share

chmod 777 share

groupadd zu1

gpasswd -a root zu1

gpasswd -a pp zu1

gpasswd -a kk zu1

2、编辑配置文件

vi /etc/samba/smb.conf ---写入

[share]

public = yes

path = /mnt/share

writable = no

write list = pp

valid users = @zu1 ---可用用户列表,@表示组中用户

invalid users = kk ---指定不可用用户,即拒绝访问的用户

3、重启服务

systemctl restart smb

restart是重启服务,即会关闭再开启,会影响到已经建立好连接、正在访问samba的客户端。其实也可以使用:systemctl reload smb 命令重新加载新的配置文件配置,这样则是在不关闭服务的情况下,更新了新的共享,就不会影响其他正在访问的客户端了。

4、windows访问验证

在windows中访问samba共享,可证明:qq因为是非zu1中用户,访问share会失败(访问share时会弹窗让再次输入用户名、密码,其实这只是windows的一种默认的处理方式,Linux中并不支持访问失败后可立即切换,所以即便输入被允许的用户名、密码也是无效的);kk虽是zu1中用户,但也不可以访问share;pp、root可以访问share,但各自有不同的权限设置。

4.3 windows共享,Linux访问

4.3.1 windows设置共享

windows的共享原理因为与本书无关,所以我们不做具体讲解,只介绍配置步骤:

1、进入e:盘,创建文件夹aaa

进入aaa文件夹,创建文件aaa.txt

2、设置共享

进入e:盘,右键 aaa 文件夹=>属性=>共享=>共享该文件夹

右键 aaa 文件夹=>属性=>安全=>添加=>输入everyone=>确定

3、配置登录密码

右键 我的电脑=>管理=>本地用户和组=>用户=>右键 administrator=>设置密码=>设置上密码后,确定直到完成。如下图:

注:本步骤设定完毕后,Linux客户端即可使用administrator用户登录windows的共享了。

4.3.2 Linux访问windows共享

windows的共享服务制作完毕后,就可在Linux中访问了,Linux中有两种访问方式:挂载式、登录式

方式一:挂载式

挂载式是最为简单直接的,也最常用,可以将windows共享的目录直接挂载本地目录上,就像使用本机的文件系统一样。

mkdir /mnt/win ---创建挂载点

mount //192.168.10.1/aaa /mnt/win -o username=administrator

---挂载共享

mount ---查看挂载表

可见windows共享的挂载显示的type文件系统类型是cifs

vi /etc/fstab ---配置开机自动挂载

//192.168.10.1/aaa /mnt/win cifs defaults,username=administrator,password=123 0 0

方式二:登录式

Linux以客户端的身份登录连接到windows服务器,使用的命令是smbclient,具体操作如下:

smbclient //192.168.10.1/win -U administrator ---进入登录界面

此界面下的操作命令与sftp登录后的方式相同,如:get、put等。

注:Linux两种连接windows共享的方式中,挂载式只可以是root用户使用。普通只允许使用登录式,或者使用sudo进行samba挂载。

4.4 samba配置文件详细介绍

以上各节,我们已经把samba服务中最常用一些配置讲解完毕,其实Linux作为共享服务器时,samba服务中还有很多配置可以对客户端进行管理,如:限制客户端ip、限制连接数等,下面来对smb.conf中global模块或单个共享模块的设置项的功能详细介绍一下,相关实验,各位读者可以自行验证一下,或当做资料库,当生产环境中有相关需求时再行查阅。(PS:以下信息来自于网络搜索:博客园,muscleape发布的文章)

[global]

config file = /usr/local/samba/lib/smb.conf.%m 说明:config file可以让你使用另一个配置文件来覆盖缺省的配置文件。如果文件不存在,则该项无效。这个参数很有用,可以使得samba配置更灵活,可以让一台 samba服务器模拟多台不同配置的服务器。比如,你想让PC1(主机名)这台电脑在访问Samba Server时使用它自己的配置文件,那么先在/etc/samba/host/下为PC1配置一个名为smb.conf.pc1的文件,然后在 smb.conf中加入:config file = /etc/samba/host/smb.conf.%m。这样当PC1请求连接Samba Server时,smb.conf.%m就被替换成smb.conf.pc1。这样,对于PC1来说,它所使用的Samba服务就是由 smb.conf.pc1定义的,而其他机器访问Samba Server则还是应用smb.conf。

workgroup = WORKGROUP 说明:设定 Samba Server 所要加入的工作组或者域。

server string = Samba Server Version %v 说明:设定 Samba Server 的注释,可以是任何字符串,也可以不填。宏%v表示显示Samba的版本号。

netbios name = smbserver 说明:设置Samba Server的NetBIOS名称。如果不填,则默认会使用该服务器的DNS名称的第一部分。netbios name和workgroup名字不要设置成一样了。

interfaces = lo eth0 192.168.12.2/24 192.168.13.2/24 说明:设置Samba Server监听哪些网卡,可以写网卡名,也可以写该网卡的IP地址。

hosts allow = 127. 192.168.1. 192.168.10.1 说明:表示允许连接到Samba Server的客户端,多个参数以空格隔开。可以用一个IP表示,也可以用一个网段表示。hosts deny 与hosts allow 刚好相反。 例如:hosts allow=172.17.2.EXCEPT172.17.2.50 表示容许来自172.17.2.*的主机连接,但排除172.17.2.50 hosts allow=172.17.0.0/255.255.0.0 表示容许来自172.17.0.0/255.255.0.0子网中的所有主机连接 hosts allow=M1,M2 表示容许来自M1和M2两台计算机连接

max connections = 0 说明:max connections用来指定连接Samba Server的最大连接数目。如果超出连接数目,则新的连接请求将被拒绝。0表示不限制。

deadtime = 0 说明:deadtime用来设置断掉一个没有打开任何文件的连接的时间。单位是分钟,0代表Samba Server不自动切断任何连接。

time server = yes/no 说明:time server用来设置让nmdb成为windows客户端的时间服务器。

log file = /var/log/samba/log.%m 说明:设置Samba Server日志文件的存储位置以及日志文件名称。在文件名后加个宏%m(主机名),表示对每台访问Samba Server的机器都单独记录一个日志文件。如果pc1、pc2访问过SambaServer,就会在/var/log/samba目录下留下log.pc1和log.pc2两个日志文件。

max log size = 50 说明:设置Samba Server日志文件的最大容量,单位为kB,0代表不限制。

security = user 说明:设置用户访问Samba Server的验证方式,一共有四种验证方式。 1. share:用户访问Samba Server不需要提供用户名和口令, 安全性能较低。 2. user:Samba Server共享目录只能被授权的用户访问,由Samba Server负责检查账号和密码的正确性。账号和密码要在本Samba Server中建立。 3. server:依靠其他Windows NT/2000或SambaServer来验证用户的账号和密码,是一种代理验证。此种安全模式下,系统管理员可以把所有的Windows用户和口令集中到一个NT系统上,使用 Windows NT进行Samba认证, 远程服务器可以自动认证全部用户和口令,如果认证失败,Samba将使用用户级安全模式作为替代的方式。 4. domain:域安全级别,使用主域控制器(PDC)来完成认证。

passdb backend = tdbsam 说明:passdb backend就是用户后台的意思。目前有三种后台:smbpasswd、tdbsam和ldapsam。sam应该是security account manager(安全账户管理)的简写。 1.smbpasswd:该方式是使用smb自己的工具smbpasswd来给系统用户(真实用户或者虚拟用户)设置一个Samba密码,客户端就用这个密码来访问Samba的资源。smbpasswd文件默认在/etc/samba目录下,不过有时候要手工建立该文件。 2.tdbsam: 该方式则是使用一个数据库文件来建立用户数据库。数据库文件叫passdb.tdb,默认在/etc/samba目录下。passdb.tdb用户数据库 可以使用smbpasswd –a来建立Samba用户,不过要建立的Samba用户必须先是系统用户。我们也可以使用pdbedit命令来建立Samba账户。pdbedit命令的 参数很多,我们列出几个主要的。   pdbedit –a username:新建Samba账户。   pdbedit –x username:删除Samba账户。   pdbedit –L:列出Samba用户列表,读取passdb.tdb数据库文件。   pdbedit –Lv:列出Samba用户列表的详细信息。   pdbedit –c “[D]” –u username:暂停该Samba用户的账号。   pdbedit –c “[]” –u username:恢复该Samba用户的账号。 3.ldapsam:该方式则是基于LDAP的账户管理方式来验证用户。首先要建立LDAP服务,然后设置“passdb backend =ldapsam:ldap://LDAP Server”

encrypt passwords = yes/no 说明:是否将认证密码加密。因为现在windows操作系统都是使用加密密码,所以一般要开启此项。不过配置文件默认已开启。

smb passwd file = /etc/samba/smbpasswd 说明:用来定义samba用户的密码文件。smbpasswd文件如果没有那就要手工新建。

username map = /etc/samba/smbusers 说明:用来定义用户名映射,比如可以将root换成administrator、admin等。不过要事先在smbusers文件中定义好。比如:root = administrator admin,这样就可以用administrator或admin这两个用户来代替root登陆Samba Server,更贴近windows用户的习惯。

guest account = nobody 说明:用来设置guest用户名。

socket options = TCP_NODELAY SO_RCVBUF=8192SO_SNDBUF=8192 说明:用来设置服务器和客户端之间会话的Socket选项,可以优化传输速度。

domain master = yes/no 说明:设置Samba服务器是否要成为网域主浏览器,网域主浏览器可以管理跨子网域的浏览服务。

local master = yes/no 说明:local master用来指定Samba Server是否试图成为本地网域主浏览器。如果设为no,则永远不会成为本地网域主浏览器。但是即使设置为yes,也不等于该Samba Server就能成为主浏览器,还需要参加选举。

preferred master = yes/no 说明:设置Samba Server一开机就强迫进行主浏览器选举,可以提高Samba Server成为本地网域主浏览器的机会。如果该参数指定为yes时,最好把domain master也指定为yes。使用该参数时要注意:如果在本Samba Server所在的子网有其他的机器(不论是windows NT还是其他Samba Server)也指定为首要主浏览器时,那么这些机器将会因为争夺主浏览器而在网络上大发广播,影响网络性能。 如果同一个区域内有多台Samba Server,将上面三个参数设定在一台即可。

os level = 200 说明:设置samba服务器的os level。该参数决定Samba Server是否有机会成为本地网域的主浏览器。os level从0到255,winNT的os level是32,win95/98的os level是1。Windows 2000的os level是64。如果设置为0,则意味着SambaServer将失去浏览选择。如果想让Samba Server成为PDC,那么将它的os level值设大些。

domain logons = yes/no 说明:设置Samba Server是否要做为本地域控制器。主域控制器和备份域控制器都需要开启此项。

logon script = %u.bat 说明:当使用者用windows客户端登陆,那么Samba将提供一个登陆档。如果设置成%u.bat,那么就要为每个用户提供一个登陆档。如果人比较多,那就比较麻烦。可以设置成一个具体的文件名,比如start.bat,那么用户登陆后都会去执行start.bat,而不用为每个用户设定一个登陆档了。 这个文件要放置在[netlogon]的path设置的目录路径下。

wins support = yes/no 说明:设置samba服务器是否提供wins服务。

wins server = wins服务器IP地址 说明:设置Samba Server是否使用别的wins服务器提供wins服务。

wins proxy = yes/no 说明:设置Samba Server是否开启wins代理服务。

dns proxy = yes/no 说明:设置Samba Server是否开启dns代理服务。

load printers = yes/no 说明:设置是否在启动Samba时就共享打印机。

printcap name = cups 说明:设置共享打印机的配置文件。

printing = cups 说明:设置Samba共享打印机的类型。现在支持的打印系统有:bsd, sysv, plp, lprng, aix, hpux, qnx 共享参数: #================== Share Definitions ================== [共享名]

comment = 任意字符串 说明:comment是对该共享的描述,可以是任意字符串。

path = 共享目录路径 说 明:path用来指定共享目录的路径。可以用%u、%m这样的宏来代替路径里的unix用户和客户机的Netbios名,用宏表示主要用于[homes] 共享域。例如:如果我们不打算用home段做为客户的共享,而是在/home/share/下为每个Linux用户以他的用户名建个目录,作为他的共享目 录,这样path就可以写成:path = /home/share/%u; 。用户在连接到这共享时具体的路径会被他的用户名代替,要注意这个用户名路径一定要存在,否则,客户机在访问时会找不到网络路径。同样,如果我们不是以用户来划分目录,而是以客户机来划分目录,为网络上每台可以访问samba的机器都各自建个以它的netbios名的路径,作为不同机器的共享资源,就可以 这样写:path =/home/share/%m 。

browseable = yes/no 说明:browseable用来指定该共享是否可以浏览。

writable = yes/no 说明:writable用来指定该共享路径是否可写。

available = yes/no 说明:available用来指定该共享资源是否可用。

admin users = 该共享的管理者 说明:admin users用来指定该共享的管理员(对该共享具有完全控制权限)。在samba 3.0中,如果用户验证方式设置成“security=share”时,此项无效。 例如:admin users =david,sandy(多个用户中间用逗号隔开)。

valid users = 允许访问该共享的用户 说明:valid users用来指定允许访问该共享资源的用户。 例如:valid users = david,@dave,@tech(多个用户或者组中间用逗号隔开,如果要加入一个组就用“@组名”表示。)

invalid users = 禁止访问该共享的用户 说明:invalid users用来指定不允许访问该共享资源的用户。 例如:invalid users = root,@bob(多个用户或者组中间用逗号隔开。)

write list = 允许写入该共享的用户 说明:write list用来指定可以在该共享下写入文件的用户。 例如:write list = david,@dave

public = yes/no 说明:public用来指定该共享是否允许guest账户访问。

guest ok = yes/no

说明:意义同“public”。

本文分享自微信公众号 - 教主小筑(gh_e0879483602d)

原文出处及转载信息见文内详细说明,如有侵权,请联系 yunjia_community@tencent.com 删除。

原始发表时间:2019-05-10

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

扫码关注云+社区

领取腾讯云代金券