一、Samba简介
Samba是一个能让Linux系统应用Microsoft网络通讯协议的软件,由客户端和服务端构成。 SMB(Server Message Block的缩写,即服务器消息块)主要是作为Microsoft的网络通讯协议,后来Samba将SMB通信协议应用到了Linux系统上,就形成了现在的Samba软件。后来微软又把 SMB 改名为 CIFS(Common Internet File System),即公共 Internet 文件系统,并且加入了许多新的功能,这样一来,使得Samba具有了更强大的功能。
Samba最大的功能就是可以用于Linux与windows系统直接的文件共享和打印共享,Samba既可以用于windows与Linux之间的文件共享,也可以用于Linux与Linux之间的资源共享,由于NFS(网络文件系统)可以很好的完成Linux与Linux之间的数据共享,因而 Samba较多的用在了Linux与windows之间的数据共享。
SMB是基于客户机/服务器型的协议,因而一台Samba服务器既可以充当文件共享服务器,也可以充当一个Samba的客户端,例如,一台在Linux 下已经架设好的Samba服务器,windows客户端就可以通过SMB协议访问Samba服务器上的资源,同时,Samba服务器也可以访问网络中 其它windows系统或者Linux系统共享出来的文件。Samba在windows下使用的是NetBIOS协议,如果你要使用Linux下共享出来的文件,请确认你的windows系统下是否安装了NetBIOS协议。
组成Samba运行的有两个服务,一个是SMB,另一个是NMB;SMB是Samba 的核心启动服务,主要负责建立 Linux Samba服务器与Samba客户机之间的对话, 验证用户身份并提供对文件和打印系统的访问,只有SMB服务启动,才能实现文件的共享,监听139 TCP端口;而NMB服务是负责解析用的,类似与DNS实现的功能,NMB可以把Linux系统共享的工作组名称与其IP对应起来,如果NMB服务没有启动,就只能通过IP来访问共享文件,而不能使用主机名的方式进行访问,监听137和138 UDP端口。
二、实验环境
服务端:Centos 7 192.168.10.130 客户端:Windows 7虚拟机
三、开始实验
1、安装Samba
1.1 检查本机是否安装了Samba
[root@app ~]# rpm -qa | grep samba
如上图所示,我们可以看到系统默认只安装了Samba客户端和通用包,没有安装服务端,SAMBA 这个服务器总共需要至少三个套件,分别是:
samba:这个套件主要包含了 SAMBA 的主要 daemon档案 ( smbd 及 nmbd )、 SAMBA 的文件档 ( document )、以及其它与 SAMBA 相关的logrotate 设定文件及开机预设选项档案等;
samba-common:这个套件则主要提供了 SAMBA 的主要设定档(smb.conf) 、 smb.conf 语法检验的测试程序 ( testparm )等等;
samba-client:这个套件则提供了当 Linux 做为SAMBA Client 端时,所需要的工具指令,例如挂载 SAMBA 档案格式的执行档 smbmount等等。
下面我们查看下yum仓库中的Samba版本:
[root@app ~]# yum list samba-*
这里我们卸载系统自带的Samba-4.7安装yum仓库中的Samba-4.9。
1.2 卸载系统自带的Samba
[root@app ~]# rpm -e samba-common -f --nodeps [root@app ~]# rpm -e samba-common-libs -f --nodeps [root@app ~]# rpm -e samba-client -f --nodeps [root@app ~]# rpm -e samba-client-libs -f --nodeps
1.3 使用yum安装Samba
[root@app ~]# yum install samba samba-common samba-client -y
安装完成后,能看到如下所示说明安装成功
1.4 验证Samba服务
[root@app ~]# systemctl start nmb [root@app ~]# systemctl status smb
如果一切顺利你会看到如下所示:
至此Samba安装完成,下面介绍Samba配置文件的常用选项:
1.5 Samba配置文件/etc/samba/smb.conf.example中常用配置选项如下:
[global] # ----------------------- Network-Related Options ------------------------- # workgroup = MYGROUP # Windows域名或者工作组名 server string = Samba Server Version %v # 这是一段描述信息,可以随便写。一般用linux访问共享时会看到,Windows看不到。 netbios name = MYGROUP # 用于指定与主机名无关的服务器名称,最大值为15个字符。 interfaces = lo eth0 192.168.12.2/24 192.168.13.2/24 # 用于指定监听的网络接口,可以是网卡名,也可以是IP地址的形式。 hosts allow = 127. 192.168.12. 192.168.13. EXCEPT 192.168.1.10 # 指定仅允许哪些主机有权访问Samba服务器资源(白名单),该参数可以放置在全局,也可以放置在共享段。这里可以指定允许访问的主机名、IP地址或网段,当指定网段时可以使用192.168.12或192.168.12.0/255.255.255.0格式,使用EXCEPT可以指定排除的IP地址。 hosts deny = 127. 192.168.12. 192.168.13. EXCEPT 192.168.1.10 # 指定不允许哪些主机访问Samba服务器资源(黑名单),语法与白名单类似。 # --------------------------- Logging Options ----------------------------- log file = /var/log/samba/log.%m #定义日志文件,因为使用了Samba变量%m,所以每个访问共享的主机会产生独立的 max log size = 50 # 定义日志文件大小50KB(单位是KB) # ----------------------- Standalone Server Options ------------------------ security = user # 有四种安全级别:uesr,share(官方不推荐),server(官方不推荐),domain(ads)。user:是通过Samba服务器提供的用户名和密码进行访问。share:不需要用户名密码就可以访问Samba服务器。server:基于其它服务器验证的方式访问Samba服务器,domain是基于AD服务器验证的方式访问Samba服务器。 passdb backend = tdbsam # 用户名密码的存储方式,有三种:tdbsam,smbpasswd,ldapsam。smbpasswd代表使用老的明文格式存储账户及密码;tdbsam代表基于TDB的密文格式存储;ldapsam代表使用LDAP存储账户资料。 # ----------------------- Domain Members Options ------------------------ # security = domain # 必须是domain或者ads passdb backend = tdbsam # 与上面相同,这里不解释。 realm = MY_REALM # 仅当设置了“security=ads”选项时才使用realm选项。realm选项指定主机所属的活动目录领域。 password server =# 仅当“security=server”时使用此选项,或者如果无法使用DNS定位域控制器。可以使用下面参数列表: My_PDC_Name、[My_BDC_Name]、[My_Next_BDC_Name]:password server = My_PDC_Name [My_BDC_Name] [My_Next_BDC_Name] # ----------------------- Domain Controller Options ------------------------ # security = user # 必须使用域控制器中的用户登陆. passdb backend = tdbsam # 与上面选项一样不解释。 domain master = yes # 指定Samba为域主控制器,允许Samba来整理子网之间的浏览列表。如果已经有Windows NT域控制器执行此任务,应设置为no。 domain logons = yes # 允许Samba为Windows或者工作站提供网络登录服务。 # # logon script = specifies a script to run at login time on the client. These # scripts must be provided in a share named NETLOGON. # logon path = specifies (with a UNC path) where user profiles are stored. # the following login script name is determined by the machine name # (%m): ; logon script = %m.bat # the following login script name is determined by the UNIX user used: ; logon script = %u.bat ; logon path = \\%L\Profiles\%u # use an empty path to disable profile support: ; logon path = # various scripts can be used on a domain controller or a stand-alone # machine to add or delete corresponding UNIX accounts: ; add user script = /usr/sbin/useradd "%u" -n -g users ; add group script = /usr/sbin/groupadd "%g" ; add machine script = /usr/sbin/useradd -n -c "Workstation (%u)" -M -d /nohome -s /bin/false "%u" ; delete user script = /usr/sbin/userdel "%u" ; delete user from group script = /usr/sbin/userdel "%u" "%g" ; delete group script = /usr/sbin/groupdel "%g" # ----------------------- Browser Control Options ---------------------------- # local master = no # 当设置为no时,Samba不会成为网络上的主浏览服务器。当设置为yes时,将进行正常的选举。 os level = 33 # 选举Samba主服务器的优先级,数字越大称为主服务器的几率越高。 preferred master = yes # 如果为yes在启动Samba时强制进行本地主服务器选举,并为自己赢得选举提供更高的机会 #----------------------------- Name Resolution ------------------------------- # # 用于支持 Windows Internet Name Service (WINS). # Samba可以是WINS服务器或WINS客户端,但不能同时是两者。 wins support = yes # 当设置为yes时,Samba的NMBD组件将启用其WINS服务器。 wins server = w.x.y.z # wins服务器地址 wins proxy = yes # 当设置为yes时,Samba为不支持WINS功能的客户机进行名称解析查询。默认为否,网络上必须至少有一台WINS服务器进行域名解析。 dns proxy = yes # 当设置为yes时Samba将尝试通过DNS nslookups解析NetBIOS名称 # --------------------------- Printing Options ----------------------------- # load printers = yes # 设置为“yes”时,将自动加载打印机列表进行共享,而不是单独进行设置。 cups options = raw # 允许您将选项传递到CUPS库。例如,将此选项设置为raw,则可以在Windows客户端上使用驱动程序。 printcap name = /etc/printcap # 用于指定备用的printcap文件。lpstat:自动获取UNIX System V系统上的打印机列表: printing = cups # 定义打印机的系统类型,可选项有:bsd,sysv,plp,lprng,aix,hpux,qnx,cups # --------------------------- File System Options --------------------------- # map archive = no # 当Windows客户端将文件复制或移动到Samba服务器共享目录时,是否保留文件在Windows中的属性。默认yes map hidden = no # 当Windows客户端将文件复制或移动到Samba服务器共享目录时,是否保留文件在Windows中的隐藏文件属性,默认为yes map read only = no # 当Windows客户端将文件复制或移动到Samba服务器共享目录时,是否保留文件在Windows中的只读属性。默认为yes map system = no # 当Windows客户端将文件复制或移动到Samba服务器共享目录时,是否保留文件在Windows中的系统文件属性,默认为no store dos attributes = yes # 当Windows客户端将文件复制或移动到Samba服务器的共享目录时,是否保留文件在Windows中的相关属性(只读,系统,隐藏,存档属性)。默认为no。 #============================ 单独设置的常用选项 ============================== [test] comment = Home Directories # 描述符,是给系统管理员看的 path = /tmp # 共享文件的路径 security = user # 设置安全级别 public = yes # 是否公开,也就是是否能在网上邻居看到该共享 guest ok = yes/no # 设置是否所有人都可以访问共享目录,与public配置项作用相同。 guest ok = no # 是否拒绝匿名访问,仅当安全级别为 share 时才生效 browseable = yes # 共享的目录是否让所有人可见 guest account = nobody # 设置匿名账户为nobody invalid users = root,@bob # 用来指定禁止访问该共享的用户和组,多个用户或者组中间用逗号隔开 valid users = root,@bob # 用来指定允许访问该共享资源的用户。如果开启此项,则不再列表中的用户将无法访问共享。多个用户或者组中间用逗号隔开,如果要加入一个组就用“@组名”表示。 writable = yes/no # writable用来指定该共享路径是否可写。 write list = root,@bob # 允许写入该共享的用户 deadtime = 10 # 客户端在10分钟内没有打开任何 Samba资源,服务器将自动关闭会话,在大量的并发访问环境中,这样的设置可以提高服务器性能 display charset = UTF8 # 设置显示的字符集 max connections = 0 # 设置最大连接数,0表示无限制,如果超过最大连接数则拒绝连接 create mask = 0775 # 客户端上传文件的默认权限 directory mask = 0775 # 客户端创建目录的默认权限 admin users = user1 # 设置共享目录的管理员,具有完全权限 # 过滤上传的文件 veto files=/*.txt/*.bmp/*.doc/ delete veto files = yes #文件类型之间用“/“分隔开只设置veto files实际上是隐藏文件不让用户看到,文件已经上传到了服务器,没有实现过滤的功能。delete veto files 设置为 yes 后才是将限制类型的文件删除,实现文件过滤的功能。
2、使用匿名的方式访问共享
2.1 创建匿名共享目录,有读写的权限。
[root@app ~]# mkdir /tmp/share [root@app ~]# chmod -R 777 /tmp/share/
2.2 实验环境,关闭本机防火墙,selinux
[root@app ~]# systemctl stop firewalld.service # 临时关闭本机防火墙 [root@app ~]# setenforce 0 // 临时关闭selinux # 永久关闭selinux 修改配置文件/etc/selinux/config: 将SELINUX=enforcing改为SELINUX=disabled 重启机器即可
2.3 编辑/etc/samba/smb.conf(请先将smb.conf备份一份,方便出问题后随时替换回来),我的配置文件如下:
[global] workgroup = WORKGROUP # 这个版本没有share这个安全级别,需要配合map to guest = Bad User security = user map to guest = Bad User passdb backend = tdbsam [my_share] comment = public share public = yes path = /tmp/share/ writable = yes # 可写的权限
重启Samba服务后,访问Samba共享。
2,4 访问共享,进行验证
2.5 过滤上传文件类型,禁止上传图片和zip,EXE文件
修改后的配置文件如下:
[global] workgroup = WORKGROUP # 这个版本没有share这个安全级别,需要配合map to guest = Bad User security = user map to guest = Bad User passdb backend = tdbsam [my_share] comment = public share public = yes path = /tmp/share/ writable = yes # 可写的权限 # 只设置veto files实际上是隐藏文件不让用户看到,没有真正删除文件delete veto files 设置为 yes 后才是将限制类型的文件删除 veto files = /*.jpg/*.jpeg/*.zip/*.exe/ delete veto files = yes
保存文件后,重启Samba服务进行验证。
匿名共享就到这里吧,下面进行用户验证。
3、用户名密码登陆Samba服务器
3,1 创建Samba账户
创建3个用户,一个禁止访问共享用户deny_user,一个只读权限read_user,一个读写权限write_user。
# 创建系统账户,用于映射Samba账户,不需要登陆系统 [root@app ~]# useradd -s /bin/nologin deny_user [root@app ~]# useradd -s /bin/nologin read_user [root@app ~]# useradd -s /bin/nologin write_user # 创建Samba账户 [root@app ~]# pdbedit -a deny_user new password: # 输入密码 retype new password: # 确认密码 Unix username: deny_user NT username: Account Flags: [U ] User SID: S-1-5-21-4013762177-3865157733-2962489042-1000 Primary Group SID: S-1-5-21-4013762177-3865157733-2962489042-513 Full Name: Home Directory: \\app\deny_user HomeDir Drive: Logon Script: Profile Path: \\app\deny_user\profile Domain: APP Account desc: Workstations: Munged dial: Logon time: 0 Logoff time: Wed, 06 Feb 2036 23:06:39 CST Kickoff time: Wed, 06 Feb 2036 23:06:39 CST Password last set: Mon, 02 Dec 2019 23:54:49 CST Password can change: Mon, 02 Dec 2019 23:54:49 CST Password must change: never Last bad password : 0 Bad password count : 0 Logon hours : FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
[root@app ~]# pdbedit -a read_user ... [root@app ~]# pdbedit -a write_user ...
3.2 创建共享目录
[root@app ~]# mkdir /tmp/user [root@app ~]# chmod -R 777 /tmp/user/
3.3 配置文件内容如下:
[global] workgroup = WORKGROUP security = user passdb backend = tdbsam [user] comment = security user path = /tmp/user/ valid users = read_user write_user # 有读取权限的用户 invalid users = deny_user # 禁止访问共享的用户 write list = write_user # 有写入权限的用户 # 只设置veto files实际上是隐藏文件不让用户看到,没有真正删除文件delete veto files 设置为 yes 后才是将限制类型的文件删除 veto files = /*.jpg/*.jpeg/*.zip/*.exe/ delete veto files = yes
保存配置文件,重启Samba服务。
3.4 验证最终效果:
好了就简单到这里吧,关于更多选项这里就不逐一进行演示了。
关于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用户的账号。