1.什么是Samba

Samba是Linux和UNIX系统上实现SMB协议的一个免费软件,由服务器及客户端程序构成 SMB (Server Message Block,信息服务块)是一种在局域网上共享文件和打印机的一种通信协议 它为局域网内的不同计算机之见提供文件及打印机等资源的共享服务 SMB协议是客户及/服务器型协议,客户机通过协议可以访问服务器上的共享文件系统,打印机及其他资源 通过设置“NetBIOS over TCP/IP”使得Samba不但能与局域网络主机分享资源,还能与全世界的电脑分享资源

2.搭建一个Samba服务器

打开desktop和server虚拟机,把desktop当作客户端,server当作服务端,配置desktop的ip为172.25.254.115,配置server的ip为172.25.254.215,更改115名字为client.westos.com,更改215的名字为,samba.westos.com,分别配置yum源

android 搭建srs服务器 android smb 服务器_服务器


215端

下面将把215这台虚拟机搭建samba服务器,在215上面需要安装3个安装包

yum install samba-client samba的客户端yum install samba-common samba服务用到的命令 yum isntall samba samba的主服务 yum search samba

android 搭建srs服务器 android smb 服务器_服务器_02

rpm -qc samba-common查看samba的主配置文件 /etc/samba/smb.conf

android 搭建srs服务器 android smb 服务器_服务器_03

rpm -qa 查看samba服务的版本

android 搭建srs服务器 android smb 服务器_客户端_04

vim /etc/samba/smb.conf

android 搭建srs服务器 android smb 服务器_服务端_05

可以看出Selinux会对Samba服务有一定的影响,如果Selinux开启,需要更改samba共享目录的安全上下文mkdir /westos_smb,建立一个共享目录

android 搭建srs服务器 android smb 服务器_服务端_06

semanage fcontext -a -t samba_share_t '/westos_smb(/.*)?'更改安全上下文

android 搭建srs服务器 android smb 服务器_服务器_07

restorecon -RvvF /westos_smb刷新使当前生效

android 搭建srs服务器 android smb 服务器_服务器_08

vim /etc/samba/smb.conf

android 搭建srs服务器 android smb 服务器_服务器_09


[WESTOS]为samba服务器对外共享的总名称

path = /westos_smb实际共享目录路径

重启服务

android 搭建srs服务器 android smb 服务器_服务端_10

关闭防火墙

samba服务用户
建立westos用户和lee用户,并将其加入samba用户里面,并设置密码

useradd westosuseradd lee

android 搭建srs服务器 android smb 服务器_服务器_11

smbpasswd -a westossmbpasswd -a lee

android 搭建srs服务器 android smb 服务器_服务器_12


android 搭建srs服务器 android smb 服务器_客户端_13

注意这里的用户首先必须在系统中真实存在,然后在用smbpasswd命令加入到samba服务中用pdbedit -L 来查看samba服务器的samba用户

android 搭建srs服务器 android smb 服务器_android 搭建srs服务器_14


给/westos_smb中建立5个文件

android 搭建srs服务器 android smb 服务器_服务器_15

在215端
安装samba-client客户端

android 搭建srs服务器 android smb 服务器_服务端_16

smbclient -L //172.25.254.215 以匿名用户对samba服务器215的共享目录进行查看,-L表示列出,没有root用户就直接回车

android 搭建srs服务器 android smb 服务器_服务器_17

smbclient //172.25.254.215/WESTOS -U westos 以smb服务器中westos用户直接查看215共享的文件ls

android 搭建srs服务器 android smb 服务器_服务器_18


这种方式只能查看,而想进行上传下载等操作,可以mount到本地

android 搭建srs服务器 android smb 服务器_android 搭建srs服务器_19

发现并不能删除和建立文件

3.在samba服务修改权限

加入服务端对共享目录的说明

android 搭建srs服务器 android smb 服务器_android 搭建srs服务器_20


重启服务

在客户端查看,在Comment处,有加入的Share File

android 搭建srs服务器 android smb 服务器_服务端_21

browseable = no 隐藏这个共享目录,使客户端-L看不到samba服务器对外的共享目录,但实际是存在的

重启服务

android 搭建srs服务器 android smb 服务器_客户端_22


android 搭建srs服务器 android smb 服务器_服务端_23

valid users = westos客户端只可以用samba服务器的westos用户身份来登陆samba

android 搭建srs服务器 android smb 服务器_服务器_24


android 搭建srs服务器 android smb 服务器_android 搭建srs服务器_25


