CIFS (Common Internet File System) 通用网络文件系统
在windows主机之间进行网络文件共享是通过使用微软公司自己的CIFS服务实现的。CIFS也可以在linux系统和windows系统之间共享文件,因此这种文件系统主要用于客户端是windows系统。 提供CIFS的服务是samba。
samba相关概念
1.Samba是一套使用SMB(Server Message Block)协议的应用程序, 通过支持这个协议, Samba允许Linux服务器与Windows系统之间进行通信,使跨平台的互访成为可能。Samba采用C/S模式, 其工作机制是让NetBIOS( Windows 网上邻居的通信协议)和SMB两个协议运行于TCP/IP通信协议之上,并且用NetBEUI协议让Windows在“网上邻居”中能浏览Linux服务器。
SMB(Server Messages Block,信息服务块)是一种在局域网上共享文件和打印机的一种通信协议,它为局域网内的不同计算机之间提供文件及打印机等资源的共享服务。
Samba服务器可实现如下功能:WINS和DNS服务; 网络浏览服务; Linux和Windows域之间的认证和授权; UNICODE字符集和域名映射;满足CIFS协议的UNIX共享等。
2. Samba的主要应用
SAMBA的主要目的就是用来沟通Windows与Unix这两种不同的作业平台。
主要应用:
共享档案与打印机服务;
提供身份认证;
提供Windows网络上的主机名称解析(NetBIOS name)。
3. Samba的几个主要配置文件(文件路径:/etc/samba)
smb.conf:最主要的配置文件,分为[global]和[Share Definitions]两个部分。
lmhosts:对应NetBIOS Name与该主机的IP,一般Samba在启动时就能捕捉到LAN中相关计算机NetBIOS Name对应的IP,因此,这个配置文件一般不用设置。
smbpasswd:这个文件默认不存在,它是Samba预设的使用者密码对应表。
4.安装包说明:
samba-common //主要提供samba服务器的设置文件与设置文件语法检验程序testparm
samba-client //客户端软件,主要提供linux主机作为客户端时,所需要的工具指令集
samba //服务器端软件,主要提供samba服务器的守护程序,共享文档,日志的轮替,开机默认选项
5.服务端口:
通常使用TCP/445进行所有连接。还使用UDP137、UDP138和TCP/139进行向后兼容
6. Samba的几个主要命令
smbpasswd:用来设置Samba用户的帐号和密码。
smbclient:用来查看别的Linux主机的共享。也可以在自己的Samba主机上使用,用来查看设置是否成功。
-L:后面接主机所提供共享的资源目录
-U:后面接帐号来访问主机的可使用的资源
smbmount:用来将Samba服务器共享的文档和目录挂载到自己的Linux主机上。
testparm:用来检查smb.conf是否有错误。
samba服务配置
实验环境:
服务端IP=172.25.254.100
1>关闭防火墙
[root@shareserver ~]# systemctl stop firewalld
2>安装并开启samba服务
[root@shareserver ~]# yum install samba samba-common samba-client -y
[root@shareserver ~]# systemctl start smb
3>添加samba服务共享用户
[root@shareserver ~]# id student
uid=1000(student) gid=1000(student) groups=1000(student),10(wheel)[root@shareserver ~]# smbpasswd -a student ##设置student用户登陆samba服务的密码
New SMB password:
Retype new SMB password:
Added user student. ## samba服务共享用户student添加成功
注:设置登陆samba服务的密码时用户必须是本机存在的用户,否则添加samba用户将会失败。
[root@shareserver ~]# useradd westos ##添加westos用户
[root@shareserver ~]# smbpasswd -a westos ##设置westos用户登陆samba服务的密码
New SMB password:
Retype new SMB password:
Added user westos.[root@shareserver ~]# pdbedit -L ##列出可以登陆samba服务的用户
student:1000:Student User
westos:1001:
pdbedit -x westos ###在登陆samba用户登陆列表清除westos用户
客户端IP=172.25.254.200
1>关闭防火墙
2>安装并开启samba服务
[root@client ~]# systemctl stop firewalld
[root@client ~]# yum install samba-client -y
3>用户登陆
匿名用户登陆
[root@client ~]# smbclient -L //172.25.254.100 ### -L 显示服务器端所分享出来的所有资源
Enter root's password: ###不用输密码直接回车
Anonymous login successful
Domain=[MYGROUP] OS=[Unix] Server=[Samba 4.1.1] Sharename Type Comment
--------- ---- -------
IPC$ IPC IPC Service (Samba Server Version 4.1.1)
Anonymous login successful
本地用户登陆:默认登陆目录为本地用户的家目录
[root@client ~]# smbclient -L //172.25.254.100 -U westos ### -U后接的参数是登陆samba服务的用户,没有该参数时默认以匿名用户身份登陆
Enter westos's password:
Domain=[MYGROUP] OS=[Unix] Server=[Samba 4.1.1] Sharename Type Comment
--------- ---- -------
IPC$ IPC IPC Service (Samba Server Version 4.1.1)
westos Disk Home Directories ##以westos用户身份登陆时默认登陆目录为本地用户westos的家目录
Domain=[MYGROUP] OS=[Unix] Server=[Samba 4.1.1]
4>用户访问共享目录
匿名用户:
[root@client ~]# smbclient //172.25.254.100/westos
Enter root's password:
Anonymous login successful
Domain=[MYGROUP] OS=[Unix] Server=[Samba 4.1.1]
tree connect failed: NT_STATUS_ACCESS_DENIED
可以看出匿名用户可以登陆成功,但不能访问共享目录,不能对该共享资源进行操作。
本地用户:
[root@client ~]# smbclient //172.25.254.100/westos -U westos ##本地用户访问共享资源目录
Enter westos's password:
Domain=[MYGROUP] OS=[Unix] Server=[Samba 4.1.1]
smb: \> ls ##本地用户成功通过samba服务访问到共享资源
NT_STATUS_ACCESS_DENIED listing \* ##本地用户进入家目录时,文件系统拒绝,因为能够访问家目录的功能是关闭的
开启访问家目录权限:
服务端配置:
[root@shareserver ~]# getsebool -a | grep samba ##查看samba服务的各接口开启状态
samba_enable_home_dirs --> off ##访问访问家目录的功能未开启[root@shareserver ~]# setsebool -P samba_enable_home_dirs on ##开启访问家目录的功能
客户端测试:
[root@client ~]# smbclient //172.25.254.100/westos -U westos
可以看出本地用户在登陆的时候可以访问用户的家目录了。
客户端在smb命令下对文件的上传与删除操作:
[root@client ~]# smbclient //172.25.254.100/westos -U westos ##westos用户访问共享目录
smb: \> !ls ## !ls命令查看可以上传的文件,这些文件是客户端当前目录下的文件
anaconda-ks.cfg Documents Music Public Videos
Desktop Downloads Pictures Templatessmb: \> put anaconda-ks.cfg ###上传!ls命令查到的文件
putting file anaconda-ks.cfg as \anaconda-ks.cfg (8416.2 kb/s) (average 8417.0 kb/s) ##上传成功smb: \> rm anaconda-ks.cfg ##删除共享目录中存在的文件
在smb中输入命令? ,输出结果为smb中支持的命令,这些命令少于shell中的命令,若需执行这些命令之外的shell的命令,需要将f服务机上的共享目录挂载到客户端。
共享目录的挂载
临时挂载:
[root@client ~]# mount -o username=westos,password=westos //172.25.254.100/westos /mnt/ 将共享目录挂载到/mnt
[root@client ~]# cd /mnt
[root@client mnt]# touch file{1..5} 在/mnt在建立文件,查看文件属性[root@client mnt]# ll 查看文件建立的属性
total 0
-rw-r--r--. 1 1001 1001 0 Nov 26 12:52 file1 ##1001为westos用户的uid,即所创建的文件的拥有者和所属组都是westos
-rw-r--r--. 1 1001 1001 0 Nov 26 12:52 file2
-rw-r--r--. 1 1001 1001 0 Nov 26 12:52 file3
-rw-r--r--. 1 1001 1001 0 Nov 26 12:52 file4
-rw-r--r--. 1 1001 1001 0 Nov 26 12:52 file5
在服务器主机上查看创建的文件,在用户家目录下可以看到客户端上创建的文件,且文件的拥有者和所属组都是westos
永久挂载:
[root@client /]# umount /mnt ##卸载前面的临时挂载
[root@client /]# vim /etc/fstab ##修改配置文件//172.25.254.100/westos /mnt cifs defaults,username=westos,password=westos 0 0 添加该行配置实现永久挂载
[root@client /]# mount -a ##刷新
[root@client /]# df ##查看挂载情况
设定访问域名
1.查看当前域名:
2.在服务端修改配置文件:
[root@shareserver ~]# vim /etc/samba/smb.conf
89 workgroup = WESTOS ##将域名更改为WESTOS
3.客户端查看域名变化
设置samba服务的黑白名单
1.在服务端修改配置文件:
[root@shareserver ~]# vim /etc/samba/smb.conf
96 hosts allow = 172.25.254.81 白名单
97 hosts deny = 172.25.254.200 黑名单[root@shareserver ~]# systemctl restart smb ##重启服务
2.客户端测试:
主机ip=172.25.254.81
主机ip=172.25.254.200
smb共享设置
1.共享用户自行建立的目录
方式:修改安全上下文
服务器端:
[root@shareserver ~]# mkdir /subshare ##建立共享目录
[root@shareserver ~]# semanage fcontext -a -t samba_share_t '/subshare(/.*)?' ## 修改/subshare目录及其内容的安全上下文
[root@shareserver ~]# restorecon -RvvF /subshare ##刷新
restorecon reset /subshare context unconfined_u:object_r:default_t:s0->system_u:object_r:samba_share_t:s0
[root@shareserver ~]# semanage fcontext -l | grep /subshare ##查看该目录的上下文是否修改成功了
/subshare(/.*)? all files system_u:object_r:samba_share_t:s0
[root@shareserver ~]# vim /etc/samba/smb.conf ##修改配置文件323 [linux] 客户端用户登陆smb时可以看到的共享资源名字,可以随便起
324 comment = subshare dir describe 共享资源的描述
325 path = /subshare 共享目录的绝对路径
客户端测试:
<1>匿名用户登陆可查看共享目录
<2>本地用户可进入共享目录的家目录
2.共享系统目录
直接修改系统安全上下文会影响其他服务对该目录的使用,所以需要修改smb布尔值。修改此bool,也可共享用户自行建立的目录。
[root@shareserver /]# vim /etc/samba/smb.conf
327 [mnt]
328 comment = mnt dir describe 共享资源的描述
329 path = /mnt 共享目录的绝对路径[root@shareserver /]# systemctl restart smb ##重启服务
[root@shareserver /]# getsebool -a | grep samba
[root@shareserver /]# setsebool samba_export_all_ro --> off on
注意:setsebool -P samba_export_all_ro on ##永久性开启smb服务所有端口的只读功能,打开这个开关,除了系统目录的共享之外,还可以进行自己目录的共享,它比直接修改安全上下文的权力大,不受selinux控制,但是安全性差;如果共享系统目录,只是编辑配置文件若是没有修改布尔值,则看不到此目录新建的文件;
客户端测试:
<1>匿名用户可查看共享目录
<2>本地用户测试
服务端只对配置文件进行了修改但没有改变samba_export_all_ro的值时:
本地用户登陆后看不到共享目录中新建的文件
服务端既对配置文件进行了修改又改变samba_export_all_ro的值时:
本地用户登陆后可以看到共享目录中新建的文件
共享目录权限的设置
<1>允许所有人可写
服务端设置:
[root@shareserver subshare]# vim /etc/samba/smb.conf
[linux]
comment = subshare dir describe
path = /subshare
writable = yes[root@shareserver subshare]# systemctl restart smb
[root@shareserver subshare]# chmod 777 /subshare/ ###改变共享目录的权限,方便测试
配置文件内容
客户端测试:
客户端可以用smb命令对登陆共享目录进行测试,也可以先在客户端挂载共享文件系统,再在挂载点下进行测试。
<1>用smb命令对登陆共享目录
[root@client ~]# smbclient //172.25.254.100/linux -U westos
Enter westos's password:
Domain=[WESTOS] OS=[Unix] Server=[Samba 4.1.1]
smb: \> !ls ##查看能够进行上传的文件
anaconda-ks.cfg Documents Music Public Videos
Desktop Downloads Pictures Templates
smb: \> put anaconda-ks.cfg
putting file anaconda-ks.cfg as \anaconda-ks.cfg (8416.2 kb/s) (average 8417.0 kb/s) ##上传文件成功
smb: \> rm anaconda-ks.cfg ##删除文件成功
<2>先在客户端挂载共享文件系统,再在挂载点下进行测试
[root@client ~]# mount //172.25.254.100/linux /mnt -o username=westos,password=westos ##挂载文件系统
[root@client ~]# cd /mnt ##切换到挂载点所在的目录下面
[root@client mnt]# touch file{1..3} ##测试能否创建文件 [root@client mnt]# rm -fr file1 ##测试能否删除文件
<2>允许某用户可写
服务端设置:
[root@shareserver westos]# vim /etc/samba/smb.conf ##修改配置文件
[linux]
comment = subshare dir describe
path = /subshare
; writable = yes ##注释掉所有人可写的功能
write list = westos ##只允许westos用户可写[root@shareserver westos]# systemctl restart smb
客户端测试:
[root@client mnt]# mount ##查看挂载该共享目录的用户身份
//172.25.254.100/linux on /mnt type cifs (rw,relatime,vers=1.0,cache=strict,username=westos,domain=SHARESERVER,uid=0,noforceuid,gid=0,noforcegid,addr=172.25.254.100,unix,posixpaths,serverino,acl,rsize=1048576,wsize=65536,actimeo=1)
westos用户测试对该共享目录可写
student用户测试对该共享目录不可写
<3>允许某用户组可写
服务端设置:
[root@shareserver westos]# vim /etc/samba/smb.conf ##修改配置文件
[linux]
comment = subshare dir describe
path = /subshare
; writable = yes ##注释掉所有人可写的功能
write list = +westos ##只允许westos用户组可写,该语句功能与write list = @westos相同[root@shareserver westos]# systemctl restart smb
[root@shareserver westos]# usermod -G westos student ##将student加入westos组
[root@shareserver westos]# id student
uid=1000(student) gid=1000(student) groups=1000(student),1001(westos)
客户端测试:
用户组成员westos测试对该共享目录可写
用户组成员student测试对该共享目录可写
注:以student用户身份创建的文件的拥有者和所属组都是server机的student用户id=1000
[root@shareserver westos]# id student
uid=1000(student) gid=1000(student)
当客户端上没有uid为1000的用户时,文件属性的拥有者和所属组都用uid和gid表示
这里客户端存在uid是1000的student用户,故文件属性中就用该用户名表示拥有者,用户名是可以改变的,但是用户的uid是唯一的,这里的文件属性主要匹配的是server机samba用户的uid。
[root@client mnt]# id student
uid=1000(student) gid=1000(student)
<4>共享浏览信息
服务端设置:
[root@shareserver westos]# vim /etc/samba/smb.conf ##修改配置文件
[linux]
comment = subshare dir describe
path = /subshare
; writable = yes ##注释掉所有人可写的功能
write list = +westos ##只允许westos用户组可写,该语句功能与write list = @westos相同 browseable = no ##默认该共享目录可以被浏览 browseable = yes
[root@shareserver westos]# systemctl restart smb
客户端测试:
修改前(默认browseable = yes,共享可浏览):
修改后(隐藏共享浏览):
<5>设置共享目录的有效用户/有效用户组
服务端设置:
[root@shareserver westos]# vim /etc/samba/smb.conf
[linux]
comment = subshare dir describe
path = /subshare
writable = yes
valid users= westos ###当前共享的有效用户是westos valid users= +westos ###当前共享的有效用户是westos用户组里的用户
[root@shareserver westos]# systemctl restart smb
客户端测试:
有效用户westos进入共享目录成功
非有效用户student进入共享目录失败:
<6>设置某一用户对于共享目录以超级用户身份访问
[root@shareserver westos]# vim /etc/samba/smb.conf
[linux]
comment = subshare dir describe
path = /subshare
writable = yes
admin users = student ###设置student用户对于共享资源以超级用户身份访问[root@shareserver westos]# systemctl restart smb
客户端测试:
[root@client /]# mount //172.25.254.100/linux /mnt -o username=student,password=student ##以student用户的身份挂载文件系统
[root@client /]# cd /mnt ##切换到挂载点所在的路径
[root@client mnt]# ll
total 0
-rw-r--r--. 1 student student 0 Nov 27 01:52 studentfile
-rw-r--r--. 1 1001 1001 0 Nov 27 01:38 westosfile[root@client mnt]# touch test ##新建一个文件
[root@client mnt]# ll ##查看文件的属性
total 0
-rw-r--r--. 1 student student 0 Nov 27 01:52 studentfile
-rw-r--r--. 1 root student 0 Nov 27 04:40 test ###新建文件的拥有者是root
-rw-r--r--. 1 1001 1001 0 Nov 27 01:38 westosfile
<7>允许匿名用户访问共享目录
服务器端配置:
[root@shareserver westos]# vim /etc/samba/smb.conf ##修改配置文件
126 map to guest = bad user
323 [linux]
324 comment = subshare dir describe
325 path = /subshare
326 writable = yes
327 admin users = student
328 guest ok = yes [root@shareserver westos]# systemctl restart smb
客户端测试:
[root@client /]# smbclient //172.25.254.100/linux
可见匿名用户可以成功访问该共享目录。
匿名用户上传文件:
在server端共享目录下查看上传文件的属性,可以发现匿名用户上传文件的拥有者和所属组都默认为nobody。
<8>多用户挂载
[root@client ~]# yum install cifs-utils.x86_64 -y ##安装cifs-utils软件包,它包含了cifscreds命令
[root@client ~]# vim /root/smbpass ##编辑samba用户信息文件,指定用户名和密码
username=westos
password=westos[root@client ~]# chmod 600 /root/smbpass ##改变文件的权限
[root@client ~]# mount -o credentials=/root/smbpass,sec=ntlmssp,multiuser //172.25.254.100/linux /mnt ##超级用户认证挂载(以westos用户认证信息)
[root@client ~]# cd /mnt
[root@client mnt]# touch rootfile ##超级用户在共享目录下新建文件
[root@client mnt]# ll
total 0
-rw-r--r--. 1 1001 1001
客户端切换到student用户,可以看出student用户不能访问共享目录
[student@client mnt]$ cifscreds add -u student 172.25.254.100 ##普通用户认证以student用户登陆,这里添加的用户必须是存在的samba用户
Password: ##输入已经存在的samba用户的密码
[student@client mnt]$ ls ##student用户可以访问共享目录
rootfile
[student@client mnt]$ touch studentfile ##student用户在共享目录下新建文件
[student@client mnt]$ ll
total 0
-rw-r--r--. 1 1001 1001 0 Nov 27 07:40 rootfile
-rw-r--r--. 1 student student[student@client mnt]$ cifscreds clearall ##清空挂载用户