Linux 下 Samba 文件共享服务的部署
首先介绍一下 samba 文件共享服务的基本信息
- SMB(Server Messages Block,服务器消息块)
1987 年,微软公司和英特尔公司共同制定了 SMB(Server Messages Block,服务器消息协议,旨在解决局域网内的文件或打印机等资源的共享问题,这也使得在多个主机之间共享文件变得越来越简单- Samba
1991 年,当时还在读大学的 Tridgwell 为了解决 Linux 系统与 Windows 系统之间的文件共享问题,基于 SMB 协议开发出了 SMBServer 服务程序。这是一款开源的文件共享软件,经过简单配置就能够实现 Linux 系统与 Windows 系统之间的文件共享工作。- CIFS(common internet file system)通用网络文件系统 件系统
CIFS是公共的或开放的SMB协议版本,并由Microsoft使用。
1. 服务安装以及用户添加
1.1 首先安装服务
在samba 服务器端安装:
samba.x86_64 与Windows机器互操作的服务器和客户端软件
samba-client.x86_64 Samba客户程序(客户端,服务端都得有)
samba-common.x86_64 Samba服务器和客户端都使用的文件
[root@server ~]# yum install samba.x86_64 -y
[root@server ~]# yum install samba.-client.x86_64 -y
[root@server ~]# yum install samba-common.x86_64 -y
启动 smb 服务
[root@server ~]# systemctl start smb
[root@server ~]# systemctl enable smb
关闭防火墙
[root@server ~]# systemctl stop firewalld
在客户端
进行samba 客户端安装安装
[root@client ~]# yum install samba-client.x86_64 -y
安装完成,通过 smbclient 对 samba 客户端管理命令来进行查看
[root@client ~]# smbclient -L //172.25.151.150
#以匿名用户身份对 samba 服务器上可用的共享服务进行查看
执行如下:
在服务端为 samba 服务添加用户(必须为服务器系统中已存在的用户)
使用 smbpasswd 命令为系统用户设置 Samba 服务程序的密码
[root@server ~]# smbpasswd -a smbuser #将系统用户 smbuser 添加为 smb 用户
New SMB password: #设定用户密
Retype new SMB password: #再次输入密码
Added user smbuser. #添加成功
执行如下:
可以通过 pdbedit 来管理 Samba 用户数据库
[root@server ~]# pdbedit
-L 列出账户列表
-Lv 列出账户详细信息的列表
在客户端执行:
[root@client ~]# smbclient -L //172.25.151.150 -U smbuser
# 以用户 smbuser 身份对 samba 服务器上可用的共享服务进行查看
执行如下:
在服务端列出 smb 用户信息
在客户端进行查看
2. smb的访问管理
2.1 通过samba客户端进行共享
[root@client ~]# smbclient //172.25.151.150/smbuser -U smbuser
访问 samba 用户默认访问目录
执行如下:
如上显示, 此时可以访问,但无法进行查看,执行 ls 发现不被允许
这是因为服务端 SELinux 的问题
在服务端进行对该服务的允许
[root@server ~]# getsebool -a | grep samba
#查看该服务的sebool值
[root@server ~]# setsebool -P samba_enable_home_dirs on
#让selinux 允许
后在smb客户端进行查看访问
执行如下:
在服务端修改 sebool 值
查看 samba 服务的sebool 值
修改 samba 服务的 sebool 值
在客户端进行查看
2.2 通过挂载进行共享
登陆后,可以进行上传下载命令,但不同能进行删除,创建等命令
登陆后上传时,不能切换目录,只能上传登录前客户端所在目录的文件,下载也同样只能下载到当前目录局限性太大,可以通过挂载对共享目录进行使用
登录成功后进行上传命令:
无法进行编辑操作:
在客户端执行 smbclient -L //172.25.151.150 -U smbuser
可看到smaba 共享目录类型为 disk ,类型为硬盘
可对其进行挂载应用
执行如下:
在客户端执行
[root@client ~]# mount //172.25.151.150/smbuser /mnt/ -o username=smbuser,password=redhat
将默认服务端共享目录 smbuser 挂载到客户端 /mnt/ 下
然后对其进行操作新建文件,删除等操作
想要开机自动挂载
可以编写/etc/fstab 文件(必须保证 samba 服务端的服务开启,否则将会无法开机)
[root@client ~]# vim /etc/fstab
内容如下:
//172.25.151.150/smbuser /mnt cifs defaults,username=smbuser,password=redhat 0 0
执行开机自动挂载
重启后成功
执行如下:
进行挂载操作
编辑 /etc/fstab 内容
2.3 用户访问限制
可以在 samba 服务端编辑配置文件,限定访问 samba 服务的用户
编辑/etc/samba/smb.conf
[root@server ~]# vim /etc/samba/smb.conf
内容如下
第 89 行 workgroup = Server #将工作组改为 Server
第 98 行添加用户访问黑/白名单
98 hosts allow = 172.25.151.50
#允许172.25.254.139 主机进行访问,其他主机不被允许
#98 hosts deny = 172.25.151.50
#拒绝172.25.254.139 主机进行访问,其余主机可以访问
~
编辑完成重启服务
执行如下:
编辑配置文件
在 ip 为172.25.151.50 的主机进行测试,可以访问
在 ip 为172.25.151.250 的主机进行测试,无法访问
黑白名单的限制包括通过用户访问,以及限制用户对共享目录进行挂载使用
2.4 指定Samba共享目录
2.4.1 新建目录
[root@server ~]# mkdir /smbshare #作为smb 的共享目录
并编辑主配置文件/etc/samba/smb.conf
在最后添加如下:
322 [DIR] #指定共享目录
323 comment = smbsharedir #注释
324 path = /smbshare #路径
重启服务
通过在客户端执行
[root@client ~]# smbclient -L //172.25.151.150
可以查看到共享的目录
此时 /smbshare 可以被访问,但无法被查看,需要修改selinux安全上下文
[root@server ~]# semanage fcontext -a -t samba_share_t '/smbshare(/.*)?'
# 将/smbshare 的安全上下文修改为 samba_share_t
[root@server ~]# restorecon -Fvvr /smbshare/ #更新目录安全上下文
此时就可对目录进行访问
执行如下:
在服务端
编辑配置文件
在客户端
通过 smbclient 查看共享信息,可看到 共享文件名, DIR
执行 smbclient //172.25.151.150/DIR -U smbuser 通过 smbuser 用户进行访问,由于 selinux无法进行访问
挂载后也无法进行操作:
修改自定义共享目录 /smbshare/ 的安全上下文
再进行访问,或是挂载
挂载进行使用
2.4.2 共享系统目录
将 /mnt 目录 作为smb 共享目录
编辑主配置文件 /etc/samba/smb.conf
编辑内容如下:
326 [mnt] #指定共享目录
327 comment = mntdir #注释
328 path = /mnt #路径
修改完成重启服务
通过在客户端执行
[root@client ~]# smbclient -L //172.25.254.239
可以查看到共享的目录
此时 /mnt 可以被访问,但无法被查看,不能像自建目录一样进行安全上下文的修改,
因为,系统目录会被多个程序访问使用,修改安全上下文,则只能被 samba 服务访问,显然
是合适的。此时需要修改 sebool 值
[root@server ~]# setsebool -P samba_export_all_ro on
此时smb服务的输出仅可以读,若想对其可写,可修改 sebool 值 samba_export_all_rw
此时就可以对其进行查看
执行如下:
在服务端
修改配置文件
在客户端
通过 smbclient 进行查看共享信息
在服务端修改 sebool 值
在客户端进行访问
2.4.3 对目录进行权限设置
对上述分享后,是无法对目录进行写操作的,因为在配置文件中,服务没有赋予权限
通过编辑配置文件,对目录进行权限设置:
[root@server ~]# vim /etc/samba/smb.conf
内容如下:
322 [DIR] #指定共享目录
323 comment = smbsharedir #注释
324 path = /smbshare #路径
325 browseable = yes #是否允许浏览#此权限若为no 则无法看到 DIR
326 writeable = yes #是否可写(前提是对DIR有写的权限)
327 # write list = smbuser #允许写的用户名单
#允许指定用户或用户组可写(前提是该用户或者用户组对DIR有写的权限)
#后直接跟用户名称,若名称前有 +(@) 表示用户组
328 admin users = student #指定 smb 服务的访问管理用户
修改完毕后重启服务
通过 setfacl 对共享目录进行附加权限的设置
[root@server ~]# setfacl -Rm d:u:Sambauser:7 /smbshare
对/smbshare 目录 指定Sambuser 用户可读可写可执行
执行如下:
在服务端编辑配置文件:
对共享目录设定附加权限:
在客户端进行挂载使用:
2.5 多用户管理
以客户端 root 用户身份直接执行
mount -o /172.25.254.239/Samber /mnt/ username=Sambauser,password=redhat
smb服务的挂载点,在切换为普通用户的情况下,是可以被看到的
执行如下:
这样不够安全
所以进行多用户挂载
在客户端安装:cifs-utils 用于安装和管理 CIFS 挂载的实用程序
[root@client mnt]# yum install cifs-utils.x86_64 -y
建立smb用户文件 /root/smbusers
内容如下:输入已知smb用户的用户名以及密码
1 username=smbuser
2 password=redhat
通过如下方式进行挂载:
[root@client ~]# mount -o credentials=/root/smbusers,sec=ntlmssp,multiuser //172.25.151.150/DIR /mnt
其中:
# credentials=filename
指定包含用户名和/或密码以及可选工作组名称的文件。该文件的格式为:
username=value #用户名
password=value #密码
domain=value #域名
这比在共享文件(如/etc/fstab)中使用明文密码要好。确保正确地保护任何凭证文件。
# sec=ntlmssp
安全模式设置为 ntlmssp ,此模式选择看版本,
在v3.8之前,主线内核版本的默认值是sec=ntlm。在v3.8中,默认设置sec=ntlmssp。
# multiuser 多用户模式
此后切换用户后,无法对smb进行查看,需要进行认证,通过 cifscreds 进行访问
cifscreds 在内核密钥环中管理NTLM凭据
在另一用用户下执行:
[student@client mnt]$ cifscreds add -u smbuser 172.25.151.150
# cifscreds add [-u 用户名] samba主机IP
然后输入密码进行验证就可以
执行如下:
在客户端将 cifs-utils 服务安装完成后,编辑smbusers文件
在客户端以 root 用户进行多用户加密模式进行挂载
切换用户进行查看,访问被拒绝
执行cifscreds add -u smbuser 172.25.151.150 键入密码后进行访问
3. windows 下的访问
既然 samba 是用来执行 linux 与 windows 之间的文件共享,当然少如何进行 windows 端的操作
主机名 | 操作系统 | IP |
---|---|---|
Samba 共享服务器 | RHEL 7.0 | 172.25.151.150 |
Windows 客户端 | Windows 7 | 172.15.151.39 |
3.1 windows 匿名用户进行访问
windows 下的匿名用户为 guest
在 linux 服务端进行操作
编辑配置文件/etc/samba/smb.conf
内容如下:
第 123 行左右
124 security = user
125 passdb backend = tdbsam
126 map to guest = bad user
#对 guest 进行映射,
#即让系统识别 guest 用户身份,为匿名用户
322 [DIR]
323 comment = smbsharedir
324 path = /smbshare
325 browseable = yes
326 writeable = yes
327 # write list = smbuser
328 admin users = student
329 guest ok = yes #匿名用户允许登陆
编辑完成重启服务
执行如下:
在 linux 服务端
编辑配置文件
在共享目录下建立 txt 文档进行测试
编辑内容如下
在 windows 客户端
要在 Windows 系统中访问共享资源,只需在 Windows 的“运行”命令框中输入两个反斜
杠,然后再加服务器的 IP 地址即可
进入共享目录
对文件进行编辑
3.2 windows 以samba 用户身份进行访问
在 linux 服务端编辑配置文件
[root@server ~]# vim /etc/samba/smb.conf
322 [DIR]
323 comment = smbsharedir
324 path = /smbshare
325 browseable = yes
326 writeable = yes
327 # write list = smbuser
328 admin users = student
去掉对虚拟用户允许的编辑即可
编辑完成重启服务
执行如下:
在 linux 服务端
编辑配置文件,并重启服务
在 windows 客户端
在 Windows 的“运行”命令框中输入两个反斜杠,然后再加服务器的 IP 后,进行共享目录。需要进行验证
输入 smbuser 用户名及密码
验证成功,进行操作
注:
由于 Windows 系统缓存的原因,有可在第二次登录时提供了正确的账户和密码,依然会报错,这时只需要重新启动一下 Windows 客户端就没问题了