而lee用户就不可以登陆

android 搭建srs服务器 android smb 服务器_服务器_26

valid users = +westos 表示只有属于westos组的用户可以登陆

android 搭建srs服务器 android smb 服务器_android 搭建srs服务器_27


现在将lee用户加入westos用户组

usermod -G westos leeid lee

再次用lee登陆,发现可以登陆了

android 搭建srs服务器 android smb 服务器_android 搭建srs服务器_28


android 搭建srs服务器 android smb 服务器_服务器_29

writable = yes 表示可以写入

android 搭建srs服务器 android smb 服务器_android 搭建srs服务器_30


重启服务

用客户端:

android 搭建srs服务器 android smb 服务器_android 搭建srs服务器_31

发现此时还是不能上传和删除,为什么?因为虽然服务允许了,但是文件系统的权限还没有允许。

ls -ld /westos_smb查看文件夹权限,发现只对于root用户可写现在给westos用户一个满权限

android 搭建srs服务器 android smb 服务器_客户端_32

然后再测试

成功删除file1

android 搭建srs服务器 android smb 服务器_客户端_33

成功上传文件

android 搭建srs服务器 android smb 服务器_客户端_34


注意:文件系统的权限和服务权限都要开启

write list = lee 服务只允许lee用户对samba目录可写,这个和writable只能存在一个,开启这个就必须将writable注释掉

android 搭建srs服务器 android smb 服务器_服务器_35

给文件权限系统加入lee用户满权限

android 搭建srs服务器 android smb 服务器_服务端_36


android 搭建srs服务器 android smb 服务器_android 搭建srs服务器_37


此时westos用户,虽然文件系统有rwx权限,但是服务只允许lee用户可写,所以它仍不能上传删除文件

android 搭建srs服务器 android smb 服务器_服务端_38

write list = @lee 表示属于lee组的用户可以写

android 搭建srs服务器 android smb 服务器_服务端_39


用客户端westos用户登陆,发现还是无法上传,因为还没有把westos用户加入lee组

android 搭建srs服务器 android smb 服务器_android 搭建srs服务器_40


==在服务端加westos用户到lee组中

usermod -G lee westosid westos

android 搭建srs服务器 android smb 服务器_服务器_41


此时westos用户可以上传删除文件

android 搭建srs服务器 android smb 服务器_服务器_42

guest ok = yes 使匿名用户可以登陆

此时匿名用户不能登陆

android 搭建srs服务器 android smb 服务器_服务器_43


android 搭建srs服务器 android smb 服务器_android 搭建srs服务器_44


此时再次尝试,匿名用户可以登陆了

android 搭建srs服务器 android smb 服务器_服务器_45


尝试用匿名用户挂载

mount //172.25.254.215/WESTOS /mnt -o username=guest.password=""

android 搭建srs服务器 android smb 服务器_android 搭建srs服务器_46


发现不能挂载,因为挂载这个进程没有识别smaba服务器的匿名用户

在配置文件中加入 map to guest = bad user 使挂载进程映射你名用户bad user

android 搭建srs服务器 android smb 服务器_服务器_47


android 搭建srs服务器 android smb 服务器_服务器_48

admin users = westos 将/westos_smb目录的root用户设置为westos用户

android 搭建srs服务器 android smb 服务器_服务器_49


此时需要把writable权限也开开

用westos用户挂载/westos_smb,然后上传文件file{7..10}ll 查看文件的权限所属发现file7-file10属于root用户,1001组,1001即为服务端westos组,只是因为客户端没有1001这个组所以就直接用组id表示,但是所属用户是root

如何共享系统文件夹,(非自己创建例如/mnt)

前文说到可以通过修改安全上下文的方式来使文件夹被共享,而如果我想共享系统/mnt目录,就不可以使用这个方法了因为还有别的地方需要用到/mnt的安全上下文,如果修改了/mnt的安全上下文为smaba的就会导致别的地方不能使用/mnt所以只能通过降低samba安全性的方法来使/mnt共享,这个方法就是修改Selinux的samba功能开关

getsebool -a | grep samba

android 搭建srs服务器 android smb 服务器_服务器_50


发现都是关闭的状态

vim /etc/smaba/smb.conf 写入共享/mnt的信息

android 搭建srs服务器 android smb 服务器_android 搭建srs服务器_51


在/mnt下创建10个文件,查看安全上下文,发现并不是smaba服务要求的安全上下文

android 搭建srs服务器 android smb 服务器_客户端_52


