1 原理---》 安装 ---》 配置 --》 启动服务加测试 --》 补充
2
3 ==================================================================
4
5 samba --文件服务器
6 smb (service message block 服务消息块)
7
8 smb与ftp对比:
9 smb不好跨公网,可能要借助vpn这种方式。smb对权限控制比ftp好,特别适用于在同一个目录里多个用户拥有不同权限的场合。smb和ftp都能跨平台。smb除了做文件服务器还可以做windows域有关的应用(比如把一个linux加到windows域里).
10
11
12 smb与nfs对比:
13 nfs: linux to linux
14 samba: linux to windows
15
16
17 smb与http对比
18
19 smb使用的netbios通讯协定
20
21 netbios (network basic input/output system) --最早由IBM发展出来的目的为让局域网内少数电脑进行网络连结的协议,初期的设定并不是针对大型网络,并且他是无法横跨不同路由的; 微软就使用了它进行局域网内的通讯
22
23 现在有所谓的netbios over tcp/ip 可以横跨不同路由
24 netbeui (netbios extened user interface) 为IBM在netbios基础上发展而来的改良版本
25
26
27 用samba登入某部windows主机,要加入此windows主机的群组(workgroup),并且也要设定一下netbios name (要求唯一),然后就可以视权限进行资源的访问了
28
29
30 samba通过两个守护进程来控制
31
32 nmbd 用来管理workgroup,netbios name的解析等 用udp 的137,138端口
33
34 smbd 用来管理samba主机分享的目录,档案 用tcp的139和445 (TCP的可靠性)
35
36
37 --rhel6,rhel7下监听端口主要只有TCP的139,445 监听端口
38
39 cifs common interface file system
40
41 mount -t cifs -o username=administrator //ip/共享名 /mnt
42
43 --windows防火墙关闭
44 --guest用户打开
45
46 ==================================================================
47
48 准备一台全新centos7平台的虚拟机模拟samba服务器
49
50 安装samba相关软件包
51 [root@server ~]# yum install samba\*
52
53 =================================================================
54
55
56 配置文件简单说明
57 cat /etc/xinetd.conf |grep -v ^# |grep -v ^$
58 [root@server ~]# cat /etc/samba/smb.conf
59 [global] --定义全局的参数
60 workgroup = SAMBA --定义工作组
61 security = user --定义工作模式:share,user,server
62
63 passdb backend = tdbsam
64
65 printing = cups
66 printcap name = cups
67 load printers = yes
68 cups options = raw
69
70 [homes] --加入到samba的用户,默认会共享自己的家目录
71 comment = Home Directories
72 valid users = %S, %D%w%S
73 browseable = No
74 read only = No
75 inherit acls = Yes
76
77 [printers]
78 comment = All Printers
79 path = /var/tmp
80 printable = Yes
81 create mask = 0600
82 browseable = No
83
84 [print$]
85 comment = Printer Drivers
86 path = /var/lib/samba/drivers
87 write list = root
88 create mask = 0664
89 directory mask = 0775
90
91
92 [root@server ~]# systemctl restart smb --配置文件没有做任何修改,直接启动
93
94
95 [root@server ~]# netstat -ntlup |grep bd --查看端口是否启动
96 tcp 0 0 0.0.0.0:139 0.0.0.0:* LISTEN 2399/smbd
97 tcp 0 0 0.0.0.0:445 0.0.0.0:* LISTEN 2399/smbd
98 tcp6 0 0 :::139 :::* LISTEN 2399/smbd
99 tcp6 0 0 :::445 :::* LISTEN 2399/smbd
100
101
102 例一:smb客户端的访问
103 1,再准备一台linux模拟客户端
104 [root@client ~]# yum install samba-client --先确认安装客户端命令的软件包
105
106 smbclient - ftp-like client to access SMB/CIFS resources on servers
107
108 [root@client ~]# smbclient -L //10.1.1.2 --接服务器的ip
109 Enter root's password: --不要真的去输10.1.1.2服务器的root密码,如果输root密码,会报下面一行的错误
110 session setup failed: NT_STATUS_LOGON_FAILURE
111
112
113 [root@client ~]# smbclient -L //10.1.1.2
114 Enter root's password: --直接回车,表示以匿名用户登录,但没有看到共享资源,只有服务器的基本信息
115
116
117 2,从上面看到客户端现在没法访问服务器,所以我们要用本地用户来登录(注意此本地用户是需要服务器上存在的用户)
118 下面就在服务器端执行下面的命令
119 [root@server ~]# useradd a 在服务端创建一个a的普通用户
120 [root@server ~]# echo 123 | passwd --stdin a 给a用户一个密码
121
122 [root@server ~]# smbpasswd -a a --服务器端的本地用户还需要使用smbpasswd -a加入到samba用户,才能在客户端使用此加入的用户登录
123 New SMB password:
124 Retype new SMB password:
125 Added user a.
126
127 smbpasswd的相关操作
128 -a 添加smb用户
129 -d 禁用smb用户
130 -x 删除smb用户
131 -e 启用被禁用的smb用户
132
133
134 3,回到客户端再次登录
135
136 [root@client ~]# smbclient -L //10.1.1.2 -U a --使用a用户登录查看服务器共享的信息
137 Enter a's password:
138 Domain=[SAMBA] OS=[Windows 6.1] Server=[Samba 4.4.4]
139
140 Sharename Type Comment
141 --------- ---- -------
142 print$ Disk Printer Drivers
143 IPC$ IPC IPC Service (Samba 4.4.4)
144 a Disk Home Directories --这里可以看到一个叫a名字的共享(其实就是服务器把a用户的家目录给共享了)
145 Domain=[SAMBA] OS=[Windows 6.1] Server=[Samba 4.4.4]
146
147 Server Comment
148 --------- -------
149
150 Workgroup Master
151 --------- -------
152
153 [root@client ~]# smbclient //10.1.1.2/a -U a --以a用户身份登录到服务器叫a的共享
154 smb: \> pwd --查看当前登录的目录
155 Current directory is \\10.1.1.2\a\
156 smb: \> ? --帮助
157 smb: \> help get --查看get命令的帮助
158 smb: \> ls --列表
159 smb: \> put install.log --上传
160 putting file install.log as \install.log (966.9 kb/s) (average 966.9 kb/s)
161 smb: \> get vvv --下载
162 getting file \vvv of size 0 as vvv (0.0 kb/s) (average 0.0 kb/s)
163 smb: \> rm vvv --删除
164 smb: \> rename install.log install --重命名
165
166 --上面可以看到用户登录samba的默认家目录,有上传,下载,删除,重命令的功能
167 ==================================================================
168 4,windows客户端登录方法:
169 windows客户端登录
170
171 方法一:
172 在cmd下输入 \\10.1.1.2\a
173
174
175
176 然后会弹出一个登录界面,输入用户名和smbpasswd -a定义的密码
177
178
179 方法二:
180 直接做映射:点我的电脑----映射网络驱动器--在文件夹那栏填上\\10.1.1.2\a--再点使用其它凭据连接--写上a用户和他的密码(把记住我的凭据打勾)--就完成了映射了
181
182
183
184 ==================================================================
185 例2.自定义增加一个samba共享,并用客户查看和登录
186
187 服务端的操作
188 # vim /etc/samba/smb.conf --直接加上下面一段新的配置
189
190 需求[test] --新定义了一个共享的资源,共享名为test
191 comment = public for everyone
192 path = /test --实际共享的资源目录名
193 guest ok = yes --表示可以匿名登录(与smbpasswd -a加的普通用户无关);guest ok参数换成public也是一样的
194 browseable = yes --客户端使用-L参数查看能看得到
195
196 # mkdir /test 创建需要共享的目录
197 # systemctl restart smb 7系统重启服务
198 #service smb restart 6系统重启服务
199
200 客户端的操作:
201 # smbclient -L //10.1.1.2/ --匿名查看服务器的共享
202
203 # smbclient -L //10.1.1.2/ -U a --a用户查看服务器的共享
204
205 # smbclient //10.1.1.2/test --匿名登录叫test的共享
206
207 # smbclient //10.1.1.2/test -U a --用a用户登录叫test的共享
208 ==============================================================
209
210
211 例三,匿名用户(nobody用户)对这个自定义共享的权限讨论
212
213 匿名用户可读(下载):
214 nobody用户对目录有rx权限,对要下载的文件有r权限,则就可以下载
215
216 匿名用户可写(上传):
217 nobody用户对目录有写权限,还要在配置文件里加一个参数 writable = yes;
218 # vim /etc/samba/smb.conf
219 [test]
220 comment = public for everyone
221 path = /test
222 public = yes
223 browseable = yes
224 writable = yes
225
226 总结:
227 1,无论是什么服务,客户端访问一定会以一个用户身份来访问(与客户端用哪个用户操作无关),这个身份是由服务器决定的
228
229 匿名用户也会以一个用户身份,几个常用服务的匿名用户:
230 nfs匿名用户为nfsnobody
231 ftp匿名用户为ftp,anonymous
232 samba匿名用户为nobody
233
234 2,客户端要在服务器做一个事件(比如上传或下载),需要注意下面的一个过程:
235
236 客户端程序 --> iptables(防火墙) -->pam (控制客户是否可以登录)--> selinux (程序的域是否能访问文件或目录的类型) --> 服务参数是否允许 --》系统权限rwx-->服务程序
237 ==================================================================
238 例四,samba普通用户对这个自定义共享的权限讨论
239
240 和匿名用户一样,只是用户身份不一样而已(客户端用什么用户登录,就是什么身份)
241 ==========================================================================
242 例五.关于用户互相能删除文件的解决
243
244 1,
245 服务器再加一个b用户 server端
246 客户端使用a用户登录/test共享资源,上传两个文件123和456
247 #useradd b
248 #smbpasswd -a b 添加到smb组里面
249 客户端使用b用户登录/test共享资源,也上传两个文件678和789
250
251 查看一下用户上传的文件属性
252 [root@server ~]# ls /test/ -l
253 total 0
254 -rwxr--r-- 1 a a 0 Dec 18 15:07 123
255 -rwxr--r-- 1 a a 0 Dec 18 15:07 456
256 -rwxr--r-- 1 b b 0 Dec 18 15:07 678
257 -rwxr--r-- 1 b b 0 Dec 18 15:07 789
258
259 2,客户端测试发现a用户可以删除b上传的文件,反之也一样
260 [root@client ~]# smbclient //10.1.1.2/test -U a
261 smb: \> rm 678
262
263 [root@client ~]# smbclient //10.1.1.2/test -U b
264 smb: \> rm 123
265
266
267 3,在服务器端把剩下的两个文件权限改为577,客户端测试会发现都删除不了(测试过程省略)
268 [root@server ~]# ls /test -l
269 total 0
270 -r-xrwxrwx 1 a a 0 Dec 18 15:07 456
271 -r-xrwxrwx 1 b b 0 Dec 18 15:07 789
272
273 4,在服务器端把剩下的两个文件权限再改为200,客户端测试会发现可以随便删除(a用户可以删除自己上传和b用户上传的)(测试过程省略)
274 # ls /test -l
275 total 0
276 --w------- 1 a a 0 Dec 18 15:07 456
277 --w------- 1 b b 0 Dec 18 15:07 789
278
279 分析总结: 只要文件的拥有者对这个文件有可写的权限,那么别人(包括自己)就可以删除它 (200权限例子)
280 文件的拥有者对这个文件没有可写的权限,别人就不能删除它,连自己都不能删除 (577权限的例子)
281
282
283 要实现只能自己删除自己的文件,别人不能删除,则解决方法:
284 chmod o+t /test
285 同时文件的owner对这个文件要有写权限,对上级目录也要有写权限
286 ==================================================================
287 例六: create mask 和 directory mask 直接定义上传后的文件或者目录的权限
288
289 [root@server ~]# vim /etc/samba/smb.conf
290
291 [test]
292 comment = public for everyone
293 path = /test
294 browseable = yes
295 read only = yes
296 writeable = yes
297 create mask = 0444 --表示创建的或者上传的文件权限为444(原来默认值为744)
298 directory mask = 0666 --表示创建的或者上传的目录权限为666(原来默认值为755)
299
300 [root@server ~]# systemctl restart smb 重启服务
301
302 ==================================================================
303
304 例七:对test共享资源实现a用户可以上传下载,b用户只能下载,拒绝匿名用户和其它samba用户(也用smbpasswd -a加入的用户)访问
305 valid users = a,b,@group --只允许a,b用户和group组(只要属于这个组就可以,不一定要gid为这个组)访问
306 write list = a,@group --允许写的用户列表
307
308 [test]
309 comment = public for everyone
310 path = /test
311 guest ok = no --拒绝匿名用户,或者使用public = no
312 valid users = a,b
313 write list = a --写列表只允许a用户写,表示只允许a用户上传
314 ==================================================================
315 扩展
316 read list(不要理解错了,read list不是控制哪些人只能读,也是控制哪些人只能写,只不过和write list相反而已 )
317
318 下面这两句参数合起来,表示所有人可写,但除了a
319 writable = yes
320 read list = a
321 ==================================================================
322 练习:对test共享资源实现a用户能上传(不能下载自己上传的文件),b用户只能下载,拒绝匿名用户和其它用户访问
323
324 在例六的答案基础上再加一个参数create mask = 0344 就可以
325 ===========================================================================
326
327 练习:对test共享资源实现a用户可以上传下载,b用户只能下载(但不能下载a上传的文件),拒绝匿名用户和其它用户访问
328
329 在例六的答案基础上再加一个参数create mask = 0740 就可以
330 =============================================================================
331
332 例八:对test共享资源实现a用户可以上传下载,b用户只能下载,属于smb组的用户可以登录和上传下载,别的普通用户和匿名用户都拒绝
333
334 [root@server ~]# vim /etc/samba/smb.conf
335
336 [test]
337 comment = public for everyone
338 path = /test
339 public = no
340 browseable = yes
341 valid users = a,b,@smb
342 write list = a,@smb
343
344 [root@server ~]# systemctl restart smb
345
346 [root@server ~]# groupadd smb
347 [root@server ~]# useradd smb1 -g smb
348 [root@server ~]# useradd smb2 -g smb
349 [root@server ~]# smbpasswd -a smb1
350 [root@server ~]# smbpasswd -a smb2
351 [root@server ~]# id smb1
352 uid=521(smb1) gid=521(smb) groups=521(smb)
353 [root@li ~]# id smb2
354 uid=522(smb2) gid=521(smb) groups=521(smb)
355 ==================================================================
356 例九:对test共享资源实现:
357 boss用户可以上传下载(下载所有人),还能删除自己上传的文件
358 secretary用户只能下载(下载所有人)
359 属于it组的用户(使用it1和it2两个用户来实验就可以)可以登录并且可以上传,下载和删除自己上传的文件,用户互相之间不能删除,互相之间不能下载别人的文件,但可以下载boss上传的文件
360 别的普通用户和匿名用户都拒绝
361
362
363
364 useradd boss
365 useradd secretary
366 groupadd it
367 useradd -g it it1
368 useradd -g it it2
369
370 smbpasswd -a boss
371 smbpasswd -a secretary
372 smbpasswd -a it1
373 smbpasswd -a it2
374
375 ==================================================================
376 例十: 对test共享资源实现:
377 a上传下载(可以下载所有人上传的)
378 b只能下载(可以下载所有人上传的)
379 c可以上传但只能下载自己上传的
380 都可以删除自己的文件,互相不能删除它人文件,其他用户和匿名用户登录拒绝
381
382 方法一:
383 -rwxr----- a a file1
384 -rwxr----- c c file2
385 b加到a和c组,a加到c组
386
387 [test]
388 comment = public for everyone
389 path = /test
390 public = no
391 valid users = a,b,c
392 write list = a,c
393 create mask = 0740
394
395 # mkdir /test
396 # chmod o+w,o+t /test
397 ==================================================================
398 例十一: 对test共享资源实现:
399 a上传下载(可以下载所有人上传的)
400 b只能下载(可以下载所有人上传的)
401 c可以上传但只能下载a上传的,自己上传的也不能下
402 都可以删除自己的文件,互相不能删除它人文件,其他用户和匿名用户登录拒绝
403
404
405 分析:
406 实现a上传的为默认的0744,c上传的为0344就可以实现
407 rwxr--r-- a a file
408 -wxr--r-- c c file
409
410 如果实现不同用户上传的权限不一样呢?这里就要用到samba的用户子配置文件
411
412 # useradd a
413 # useradd b
414 # useradd c
415 # smbpasswd -a a
416 # smbpasswd -a b
417 # smbpasswd -a c
418 # mkdir /test
419 # chmod 757 /test
420 # chmod o+t /test
421
422 # vim /etc/samba/smb.conf
423
424 config file = /etc/samba/smb.conf.%U --手动加上这一句,表示针对每个用户都可以单独写一个配置文件,加在上面的全局[global]里
425
426 [test]
427 comment = public for everyone
428 path = /test
429 public = no
430 browseable = yes
431 valid users = a,b,c
432 write list = a
433 create mask = 0744
434
435 # vim /etc/samba/smb.conf.c
436
437 [test]
438 comment = public for everyone
439 path = /test
440 public = no
441 browseable = yes
442 writable = yes
443 create mask = 0344
444
445 ==================================================================
446
447 例十四:访问控制
448
449 注意写到全局参数[global]下
450
451 1,拒绝10.1.1网段
452 hosts deny = 10.1.1.
453
454 1,拒绝10.1.1网段,但是允许10.1.1.35
455 hosts deny = 10.1.1.
456 hosts allow = 10.1.1.35
457
458 2,拒绝所有,但允许10.1.1网段,但又不允许10.1.1.45
459 hosts deny = all
460 hosts allow = 10.1.1. EXCEPT 10.1.1.45
461
462
463 也可以写到单独的共享资源下,只针对此共享资源来进行访问控制