且构网

分享程序员开发的那些事...
且构网 - 分享程序员编程开发的那些事

RHCE培训笔记——Samba

更新时间:2022-09-13 17:43:25

Samba是在Linux和UNIX系统上实现SMB协议的一个免费软件,由服务器及客户端程序构成。


以下通过两个基础实验来学习samba,实验平台为Centos 6.2,环境为:

Samba服务器

主机名:luffy    IP地址:192.168.56.53

客户端测试机

主机名:zoro     IP地址:192.168.56.54



实验一


假设公司有一台samba服务器,提供了一个共享名为/share的共享目录,现在要求只允许192.168.56.0网段的用户可以使用自己的samba帐户登录此目录,并可读写,但不允许动别人的资料。


一、准备工作


1.创建用户user1、user2,并在根目录下创建共享文件夹share及其共享文件,其中share的文件夹属性为777。

创建结果如下:

[root@luffy ~]# cat /etc/passwd

……省略部分内容……

user1:x:502:502::/home/user1:/bin/bash

user2:x:503:503::/home/user2:/bin/bash

[root@ luffy ~]# ls -l /share

total 8

-rw-r--r--. 1 root root 4 May 24 06:41 a

-rw-r--r--. 1 root root 4 May 24 06:41 b

[root@ luffy ~]# ls -ld /share

drwxrwxrwx. 2 root root 4096 May 24 06:41 /share


2.安装samba软件

[root@luffy ~]# yum install samba*

Samba*涉及到的组件是samba,samba-common,samba-client

其中samba必需安装,后面两个在装系统时其实已默认安装(因此其他linux客户端可以直接使用smbclient命令访问samba的共享文件夹)。


3.添加samba用户

Samba中添加的用户,必须是samba服务器所在系统中预先创建的,但该用户登录samba时使用的密码,需由samba创建并保存。

使用到的命令是smbpasswd,参数-a表示添加用户,-x表示删除用户,-d表示禁用用户。

下面将user1和user2加入到samba中,

[root@ luffy ~]# smbpasswd -a user1

New SMB password:

Retype new SMB password:

Added user user1.

[root@ luffy ~]# smbpasswd -a user2

New SMB password:

Retype new SMB password:

Added user user2.


二、配置共享


在服务器SELinux开启(Enforcing状态)的情况下,进行以下实验。


1.在samba主配文件/etc/samba/smb.conf末尾添加以下内容:

1
2
3
4
5
6
[share]
comment = sharefile  #描述信息
path = /share  #指定共享文件夹的路径
hosts allow = 192.168.56.  #允许访问该目录的网段
browseable=yes  #可浏览
writable = yes  #可写


注,hosts allow字段如果不写,则表示所有可访问该服务器的客户端都可访问该共享目录。在本实验和许多实际环境中,都是内网共享,只有同网段的内网用户才可访问,“hosts allow=本网段”其实不需要写。


另外,主配文件第100行附近,

1
2
3
security = user
#smb passwd file = /etc/samba/smbpasswd
passdb backend = tdbsam

表示,当前(默认)使用的是user认证方式,即客户端需要有samba中记录的用户及其密码才能登录,如果是security = share,则表示采用匿名登录方式。


配置修改完成后,重启samba服务,

[root@luffy ~]# service smb restart


客户端访问时,报错:

[root@zoro ~]# smbclient //192.168.56.53/share -U user1

Enter user1's password:

Domain=[MYGROUP] OS=[Unix] Server=[Samba 3.6.9-151.el6]

smb: \> ls

NT_STATUS_ACCESS_DENIED listing \*


               40317 blocks of size 262144. 31467 blocks available

smb: \> quit

没有访问权限,是由于请求被selinux拦截了。