在客户端用westos用户登陆后ls也不能看到10个文件

android 搭建srs服务器 android smb 服务器_服务器_53

这时在服务端修改Selinux对于samba的服务控制setsebool -P samba_export_all_ro on(1) 打开只读权限 -P永久打开客户端再次用westos用户登陆samba服务器

发现可以查看到10个文件了

android 搭建srs服务器 android smb 服务器_服务器_54


尝试删除和上传文件,发现并不能

android 搭建srs服务器 android smb 服务器_android 搭建srs服务器_55


android 搭建srs服务器 android smb 服务器_服务器_56

这时候需要再开启Selinux控制smaba的读写权限

setsebool -P samba_export_all_ro on(1) -P 永久打开

再次登陆,rm file10 还是不能删除,因为文件系统没有给westos对于/mnt的满权限,切换到samba端,给westos对于/mnt的满权限

android 搭建srs服务器 android smb 服务器_客户端_57


再次用westos登陆,发现可以删除

android 搭建srs服务器 android smb 服务器_客户端_58

如何实现samba的多用户挂载在客户端做实验

刚才在服务端将smb服务设置好后,客户端实现挂载,对smb的共享目录进行修改这时候客户端以服务端的westos用户进行登陆,而客户端的student用户可以看到root用户下的/mnt的挂载内容,这样就很不安全应该客户端每一个用户在smb服务端中均有自己对应的smb用户root ---->westosstudent----->lee

先在root用户下,用smb端的westos用户挂载共享目录到/mnt下

android 搭建srs服务器 android smb 服务器_服务器_59

android 搭建srs服务器 android smb 服务器_服务器_60

在客户端切换student用户,cd /mnt 后仍然可以看到/mnt里的东西

android 搭建srs服务器 android smb 服务器_服务端_61


此时需要在客户端安装可以实现多用户挂载的服务,客户端每个用户只能看到自己的挂载内容

切换到root用户 yum install cifs-utils -y

android 搭建srs服务器 android smb 服务器_客户端_62

man mount.cifs 查看cifs的挂载配置vim /root/smb 写入挂载用户身份的认证文件

android 搭建srs服务器 android smb 服务器_客户端_63

之前挂载的时候samba用户的密码和用户名是裸露在外的现在把它写入文件里面并且给这个文件一个600的权限,只能让root用户查看chmod 600 /root/smb

android 搭建srs服务器 android smb 服务器_android 搭建srs服务器_64

mount //172.25.254.215/WESTOS /mnt -o credentials=/root/smb 以认证文件的方式挂载,不用裸露用户身份

android 搭建srs服务器 android smb 服务器_android 搭建srs服务器_65

成功挂载

输入mount依然可以看到挂载的用户是westos

android 搭建srs服务器 android smb 服务器_服务端_66


切换到student用户,发现仍然可以看到挂载到/mnt下的文件

android 搭建srs服务器 android smb 服务器_android 搭建srs服务器_67


卸载/mnt

android 搭建srs服务器 android smb 服务器_服务器_68

mount //172.25.254.215/WESTOS /mnt -o credentials=/root/smb,sec=ntlmssp,multiuser root用户挂载的时候不让别的用户看到自己的操作,并开启多用户挂载

android 搭建srs服务器 android smb 服务器_服务端_69


再次切换用户student,发现不能看到/mnt里的内容了

android 搭建srs服务器 android smb 服务器_客户端_70


现在为student用户创建挂载用户

cifscreds --help 查看多用户挂载的命令用法

android 搭建srs服务器 android smb 服务器_客户端_71

cifsscreds add -u lee 172.25.254.215为本地student用户创建samba用户lee

android 搭建srs服务器 android smb 服务器_客户端_72

cd /mnt切换到挂载目录ls此时就可以看到/mnt里的内容了touch file000 ll 在客户端属于student用户的cifscreds clear -u lee 172.25.254.215 取消samba用户

android 搭建srs服务器 android smb 服务器_客户端_73


android 搭建srs服务器 android smb 服务器_服务器_74


此时file000的所属用户是1002,是因为在客户端没有lee这个用户,而lee这个用户在服务端是1002,所以客户端显示的就是1002.

在服务端 可以看到file000是属于lee用户的

android 搭建srs服务器 android smb 服务器_服务器_75

取消student用户的smaba用户leecifscreds clear -u lee 172.25.254.215卸载,再次挂载,切换用户student,又不能看到了

android 搭建srs服务器 android smb 服务器_服务器_76