SAMBA
在1987年时,由微软和英特尔公司共同制订了SMB服务器通信协议(Server Messages Block),这项技术的诞生是为了解决局域网内的文件或打印机等资源的共享服务问题,让多个主机之间共享文件变成越来越简单。
后来到了1991年,当年还在读大学的学生Tridgwell为了解决Linux与Windows系统之间的文件共享问题,便基于了这项SMB技术协议开发出了SMBserver这一款服务程序,SMBserver服务程序是一款基于SMB协议并由服务端和客户端组成的开源文件共享软件,通过非常简单的配置就能够实现Linux系统与Windows系统之间的文件共享工作。当时还在上学的Tridgwell想要把这款SMBServer软件注册成为商标,但却被商标局以SMB是没有意义的字符而拒绝了他的申请,经过Tridgwell不断的翻看词典,突然看到一个拉丁舞蹈的名字——SAMBA,如图12-1所示,这个热情洋溢的舞蹈名字中又恰好包含了SMB(SAMBA),于是这便是Samba服务程序名字的由来,现在已经成为了Linux系统与Windows系统之间共享文件的最佳选择。
安装方式
YUM安装
yum install samba
RPM安装
rpm -vih samba*
默认配置文件位置
/etc/samba/smb.conf
配置文件详解
grep -E -v "#|;|^$" /etc/samba/smb.conf
[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:需由SMB服务验证来访主机提供的口令后才可建立访问,更加的安全。
#server:使用独立的远程主机验证来访主机提供的口令(集中管理帐号)。
#domain:使用PDC来完成验证
passdb backend = tdbsam #定义用户后台的类型,共有3种。
#smbpasswd:使用SMB服务的smbpasswd命令给系统用户设置SMB密码。
#tdbsam:创建数据库文件并使用pdbedit建立SMB独立的用户。
#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"参数。
writable = no
printable = yes
创建smb用户命令详解
pdbedit命令用于管理SMB服务的帐户信息数据库,格式为:“pdbedit [选项] 帐户”,第一次把用户信息写入到数据库时需要使用-a参数,以后修改用户密码、删除用户等等操作就不再需要了(需要系统中存在用户)
命令 | 参数 | 作用 |
---|---|---|
pdbedit | -a 用户名 | 建立Samba用户 |
pdbedit | -x 用户名 | 删除Samba用户 |
pdbedit | -L | 列出用户列表 |
pdbedit | -Lv | 列出用户详细信息的列表 |
smbpasswd命令也是用于管理SMB服务的帐户信息数据库,格式为:“smbpasswd [选项] 帐户”,每次把用户信息写入到数据库时都需要使用-a参数(需要系统中存在用户)
命令 | 参数 | 作用 |
---|---|---|
smbpasswd | -a 用户名 | 新建用户 |
smbpasswd | -d 用户名 | 冻结用户,就是这个用户不能在登录了 |
smbpasswd | -e 用户名 | 恢复用户,解冻用户,让冻结的用户可以在使用 |
smbpasswd | -n 用户名 | 把用户的密码设置成空. |
smbpasswd | -x 用户名 | 删除用户,删除的是samba中的用户,而不是系统用户 |
实例:
配置服务器samba,工作组为STAFF,共享目录/smb1, 共享名smb1,仅允许172.16.0.0/24主机访
问。samba用户smb_user1可以读取,密码abc.123, 客户端自动挂接到/mnt/smb1共享目录/smb2,共享名smb2,仅允许172.16.0.0/24主机访问。仅允许用户smb_user1读取, smb_user2读写,密码都为abc.123;客户端以multiuser方式自动挂接到/mnt/smb2。
~]# mkdir /smb1
~]# mkdir /smb2
~]# chcon -t samba_share_t /smb1
~]# chcon -t samba_share_t /smb1 #chcon 命令设置SELinux只对当前目录生效若要目录下文件生效请参考注释①
~]# useradd smb_user1
~]# useradd smb_user2
~]# smbpass -a smb_user2
~]# smbpass -a smb_user1
~]# vim /etc/samba/smb.conf
[global]
workgroup = STAFF
config file = /etc/samba/smb.conf.%U #config file选项用户只可以看着独立配置文件中的共享目录
include = /etc/samba/%U.smb.conf #include选项可以看到独立配置文件与smb.conf的共享目录
#此处用了两种引用用户独立配置文件的方法,达到不同用户不同权限的其他方法参考注释②
~]# vim /etc/samba/smb.conf.smb_user1
[smb1]
comment = smb1
path = /smb1
public = no
read only = yes
browseable = yes
hosts allow = 172.16.0.
host deny = ALL
[smb2]
comment = smb2
path = /smb2
public = no
writable = no
browseable = yes
hosts allow = 172.16.0.
hosts deny = ALL
~]# vim /etc/samba/smb_user2.smb.conf
[smb2]
comment = smb2
path = /smb2
public = no
writable = yes
#writable = no
#write list = smb_user2
browseable = yes
hosts allow = 172.16.0.
hosts deny = ALL
~]# firewall-cmd --add-service=samba --permanent
~]# firewall-cmd --reload
~]# systemctl restart smb
~]# systemctl enable smb
注释①:
semanage 依赖policycoreutils-python包,可使用yum install -y policycoreutils-python安装
semanage fcontext -a -t samba_share_t "/smb1(/.)?" 使用正则表达式递归设置
semanage fcontext -a -t samba_share_t "/smb2(/.)?"
~]# restorecon -RFvv /smb1
restorecon reset /smb1 context unconfined_u:object_r:default_t:s0->system_u:object_r:samba_share_t:s0
~]# restorecon -RFvv /smb2
restorecon reset /smb2 context unconfined_u:object_r:default_t:s0->system_u:object_r:samba_share_t:s0
强制递归刷新显示详细信息
注释②:
多用户不同读/写权限可以在共享目录选项中使用
writable=no #所有人不可写
writae list = user,@group #指定用户或组可以写入
客户端挂载
查看服务端共享列表
mkdir /mnt/{smb1,smb2}
~]# smbclient -L 172.16.0.102 -U smb_user1%abc.123
Domain=[WORKGROUP] OS=[Windows 6.1] Server=[Samba 4.4.4]
Sharename Type Comment
--------- ---- -------
smb1 Disk smb1
smb2 Disk smb2
smb_user1 Disk Home Directories
IPC$ IPC IPC Service (Samba 4.4.4)
Domain=[WORKGROUP] OS=[Windows 6.1] Server=[Samba 4.4.4]
Server Comment
--------- -------
Workgroup Master
--------- -------
~]# smbclient -L 172.16.0.102 -U smb_user2%abc.123
Domain=[STAFF] OS=[Windows 6.1] Server=[Samba 4.4.4]
Sharename Type Comment
--------- ---- -------
print$ Disk Printer Drivers
IPC$ IPC IPC Service (Samba 4.4.4)
smb2 Disk smb2
smb_user2 Disk Home Directories
Domain=[STAFF] OS=[Windows 6.1] Server=[Samba 4.4.4]
Server Comment
--------- -------
Workgroup Master
--------- -------
samba客户端交互模式测试用户读写权限
交互式测试smb_user1对smb1仅有读权限
~]# smbclient //172.16.0.102/smb1 -U smb_user1%abc.123
Domain=[WORKGROUP] OS=[Windows 6.1] Server=[Samba 4.4.4]
smb: > ls
. D 0 Sun Jun 18 20:55:31 2017
.. DR 0 Sun Jun 18 20:15:20 2017
18307072 blocks of size 1024. 16669420 blocks available
smb: > put test
NT_STATUS_ACCESS_DENIED opening remote file est
交互式测试smb_user1对smb2仅有读权限
~]# smbclient //172.16.0.102/smb2 -U smb_user1%abc.123
Domain=[WORKGROUP] OS=[Windows 6.1] Server=[Samba 4.4.4]
smb: > ls
. D 0 Sun Jun 18 20:55:31 2017
.. DR 0 Sun Jun 18 20:15:20 2017
18307072 blocks of size 1024. 16669420 blocks available
smb: > put test
NT_STATUS_ACCESS_DENIED opening remote file est
交互式测试smb_user2无法访问smb1
~]# smbclient //172.16.0.102/smb1 -U smb_user2%abc.123
Domain=[STAFF] OS=[Windows 6.1] Server=[Samba 4.4.4]
tree connect failed: NT_STATUS_BAD_NETWORK_NAME
交互式测试smb_user2对smb1有写入权限
~]# smbclient //172.16.0.102/smb2 -U smb_user1%abc.123
Domain=[WORKGROUP] OS=[Windows 6.1] Server=[Samba 4.4.4]
smb: > ls
. D 0 Sun Jun 18 20:55:31 2017
.. DR 0 Sun Jun 18 20:15:20 2017
smb: > put test
putting file test as est (1.3 kb/s) (average 1.3 kb/s)
开机挂载
~]# vim user1.smb
username=smb_user1
password=abc.123
domain=STAFF
~]# chmod 600 user1.smb
vim /etc/fstab
//172.16.0.102/smb1 /mnt/smb1 cifs defaults,credentials=/root/user1.smb 0 0
~]# mount -a
~]# mount |grep /mnt/smb1
//172.16.0.102/smb1 on /mnt/smb1 type cifs (rw,relatime,vers=1.0,cache=strict,username=smb_user1,domain=STAFF,uid=0,noforceuid,gid=0,noforcegid,addr=172.16.0.102,unix,posixpaths,serverino,acl,rsize=1048576,wsize=65536,actimeo=1)
编辑认证文件并使用多用户挂载
vim user2.smb
username=smb_user2
password=abc.123
domain=STAFF
~]# chmod 600 user2.smb
vim /etc/fstab
//172.16.0.102/smb2 /mnt/smb2 cifs credentials=/root/smb_user2,multiuser,sec=ntlmssp 0 0
~]# mount |grep /mnt/smb2
//172.16.0.102/smb2 on /mnt/smb2 type cifs (rw,relatime,vers=1.0,sec=ntlmssp,cache=strict,multiuser,domain=STAFF,uid=0,noforceuid,gid=0,noforcegid,addr=172.16.0.102,unix,posixpaths,serverino,acl,noperm,rsize=1048576,wsize=65536,actimeo=1)
创建与服务器有相同UID的链接用户
useradd -u 1001 smb_user1
useradd -u 1002 smb_user2
切换smb_user1用户检测只有读取权限
~]# su - smb_user1
~]$ ls /mnt/smb2/test
ls: cannot access /mnt/smb2: Permission denied
~]$ cifscreds add 172.16.0.102
Password:
~]$ ls /mnt/smb2
test
~]$ touch /mnt/smb2/abc
touch: cannot touch ‘/mnt/smb2/abc’: Permission denied
切换smb_user2用户检测有写入权限
~]# su - smb_user2
~]$ ls /mnt/smb2
test
~]$ cifscreds add 172.16.0.102
Password:
~]$ touch /mnt/smb2/test1
~]$ ls /mnt/smb2/
test test1
客户端的三种挂载方式示列
编辑fstab文件
yum install cifs-utils
vim auth.smb
username=smbuser
password=redhat
domain=MYGROUP
chmod -Rf 600 auth.smb
vim /etc/fstab
//server/path /mountpoint cifs credentials=/root/auth.smb 0 0
//server/path /mountpoint cifs defaults,username=smbuser,password 0 0
手动挂载
mount.cifs //server/path /mountpoint -o user=smbuser,pass=redhat
mount -t cifs -o user=smbuser,pass=redhat //server/path /mountpoint
auto自动挂载
yum install autofs
vim /etc/aotu.master.d/demo.autofs
/mnt /etc/auto.demo
vim /etc/auto.demo
smb1 -fstype=cifs,ro,credentials=/root/user1.smb //server/smb1
smb2 -fstype=cifs,rw,credentials=/root/user2.smb //server/smb2