返回顶部

centos 7 搭建Samba

一、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 = <NT-Server-Name> # 仅当“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用户的账号。

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

  

posted @ 2019-11-30 23:54  id_iot  阅读(606)  评论(0编辑  收藏  举报