Samba概述
SMB(Server Messages Block,信息服务块)是一种在局域网上共享文件的打印机的一直通信协议,他为局域网内的不同操作系统的计算机之间提供文件及打印机等资源的共享服务。SMB协议是客户机/服务器(C/S)型协议,客户机通过该协议可以访问服务器上的共享文件系统,打印机及其他资源。如图:
Samba的特性:
使用smb/cifs协议,可以跨平台、可实现文件系统挂载、可实现服务器端修改文件
smb协议和cifs之间的关系
随着Internet的流行,Microsoft希望这个协议扩展到Internet上去,成为Internet上计算机之间互相共享数据的一种标准。因此它**将原有的几乎没有多少技术文档的SMB协议进行整理,重新命名为CIFS(Common Internet File System),它使程序可以远程访问Internet计算机上的文件并要求此计算机提供服务。**客户程序请求服务器上的服务器程序为它提供服务,服务器获得请求并返回响应。CIFS是公共的或开放的SMB协议版本,并由Microsoft使用。SMB协议在局域网上用于服务器文件访问和打印机的协议。
Samba服务详解
Samba软件相关配置
- **协议:**SMB/CIFS
- 服务:
- smb 实现资源共享、权限验证 TCP 139 445
- 配置文件(/etc/samba)
- smb.conf 主配置文件
- smbusers 别名配置文件
Samba提供的服务
Samba 服务提供了两个独立的守护进程:smbd
和 nmbd
。它们分别负责不同的功能,通常需要同时运行以提供完整的Samba服务:
smbd
(Server Message Block Daemon):smbd
是Samba软件包中的主要守护程序,它管理文件和打印服务的共享,以及与客户端的认证。- 它负责响应文件服务的请求,也就是客户端对共享文件和打印机的读取和写入请求。
smbd
处理文件权限和锁定,确保文件和数据的安全性。- 它还负责处理与Active Directory和NT4样式域控制器的集成。
nmbd
(NetBIOS Name Service Daemon):nmbd
是负责NetBIOS名称服务和解析的守护程序,处理NetBIOS over TCP/IP(NBT)网络的名称解析。- 它允许Samba服务器响应Windows网络中的“浏览器”请求,如网络邻居。
nmbd
管理在Samba服务器上运行的WINS服务器,这个WINS服务器用于在网络中解析NetBIOS名称到IP地址。
两者的区别主要反映在不同的网络协议和服务上:smbd
更关注文件和打印服务,而 nmbd
处理网络名称解析和发现。在传统的Windows网络环境中,这两项服务通常都是必需的,因为Windows客户端利用这些服务进行文件共享及网络上的计算机发现。
然而,在现代的网络环境中,尤其是在网络配置不再依赖于NetBIOS服务的情况下,nmbd
可能不是严格必要的。例如,当仅使用IP地址或DNS进行名称解析,以及不需要网络浏览功能时,你可能只需要 smbd
。
启动两者的主要目的是为了确保Samba服务提供完整的功能集,允许与依赖NetBIOS服务的旧版客户端的兼容性以及与现代客户端的兼容性。
登录验证模式(安全级别)
- share 匿名用户
- user 本地用户验证
- Samba服务器默认的安全级别,用户在访问共享资源之前必须提供用户名和密码进行验证
- 拓展: tdbsam:该方式是使用一个数据库文件来验证。数据库文件叫passdb.tdb。可以通过pdbedit -a 向数据库中添加新用户,不过要建立的Samba用户必须先是系统用户。也可以理解为我们使用pdbedit -a 将系统用户转化为了samba用户。pdbedit命令的参数很多,列出几个主要的。
- pdbedit -a username:新建Samba账户(将系统用户转化成Samba用户,并设置密码)
- pdbedit -x username:删除Samba账户
- pdbedit -L:列出Samba用户列表,读取passdb.tdb数据库文件。
- 别名用户访问(虚拟用户)
常见参数解释
[global]用于定义Samba服务器的总体特性,其配置项对所有共享资源生效
[global]
# 设定Samba Server所要加入的工作组或者域。
workgroup = MYGROUP
# 设定Samba Server 的注释,可以是任何字符串,也可以不填。宏‰v表示显示Samba的版本号。
server string = Samba Server Version %v
# 表示允许连接到Samba Server的客户端,多个参数以空格隔开。可以用一个IP表示,也可以用一个网段表示。
# hosts deny 与hosts allow刚好相反(二选一)。
# hosts deny参数用于指定哪些主机(或IP地址)被拒绝访问Samba服务器上的共享资源。
# 例如:
# hosts allow=172.17.2. EXCEPT 172.17.2.50
# 表示容许来自172.17.2.*的主机连接,但排除172.17.2.50
# hosts allow=172.17.2.0/255.255.0.0
# 表示容许来自172.17.2.0/255.255.0.0子网中的所有主机连接
hosts allow = 192.168.45.10 192.168.45.20
# 设置Samba Server日志文件的存储位置以及日志文件名称。在文件名后加个宏%m(主机名),表示对每台访问Samba Server的机器都单独记录一个日志文件。
log file = /var/log/samba/log.%m
# 设置Samba Server日志文件的最大容量,单位为kB,0代表不限制
max log size = 50
# 设置用户访问Samba Server的验证方式。
security = user
# 配置指定了 Samba 用来存储用户密码的后端数据库类型
passdb backend = tdbsam
# 设置是否在启动Samba时就共享打印机
load printers = yes
# 这行配置设置了当Samba向CUPS打印系统发送打印作业时应用的选项。raw选项意味着Samba将发送原始的打印数据到打印机。
cups options = raw
# 此参数定义了一个文件的路径,这个文件包含了Windows用户名与UNIX系统用户名的映射。
username map = /etc/samba/smbusers
[homes]用于设置用户宿主目录的共享属性(特殊共享)
[homes]
: 自动为每个用户创建一个共享,映射到用户主目录。这个共享默认不可浏览(browseable = no
),但是可写的(writable = yes
)。这意味着用户可以连接到他们自己的home目录,如果他们有适当的权限。
[homes] # 共享名(特殊共享,泛指每个用户对应的家目录)
comment = Home Directories # 共享描述
browseable = no # 共享是否可被查看
writable = yes # 共享是否可写
valid users = %S # 允许访问该共享的用户,%S 将代表当前试图连接 [homes] 共享的 Samba 用户名对应的那个家目录所有者。在许多默认配置下,这个不需要显式设置,因为 Samba默认只允许用户访问他们自己的家目录。
# 例如: valid users = bob,@bob(多个用户或者组中间用逗号隔开,如果要加入一个组就用“@组名”表示。)
[printers]用于设置打印机共享资源的属性(特殊共享,共享打印设备,现在基本不用)
[printers]
: 用于所有打印机的共享,其路径是 /var/spool/samba
。这个打印共享不可浏览,也不允许作为文件共享的写入,但是设置为可打印(printable = yes
)。
[printers] # 共享名
comment = All Printers # 共享描述
path = /var/spool/samba # 共享路径
browseable = no # 共享是否可被查看
guest ok = no # 是否可以匿名访问,类似于public
writable = no # 是否可写
printable = yes # 是否可以打印
[自定义]自定义共享区域
[public]
: 一个公开的共享,其路径是 /temp
。它设置为可公开访问(public = yes
),可写的(writable = yes
), 并且不可打印(printable = no
)。此共享还指定了一个名为 Samba
的用户具有写入权限。
[自定义] # 共享名
comment = the share is xbz # 共享描述
path = /share/zdy # 共享路径
public = yes # 是否可以匿名访问,类似于guest ok
browseable = yes # 共享是否可被查看
writable = yes # 是否可写(同时设置目录的W)
- 配置文件检查工具
- testparm :若显示"Loaded services file OK."信息表示配置文件的语法是正确的
- -v:显示samba所支持的所有选项
访问控制
-
写入权限的控制方式(类似于vsftp的限制方式):
-
配置文件开启,文件系统严格控制(尽量采用这种)
-
writable = yes
- 这个设置允许通过Samba连接进行写入操作。
-
setfacl 或chmod 777
-
使用
setfacl
设置文件系统的访问控制列表比使用chmod
提供更精细的权限控制。chmod 777
非常宽松,使所有用户都能对文件进行读、写和执行操作,这不是最佳做法。 -
使用
setfacl
可以给单个用户或组指定权限,而不影响其他用户的权限。 -
例如,如果你想允许特定用户写入某个目录,你可以这样设置:
setfacl -m u:username:rwx /path/to/share
这个命令意味着用户"
username
"被授权对/path/to/share
具有读、写和执行的权限。- 如果你想允许一个组的成员有写入权限,可以使用:
setfacl -m g:groupname:rwx /path/to/share
同样,这表示组"
groupname
"中的成员可以对目录/path/to/share
进行读、写和执行操作。 -
-
-
-
文件系统开启,配置文件严格控制
- chmod 777
- read only = yes
- 这是Samba共享配置中的参数,设置共享为只读。无论文件系统上的权限如何,通过Samba访问时,所有用户都不能写入或修改共享中的文件。
- write list = 用户 , @组
- 尽管共享被设置为只读,但
write list
参数允许指定的用户或组中的成员覆盖read only
参数的设置,使他们能够写入共享。用户
应该被替换为具体的用户名称,@组
应该被替换为具体的组名称。在UNIX/Linux系统中,组名前面通常加上@
符号。
- 尽管共享被设置为只读,但
-
案例:
-
1、首先,使用
chmod 777
设置文件系统权限(尽管这不安全):chmod 777 /path/to/share
-
2、然后,在smb.conf配置文件中,设置共享部分如下:
[share] path = /path/to/share read only = yes write list = alice, @staff
在这个配置中,共享
[share]
默认是只读的,但用户alice
和组staff
中的所有成员都可以写入共享。 -
这样配置的结果是:
-
文件系统不会限制任何用户对共享内容的修改,因为所有权限位都被设置为允许。
-
默认情况下,通过Samba访问共享时,用户将不能写入或修改文件。
-
然而,指定的用户(例如
alice
)和指定的组(例如staff
)成员可以通过Samba写入和修改文件。
-
服务启动管理
-
启动、停止、重新启动和重新加载Samba服务
service smb start|stop|restart|reload # 必须启动 service nmb start|stop|restart|reload
-
开机自动启动samba服务
chkconfig --list smb chkconfig --list nmb
chkconfig
命令的基本用法 :
-
列出所有服务的启动状态:
chkconfig --list
-
查看单个服务的启动状态:
chkconfig --list [service-name]
-
为服务设置启动状态:
chkconfig [service-name] on chkconfig [service-name] off
-
只在特定运行级别中启用服务:
chkconfig --level [levels] [service-name] on
其中
[levels]
是一组运行级别编号,例如:2345。 -
添加新服务:
chkconfig --add [service-name]
-
删除服务:
chkconfig --del [service-name]
-
为特定运行级别设置服务:
chkconfig --level [level] [service-name] on|off
比如要在运行级别 3 和 5 启动
httpd
服务,使用以下命令:chkconfig --level 35 httpd on
-
查看服务在特定运行级别是否启用:
chkconfig --level [level] [service-name]
运行级别(runlevels)通常定义为:
- 0 - 关机
- 1 - 单用户模式
- 2 - 多用户,但没有网络服务
- 3 - 完全多用户模式(命令行)
- 4 - 未使用/保留
- 5 - 图形模式
- 6 - 重启
客户端登录方式
-
Linux端
smbclient -U 用户名 -L //服务器IP # 查看服务器共享 smbclient -U 用户名 //服务器IP/共享名 # 登录服务器共享
-
window端
\\服务器IP\共享名 net use * /del # 清空登录缓存
在Windows操作系统中,通过网络驱动器连接到Samba共享时,系统通常会缓存您的凭据。如果您需要清除这些凭据,可以使用 net use
命令来实现。
以下是在Windows命令行使用 net use
命令来映射网络驱动器和删除网络驱动器的相关步骤:
- 连接Samba共享:
使用以下命令连接到Samba共享,替换\\服务器IP\共享名
为实际的服务器IP地址和共享名称,如果需要的话,系统会提示您输入用户名和密码。
net use Z: \\服务器IP\共享名
示例中的 Z:
是您想要映射的驱动器字母。
-
查看当前映射:
要查看当前已映射的网络驱动器列表,可以使用:net use
-
删除特定的网络驱动器映射:
如果您想要删除特定的网络驱动器映射,可以指定驱动器字母。例如,删除映射到Z:
的网络驱动器:net use Z: /delete
-
清空所有网络驱动器映射和登录缓存:
要断开所有网络驱动器的连接并清除与它们关联的用户名和密码缓存,可以使用:net use * /del
使用 net use * /del
命令清除所有映射网络驱动器的连接并清空登录缓存可以帮助解决访问共享时出现的登录问题,例如如果您的密码已更改或您想用另一个用户账户重新连接。
请注意,net use * /del
命令将断开连接并且删除所有网络驱动器,确保这是您想要的操作,因为所有网络映射都将丢失,之后你需要重新建立连接。在执行这个操作之前,保存所有打开的来自网络驱动器的文档和工作。
Samba部署实验
注:先关闭服务器和客户机上的防火墙和 SELinux
部署流程:
-
确认客户端和相关命令软件是否安装(默认安装的,如果是安装的是服务版本的可能是没有安装的,需要自己安装)
[root@centos6Base samba]# rpm -qa|grep samba samba-client-3.6.23-53.el6_10.x86_64 # 可能是默认安装的 samba-winbind-clients-3.6.23-53.el6_10.x86_64 # 可能是默认安装的 samba-winbind-3.6.23-53.el6_10.x86_64 # 可能是默认安装的 samba-3.6.23-53.el6_10.x86_64 samba-common-3.6.23-53.el6_10.x86_64 # 可能是默认安装的 samba4-libs-4.2.10-15.el6.x86_64 # 可能是默认安装的
-
服务端安装samba(根据实际情况安装)
yum isntall samba samba-client samba-winbind-clients samba-winbind samba-common samba4-libs -y
-
创建共享区域
备份主配置文件
创建独立的共享区间(仿照模板编写) -
启动smb服务并查看默认共享区域
本地验证(登录、上传、下载)
a、修改配置文件(添加自定义共享)
[自定义]
comment = the share is xbz
path = /user/test
public = yes
browseable = yes
writable = yes
b、创建共享目录并给定相应权限
mkdir /user/test
chmod 666 /user/test
# 最好使用ACL权限
c、测试配置文件并重启服务
testparm
service smb restart
d、首先,创建Linux用户
useradd -s /sbin/nologin samba
passwd samba # 不需要创建系统密码
e、转换为Samba用户
pdbedit -a samba
f、客户端查看共享文件夹并登录测试
smbclient -U samba -L IP地址
smbclient -U samba //IP地址/共享名
访问控制 - 通过配置限制
valid users 及允许部分用户访问共享区域
注:前提条件指定目录权限改到最大,通过修改配置文件来实现实验结果
部分用户登录samba服务器(只有在用户列表中的用户才能访问这个自定义共享区域
)
修改 /etc/samba/smb.conf中自定义的共享区域
添加:设置合法用户列表
valid users = 用户,@组(多个逗号分隔)
部分用户对共享区域有写权限
修改 /etc/samba/smb.conf中自定义的共享区域
添加:开始只读,设置可写列表
read only = yes
write list = 用户,@组(多个逗号分隔)
设置上传文件的默认权限
create mask 文件的默认权限
directory mask 目录的默认权限
添加:
create mask = 666
directory mask = 777
用户别名(虚拟用户)
- 在
/etc/samba/smbusers
文件中添加别名:
zhangsan = zs
- 修改主配置文件
/etc/samba/smb.conf
,启用别名映射:
vim /etc/samba/smb.conf
- 添加以下行(
设置在global里面
):
username map = /etc/samba/smbusers
- 进行测试连接:
使用 smbclient 命令测试连接,格式为:
smbclient -U 别名 //服务器ip/共享名
映射网络驱动器(挂载)
-
Linux下面:
- 临时挂载可以使用以下命令:
mount -t cifs -o username=xxx,password=xxx //服务器ip/服务器共享 /本地挂载目录
- 永久挂载,可以编辑
/etc/fstab
文件,在文件末尾添加类似以下行:
//服务器ip/服务器共享 /本地挂载目录 cifs defaults,username=xxx,password=xxx 0 0
-
在window下:
- 右键点击“我的电脑”或“此电脑”,选择“映射网络驱动器”。
- 在弹出的对话框中,选择一个未被使用的驱动器字母,然后填写服务器地址,例如
\\服务器ip\服务器共享
- 接着根据需要填写用户名和密码,最后点击“完成”或“连接”。
图形化Web(管理页面)
-
安装SWAT:
SWAT可能不包含在所有Linux发行版的默认仓库中,在某些情况下,你可能需要找到适合你的系统版本的软件包。在一些旧的系统中(如CentOS 6),你可以使用YUM安装SWAT:yum install samba-swat
-
配置xinetd:
SWAT通常通过xinetd守护进程来运行。安装SWAT后,你需要配置xinetd。创建或编辑SWAT的配置文件(可能的路径为
/etc/xinetd.d/swat
),添加以下内容:service swat { port = 901 socket_type = stream wait = no only_from = 127.0.0.1 user = root server = /usr/sbin/swat log_on_failure += USERID disable = no }
only_from
行定义了哪些IP地址允许访问SWAT,出于安全考虑,这里设置为只有本地127.0.0.1
可以访问。如果你需要从其他计算机访问,修改此项为对应的IP地址或删除此行。 -
允许来自防火墙的访问:
如果你的Linux系统使用防火墙(如iptables或firewalld),确保开放901端口以允许通过网络访问SWAT。 -
重启xinetd服务:
保存你的更改并重启xinetd服务来应用设置。service xinetd restart
-
访问SWAT:
打开Web浏览器,访问http://servername:901
或http://localhost:901
(取决于你的服务器名称或IP地址)进入SWAT登录页面。使用你的Samba或系统root用户的凭据登录。