samba 服务 简介
1987年,微软公司和英特尔公司共同制定了SMB(Server Messages Block,服务器消息块)协议,旨在解决局域网内的文件或打印机等资源的共享问题,这也使得在多个主机之间共享文件变得越来越简单。到了1991年,当时还在读大学的Tridgwell为了解决Linux系统与Windows系统之间的文件共享问题,基于SMB协议开发出了SMBServer服务程序。这是一款开源的文件共享软件,经过简单配置就能够实现Linux系统与Windows系统之间的文件共享工作。当时,Tridgwell想把这款软件的名字SMBServer注册成为商标,但却被商标局以SMB是没有意义的字符而拒绝了申请。后来Tridgwell不断翻看词典,突然看到一个拉丁舞蹈的名字—Samba,而且这个热情洋溢的舞蹈名字中又恰好包含了“SMB”,于是Samba服务程序的名字由此诞生(见图12-1)。Samba服务程序现在已经成为在Linux系统与Windows系统之间共享文件的最佳选择。
smb(samba):用于linux和windows之间的文件共享,可以实现匿名用户和本地用户之间的文件共享
工作原理:
- smb进程 控制发布共享目录与权限 tcp 139 445
- nmb进程 主要用于名称解析 udp 137 138
软件包及配置文件了解
- 软件包
[root@centos7-1 ~]# rpm -aq |grep samba //6系统上查看 samba-winbind-clients-3.6.9-164.el6.x86_64 客户端工具 samba-3.6.9-164.el6.x86_64 服务端 samba-client-3.6.9-164.el6.x86_64 客户端工具 samba4-libs-4.0.0-58.el6.rc4.x86_64 库文件 samba-common-3.6.9-164.el6.x86_64 工具包 samba-winbind-3.6.9-164.el6.x86_64 客户端工具
- 配置文件
[root@courtoap ~]# rpm -ql samba |grep etc // 6系统 /etc/logrotate.d/samba 日志轮转文件 /etc/pam.d/samba 验证机制 /etc/rc.d/init.d/nmb 启动脚本 /etc/rc.d/init.d/smb /etc/samba/smbusers 用户别名文件 [root@centos7-1 ~]# rpm -ql samba |grep etc // 7系统 /etc/openldap/schema /etc/openldap/schema/samba.schema /etc/pam.d/samba
- 二进制命令
/usr/sbin/nmbd /usr/sbin/smbd
[root@centos7-1 ~]# rpm -ql samba-common /etc/samba 主目录 /etc/samba/smb.conf 主配置文件 /usr/bin/pdbedit 查看smb数据库用户 /usr/bin/smbpasswd 设置用户密码 /usr/bin/testparm 检测语法
- 了解主配置文件
[root@centos7-1 ~]# cat /etc/samba/smb.conf |grep -v ^#|grep -v '^;'|grep [a-z] [global] workgroup = SAMBA security = user passdb backend = tdbsam printing = cups printcap name = cups load printers = yes cups options = raw [homes] comment = Home Directories valid users = %S, %D%w%S browseable = No read only = No inherit acls = Yes [printers] comment = All Printers path = /var/tmp printable = Yes create mask = 0600 browseable = No [print$] comment = Printer Drivers path = /var/lib/samba/drivers write list = @printadmin root force group = @printadmin create mask = 0664 directory mask = 0775
Samba服务程序中的参数以及作用
[global] | #全局参数。 | |
workgroup = MYGROUP | #工作组名称 | |
server string = Samba Server Version %v | #服务器介绍信息,参数%v为显示SMB版本号 | |
log file = /var/log/samba/log.%m | #定义日志文件的存放位置与名称,参数%m为来访的主机名 | |
max log size = 50 | #定义日志文件的最大容量为50KB | |
security = user | #安全验证的方式,总共有4种 | |
#share:来访主机无需验证口令;比较方便,但安全性很差 | ||
#user:需验证来访主机提供的口令后才可以访问;提升了安全性 | ||
#server:使用独立的远程主机验证来访主机提供的口令(集中管理账户) | ||
#domain:使用域控制器进行身份验证 | ||
passdb backend = tdbsam | #定义用户后台的类型,共有3种 | |
#smbpasswd:使用smbpasswd命令为系统用户设置Samba服务程序的密码 | ||
#tdbsam:创建数据库文件并使用pdbedit命令建立Samba服务程序的用户 | ||
#ldapsam:基于LDAP服务进行账户验证 | ||
load printers = yes | #设置在Samba服务启动时是否共享打印机设备 | |
cups options = raw | #打印机的选项 | |
[homes] | #共享参数 | |
comment = Home Directories | #描述信息 | |
browseable = no | #指定共享信息是否在“网上邻居”中可见 | |
writable = yes | #定义是否可以执行写入操作,与“read only”相反 | |
[printers] | #打印机共享参数 | |
comment = All Printers | ||
path = /var/spool/samba | #共享文件的实际路径(重要)。 | |
browseable = no | ||
guest ok = no 等于 public = no | #是否所有人可见,等同于"public"参数。 | |
writable = no 等于 read only = yes | ||
printable = yes |
搭建SMB服务
测试默认情况下的共享文件,也就是安装完软件直接启动。不做任何配置文件的修改
服务端:192.168.122.205
[root@centos7-1 ~]# yum install samba [root@centos7-1 ~]# systemctl start smb # 6的启动命令 service smb restart service nmb restart
客户端测试查看服务端共享了哪些文件
客户端:192.168.122.206
[root@centos7-2 ~]# smbclient -L 192.168.122.205 Enter root's password: //此处不输密码,直接回车 Anonymous login successful Domain=[SAMBA] OS=[Windows 6.1] Server=[Samba 4.7.1] Sharename Type Comment --------- ---- ------- print$ Disk Printer Drivers IPC$ IPC IPC Service (Samba 4.7.1) Anonymous login successful Domain=[SAMBA] OS=[Windows 6.1] Server=[Samba 4.7.1] Server Comment --------- ------- CENTOS7-1 Samba 4.7.1 Workgroup Master --------- ------- SAMBA CENTOS7-1
服务端:192.168.122.205
创建一个本地用户 [root@centos7-1 ~]# useradd smb1 将用户添加到数据库并且设置密码 (server端设置) [root@centos7-1 ~]# smbpasswd -a smb1 New SMB password: Retype new SMB password: Added user smb1.
查看smb数据库的用户(查看是否成功添加)
[root@centos7-1 ~]# pdbedit -L smb1
smb1:1001:
客户端:192.168.122.206
查看共享的目录 [root@centos7-2 ~]# smbclient -L 192.168.122.205 -U smb1 Enter smb1's password: Domain=[SAMBA] OS=[Windows 6.1] Server=[Samba 4.7.1] Sharename Type Comment --------- ---- ------- print$ Disk Printer Drivers IPC$ IPC IPC Service (Samba 4.7.1) smb1 Disk Home Directories Domain=[SAMBA] OS=[Windows 6.1] Server=[Samba 4.7.1] Server Comment --------- ------- CENTOS7-1 Samba 4.7.1 Workgroup Master --------- ------- SAMBA CENTOS7-1 通过smb1用户登录 [root@centos7-2 ~]# smbclient //192.168.122.205/smb1 -U smb1 Enter smb1's password: Domain=[SAMBA] OS=[Windows 6.1] Server=[Samba 4.7.1] smb: > ls . D 0 Thu Nov 15 10:30:04 2018 .. D 0 Thu Nov 15 10:30:04 2018 .mozilla DH 0 Mon Oct 29 12:26:18 2018 .bash_logout H 18 Wed Aug 3 00:00:07 2016 .bash_profile H 193 Wed Aug 3 00:00:07 2016 .bashrc H 231 Wed Aug 3 00:00:07 2016 9447424 blocks of size 1024. 5601668 blocks availabl
实例一
共享本地目录/samba/share, 并且只允许harry用户可写,sysadmin组的成员只读
服务端:
第1步:创建共享目录
[root@centos7-1 ~]# mkdir /samba/share -p [root@centos7-1 ~]# echo hello world > /samba/share/t.txt [root@centos7-1 ~]# ls /samba/share/
第2步:创建用户和组方便后面测试
[root@centos7-1 ~]# useradd harry [root@centos7-1 ~]# groupadd sysadmin [root@centos7-1 ~]# useradd -G sysadmin u1 [root@centos7-1 ~]# useradd -G sysadmin u2
第3步:将创建的用户添加到smb服务的数据库并设置密码
[root@centos7-1 ~]# smbpasswd -a harry New SMB password: Retype new SMB password: Added user harry. [root@centos7-1 ~]# smbpasswd -a u1 New SMB password: Retype new SMB password: Added user u1. [root@centos7-1 ~]# smbpasswd -a u2 New SMB password: Retype new SMB password: Added user u2. [root@centos7-1 ~]# pdbedit -L smb1:1001: u1:1004: harry:1003: u2:1005:
第4步:编辑配置文件进行相应的配置并重启服务
[root@centos7-1 ~]# vim /etc/samba/smb.conf [share] comment = samba share // 描述 path = /samba/share // 共享的目录 browseable = yes // 不隐藏标签 valid users = harry,@sysadmin // 可读用户 write list = harry // 可写用户 [root@centos7-1 ~]# systemctl restart smb
客户端测试:
查看共享目录,可以查看到共享的share目录
[root@centos7-2 ~]# smbclient -L 192.168.122.205 Enter root's password: Anonymous login successful Domain=[SAMBA] OS=[Windows 6.1] Server=[Samba 4.7.1] Sharename Type Comment --------- ---- ------- homes Disk Home Directories print$ Disk Printer Drivers share Disk samba share IPC$ IPC IPC Service (Samba 4.7.1) Anonymous login successful Domain=[SAMBA] OS=[Windows 6.1] Server=[Samba 4.7.1] Server Comment --------- ------- CENTOS7-1 Samba 4.7.1 Workgroup Master --------- ------- SAMBA CENTOS7-1
测试harry用户可读可写
[root@centos7-2 ~]# smbclient //192.168.122.205/share -U harry Enter harry's password: Domain=[SAMBA] OS=[Windows 6.1] Server=[Samba 4.7.1] smb: > ls . D 0 Thu Nov 15 11:21:44 2018 .. D 0 Thu Nov 15 11:21:20 2018 t.txt N 12 Thu Nov 15 11:21:44 2018 9447424 blocks of size 1024. 5608576 blocks available smb: > mkdir 1 NT_STATUS_ACCESS_DENIED making remote directory 1 smb: >
测试发现harry用户能够成功访问,但是创建文件却失败了(原因分析:服务本身已经给定了harry用户写的权限,那么就应该是目录没有写的权限)
解决办法:
服务端给予harry用户读写执行的权限
[root@centos7-1 ~]# setfacl -m u:harry:rwx /samba/share/
客户端再次测试:
smb: > mkdir 1 smb: > ls . D 0 Thu Nov 15 11:32:35 2018 .. D 0 Thu Nov 15 11:21:20 2018 t.txt N 12 Thu Nov 15 11:21:44 2018 1 D 0 Thu Nov 15 11:32:35 2018 9447424 blocks of size 1024. 5609416 blocks available smb: > get t.txt getting file .txt of size 12 as t.txt (0.1 KiloBytes/sec) (average 0.1 KiloBytes/sec) smb: > 发现harr用户可以创建文件,和下载文件
测试u1用户
[root@centos7-2 ~]# smbclient //192.168.122.205/share -U u1 Enter u1's password: Domain=[SAMBA] OS=[Windows 6.1] Server=[Samba 4.7.1] smb: > ls . D 0 Thu Nov 15 11:32:35 2018 .. D 0 Thu Nov 15 11:21:20 2018 t.txt N 12 Thu Nov 15 11:21:44 2018 1 D 0 Thu Nov 15 11:32:35 2018 9447424 blocks of size 1024. 5609216 blocks available smb: > mkdir aaa NT_STATUS_MEDIA_WRITE_PROTECTED making remote directory aaa
测试发现u1用户能够成功访问并且能够查看,但是创建文件却失败了。(原因:配置文件中我们只是允许了harry用户能够进行写,而sysadmin组里面的成员并没有给写的权限。所以并不能创建文件)
注意:如果不加可用用户选项,那么表示当前samba数据库里面的用户都可以访问
实例二
基于用户名密码和acl的综合访问:
需求:
公司:uplooking
1、财务部门 /samba/upl_cw cw01财务总监有可读可写权限,财务部门员工可读,boss01对其有管理权限。
2、市场部门 /samba/upl_sc 市场部门员工可读可写,公司员工可以查询资料,boss02对其有管理权限。
3、HR部门 /samba/upl_rs rs01HR总监可读写,HR部门员工可以对财务部查询,vip用户可以查询
4、休息区 /samba/upl_pub 自己管理自己的文件
思路:
1、选择哪个服务做文件共享(samba)
2、需要一台Linux服务器(rhel/centos)
3、根据部门创建不同的工作目录来保存不同部门的文件
4、将目录发布出去
5、测试验证
服务器:
第1步:在服务器上创建相应的工作目录
[root@centos7-1 ~]# mkdir /samba/upl_{cw,sc,rs,pub} -p
第2步:创建相应的用户和组
[root@centos7-1 ~]# groupadd uplooking [root@centos7-1 ~]# groupadd cw [root@centos7-1 ~]# groupadd rs [root@centos7-1 ~]# groupadd sc [root@centos7-1 ~]# useradd cw01 -g cw -G uplooking [root@centos7-1 ~]# useradd cw02 -g cw -G uplooking [root@centos7-1 ~]# useradd rs01 -g rs -G uplooking [root@centos7-1 ~]# useradd rs02 -g rs -G uplooking [root@centos7-1 ~]# useradd sc01 -g sc -G uplooking [root@centos7-1 ~]# useradd sc02 -g sc -G uplooking [root@centos7-1 ~]# useradd boss01 -g uplooking -G cw [root@centos7-1 ~]# useradd boss02 -g uplooking -G sc [root@centos7-1 ~]# useradd vip
第3步:编辑配置文件进行相应的配置并重启服务
[root@centos7-1 ~]# vim /etc/samba/smb.conf [cw_share] comment= cw01财务总监有可读可写权限,财务部门员工可读,boss01对其有管理权限 path = /samba/upl_cw valid users = @cw,boss01,@rs write list = cw01,boss01 [sc_share] comment= 市场部门员工可读可写,公司员工可以查询资料,boss02对其有管理权限 path = /samba/upl_sc valid users = @uplooking read only = yes write list = @sc,boss02 [hr_share] comment = rs01HR总监可读写,HR部门员工可以对财务部查询,vip用户可以读写 path = /samba/upl_rs valid users = @rs,vip write list = rs01,vip [pub] comment = 自己管理自己的文件 path = /samba/upl_pub public = yes writable = yes hosts allow = 192.168.122.0/24 [root@centos7-1 ~]# systemctl restart smb
第4步:将用户加入到samba数据库里
[root@centos7-1 ~]# smbpasswd -a cw01 New SMB password: Retype new SMB password: Added user cw01. [root@centos7-1 ~]# smbpasswd -a cw02 New SMB password: Retype new SMB password: Added user cw02. [root@centos7-1 ~]# smbpasswd -a rs01 New SMB password: Retype new SMB password: Added user rs01. [root@centos7-1 ~]# smbpasswd -a rs02 New SMB password: Retype new SMB password: Added user rs02. [root@centos7-1 ~]# smbpasswd -a sc01 New SMB password: Retype new SMB password: Added user sc01. [root@centos7-1 ~]# smbpasswd -a sc02 New SMB password: Retype new SMB password: Added user sc02. [root@centos7-1 ~]# smbpasswd -a boss01 New SMB password: Retype new SMB password: Added user boss01. [root@centos7-1 ~]# smbpasswd -a boss02 New SMB password: Retype new SMB password: Added user boss02. [root@centos7-1 ~]# smbpasswd -a vip New SMB password: Retype new SMB password: Added user vip. [root@centos7-1 ~]# pdbedit -L smb1:1001: u1:1004: cw01:1006: harry:1003: u2:1005: cw02:1007: rs01:1008: rs02:1009: sc01:1010: sc02:1011: boss01:1012: boss02:1013: vip:1014:
第5步:相应的acl授权
[root@centos7-1 ~]# setfacl -m u:cw01:rwx /samba/upl_cw/ [root@centos7-1 ~]# setfacl -m u:boss01:rwx /samba/upl_cw/ [root@centos7-1 ~]# setfacl -m g:cw:rx /samba/upl_cw/ [root@centos7-1 ~]# setfacl -m g:sc:rwx /samba/upl_sc/ [root@centos7-1 ~]# setfacl -m g:uplooking:rx /samba/upl_sc/ [root@centos7-1 ~]# setfacl -m u:boss02:rwx /samba/upl_sc/ [root@centos7-1 ~]# setfacl -m u:rs01:rwx /samba/upl_rs/ [root@centos7-1 ~]# setfacl -m g:rs:rx /samba/upl_rs/ [root@centos7-1 ~]# setfacl -m u:vip:rwx /samba/upl_rs/ [root@centos7-1 ~]# setfacl -m g:uplooking:rwx /samba/upl_pub/
客户端测试验证:
查看共享目录
[root@centos7-2 ~]# smbclient -L 192.168.122.205 Enter root's password: Anonymous login successful Domain=[SAMBA] OS=[Windows 6.1] Server=[Samba 4.7.1] Sharename Type Comment --------- ---- ------- homes Disk Home Directories print$ Disk Printer Drivers share Disk samba share cw_share Disk cw01财务总监有可读可写权限,财务部门员工可读,boss01对其有管理权限 sc_share Disk 市场部门员工可读可写,公司员工可以查询资料,boss02对其有管理权限 hr_share Disk rs01HR总监可读写,HR部门员工可以对财务部查询,vip用户可以读写 pub Disk 自己管理自己的文件 IPC$ IPC IPC Service (Samba 4.7.1) Anonymous login successful Domain=[SAMBA] OS=[Windows 6.1] Server=[Samba 4.7.1] Server Comment --------- ------- CENTOS7-1 Samba 4.7.1 Workgroup Master --------- ------- SAMBA CENTOS7-1 详细测试此处就省略了。。。
samba总结
- SAMBA 可以让 Linux 与 Windows 直接进行文件系统的使用;
- SAMBA 主要架构在 NetBIOS 上发展的,且以 NetBIOS over TCP/IP 克服NetBIOS 无法跨路由的问题;
- Samba 使用的 daemon 主要有管理分享权限的 smbd 以及 NetBIOS 解析的nmbd
- Samba 使用的模式主要有单机的 workgroup 方式,以及网域控管的 PDC 模式;
- Samba 的主配置文件之档名为 smb.conf
- smb.conf 内,主要区分为 [global] 服务器整体设定与 [share] 分享的资源两大部分
- Samba 使用者账号控管主要的设定值为 security = {share,user,domain}等
- Samba 客户端可使用 smbclient 以及 mount.cifs 进行网络的挂载
- 新版的 Samba 默认使用数据库记录帐户信息,新增账号用 pdbedit ,修改密码则用 smbpasswd
- Samba 主要支持 CUPS 的打印机服务器
- 在权限控管方面,最容易出错的为 SELinux 的规则与类型 (SELinux type)
- 默认情况下,服务端会将系统中的所有本地用户的家目录共享出去;并且不允许匿名用户访问
- 本地用户都可以通过用户名和smab数据库的密码去访问当前用户的家目录
- samba数据库里面的用户必须是当前操作系统中存在的用户
配置文件:一般放在/etc/samba/smb.conf里面,可以通过rpm -qc packagename查询;编辑完配置文件可以通过testparm来进行samba的确认。
常用命令
将本地用户加入到smb数据库里
# smbpasswd -a stu1 // 将用户添加到数据库并且设置密码
查看smb数据库的用户
# pdbedit -L //查看smb数据库的用户
查看共享目录:客户端通过smbclient命令查看服务器共享出什么目录
smbclient -L NetBiosName -U username
linux客户端访问
# smbclient //192.168.122.205/homes -U smb1 // 通过smb1用户访问homes
清空windows缓存
cmd——>net use * /del
访问权限控制
控制读写访问
writable = yes/no // 可写总开关 read only = yes/no // 可读总开关 write list = tom,@admin // 可读 多个用户用逗号隔开 加个@符号对组的控制 read list = tom,@admin // 可写
对象的访问控制
valid users = tom,@admin // 指定可用用户 invalid users = tom,@admin // 指定不可用用户 注意:两个参数不要同时存在
网络访问控制
hosts allow = 150.203.6.0/255.255.255.0 EXCEPT 150.203.6.66 // 允许哪个网络里的访问,表示150.203.6.0这个网段除了150.203.6.66这个用户不能访问,别的都能访问 hosts allow = 150.203.15.0/255.255.255.0 hosts allow = *.uplooking.com hosts deny = 192.168.1.3 vm01.example.com // 拒绝哪个网络的访问 如果deny和allow冲突,allow优先