(注:如果是出现NT_STATUS_BAD_NETWORK_NAME的报错,大概是因为主配文件中定义共享文件块时,中括号里的名字出错,访问路径//192.168.56.53/share中的share不是指根目录中的share文件夹,而是主配文件中自定义的[share]中括包内的share。)


2.服务器端对samba共享目录修改安全上下文,使用chcon命令

[root@luffy ~]# ls -ldZ /share

drwxr-xr-x. root root system_u:object_r:default_t:s0   /share

[root@luffy ~]# chcon -t samba_share_t /share

[root@luffy ~]# ls -ldZ /share

drwxr-xr-x. root root system_u:object_r:samba_share_t:s0 /share


客户端再访问,就正常了

[root@zoro ~]# smbclient //192.168.56.53/share -U user1

Enter user1's password:

Domain=[MYGROUP] OS=[Unix] Server=[Samba 3.6.9-151.el6]

smb: \> ls

 .                                   D        0  Fri May 24 06:41:33 2013

 ..                                 DR        0  Fri May 24 06:18:56 2013

 a                                            4  Fri May 24 06:41:26 2013

 b                                            4  Fri May 24 06:41:33 2013


               40317 blocks of size 262144. 31466 blocks available

smb: \>

smb: \> rm a

smb: \> ls

 .                                   D        0  Fri May 24 06:45:54 2013

 ..                                 DR        0  Fri May 24 06:18:56 2013

 b                                            4  Fri May 24 06:41:33 2013


               40317 blocks of size 262144. 31466 blocks available

smb: \>quit


从以上操作还可以看到,此时user1可以删除其root创建的文件a(因为文件夹share的权限被设成了777)。即user1可以动其他人的文件,这不符合要求。


3.服务器端对共享目录设置特殊权限

[root@luffy ~]# chmod o+t /share


这里的t,指sticky bit,可以理解为防删除位. 一个文件是否可以被某用户删除,主要取决于该文件所属的组是否对该用户具有写权限。如果没有写权限,则这个目录下的所有文件都不能被删除,同时也不能添加新的文件。如果希望用户能够添加文件,但同时不能删除文件,则可以对文件使用sticky bit位。设置该位后, 就算用户对目录具有写权限, 也不能删除该文件。(这话理解起来有点费劲~)


此时客户端登录便不可以删除其他用户的文件了,但删除自己的文件没问题。

[root@zoro ~]# smbclient //192.168.56.53/share -U user1

Enter user1's password:

Domain=[MYGROUP] OS=[Unix] Server=[Samba 3.6.9-151.el6]

smb: \> ls

 .                                   D        0  Fri May 24 06:45:54 2013

 ..                                 DR        0  Fri May 24 06:18:56 2013

 b                                            4  Fri May 24 06:41:33 2013


               40317 blocks of size 262144. 31465 blocks available

smb: \> rm b

NT_STATUS_ACCESS_DENIED deleting remote file \b

smb: \> rmdir user1

smb: \>quit


三、将共享文件加载到客户端本地进行操作


客户端使用smbclient远程访问共享目录时,操作指令是有限的(通过help命令可以查看),touch命令就不可用。为做进一步验证,要将共享目录加载到本地,再进行相关操作。

通过mount cifs方式进行加载。


1.先使用user1挂载、操作:

[root@zoro ~]# mount -t cifs 192.168.56.53:/share /mnt/ -o username=user1

Password:

[root@zoro ~]# cd /mnt

[root@zoro mnt]# ls

b

[root@zoro mnt]# mkdir user1

[root@zoro mnt]# vim user1/1

user111 (注,这个是输入的内容)                            

[root@zoro mnt]# ll

total 4

-rw-r--r-- 1 root root 4 May 24 06:41 b

drwxr-xr-x 2  502  502 0 May 24 07:02 user1

[root@zoro mnt]# ll user1/

total 4

-rw-r--r-- 1 502 502 8 May 24 07:02 1

[root@zoro mnt]# cd

[root@zoro ~]# umount -t cifs 192.168.56.53:/share /mnt/

umount: /mnt: not mounted


2.再用user2挂载、操作:

[root@zoro ~]# mount -t cifs 192.168.56.53:/share /mnt/ -o username=user2%redhat

(注,这行命令,直接把user2的samba密码redhat也写出来了)

[root@zoro ~]# cd /mnt

[root@zoro mnt]# ls

b  user1

[root@zoro mnt]# ls user1/

1

[root@zoro mnt]# cat user1/1

user111

[root@zoro mnt]# rm -rf user1/

rm: cannot remove `user1/1': Permission denied

[root@zoro mnt]# rm -rf b

rm: cannot remove `b': Permission denied

[root@zoro mnt]#

[root@zoro mnt]# touch 2

[root@zoro mnt]# cd

[root@zoro ~]# umount -t cifs 192.168.56.53:/share /mnt/

umount: /mnt: not mounted


可以看到,user2是没有权限删除或更改其他用户的文件的,但可以创建属于自己的文件。



实验二


公司的IT部门有it1、it2两个成员,他们可以登录到自己部门的共享目录进行读写操作,上传的文件的权限为640,且只允许他们之间读取文件,但不可以修改对方的文件。


一、准备工作


1.创建用户it1、it2和用户组it,并将it1和it2加入到用户组it。


2.创建共享目录/it,将其权限属性置为777,并使用chcon -t samba_share_t /it命令修改其安全上下文(本实验仍然在SELinux开启的情况下进行测试)。


3.将用户it1、it2加入到samba服务器

[root@luffy ~]# smbpasswd -a it1

New SMB password:

Retype new SMB password:

Added user it1.

[root@luffy ~]# smbpasswd -a it2

New SMB password:

Retype new SMB password:

Added user it2.


二、配置共享


1. 在主配文件/etc/samba/smb.conf末尾添加以下内容:

1
2
3
4
5
6
7
8
9
[it]
comment = it dept.
path = /it
browseable=yes
writable = yes
valid users = @it  #指定允许访问的用户组为it,注意@符号
create mask = 640  #指定新创建的文件的权限为640
directory mask = 750 #指定新创建的文件夹的权限为750
group = it  #指定新创建的文件(夹)的用户组为it,这里没有@


配置修改完成后,重启samba服务,

[root@luffy ~]# service smb restart


2.客户端访问

[root@zoro ~]# smbclient //192.168.56.53/it -U user1

Enter user1's password:

Domain=[MYGROUP] OS=[Unix] Server=[Samba 3.6.9-151.el6]

tree connect failed: NT_STATUS_ACCESS_DENIED

[root@zoro ~]# smbclient //192.168.56.53/it -U it1

Enter it1's password:

Domain=[MYGROUP] OS=[Unix] Server=[Samba 3.6.9-151.el6]

smb: \> quit

[root@zoro ~]# smbclient //192.168.56.53/it -U it2

Enter it2's password:

Domain=[MYGROUP] OS=[Unix] Server=[Samba 3.6.9-151.el6]

smb: \> ls

 .                                   D        0  Mon May 27 05:40:45 2013

 ..                                 DR        0  Mon May 27 05:40:45 2013


               40317 blocks of size 262144. 31463 blocks available

smb: \> quit


从以上连接可以看出,只有属于it用户组的用户才有访问/it的权限。


三、将共享文件加载到客户端本地进行操作


1.使用it1登录、挂载,创建文件(夹)

[root@zoro ~]# mount -t cifs 192.168.56.53:/it /mnt/ -o username=it1%redhat

[root@zoro ~]# cd /mnt

[root@zoro mnt]# mkdir it01

[root@zoro mnt]# vim it01/a

this is file a (注,这个是输入的内容)          

[root@zoro mnt]# ls -ld it01/

drwxr-x--- 2 504 506 0 May 27 06:35 it01/

[root@zoro mnt]# ls -ll it01/

total 4

-rw-r----- 1 504 506 15 May 27 06:35 a

[root@zoro mnt]# cd

[root@zoro ~]# umount -t cifs 192.168.56.53:/it /mnt/

umount: /mnt: not mounted


注:由于在配置文件中,对/it的共享设置,指定了create mask = 640和directory mask = 750,所以创建的文件和文件夹,都是用户组成员有读(执行)权限,其他人没有任何读写权限。


另外,由于/it的共享设置里有group = it这一行,it1无论是创建文件或文件夹,其所属用户组都是it1(504)所在的用户组it(506)。这里因为是远程挂载的,使用ll命令只能看到用户id。


下面使用it2访问时,由于it2也在it组里,所以it2对文件夹it01的r-x权限,对文件a有r--权限。


2.使用it2登录、挂载,进行验证

[root@zoro ~]# mount -t cifs 192.168.56.53:/it /mnt/ -o username=it2%redhat

[root@zoro ~]# cd /mnt

[root@zoro mnt]# ls

it01

[root@zoro mnt]# ls it01/

a

[root@zoro mnt]# cat it01/a

this is file a

[root@zoro mnt]# rm -rf it01

rm: cannot remove `it01/a': Permission denied

[root@zoro mnt]# rm -rf it01/a

rm: cannot remove `it01/a': Permission denied

[root@zoro mnt]# touch it01/b

touch: cannot touch `it01/b': Permission denied


以上可以看出,it2可以读it1的文件(夹),但却没有权限删除和修改(使用vim编辑it01/a时,会被提示不能修改)。


在上述配置文件中,如果对/it的共享设置,指定了create mask = 640和directory mask = 750,却没有添加group = it,那么it1创建的文件和文件夹,其用户组都是it1,此时it2属于其他人,是没有读写权限的。



本文转自Sunshyfangtian 51CTO博客,原文链接:http://blog.51cto.com/sunshyfangtian/1212270,如需转载请自行联系原作者